/* Copyright (c) 2026 Bc. Jan Krejčí. All rights reserved.                   */
/* Proprietary and confidential. See LICENSE in the project root.             */

/* ==========================================================================
 *  Reference (/reference) — pixelová rekonstrukce `_refs/galerie-01.png`.
 *
 *  Čísla v tomhle souboru jsou ODMĚŘENÁ, ne odhadnutá:
 *  `python tools/images/measure-galerie.py` je vypíše ze souboru návrhu,
 *  `node tools/render/v42-reference.js` je pak ověří proti živému DOM.
 *  Návrh je 1625 px široký, takže „design px" níž = CSS px při šířce okna
 *  1625. Co je v návrhu vázané na šířku stránky (kontejner, mřížka karet,
 *  fotka v hero), je proto psané ve `vw` s `clamp()`; typografie a poloměry
 *  jsou pevné, aby se drobné popisky (v návrhu 10–14 px) nescvrkly na
 *  užším okně do nečitelna.
 *
 *  Odměřený rastr:
 *    kontejner        x  55 … 1570   (obsah 1515, boční okraj 55)
 *    hero panel       y  88 … 383    (horní rohy r = 26)
 *    karty velikostí  y 384 … 680    (3 sloupce, mezera 16, r = 24)
 *    detailní skupiny y 733 … 827    (dlaždice 193 × 95, mezera 17, r = 14)
 *    spodní pás       y 849 … 946    (pilulka, r = 48)
 *
 *  Barvy nejsou pevné hexy. Celá zóna visí na dvou odstínech odvozených
 *  z akcentu (`--kp-ref-h` pro zlatou, `--kp-ref-veil-h` pro olivovou clonu
 *  karet), světlost a sytost jsou odměřené z návrhu. Ve výchozím stavu z toho
 *  vyjde přesně zlatá z předlohy, a posuvník odstínu v panelu Vzhled přebarví
 *  stránku celou — včetně noci. Sklo bere `--kp-glass-*`, pohyb `[data-motion]`,
 *  rozostření `[data-effects]`; pravidlo „Každá sekce musí ctít motiv"
 *  (CLAUDE.md §6) je tím splněné i pro tuhle 1:1 zónu.
 * ========================================================================== */

/* Tokeny drží OBA selektory. Hlavička je sourozenec `<main>`, tedy stojí
   mimo `.kp-ref` — a `var(--kp-ref-h)`, které tam nedosáhne, není „černá",
   ale NEPLATNÁ hodnota: prohlížeč celou deklaraci zahodí a zlatá pilulka
   zůstane bez pozadí. (Chyceno kontrolou „CTA pilulka je zlatá".) */
.kp-ref,
.kp-site--ref {
    /* -- odstín ----------------------------------------------------------
       Celá zóna visí na JEDNOM odstínu, a ten jde z panelu Vzhled. Zlatá
       z návrhu má změřeně H 73–83 (`#C2924F` → 73,9; `#E1B870` → 80,6)
       a značková žloutková na webu běží na `calc(var(--accent-h) − 61)`,
       tedy při výchozím zeleném akcentu na 80. Sedí to na sebe, takže se
       stránka nemusí rozhodovat mezi „1:1 s návrhem" a „reaguje na tweaks" —
       posuvník odstínu ji přebarví celou, a ve výchozím stavu je zlatá
       přesně taková, jaká je v předloze. Světlost i sytost jsou odměřené. */
    --kp-ref-h: calc(var(--accent-h, 141) - 61);
    /* Olivová clona na kartách je jiný odstín než zlatá — změřeně H ≈ 113
       (#363B1D), tedy blíž značkové zelené. Odvozuje se proto od akcentu
       vlastním posunem, aby s ním putovala taky. */
    --kp-ref-veil-h: calc(var(--accent-h, 141) - 28);

    /* -- plochy ---------------------------------------------------------- */
    --kp-ref-page: oklch(0.993 0.003 var(--kp-ref-h));
    --kp-ref-cream: oklch(0.949 0.014 var(--kp-ref-h));
    --kp-ref-cream-2: oklch(0.932 0.017 var(--kp-ref-h));
    --kp-ref-cream-3: oklch(0.902 0.021 var(--kp-ref-h));
    --kp-ref-panel: oklch(0.962 0.012 var(--kp-ref-h));

    /* -- text ------------------------------------------------------------ */
    --kp-ref-ink: oklch(0.228 0.017 var(--kp-ref-h));
    --kp-ref-ink-soft: oklch(0.512 0.014 var(--kp-ref-h));
    --kp-ref-ink-faint: oklch(0.610 0.013 var(--kp-ref-h));

    /* -- zlatá ----------------------------------------------------------- */
    --kp-ref-gold: oklch(0.692 0.103 var(--kp-ref-h));
    --kp-ref-gold-2: oklch(0.727 0.092 var(--kp-ref-h));
    --kp-ref-gold-fill: oklch(0.804 0.102 var(--kp-ref-h));
    --kp-ref-gold-line: oklch(0.727 0.092 var(--kp-ref-h) / 0.42);
    --kp-ref-gold-line-soft: oklch(0.727 0.092 var(--kp-ref-h) / 0.22);
    /* Obrys štítku na kartě — v návrhu sotva znatelný, proto vlastní token. */
    --kp-ref-gold-hairline: oklch(0.828 0.085 var(--kp-ref-h) / 0.34);

    /* -- sklo ------------------------------------------------------------
       Z Forge tokenů, ne z pevných čísel: posuvník „Sklo" v panelu Vzhled
       tak řídí i patičku karet a rozostření pod textem. Zápornou hodnotu
       `--kp-glass-*` na webu nikdo nenastaví, ale `clamp` drží rozostření
       v rozumném rozsahu i při krajních polohách posuvníku. */
    --kp-ref-frost: clamp(4px, calc(var(--kp-glass-blur, 24px) * 0.42), 16px);
    --kp-ref-glass-fill: rgba(255, 250, 238, calc(0.06 + 0.09 * var(--kp-glass-strength, 0.6)));
    --kp-ref-glass-edge: rgba(255, 250, 238, calc(0.10 + 0.14 * var(--kp-glass-strength, 0.6)));

    /* -- tmavé sklo karet ------------------------------------------------ */
    --kp-ref-glass-ink: #FFFCF4;
    --kp-ref-glass-ink-soft: rgba(255, 252, 244, 0.78);

    /* -- rastr ----------------------------------------------------------- */
    --kp-ref-pad: clamp(1.25rem, 3.385vw, 3.4375rem);   /* 55 px @ 1625 */
    --kp-ref-max: 1625px;
    --kp-ref-gap: clamp(0.7rem, 0.985vw, 1rem);         /* 16 px @ 1625 */

}

/* Vlastní kontext vrstvení pro celou zónu — pořadí níž na něm stojí.
   `overflow: hidden` sem patří místo na hero: pírka i fotka přesahují přes
   hranice sekcí a bez oříznutí ZDE by stránka dostala vodorovný posuvník.
   Na `.kp-site--ref` nic z toho nesmí — obalilo by to i hlavičku. */
.kp-ref {
    position: relative;
    z-index: 0;
    overflow: hidden;
    /* Základ je krémová plocha stránky; SVĚTLEJŠÍ vrchol dodává `::before`
       jako jeden dlouhý přechod přes celý horní díl stránky.

       Dřív měla `.kp-ref` světlý tón (0.993) a sekce pod ní vlastní plochu
       (0.932). Rozdíl 6 % světlosti na ostré vodorovné hraně je přesně to,
       co bylo hlášeno jako „moc silný přechod, není to pozvolné". Sekce teď
       vlastní plochu nemají a šev nemá kde vzniknout. */
    background: var(--kp-ref-cream-2);
    color: var(--kp-ref-ink);
}

/* Světlý vrchol stránky. Výška je v pixelech, ne v procentech: přechod má
   doznít někde pod kartami velikostí, a to je vzdálenost od HORNÍ hrany —
   procenta by se s délkou stránky protahovala a při každém přidání realizace
   by přechod skončil jinde. */
.kp-ref::before {
    content: "";
    position: absolute;
    inset: 0 0 auto;
    height: 1180px;
    z-index: 0;
    pointer-events: none;
    background: linear-gradient(180deg in oklab,
        var(--kp-ref-page) 0%,
        color-mix(in oklab, var(--kp-ref-page) 72%, var(--kp-ref-cream-2)) 34%,
        color-mix(in oklab, var(--kp-ref-page) 30%, var(--kp-ref-cream-2)) 68%,
        transparent 100%);
}

/* --------------------------------------------------------------------------
 *  Pořadí vrstev v zóně
 *  ---------------------------------------------------------------------
 *  Fotka musí ležet NAD krémovými podklady sekcí (aby prosvítala vedle
 *  karet a pod nimi doznívala) a zároveň POD jejich obsahem. Řeší to
 *  malovací pořadí CSS, ne trik:
 *
 *    −1  `.kp-ref-hero::before`   krémový panel hero pásu
 *     0  pírka; podklady sekcí (nepozicované → malují se před kladnými z)
 *     1  `.kp-ref__photo`         fotka s dolním rozplynutím
 *     2  `.kp-ref-hero::after`    krémový závoj přes levou část fotky
 *     2  `.kp-ref-shell`          karty, pás skupin, pilulka
 *     3  `.kp-ref-hero__inner`    text hero
 *
 *  Sekce samotné proto NESMĚJÍ dostat `z-index` — vytvořily by vlastní
 *  kontext a jejich obsah by se pod fotku už nedostal ven.
 * -------------------------------------------------------------------------- */
/* Fotka sedí PŘESNĚ tam, kde je na domovské stránce: přes celou šířku, od
   horní hrany, se stejnou výškou i výřezem. Návštěvník, který přijde z domů,
   pak vidí tentýž snímek na tomtéž místě a stránka se pod ním jen vymění —
   dřív byla vpravo na 62 % a obraz při přechodu uskočil. Sdílené jméno pro
   View Transitions je níž. */
.kp-ref__photo {
    position: absolute;
    top: 0;
    right: 0;
    z-index: 1;
    width: 100%;
    /* PŘESNĚ táž rovnice jako `--hero-h` na domovské stránce. Jakákoli jiná
       hodnota znamená, že se výřez liší a obraz při přechodu uskočí — a o to
       tu jde. Rozplynutí dolů je pak v PIXELECH (níž), takže si stránka drží
       své místo, kde se fotka rozpouští, nezávisle na výšce okna. */
    height: max(620px, 100dvh);
    pointer-events: none;
    /* Maska ve DVOU osách, protně se (`intersect`):
       • svisle — dolní dozvuk za kartami, tím se ruší vodorovný řez;
       • vodorovně — měkká levá hrana. Ta musí být na masce, ne jen na
         závoji `.kp-ref-hero::after`: závoj začíná až pod hlavičkou (y = 88)
         a nad ním by fotka končila svislým řezem uprostřed lišty.
       Závoj přesto zůstává — maska jen ubírá krytí, takže světlá obloha
       zůstane světlá a popisek čtvrtého odznaku by na ní zmizel. Maska řeší
       TVAR, závoj ČITELNOST. */
    /* Zastávky jsou v PIXELECH, ale zastropované procenty výšky prvku.
       Prvek je vysoký `max(620px, 100dvh)`, takže na okně nižším než 745 px
       maska nestihla dojít na nulu a fotka se uřízla vlastní spodní hranou —
       při krytí kolem 9 % je to slabá, ale přes celou šířku vedená čára.
       `min()` znamená: na vysokém okně platí pixely (doznění na stále stejném
       místě, jak bylo zamýšleno), na nízkém se stlačí tak, aby skončilo přesně
       na okraji prvku. Na 745 px se obě hodnoty potkávají, takže tam nevzniká
       zlom.

/* DVĚ masky, které se protnou:
         • svisle — fotka doznívá dolů a pod kartami už je čistá plocha;
         • vodorovně — VLEVO přechází do plochy stránky.

       Vodorovná maska tu chvíli nebyla a byl to přesně ten „škaredý pruh":
       fotka končila u levého okraje naplno, takže vedle krémového hero
       svítil kus louky. Přechod je dlouhý (0 → 46 %), aby vlevo byla táž
       plocha jako v sekci nad kartami a oko nenašlo hranu.

       Geometrie prvku se tím nemění — maska ubírá jen krytí — takže fotka
       pořád leží tam, kde na domovské stránce, a přechod mezi stránkami
       nikam neskáče. */
    -webkit-mask-image:
        linear-gradient(180deg, #000 0px, #000 min(400px, 54%), rgba(0, 0, 0, 0.55) min(560px, 75%), rgba(0, 0, 0, 0.16) min(665px, 89%), transparent min(745px, 100%)),
        linear-gradient(90deg, transparent 0%, rgba(0, 0, 0, 0.22) 14%, rgba(0, 0, 0, 0.72) 32%, #000 46%);
    mask-image:
        linear-gradient(180deg, #000 0px, #000 min(400px, 54%), rgba(0, 0, 0, 0.55) min(560px, 75%), rgba(0, 0, 0, 0.16) min(665px, 89%), transparent min(745px, 100%)),
        linear-gradient(90deg, transparent 0%, rgba(0, 0, 0, 0.22) 14%, rgba(0, 0, 0, 0.72) 32%, #000 46%);
    -webkit-mask-composite: source-in;
    mask-composite: intersect;
}

/* ŽÁDNÉ `view-transition-name` NA FOTCE — a stojí za to vědět proč.
 *
 * Fotka tu dřív nesla `kp-heroshot` jako sdílený prvek s domovskou stránkou.
 * Domovský protějšek ale jméno ztratil ve chvíli, kdy se přechod mezi
 * stránkami změnil z prolnutí na odhalení maskou (kp-view-transitions.css,
 * „SDÍLENÉ PRVKY TU UŽ NEJSOU"). Zůstala tedy polovina páru — a osamocené
 * jméno se nemá s čím spárovat, takže z něj prohlížeč udělá vrstvu, která
 * má jen `new`.
 *
 * A ta vrstva se maluje NAD kořenem: uvnitř přechodu neplatí `z-index` ze
 * stránky, skupiny jdou v pořadí zachycení. Fotka proto po celou dobu
 * přechodu ležela přes karty velikostí — na záznamu klienta jsou karty
 * průsvitné a prosvítá jimi kurník ze zóny nad nimi — a v okamžiku, kdy
 * přechod skončil a vrstva zmizela, karty naskočily.
 *
 * Naměřeno (`/cenik → /reference`, rozdíl proti předchozímu snímku v pásu
 * karet): v klidu 0–2, na posledním snímku 38. V liště nabídky totéž, jen
 * slabší, protože ta je průsvitná a fotka pod ní poskočila taky. Přesně to
 * klient popisuje jako „karty probliknou" a „pozadí menu problikne".
 *
 * Že fotka při navigaci nepřeskočí, drží něco lepšího než sdílené jméno:
 * `.kp-ref__photo` a `.kp-hero__media` nesou TÝŽ soubor ve stejném výřezu
 * i geometrii, takže je na obou stranách masky pixel po pixelu totéž.
 * Sdílený prvek by neměl co přenášet. */

.kp-ref__photo picture,
.kp-ref__photo img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
    /* Týž výřez jako na domovské stránce (`.kp-hero__media img`), aby se
       obraz při přechodu mezi stránkami nepohnul. */
    object-position: 70% 100%;
}

/* Táž fotka jako na domovské stránce musí být i STEJNĚ VELKÁ a stejně
   barevná. Rámeček a `object-position` seděly už dřív, jenže domovská
   `<img>` nese navíc `scale` (základ Ken Burns) — naměřeno na 1440 × 900:
   domů 1527 × 955 na (−44, −55), reference 1440 × 900 na (0, 0), tedy 6 %
   rozdílu ve výřezu. Dosycení bylo slabší (1,04 / 1,02 proti 1,12 / 1,05),
   takže se lišila i barva.

   Ken Burns se sem NEPŘIDÁVÁ. Přiblížení domovské fotky se v čase mění mezi
   `--kp-hero-zoom-base` a `--hero-zoom-max` a fáze animace je u každého
   načtení stránky jiná, takže „stejná animace" by shodu nezaručila o nic
   líp než pevné číslo — jen by rozhýbala pozadí, které tady drží pod sebou
   text i karty. */
.kp-ref__photo img {
    scale: var(--kp-hero-zoom-base, 1.06);
    /* Od SPODNÍ hrany, stejně jako na domovské stránce (`kp-hero.css`, tam
       kvůli rezervě pod hejnem). Se středem zůstane výřez svisle posunutý
       o polovinu přesahu — naměřeno 27 px z 900, tedy fotka o kus výš než
       na domů. Rozdíl je vidět hlavně při prokliku, protože přechod obě
       fotky sdílí jako jeden prvek. */
    transform-origin: 50% 100%;
    filter: saturate(1.12) contrast(1.05);
}

/* Vnitřní obal sekcí — jeden rastr pro karty, pás skupin i spodní pilulku.
   `z-index: 2` ho zvedá nad fotku zóny; podklad sekce kolem něj zůstává pod
   ní, takže fotka mezi kartami a vedle nich prosvítá jako v návrhu. */
/* Táž rovnice jako `.kp-section` v kp-site.css. Vlastní `--kp-ref-max`
   (1625 px) a `--kp-ref-pad` tu byly z návrhu galerie a znamenaly, že obsah
   referencí stál na jiné svislici než zbytek webu i než hlavička nad ním. */
.kp-ref-shell {
    position: relative;
    z-index: 2;
    max-width: calc(var(--kp-page-max, 1560px) + 2 * var(--kp-gutter, 24px));
    margin-inline: auto;
    padding-inline: var(--kp-gutter, 24px);
}

/* Šipka „dovnitř" ikony: v návrhu je delší a tenčí než výchozí Lucide tvar. */
.kp-refico { display: block; }

/* ==========================================================================
 *  Hlavička na téhle stránce
 *  ---------------------------------------------------------------------
 *  ŽÁDNÝ vlastní skin. Do v95 tu byla celá druhá hlavička: jiná šířka
 *  (1625 px proti rovnici zbytku webu), jiné odsazení, patková značka,
 *  zlaté odkazy i zlatá pilulka místo zelené. Vzniklo to, když měl návrh
 *  galerie vlastní krémové hero — jenže od v86 nese patkovou značku celý
 *  web a od v94 je pod hlavičkou tatáž hero fotka jako na domovské
 *  stránce. Druhá hlavička už tedy nic neřešila, jen se rozcházela.
 *
 *  Zůstává jediné: horní pruh se posouvá pod hlavičku (`padding-top: 0`),
 *  protože fotka zóny začíná u horní hrany dokumentu.
 * ========================================================================== */
.kp-site--ref .kp-main { padding-top: 0; }

/* Náznak pod hlavičkou — TÝŽ prvek, jaký má hero na domovské stránce
   (`rgba(20,16,10,.12)` do 11 %), jen o něco silnější: fotka je tu u horní
   hrany světlejší (obloha), takže bílé popisky měly kontrast 3,6 proti 5,1
   na domovské. Není to skin hlavičky — hlavička je všude stejná; tohle je
   podklad ZÓNY, přesně jako u hero. */
.kp-ref__photo::after {
    content: "";
    position: absolute;
    inset: 0 0 auto;
    height: 26%;
    pointer-events: none;
    background: linear-gradient(180deg,
        rgba(20, 16, 10, 0.34) 0%,
        rgba(20, 16, 10, 0.14) 42%,
        rgba(20, 16, 10, 0) 100%);
}

/* ==========================================================================
 *  Hero
 * ========================================================================== */
/* Hero NEMÁ `isolation` ani `overflow` — obojí by uzavřelo vrstvení
   dovnitř sekce a fotka zóny by se pod ni nedostala. Kontext i oříznutí
   drží `.kp-ref`. */
.kp-ref-hero {
    position: relative;
    padding-top: 8rem;     /* hlavička 88 + 40 → horní dotaz eyebrow na y=128 */
    padding-bottom: 2.75rem; /* spodek hero panelu na y=383, karty začínají na 384 */
}

/* Krémový panel začíná AŽ POD hlavičkou (y = 88) a má zaoblené horní rohy —
   nad ním je stránka bílá, což je v návrhu jediný pruh, kde bílá je. */
.kp-ref-hero::before {
    content: "";
    position: absolute;
    /* Odshora BEZ odsazení a bez zaoblení. Dřív tu bylo `inset: 88px 0 0`
       se zaoblenými horními rohy, tedy panel začínající pod hlavičkou —
       a mezi spodkem lišty (y = 74) a začátkem panelu (y = 88) zůstal pruh
       o jiném tónu. Naměřeno: o 12 jednotek jasu světlejší než plocha nad
       ním i pod ním, skok 11,9 na hraně. Vlevo, kde je klidná plocha, to
       čte jako vodorovná čára přes celou šířku stránky.

       Dolů panel PŘESAHUJE pod hero a mizí maskou. Dřív končil přesně tam,
       kde končí hero (y = 383), takže se na téže souřadnici potkaly dva
       různé krémy — skok 8,7 ve světlém a 22,6 v tmavém motivu. Přesah
       220 px s dozvukem přes posledních 300 px znamená, že plocha nemá
       kde skončit: než maska dojde na nulu, je pod ní přesně týž tón. */
    inset: 0 0 -220px;
    z-index: -1;
    mask-image: linear-gradient(180deg, #000 0, #000 calc(100% - 300px), transparent 100%);
    -webkit-mask-image: linear-gradient(180deg, #000 0, #000 calc(100% - 300px), transparent 100%);
    /* Přechod končí PŘESNĚ na `--kp-ref-cream-2`, protože tutéž barvu má
       plocha pod ním. Když tu dřív dobíhal na `cream-3` a sekce s kartami
       začínala `cream-2`, vznikl přes celou šířku vodorovný zlom — v návrhu
       je pozadí jedno, čisté, bez skoku. */
    background:
        radial-gradient(90% 120% at 8% 0%,
            oklch(0.972 0.009 var(--kp-ref-h)) 0%,
            oklch(0.972 0.009 var(--kp-ref-h) / 0) 58%),
        linear-gradient(150deg, var(--kp-ref-cream) 0%, var(--kp-ref-cream-2) 62%, var(--kp-ref-cream-2) 100%);
}

/* Krémový závoj PŘES fotku, ne jen měkčí maska pod ní.
   Samotná maska nestačí: fotka pak prosvítá pod čtvrtým odznakem („Děláno
   s láskou") a popisek na ní zmizí. V návrhu levá polovina fotky do krému
   doslova zapadne — proto se přes ni přetáhne táž barva, jakou má panel,
   a teprve za textovým sloupcem se otevře.
   Sahá jen po spodní hranu hero pásu: níž už fotka doznívá vlastní maskou
   a vedle karet má zůstat vidět. */
.kp-ref-hero::after {
    content: "";
    position: absolute;
    /* Táž geometrie jako panel výš, a ze stejných důvodů. Navíc: závoj
       začínající na 88 nechával nad sebou kus fotky u levého okraje, který
       se pod poloprůhlednou lištou četl jako tmavý teplý pruh. Od nuly se
       fotka noří do krému plynule celou výškou. */
    inset: 0 0 -220px;
    z-index: 2;
    pointer-events: none;
    mask-image: linear-gradient(180deg, #000 0, #000 calc(100% - 300px), transparent 100%);
    -webkit-mask-image: linear-gradient(180deg, #000 0, #000 calc(100% - 300px), transparent 100%);
    background:
        /* Teplý opar tam, kde se fotka noří do krému. V návrhu je ten pruh
           znatelně zlatější než okolní panel (#EFE2D2 proti #F5EDE3) —
           bez něj působí přechod studeně, i když se krémy shodují. */
        linear-gradient(90deg,
            transparent 20%,
            rgba(232, 204, 158, 0.3) 42%,
            rgba(236, 212, 170, 0.16) 58%,
            transparent 72%),
        linear-gradient(90deg,
            var(--kp-ref-cream) 0%,
            var(--kp-ref-cream) 26%,
            color-mix(in oklab, var(--kp-ref-cream) 88%, transparent) 36%,
            color-mix(in oklab, var(--kp-ref-cream) 62%, transparent) 46%,
            color-mix(in oklab, var(--kp-ref-cream) 26%, transparent) 56%,
            transparent 66%);
}

/* Pírka v hero — dekorace, ne obsah: leží pod textem a mají tak nízké krytí,
   že nesnižují kontrast popisků nad nimi. Vrstva 0: nad krémovým panelem
   (−1), pod fotkou (1) — obojí jsou vlevo, kde fotka stejně není. */
.kp-ref-hero__quill {
    position: absolute;
    z-index: 0;
    color: oklch(0.730 0.075 var(--kp-ref-h));
    pointer-events: none;
}

.kp-ref-hero__quill svg { width: 100%; height: 100%; }

.kp-ref-hero__quill--edge {
    left: -1.6rem;
    top: 7rem;
    width: 5.5rem;
    height: 15rem;
    opacity: 0.16;
    transform: rotate(-12deg);
}

.kp-ref-hero__quill--behind {
    left: 38%;
    top: 4.5rem;
    width: 8rem;
    height: 20rem;
    opacity: 0.1;
    transform: rotate(14deg);
}

/* Text má vlastní, VĚTŠÍ odsazení než kontejner karet (v návrhu 80 px proti
   55 px) — panel je full-bleed a jeho obsah drží vlastní okraj. */
.kp-ref-hero__inner {
    position: relative;
    z-index: 3;
    max-width: var(--kp-ref-max);
    margin-inline: auto;
    padding-inline: calc(var(--kp-ref-pad) + 1.5625rem);
}

.kp-ref-eyebrow {
    margin: 0 0 0.5rem;
    font-family: var(--kp-font-body);
    font-size: 0.8125rem;
    font-weight: 700;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: var(--kp-ref-gold-2);
}

/* Playfair Display — patkový nadpis se na webu natahuje jednou (App.razor)
   a používá se jen tady. Selektor je schválně `.kp-ref-hero h1.…`, ne holá
   třída: `.kp-site h1` v kp-site.css má specificitu (0,1,1), o jednu vyšší
   než holá třída, a v tmavém motivu barvou přebilo nadpis. Ověřeno měřením
   computed stylu na živé stránce. */
.kp-ref-hero h1.kp-ref-hero__title {
    margin: 0 0 0.55rem;
    font-family: var(--kp-font-head);
    font-weight: 400;
    font-size: clamp(2.75rem, 4.68vw, 4.75rem);   /* 76 px @ 1625 */
    line-height: 1.0;
    /* Prostrkání je dopočítané, ne zvolené: verzálková výška nadpisu je
       v návrhu 54 px (→ 76 px Playfairu), ale celý řádek „Galerie realizací"
       měří jen 516 px, kdežto Playfair při 76 px vysází 550. Předloha je tedy
       o něco užší Didone; nejbližší, co máme staženo, je Playfair, a rozdíl
       dorovná záporný tracking — výška i délka řádku pak sedí obojí. */
    letter-spacing: -0.028em;
    color: var(--kp-ref-ink);
}

.kp-ref-hero__lead {
    max-width: 25rem;
    margin: 0 0 1.85rem;
    font-family: var(--kp-font-body);
    font-size: 0.9375rem;
    line-height: 1.42;
    color: var(--kp-ref-ink-soft);
}

/* ---- odznaky důvěry ------------------------------------------------------
 *
 *  PROČ MAJÍ VLASTNÍ DESKU. Do 2026-08-28 ležela ta čtveřice přímo na hero
 *  fotce a spoléhala na to, že se fotka vlevo rozpustí do krému dřív, než
 *  k ní text dojde. Nerozpustila. Odměřeno z pixelů (`tools/render/`):
 *
 *      tmavý motiv, 1440 px   1. odznak 4,4:1   2. 3,3:1   3. 1,5:1   4. 1,3:1
 *      světlý motiv, 1440 px  všechny čtyři 2,4–2,8:1
 *
 *  Norma pro drobný text je 4,5:1. Čtvrtý popisek tedy nebyl „hůř čitelný",
 *  byl NEČITELNÝ — a ve světlém motivu byly pod normou všechny, jen to při
 *  krémovém pozadí nikoho netrklo.
 *
 *  Deska ten problém neřeší barvou textu, ale tím, že POD textem přestane
 *  být fotka: matné sklo si vezme, co je pod ním, rozostří to a stáhne
 *  k barvě motivu, takže je pozadí předvídatelné bez ohledu na to, kde
 *  zrovna fotka svítí. Zároveň z rozsypané čtveřice udělá JEDEN předmět,
 *  což je ta prémiovost, o kterou šlo.
 *
 *  Šířka `max-width` zůstává: řada se nesmí roztáhnout přes celou stránku,
 *  jinak se z ní stane lišta a přestane se číst jako součást hero textu.
 * ------------------------------------------------------------------------ */
.kp-ref-badges {
    display: flex;
    align-items: stretch;
    flex-wrap: wrap;
    gap: 0;
    /* 47rem bylo odměřeno pro drobnější písmo a pro řadu BEZ desky. Po
       zvětšení podtitulků na čitelnou velikost se do té šířky čtyři odznaky
       nevešly a řada se lámala na dva řádky. Deska navíc dovoluje být širší:
       dřív se musela vejít do krémové části, aby text neskončil na fotce —
       teď má vlastní podklad, takže na fotce ležet SMÍ. */
    max-width: min(100%, 54rem);
    margin: 0;
    padding: 0.55rem 0.35rem;
    list-style: none;

    border-radius: 16px;
    border: 1px solid var(--kp-ref-gold-line);
    background: color-mix(in oklab, var(--kp-ref-cream-2) 78%, transparent);
    backdrop-filter: blur(var(--kp-ref-frost, 10px)) saturate(1.08);
    -webkit-backdrop-filter: blur(var(--kp-ref-frost, 10px)) saturate(1.08);
    box-shadow:
        0 1px 0 color-mix(in oklab, #FFFFFF 30%, transparent) inset,
        0 10px 30px rgba(46, 34, 12, 0.14);
}

[data-theme="dark"] .kp-ref-badges {
    background: color-mix(in oklab, var(--kp-ref-cream-2) 82%, transparent);
    box-shadow:
        0 1px 0 rgba(255, 250, 238, 0.07) inset,
        0 12px 34px rgba(0, 0, 0, 0.38);
}

.kp-ref-badge {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.3rem 0.95rem;
    border-left: 1px solid var(--kp-ref-gold-line-soft);
}

.kp-ref-badge:first-child { border-left: 0; }

.kp-ref-badge__ico {
    flex: none;
    display: grid;
    place-items: center;
    width: 1.75rem;
    height: 1.75rem;
    border-radius: 999px;
    border: 1px solid var(--kp-ref-gold-line);
    background: color-mix(in oklab, var(--kp-ref-gold) 9%, transparent);
    color: var(--kp-ref-gold);
}

/* Spodní pás má ikonu holou, bez kroužku — jediný rozdíl proti hero. */
.kp-ref-badge--bare .kp-ref-badge__ico {
    width: auto;
    height: auto;
    border: 0;
    border-radius: 0;
    background: none;
}

.kp-ref-badge__text { min-width: 0; }

.kp-ref-badge__text b {
    display: block;
    font-family: var(--kp-font-body);
    font-weight: 700;
    font-size: 0.78rem;
    line-height: 1.25;
    white-space: nowrap;
    color: var(--kp-ref-ink);
}

/* Barva se ODVOZUJE od inkoustu, nebere se hotový „tlumený" token.
   `--kp-ref-ink-faint` (původní) dával na desce 2,4:1, `--kp-ref-ink-soft`
   3,2:1 — obojí pod normou 4,5:1 pro drobný text, jen to na krémovém pozadí
   nikoho netrklo. Osmaosmdesátiprocentní příměs inkoustu drží podtitul zřetelně
   tišší než tučný nadpis a přitom čitelný; a protože se míchá s plochou
   panelu, funguje ve světlém i tmavém motivu jedním zápisem. */
.kp-ref-badge__text > span {
    display: block;
    font-size: 0.72rem;
    line-height: 1.35;
    margin-top: 0.1rem;
    white-space: nowrap;
    color: color-mix(in oklab, var(--kp-ref-ink) 88%, var(--kp-ref-cream-2));
}

/* Na úzkém displeji se čtveřice láme na dva řádky. Svislý oddělovač by pak
   visel uprostřed prázdna u prvního odznaku druhého řádku, takže se
   u sudých položkách ruší a přibude vodorovný. */
@media (max-width: 46rem) {
    .kp-ref-badges { padding: 0.45rem 0.25rem; }
    .kp-ref-badge { padding: 0.42rem 0.7rem; flex: 1 1 45%; }
    .kp-ref-badge:nth-child(odd) { border-left: 0; }
    .kp-ref-badge:nth-child(n + 3) { border-top: 1px solid var(--kp-ref-gold-line-soft); }
}

/* Spodní pás důvěry stojí na vlastní krémové pilulce, takže vlastní desku
   nechce — jinak by vznikla deska v desce. */
.kp-ref-trust__items {
    padding: 0;
    border: 0;
    background: none;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    box-shadow: none;
}

/* ==========================================================================
 *  Tři karty velikostí
 * ========================================================================== */
/* Bez vlastní plochy: pozadí drží `.kp-ref` jako JEDEN přechod přes celý
   horní díl stránky (viz komentář tam). Každá plocha navíc by na svém okraji
   udělala šev. */
.kp-ref-sizes-section {
    background: transparent;
    padding-block: 0;
}

.kp-ref-sizes {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--kp-ref-gap);
}

.kp-ref-size {
    position: relative;
    display: block;
    /* Je to <button>, ne <a> — prohlížeč by mu jinak dal vlastní rám, pozadí
       i zarovnání textu na střed. */
    width: 100%;
    padding: 0;
    border: 0;
    background: none;
    text-align: left;
    font: inherit;
    cursor: pointer;
    aspect-ratio: 494 / 297;
    /* Poměr stran sám nestačí: na úzkém okně z něj vyjde karta ~200 px
       vysoká, do které se obloukový štítek (30 + 110) a tělo (nadpis, popis,
       patička) nevejdou najednou a překryjí se. Na desktopu se `min-height`
       neuplatní — poměr tam dává 297 px. */
    min-height: 288px;
    border-radius: 24px;
    overflow: hidden;
    color: var(--kp-ref-glass-ink);
    scroll-margin-top: 96px;
    /* Dva stíny, ne jeden: v návrhu je mezera mezi kartami znatelně tmavší
       než okolní krém (#B6AC9F proti #F0E7DD) — to udělá až blízký, sytější
       stín pod měkkým. S jediným rozostřeným stínem zůstala mezera skoro
       bílá (odměřeno `compare-galerie.py`, Δ 95). */
    box-shadow:
        0 3px 10px rgba(52, 38, 14, 0.34),
        0 10px 24px rgba(50, 36, 13, 0.22),
        0 24px 50px rgba(46, 34, 12, 0.24);
    transition:
        transform 0.32s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1)),
        box-shadow 0.32s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}

.kp-ref-size:hover,
.kp-ref-size:focus-visible { transform: translateY(-4px); box-shadow: 0 28px 56px rgba(46, 34, 12, 0.28); }
.kp-ref-size:focus-visible { outline: 3px solid var(--kp-ref-gold-fill); outline-offset: 3px; }

.kp-ref-size__photo { position: absolute; inset: 0; }

.kp-ref-size__photo img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    filter: saturate(1.05) contrast(1.02);
    transition: transform 0.5s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}

.kp-ref-size:hover .kp-ref-size__photo img { transform: scale(1.04); }

/* Olivové sklo ZLEVA, ne ztmavení zdola: v návrhu je levá třetina karty
   sytě olivová a doprava se rozpouští do fotky (odměřeno — na y = 400
   jde #766E3B → #4B4E28 → #463B0E napříč kartou). Druhá vrstva je jemné
   ztmavení zdola, aby patička držela kontrast i nad světlou trávou. */
.kp-ref-size__veil {
    position: absolute;
    inset: 0;
    background:
        linear-gradient(100deg,
            oklch(0.285 0.055 var(--kp-ref-veil-h) / 0.94) 0%,
            oklch(0.270 0.052 var(--kp-ref-veil-h) / 0.88) 18%,
            oklch(0.240 0.048 var(--kp-ref-veil-h) / 0.62) 36%,
            oklch(0.190 0.040 var(--kp-ref-veil-h) / 0.28) 58%,
            oklch(0.155 0.035 var(--kp-ref-veil-h) / 0.10) 80%,
            oklch(0.145 0.032 var(--kp-ref-veil-h) / 0.04) 100%),
        linear-gradient(0deg,
            oklch(0.125 0.022 var(--kp-ref-veil-h) / 0.60) 0%,
            oklch(0.125 0.022 var(--kp-ref-veil-h) / 0.22) 26%,
            oklch(0.125 0.022 var(--kp-ref-veil-h) / 0) 52%);
}

/* Rámeček karty je SVĚTLÁ vlasovka, ne zlatá. Odměřeno na horní hraně
   (#EDE1C9) i na levé (#DBD3C5) — teplá skoro bílá, nejjasnější nahoře
   a vlevo nahoře, dolů mizí do ztracena. Zlatý rámeček, který tu byl
   předtím, dělal z prémiové karty nálepku.
   Kreslí se maskovaným přechodem místo `border`: obyčejný rámeček má po
   celém obvodu jednu barvu a tenhle má po obvodu měnit krytí. */
.kp-ref-size::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 3;
    pointer-events: none;
    border-radius: inherit;
    padding: 1px;
    background: linear-gradient(152deg,
        rgba(255, 253, 247, 0.94) 0%,
        rgba(253, 248, 238, 0.62) 10%,
        rgba(250, 243, 230, 0.3) 26%,
        rgba(247, 239, 224, 0.14) 48%,
        rgba(244, 235, 218, 0.07) 74%,
        rgba(242, 232, 214, 0.05) 100%);
    -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    -webkit-mask-composite: xor;
    mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    mask-composite: exclude;
}

/* Rozostření fotky pod textem — v návrhu je levá třetina karty rozmazaná
   (směrodatná odchylka jasu 15–32 proti 40–68 vpravo), ne jen ztmavená.
   Právě tohle dělá ten „prémiový" dojem: text neleží na ostré fotce, ale
   na mléčném skle. Doprava se rozostření vytrácí maskou, takže kurník
   zůstane ostrý. */
.kp-ref-size__frost {
    position: absolute;
    inset: 0;
    -webkit-backdrop-filter: blur(var(--kp-ref-frost)) saturate(1.06);
    backdrop-filter: blur(var(--kp-ref-frost)) saturate(1.06);
    -webkit-mask-image: linear-gradient(90deg, #000 0%, #000 30%, rgba(0, 0, 0, 0.6) 45%, rgba(0, 0, 0, 0.18) 56%, transparent 66%);
    mask-image: linear-gradient(90deg, #000 0%, #000 30%, rgba(0, 0, 0, 0.6) 45%, rgba(0, 0, 0, 0.18) 56%, transparent 66%);
}

/* ---- obloukový štítek kategorie ---------------------------------------- */
/* Odměřeno: 70 × 110 px, 16 od levého a 30 od horního okraje karty. Uvnitř
   NENÍ výplň — je to jen zlatý obrys, olivové sklo prosvítá skrz. */
.kp-ref-size__tag {
    position: absolute;
    top: 30px;
    left: 16px;
    z-index: 2;
    display: grid;
    justify-items: center;
    gap: 0.55rem;
    width: 70px;
    padding: 1.05rem 0.4rem 0.95rem;
    border-radius: 24px 24px 12px 12px;
    color: var(--kp-ref-gold-fill);
}

/* Obrys štítku je v návrhu sotva znatelný a odshora dolů se ztrácí —
   plný `border` po celém obvodu z něj dělal orámovanou nálepku. Proto
   zase maskovaný přechod, jen ve zlaté a s mnohem nižším krytím. */
.kp-ref-size__tag::before {
    content: "";
    position: absolute;
    inset: 0;
    pointer-events: none;
    border-radius: inherit;
    padding: 1px;
    background: linear-gradient(168deg,
        var(--kp-ref-gold-hairline) 0%,
        oklch(0.828 0.085 var(--kp-ref-h) / 0.2) 34%,
        oklch(0.828 0.085 var(--kp-ref-h) / 0.08) 68%,
        oklch(0.828 0.085 var(--kp-ref-h) / 0.04) 100%);
    -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    -webkit-mask-composite: xor;
    mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    mask-composite: exclude;
}

/* Ikona je v návrhu tišší než popisek pod ní — nese ji tvar, ne kontrast. */
.kp-ref-size__tag .kp-refico { opacity: 0.82; }

.kp-ref-size__tag-label {
    font-family: var(--kp-font-body);
    font-size: 0.6875rem;
    font-weight: 700;
    line-height: 1.6;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    text-align: center;
    color: oklch(0.955 0.020 var(--kp-ref-h));
}

/* ---- tělo karty --------------------------------------------------------- */
.kp-ref-size__body {
    position: absolute;
    inset-inline: 0;
    bottom: 0;
    z-index: 2;
    display: block;
    padding: 0 1.25rem 1.3rem;
}

/* 26 px, ne 32: „Do 5 m²" má v návrhu verzálku 18 px a celý řetězec 87 px.
   Písmo je webové, ne patkové: patky patří NADPISŮM, a tohle je popisek na
   kartě. Dokud ho měla i karta, nebyl mezi nadpisem stránky a dlaždicí
   žádný typografický rozdíl. */
.kp-ref-size__title {
    display: block;
    font-family: var(--kp-font-body);
    font-weight: 600;
    font-size: 1.625rem;
    line-height: 1.12;
    color: var(--kp-ref-glass-ink);
}

/* Úzký sloupec a vyvážené lámání — návrh má popis na dvou skoro stejně
   dlouhých řádcích, ne na řádku a půl slově. */
.kp-ref-size__desc {
    display: block;
    max-width: 13.5rem;
    margin-top: 0.35rem;
    font-size: 0.875rem;
    line-height: 1.4;
    text-wrap: balance;
    color: var(--kp-ref-glass-ink-soft);
}

/* Patička je v návrhu ZAROVNANÁ DOLEVA (tlačítko končí zhruba v polovině
   karty), ne roztažená přes celou šířku — proto `justify-content` není
   `space-between`. */
/* Patička je v návrhu SKLENĚNÁ PILULKA, ne volně položené prvky: avatary,
   počet i tlačítko sedí v jednom zaobleném poli s mléčnou výplní a světlou
   vlasovkou. Výplň i rozostření jdou z Forge tokenů skla, takže je řídí
   posuvník „Sklo" v panelu Vzhled. */
.kp-ref-size__foot {
    display: inline-flex;
    align-items: center;
    gap: 0.8rem;
    margin-top: 1.05rem;
    padding: 0.3rem 0.42rem;
    border-radius: 999px;
    border: 1px solid var(--kp-ref-glass-edge);
    background: var(--kp-ref-glass-fill);
    -webkit-backdrop-filter: blur(calc(var(--kp-ref-frost) * 0.7)) saturate(1.1);
    backdrop-filter: blur(calc(var(--kp-ref-frost) * 0.7)) saturate(1.1);
}

/* Absolutní pozicování, ne záporné okraje ve flexu — vnořený flex spočítal
   záporné okraje na dvojici obrázků naprosto stejně (obě „druhé" dlaždice
   skončily na tomtéž místě), ověřeno měřením na živé stránce. */
.kp-ref-size__thumbs { position: relative; flex: none; width: 5.375rem; height: 2.125rem; }

.kp-ref-size__thumbs img {
    position: absolute;
    top: 0;
    width: 2.125rem;
    height: 2.125rem;
    border-radius: 999px;
    object-fit: cover;
    border: 1.5px solid oklch(0.828 0.085 var(--kp-ref-h) / 0.8);
    box-shadow: 0 2px 7px rgba(0, 0, 0, 0.4);
}

.kp-ref-size__thumbs img:nth-child(1) { left: 0; z-index: 3; }
.kp-ref-size__thumbs img:nth-child(2) { left: 1.625rem; z-index: 2; }
.kp-ref-size__thumbs img:nth-child(3) { left: 3.25rem; z-index: 1; }

.kp-ref-size__count {
    flex: none;
    font-size: 0.875rem;
    color: var(--kp-ref-glass-ink-soft);
    white-space: nowrap;
}

.kp-ref-size__cta {
    flex: none;
    display: grid;
    place-items: center;
    width: 2rem;
    height: 2rem;
    border-radius: 999px;
    background: linear-gradient(180deg, oklch(0.852 0.093 var(--kp-ref-h)), oklch(0.780 0.105 var(--kp-ref-h)));
    color: oklch(0.290 0.050 var(--kp-ref-h));
    transition: transform 0.25s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}

.kp-ref-size:hover .kp-ref-size__cta { transform: scale(1.09); }

/* ==========================================================================
 *  Pás detailních skupin
 * ========================================================================== */
/* Svislý rytmus je odměřený, ne odhadnutý: karty končí na y = 683, nadpis
   pásu má v návrhu horní hranu na 702 a dlaždice na 733. Odtud 1,2 rem nad
   nadpisem a 0,7 rem pod ním. */
.kp-ref-parts-section {
    background: var(--kp-ref-cream-2);
    padding-block: 1.2rem 0;
}

.kp-ref-parts__head {
    margin: 0 0 0.7rem;
    font-family: var(--kp-font-body);
    font-size: 0.8125rem;
    font-weight: 600;
    letter-spacing: 0.13em;
    text-transform: uppercase;
    color: oklch(0.385 0.018 var(--kp-ref-h));
}

/* Pás + kulaté tlačítko vedle sebe: dlaždice mají pevnou šířku, takže se
   jich při 1625 px vejde přesně sedm a osmá začíná za okrajem — přesně to,
   na co v návrhu ukazuje šipka. */
.kp-ref-rail { position: relative; display: flex; align-items: center; gap: 1.0625rem; }

.kp-ref-rail__track {
    flex: 1;
    min-width: 0;
    display: flex;
    gap: 1.0625rem;                       /* 17 px */
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    scrollbar-width: none;
    padding-block: 4px;                   /* místo pro stín dlaždic */
}

.kp-ref-rail__track::-webkit-scrollbar { display: none; }
.kp-ref-rail__track:focus-visible { outline: 3px solid var(--kp-ref-gold-fill); outline-offset: 4px; border-radius: 18px; }

.kp-ref-rail__btn {
    flex: none;
    display: grid;
    place-items: center;
    width: 2.875rem;
    height: 2.875rem;
    border: 0;
    border-radius: 999px;
    background: var(--kp-ref-panel);
    color: var(--kp-ref-gold);
    cursor: pointer;
    box-shadow: 0 6px 18px rgba(70, 52, 24, 0.16);
    transition: transform 0.22s ease, box-shadow 0.22s ease;
}

.kp-ref-rail__btn:hover { transform: scale(1.06); box-shadow: 0 8px 22px rgba(70, 52, 24, 0.22); }
.kp-ref-rail__btn:focus-visible { outline: 3px solid var(--kp-ref-gold-fill); outline-offset: 3px; }

/* Tlačítko zpět v návrhu vidět NENÍ — pás stojí na začátku. Objeví se, až
   je čím posouvat zpátky; třídu `is-scrolled` nasazuje kp-site.js podle
   skutečného `scrollLeft`, ne podle počtu kliknutí. */
.kp-ref-rail__btn--prev {
    position: absolute;
    left: -1.4rem;
    z-index: 4;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.25s ease, transform 0.22s ease;
}

.kp-ref-rail.is-scrolled .kp-ref-rail__btn--prev { opacity: 1; pointer-events: auto; }

/* Vejde-li se obsah celý, šipky zmizí docela — tlačítko, po kterém se nic
   nestane, je horší než žádné. Třídu nasazuje `syncRails` podle SKUTEČNÉ
   šířky obsahu, ne podle počtu dlaždic, takže platí i po zvětšení písma
   nebo po přidání sedmé sady. */
.kp-ref-rail.is-static .kp-ref-rail__btn { display: none; }

/* Dlaždice byla `<div>`, dokud neměla co otevřít. Teď je to `<button>`, tedy
   se musí přebít jeho vlastní vzhled (rámeček, pozadí, zarovnání textu na
   střed) — jinak by se na Safari objevil systémový rámeček kolem fotky. */
.kp-ref-part {
    position: relative;
    flex: none;
    display: flex;
    align-items: center;
    gap: 0.75rem;
    width: 193px;
    height: 95px;
    padding: 0 0.85rem;
    border: 0;
    border-radius: 14px;
    overflow: hidden;
    scroll-snap-align: start;
    background: var(--kp-ref-cream-3);
    text-align: left;
    font: inherit;
    cursor: pointer;
    box-shadow: 0 8px 20px rgba(46, 34, 12, 0.16);
    transition:
        transform 0.3s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1)),
        box-shadow 0.3s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}

.kp-ref-part:hover,
.kp-ref-part:focus-visible {
    transform: translateY(-3px);
    box-shadow: 0 14px 30px rgba(46, 34, 12, 0.26);
}

.kp-ref-part:focus-visible {
    outline: 3px solid var(--kp-a, #3C7A34);
    outline-offset: 3px;
}

.kp-ref-part:hover .kp-ref-part__arrow { transform: translateX(3px); }

@media (prefers-reduced-motion: reduce) {
    .kp-ref-part { transition: none; }
    .kp-ref-part:hover,
    .kp-ref-part:focus-visible { transform: none; }
    .kp-ref-part:hover .kp-ref-part__arrow { transform: none; }
}

.kp-ref-part__photo {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* Fotka je v návrhu jen tušená a otevírá se v PRAVÉM HORNÍM rohu — proto
   kruhový, ne vodorovný přechod. S vodorovným se sice fotka ukázala, ale
   spolu s ní zesvětlal i pruh pod popiskem a „Voda a napáječky" se v něm
   ztratilo; kruh nechá dosvit tam, kde žádný text není. */
.kp-ref-part__veil {
    position: absolute;
    inset: 0;
    background:
        radial-gradient(135% 170% at 106% -24%,
            rgba(28, 22, 13, 0.14) 0%,
            rgba(22, 17, 10, 0.58) 38%,
            rgba(15, 12, 7, 0.88) 68%,
            rgba(12, 10, 6, 0.94) 100%),
        linear-gradient(0deg, rgba(10, 8, 5, 0.45), rgba(10, 8, 5, 0) 62%);
}

.kp-ref-part__icon {
    position: relative;
    z-index: 1;
    flex: none;
    display: grid;
    place-items: center;
    width: 2.875rem;
    height: 2.875rem;
    border-radius: 999px;
    border: 1px solid oklch(0.828 0.085 var(--kp-ref-h) / 0.5);
    color: var(--kp-ref-gold-fill);
}

.kp-ref-part__text { position: relative; z-index: 1; min-width: 0; }

.kp-ref-part__text b {
    display: block;
    font-family: var(--kp-font-body);
    font-weight: 600;
    font-size: 0.8125rem;
    line-height: 1.3;
    color: oklch(0.955 0.017 var(--kp-ref-h));
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.kp-ref-part__text > span {
    display: block;
    margin-top: 0.15rem;
    font-size: 0.6875rem;
    line-height: 1.3;
    color: oklch(0.955 0.017 var(--kp-ref-h) / 0.62);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.kp-ref-part__arrow {
    position: absolute;
    right: 0.85rem;
    bottom: 0.8rem;
    z-index: 1;
    color: var(--kp-ref-gold-fill);
    transition: transform 0.3s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}

/* ==========================================================================
 *  Spodní pás důvěry
 * ========================================================================== */
/* Jediné místo, kde přechod zůstává — úplný spodek zóny, kde se krém
   podle návrhu mírně stmívá (#E5DACF na y = 958). Nahoře začíná stejnou
   barvou jako sekce nad ním, takže tam žádný zlom není. */
.kp-ref-trust-section {
    background: linear-gradient(180deg, var(--kp-ref-cream-2) 0%, var(--kp-ref-cream-2) 62%, var(--kp-ref-cream-3) 100%);
    padding-block: 1.05rem 1.4rem;   /* horní hrana pilulky na y = 849 */
}

/* Dlouhá pilulka: odměřeno 97 px na výšku, poloměr = polovina. */
.kp-ref-trust {
    position: relative;
    display: flex;
    align-items: center;
    gap: 1.5rem;
    min-height: 97px;
    /* Levé odsazení drží místo maskotovi. Návrh má první ikonu 265 px od
       levé hrany pilulky, tam ale stojí fotografická slepice s kuřetem
       (154 px na šířku); kreslená Pepina je štíhlejší, takže by po ní zůstala
       díra. 216 px je kompromis — mezeru vyplní pírko, které v návrhu leží
       na témž místě. */
    padding: 0.6rem 2.25rem 0.6rem 13.5rem;
    border: 1px solid oklch(0.727 0.092 var(--kp-ref-h) / 0.3);
    border-radius: 999px;
    /* Ne bílá: v návrhu je pilulka jen o kousek světlejší než krém kolem
       (#F2EBE3 proti #F0E7DD). Bílá výplň vypadala jako nalepený papír. */
    background: linear-gradient(180deg, oklch(0.955 0.013 var(--kp-ref-h)) 0%, oklch(0.938 0.014 var(--kp-ref-h)) 100%);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7);
}

/* Slepička PŘETÉKÁ přes pás — v návrhu jí nohy končí pod spodní hranou
   a hřebínek nad horní. Kreslená Pepina je vyšší než fotografická slepice
   z návrhu, proto sedí níž a je menší, aby z pásu nevyrostla o půl výšky. */
.kp-ref-trust__mascot {
    position: absolute;
    left: 2.1rem;
    bottom: -0.9rem;
    width: 7.5rem;
    height: 7.5rem;
    pointer-events: none;
}

/* `KpAvatar` sází kresbu na `width: 100%; height: auto`, a Pepina je na výšku
   (512 × 760) — v boxu 120 px by tedy měřila 178 px a vyrostla z pásu.
   Tady se proto řídí VÝŠKOU boxu, ne jeho šířkou. */
.kp-ref-trust__mascot .kp-avatar__art img {
    width: auto;
    height: 100%;
    max-width: 100%;
}

/* Dekorativní pírka u obou konců. Pilulka je oříznout nemůže (`overflow`
   by ustřihl i maskota), drží je proto nízké krytí. */
.kp-ref-trust__quill {
    position: absolute;
    top: 50%;
    width: 4.5rem;
    height: 12rem;
    color: oklch(0.665 0.085 var(--kp-ref-h));
    opacity: 0.34;
    pointer-events: none;
}

.kp-ref-trust__quill svg { width: 100%; height: 100%; }
.kp-ref-trust__quill--left { left: 8rem; transform: translateY(-52%) rotate(28deg); }
.kp-ref-trust__quill--right { right: -0.6rem; transform: translateY(-50%) rotate(-22deg); }

.kp-ref-trust__items {
    flex: 1;
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 0;
    margin: 0;
    padding: 0;
    list-style: none;
    min-width: 0;
}

.kp-ref-trust__items .kp-ref-badge { padding-inline: 1.6rem; }
.kp-ref-trust__items .kp-ref-badge:first-child { padding-left: 0; }
/* Spodní pás má v návrhu ZNATELNĚ větší písmo než odznaky v hero — nadpis
   „100% skutečné fotografie" tam měří 162 px, kdežto v hero řádek téže délky
   jen 130. Ikona je taky větší (30 px) a bez kroužku. */
.kp-ref-trust .kp-ref-badge__ico { color: var(--kp-ref-gold); }
.kp-ref-trust .kp-ref-badge__text b { font-size: 0.875rem; }
.kp-ref-trust .kp-ref-badge__text > span { font-size: 0.75rem; color: var(--kp-ref-ink-soft); }

/* ==========================================================================
 *  Tmavý motiv — celá zóna, ne jen text
 *  ---------------------------------------------------------------------
 *  Bez tohohle bloku by stránka v noci zůstala krémová (pravidlo „Každá
 *  sekce musí ctít motiv"). Zlatá se NEMĚNÍ — je to značková barva návrhu
 *  a na tmavém podkladu drží kontrast sama.
 * ========================================================================== */
[data-theme="dark"] .kp-ref,
[data-theme="dark"] .kp-site--ref {
    /* Stejný odstín (`--kp-ref-h`), jen převrácená světlost — proto tu není
       ani jeden pevný hex: posuvník odstínu přebarví i noc. */
    --kp-ref-page: oklch(0.178 0.012 var(--kp-ref-h));
    --kp-ref-cream: oklch(0.212 0.015 var(--kp-ref-h));
    --kp-ref-cream-2: oklch(0.192 0.014 var(--kp-ref-h));
    --kp-ref-cream-3: oklch(0.166 0.012 var(--kp-ref-h));
    --kp-ref-panel: oklch(0.238 0.017 var(--kp-ref-h));

    --kp-ref-ink: oklch(0.945 0.017 var(--kp-ref-h));
    --kp-ref-ink-soft: oklch(0.775 0.021 var(--kp-ref-h));
    --kp-ref-ink-faint: oklch(0.652 0.020 var(--kp-ref-h));

    --kp-ref-gold-line: oklch(0.79 0.078 var(--kp-ref-h) / 0.34);
    --kp-ref-gold-line-soft: oklch(0.79 0.078 var(--kp-ref-h) / 0.18);
    --kp-ref-gold-hairline: oklch(0.85 0.075 var(--kp-ref-h) / 0.3);
}

[data-theme="dark"] .kp-ref-hero::before {
    background:
        radial-gradient(90% 120% at 8% 0%, oklch(0.252 0.019 var(--kp-ref-h)) 0%, oklch(0.252 0.019 var(--kp-ref-h) / 0) 58%),
        linear-gradient(112deg, var(--kp-ref-cream) 0%, var(--kp-ref-cream-2) 46%, var(--kp-ref-cream-3) 100%);
}

[data-theme="dark"] .kp-ref-trust {
    background: linear-gradient(180deg, rgba(38, 31, 22, 0.92) 0%, rgba(30, 25, 17, 0.9) 100%);
    border-color: oklch(0.790 0.078 var(--kp-ref-h) / 0.26);
    box-shadow: inset 0 1px 0 oklch(0.95 0.04 var(--kp-ref-h) / 0.08);
}

[data-theme="dark"] .kp-ref-rail__btn { background: oklch(0.262 0.020 var(--kp-ref-h)); color: oklch(0.840 0.082 var(--kp-ref-h)); }
[data-theme="dark"] .kp-ref-parts__head { color: var(--kp-ref-ink-soft); }

/* --------------------------------------------------------------------------
 *  Hlavička nad hero — NIC ZVLÁŠTNÍHO
 *  ---------------------------------------------------------------------
 *  Tady dřív stálo šest bloků, které z hlavičky na /reference dělaly něco
 *  jiného než na domovské: krémový pruh pod navigací, tmavé písmo, zlatá
 *  aktivní položka, měkčí stín pod kohoutem — a v tmavém motivu totéž
 *  ještě jednou. Vzniklo to v době, kdy měla každá z těch dvou stránek za
 *  hlavičkou jinou fotku a bílé písmo z domovské se na referencích ztrácelo.
 *
 *  Od chvíle, kdy `.kp-ref__photo` nese TÝŽ snímek ve stejném výřezu jako
 *  `.kp-hero__media` (stejné `scale`, `transform-origin` i filtr), ten důvod
 *  zmizel: za oběma hlavičkami je pixel po pixelu totéž. Vlastní kabát tedy
 *  nic neřešil a přinášel dvě potíže — kulatá tlačítka v něm vycházela
 *  prázdná a při přechodu mezi stránkami se hlavička viditelně převlékala.
 *
 *  `kp-header--overlay` z `kp-hero.css` proto platí i tady, beze změn.
 *  Zóna si drží zlatý kabát ve všem ostatním; hlavička k němu nepatří. */

/* ==========================================================================
 *  Responzivita
 * ========================================================================== */
@media (max-width: 1280px) {
    .kp-ref-size__title { font-size: 1.6rem; }
    .kp-ref-size__desc { font-size: 0.8125rem; }
    .kp-ref-badge { padding-inline: 1.1rem; }
    .kp-ref-trust { padding-left: 10rem; }
    .kp-ref-trust__quill--left { left: 7.5rem; }
}

@media (max-width: 1024px) {
    .kp-ref-hero { padding-top: 6.5rem; }
    .kp-ref-sizes { grid-template-columns: 1fr 1fr; }
    .kp-ref-sizes > :last-child { grid-column: span 2; aspect-ratio: 2.6 / 1; }
    .kp-ref-trust__items { grid-template-columns: 1fr 1fr; row-gap: 0.9rem; }
    .kp-ref-trust { border-radius: 32px; padding: 1.4rem 1.6rem 1.4rem 10rem; }
    .kp-ref-trust__items .kp-ref-badge:nth-child(3) { padding-left: 0; border-left: 0; }
}

@media (max-width: 780px) {
    /* Na telefonu se fotka z pravého sloupce stává pruhem přes celou šířku
       nahoře — pořád doznívá dolů toutéž maskou, jen svisle místo do stran.
       Text pod ni odsune `padding-top`, takže na fotce neleží. */
    .kp-ref__photo { width: 100%; height: 16rem; }
    .kp-ref__photo picture, .kp-ref__photo img { object-position: 58% 55%; }

    /* Vodorovný závoj by na úzkém okně přetáhl krém přes levou třetinu
       pruhu; svislé rozplynutí fotky ho tu plně nahrazuje. */
    .kp-ref-hero::after { display: none; }

    .kp-ref-hero { padding-top: 16.5rem; padding-bottom: 1.75rem; }
    .kp-ref-hero::before { inset-block-start: 64px; border-radius: 18px 18px 0 0; }
    .kp-ref-hero__inner { padding-inline: var(--kp-ref-pad); }
    .kp-ref-badges { gap: 0.9rem 0; }
    .kp-ref-badge { flex: 1 1 45%; padding-inline: 0; border-left: 0; }
    .kp-ref-sizes { grid-template-columns: 1fr; }
    .kp-ref-sizes > :last-child { grid-column: auto; aspect-ratio: 494 / 297; }
    .kp-ref-trust {
        flex-direction: column;
        align-items: stretch;
        padding: 6.5rem 1.4rem 1.4rem;
        border-radius: 26px;
    }
    .kp-ref-trust__mascot { left: 50%; top: 0.4rem; bottom: auto; translate: -50% 0; width: 6rem; height: 6rem; }
    .kp-ref-trust__items { grid-template-columns: 1fr; row-gap: 1rem; }
    .kp-ref-trust__items .kp-ref-badge { padding-left: 0; border-left: 0; }
    .kp-ref-trust__quill { display: none; }
}

/* ==========================================================================
 *  Vizuální efekty z panelu Vzhled
 *  ---------------------------------------------------------------------
 *  „Vyvážené" a „Minimální" znamenají BEZ rozostření — `backdrop-filter`
 *  je na slabším zařízení nejdražší věc na stránce. Náhradou je hustší
 *  výplň, aby text v patičce a pod nadpisem nezůstal na holé fotce.
 *  Stejný postup jako u `.kp-spot__tag` v kp-config.css.
 * ========================================================================== */
:root[data-effects="balanced"] .kp-ref-size__frost,
:root[data-effects="minimal"] .kp-ref-size__frost {
    -webkit-backdrop-filter: none;
    backdrop-filter: none;
    background: linear-gradient(90deg, rgba(26, 28, 14, 0.42) 0%, rgba(26, 28, 14, 0.3) 34%, transparent 66%);
}

:root[data-effects="balanced"] .kp-ref-size__foot,
:root[data-effects="minimal"] .kp-ref-size__foot {
    -webkit-backdrop-filter: none;
    backdrop-filter: none;
    background: rgba(28, 30, 16, 0.46);
}

:root[data-effects="minimal"] .kp-ref-size { box-shadow: none; }

@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
    .kp-ref-size__frost { background: linear-gradient(90deg, rgba(26, 28, 14, 0.42) 0%, rgba(26, 28, 14, 0.3) 34%, transparent 66%); }
    .kp-ref-size__foot { background: rgba(28, 30, 16, 0.46); }
}

/* Po dobu přechodu se tu NIC nenahrazuje — a to je oprava, ne opomenutí.
   Stála tu dvě pravidla, která kartám na dobu přechodu PŘIDÁVALA tmavou
   plochu, ale rozostření nevypínala (na rozdíl od svých vzorů výš). Karta
   proto byla po celou dobu přechodu tmavší, než má být, a v okamžiku dojetí
   se rázem prosvětlila — naměřeno na ploše pilulky v patičce skok 23 (jas
   54 -> 77) mezi dvěma sousedními snímky, na frostu 8, na štítku 5. To je
   ta „změna průsvitnosti prvků na kartách" ze záznamu klienta.
   Náhrada tu nemá co dělat: `backdrop-filter` se do snímku KOŘENE zachytí
   normálně a karta žádné `view-transition-name` nenese, takže je uvnitř
   kořene. Berličku potřebuje jen vrstva vyříznutá vlastním jménem — proč,
   je v kp-view-transitions.css u hlavičky.
   Platí to, dokud se `backdrop-filter` do snímku kořene zachytává. Kdyby
   se ukázalo, že v nějakém prohlížeči ne, smí náhradu vrátit jen ten, kdo
   si to na tom stroji ZMĚŘÍ — a musí s ní vypnout i `backdrop-filter`,
   jinak se zase jen přičte. Tohle je už druhý pokus na témže místě. */

/* ==========================================================================
 *  Omezený pohyb
 * ========================================================================== */
:root[data-motion="reduced"] .kp-ref-size,
:root[data-motion="reduced"] .kp-ref-size__photo img,
:root[data-motion="reduced"] .kp-ref-size:hover .kp-ref-size__photo img,
:root[data-motion="reduced"] .kp-ref-size__cta,
:root[data-motion="reduced"] .kp-ref-rail__btn { transition: none; transform: none; }

:root[data-motion="reduced"] .kp-ref-rail__track { scroll-behavior: auto; }

/* ==========================================================================
 *  Galerie realizací
 *
 *  Jedna mřížka pro všechny velikosti; tři karty nad ní ji filtrují. Proč ne
 *  samostatná obrazovka na velikost: realizací je devět a rozdělují se 1 / 7
 *  / 1, takže dvě ze tří „obrazovek" by měly jedinou kartu. Filtr nad jednou
 *  mřížkou nemá slepé uličky, jde z něj vycouvat jedním klikem a unese i to,
 *  až realizací přibude.
 * ========================================================================== */

.kp-ref-gallery-section {
    position: relative;
    background: transparent;
    padding-block: clamp(2.5rem, 5vw, 4.5rem);
}

.kp-ref-gallery__head {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: clamp(1.25rem, 2.5vw, 2rem);
}

.kp-ref-gallery__title {
    margin: 0;
    font-family: var(--kp-font-head);
    font-weight: 500;
    font-size: clamp(1.5rem, 2.6vw, 2.1rem);
    color: var(--kp-ref-ink);
    letter-spacing: -0.01em;
}

.kp-ref-gallery__count {
    margin: 0.25rem 0 0;
    font-size: 0.9rem;
    color: var(--kp-ref-ink-faint);
}

/* ---- nástroje nad mozaikou --------------------------------------------- */
.kp-ref-gallery__tools {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.6rem;
}

/* „Prohlédnout všechny fotky" — druhá, tišší cesta do prohlížeče. Pilulka
   jako pilulky filtru pod ním, ale plná a tmavá: filtr MĚNÍ, co je vidět,
   tohle jediné tlačítko OTEVÍRÁ prohlížeč. Kdyby vypadala stejně, byla by to
   čtvrtá pilulka v řadě tří. */
.kp-ref-playall {
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    padding: 0.55rem 1.05rem;
    border-radius: 999px;
    border: 1px solid transparent;
    background: var(--kp-ref-ink);
    color: var(--kp-ref-cream);
    font: inherit;
    font-size: 0.88rem;
    font-weight: 600;
    cursor: pointer;
    transition:
        background 0.24s ease,
        transform 0.24s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}

.kp-ref-playall:hover { background: color-mix(in oklab, var(--kp-ref-ink) 84%, var(--kp-a, #3C7A34)); }
.kp-ref-playall:focus-visible { outline: 3px solid var(--kp-a, #3C7A34); outline-offset: 3px; }

/* ---- filtr u výsledku --------------------------------------------------
 *
 *  PROČ DUPLICITA S KARTAMI VELIKOSTÍ JE ZÁMĚR. Karty nahoře jsou obrazová
 *  vrata do galerie — fotka, ikona, věta. Tenhle řádek je pracovní ovladač
 *  a stojí u toho, co mění. Na telefonu karty stojí POD SEBOU, takže mezi
 *  první z nich a galerií leží skoro dvě obrazovky; vracet se tam kvůli
 *  přepnutí velikosti je přesně ten krok, po kterém lidé filtrování vzdají.
 *
 *  ŘÁDEK SE NEZALAMUJE, ROLUJE. Čtyři pilulky s počty se na 320px displeji
 *  do jedné řádky nevejdou a zalomení by z ovladače udělalo dva řádky, které
 *  odsunou mozaiku pod okraj. Vodorovné rolování se `scroll-snap` drží výšku
 *  a je to na dotyku přirozený pohyb. Záporné okraje s odpovídající výplní
 *  pouštějí pilulky až k hraně obsahové osy, takže poslední z nich nekončí
 *  useknutá v půlce mezery.
 * ---------------------------------------------------------------------- */
.kp-ref-chips {
    display: flex;
    gap: 0.5rem;
    margin: 0 0 clamp(0.9rem, 2vw, 1.25rem);
    padding-bottom: 2px;                 /* místo pro prstenec u fokusu */
    overflow-x: auto;
    scrollbar-width: none;
    scroll-snap-type: x proximity;
    -webkit-overflow-scrolling: touch;
}

.kp-ref-chips::-webkit-scrollbar { display: none; }

.kp-ref-chip {
    flex: none;
    scroll-snap-align: start;
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    /* 44 px na výšku je dotyková plocha, ne estetika — pod ní se na telefonu
       trefuje vedle. */
    min-height: 44px;
    padding: 0.5rem 0.95rem;
    border-radius: 999px;
    border: 1px solid var(--kp-ref-gold-line);
    background: var(--kp-ref-panel);
    color: var(--kp-ref-ink);
    font: inherit;
    font-size: 0.88rem;
    font-weight: 600;
    white-space: nowrap;
    cursor: pointer;
    transition:
        background 0.22s ease,
        border-color 0.22s ease,
        color 0.22s ease;
}

.kp-ref-chip:hover { border-color: var(--kp-ref-gold); }

.kp-ref-chip:focus-visible {
    outline: 3px solid var(--kp-a, #3C7A34);
    outline-offset: 2px;
}

/* Zvolená pilulka nese barvu značky, ne zlatou dekoraci stránky — stejná
   volba jako u prstence na kartě velikosti: STAV patří akcentu z panelu
   Vzhled, aby se s ním přepnul. */
.kp-ref-chip.is-on {
    background: var(--kp-a, #3C7A34);
    border-color: var(--kp-a, #3C7A34);
    color: #FFFFFF;
}

/* Počet realizací. Vlastní pozadí, ne jen slabší barva: na zvolené pilulce
   by světlejší bílá na zeleném splynula s popiskem vedle. */
.kp-ref-chip__n {
    display: inline-grid;
    place-items: center;
    min-width: 1.45rem;
    height: 1.45rem;
    padding: 0 0.3rem;
    border-radius: 999px;
    background: color-mix(in oklab, var(--kp-ref-ink) 10%, transparent);
    font-size: 0.74rem;
    font-weight: 700;
    line-height: 1;
}

.kp-ref-chip.is-on .kp-ref-chip__n {
    background: rgba(255, 255, 255, 0.22);
    color: #FFFFFF;
}

@media (prefers-reduced-motion: reduce) {
    .kp-ref-chip { transition: none; }
}

/* ---- mozaika realizací -------------------------------------------------
 *
 *  ČTVEREC, NE 4:3. Fotky klienta jsou na šířku i na výšku a v mřížce
 *  různých poměrů se dlaždice nesrovnají do řádků — mozaika pak vypadá jako
 *  chyba sazby. Čtverec je jediný poměr, který snese obojí bez ohledu na to,
 *  co přibude příště, a `object-fit: cover` ubere z delší strany symetricky.
 *
 *  MŘÍŽKA MÁ PEVNÝ POČET SLOUPCŮ, ne `auto-fill`. S `auto-fill` vycházel na
 *  úzkém displeji dvousloupec (miniatura přes půl obrazovky — to není
 *  mozaika, to je seznam) a na širokém devět sloupců po 118 px, kde se
 *  z kurníku stal odznáček. Tři / čtyři / šest je odměřený kompromis: na
 *  360px telefonu vyjde dlaždice na 104 px, na 1440px displeji na 186 px.
 *
 *  MEZERA JE MALÁ ZÁMĚRNĚ. Sada má být čtená jako JEDNA plocha, ne jako
 *  hromádka karet — proto 6/10 px, žádné stíny a zaoblení jen na krajních
 *  rozích panelu. To je jazyk kontaktního archu a stárne líp než karty.
 * ------------------------------------------------------------------------ */
.kp-ref-mosaic {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 6px;
    border-radius: 20px;
    overflow: hidden;
}

@media (min-width: 560px) {
    .kp-ref-mosaic { grid-template-columns: repeat(4, 1fr); gap: 8px; }
}

@media (min-width: 900px) {
    .kp-ref-mosaic { grid-template-columns: repeat(6, 1fr); gap: 10px; border-radius: 24px; }
}

.kp-ref-tile {
    position: relative;
    display: block;
    width: 100%;
    aspect-ratio: 1;
    padding: 0;
    margin: 0;
    border: 0;
    overflow: hidden;
    background: var(--kp-ref-cream-3);
    text-align: left;
    font: inherit;
    color: #FFFFFF;
    cursor: pointer;
}

.kp-ref-tile__photo {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    transition: transform 0.55s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}

.kp-ref-tile:hover .kp-ref-tile__photo,
.kp-ref-tile:focus-visible .kp-ref-tile__photo { transform: scale(1.06); }

/* Závoj je ve dvou stavech: klidový drží čitelné číslo v rohu, silnější se
   zapíná pod kurzorem spolu s popiskem. Bez klidového by číslo na světlé
   fotce zmizelo — ověřeno na dlaždici 13 (kurník proti obloze). */
.kp-ref-tile__veil {
    position: absolute;
    inset: 0;
    background: linear-gradient(180deg,
        rgba(20, 15, 8, 0) 46%,
        rgba(20, 15, 8, 0.30) 74%,
        rgba(16, 12, 6, 0.66) 100%);
    transition: opacity 0.3s ease;
}

.kp-ref-tile::after {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(180deg, rgba(20, 15, 8, 0.10), rgba(16, 12, 6, 0.72));
    opacity: 0;
    transition: opacity 0.3s ease;
}

.kp-ref-tile:hover::after,
.kp-ref-tile:focus-visible::after { opacity: 1; }

.kp-ref-tile:focus-visible {
    outline: 3px solid var(--kp-a, #3C7A34);
    outline-offset: -3px;
    z-index: 2;
}

/* Pořadové číslo patkovým řezem — jediný trvalý popisek na dlaždici.
   Velikost říká nadpis sekce, takže se tu neopakuje. */
.kp-ref-tile__no {
    position: absolute;
    left: 0.55rem;
    bottom: 0.42rem;
    z-index: 1;
    font-family: var(--kp-font-head);
    font-size: clamp(0.95rem, 2.4vw, 1.15rem);
    font-weight: 500;
    line-height: 1;
    letter-spacing: 0.01em;
    text-shadow: 0 2px 10px rgba(10, 8, 4, 0.6);
    transition: transform 0.3s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}

.kp-ref-tile:hover .kp-ref-tile__no,
.kp-ref-tile:focus-visible .kp-ref-tile__no { transform: translateY(-1.05rem); }

/* Počet fotek. Bez pilulky a bez rozostření: na 104px dlaždici zabírala
   skleněná placka desetinu plochy fotky. Stačí ikona a číslo se stínem. */
.kp-ref-tile__count {
    position: absolute;
    right: 0.45rem;
    top: 0.4rem;
    z-index: 1;
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
    font-size: 0.7rem;
    font-weight: 700;
    line-height: 1;
    color: rgba(255, 255, 255, 0.92);
    filter: drop-shadow(0 1px 4px rgba(10, 8, 4, 0.75));
}

/* Popisek se vysune zpod čísla. Na dotykovém displeji hover není a nevadí:
   totéž nese `aria-label` a nadpis sekce nad mozaikou. */
.kp-ref-tile__cap {
    position: absolute;
    left: 0.55rem;
    right: 0.5rem;
    bottom: 0.45rem;
    z-index: 1;
    font-size: 0.72rem;
    line-height: 1.2;
    color: rgba(255, 255, 255, 0.9);
    text-shadow: 0 1px 8px rgba(10, 8, 4, 0.65);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    opacity: 0;
    transform: translateY(0.35rem);
    transition: opacity 0.28s ease, transform 0.28s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}

.kp-ref-tile:hover .kp-ref-tile__cap,
.kp-ref-tile:focus-visible .kp-ref-tile__cap { opacity: 1; transform: translateY(0); }

/* ---- odkrytí zbytku ---------------------------------------------------- */
.kp-ref-more {
    margin: clamp(1.1rem, 2.4vw, 1.6rem) 0 0;
    text-align: center;
}

.kp-ref-more__btn {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.62rem 1.35rem;
    border-radius: 999px;
    border: 1px solid var(--kp-ref-gold-line);
    background: var(--kp-ref-panel);
    color: var(--kp-ref-ink);
    font: inherit;
    font-size: 0.9rem;
    font-weight: 600;
    cursor: pointer;
    transition: background 0.24s ease, border-color 0.24s ease;
}

.kp-ref-more__btn:hover { background: var(--kp-ref-cream); border-color: var(--kp-ref-gold); }
.kp-ref-more__btn:focus-visible { outline: 3px solid var(--kp-a, #3C7A34); outline-offset: 3px; }

.kp-ref-more__arrow { transform: rotate(90deg); }

@media (prefers-reduced-motion: reduce) {
    .kp-ref-tile__photo,
    .kp-ref-tile__no,
    .kp-ref-tile__cap,
    .kp-ref-tile::after,
    .kp-ref-playall,
    .kp-ref-more__btn { transition: none; }

    .kp-ref-tile:hover .kp-ref-tile__photo,
    .kp-ref-tile:focus-visible .kp-ref-tile__photo { transform: none; }

    .kp-ref-tile:hover .kp-ref-tile__no,
    .kp-ref-tile:focus-visible .kp-ref-tile__no { transform: none; }
}


/* ---- zvolená velikost --------------------------------------------------
 *
 *  Ostatní karty se NEZTMAVUJÍ ani nezprůhledňují. Zkoušelo se to (krytí
 *  0,62) a vypadalo to jako porucha vykreslování, ne jako volba — fotky
 *  vybledly a karta vedle působila rozbitě.
 *
 *  Stav nese ZVOLENÁ karta, a to trojicí, kterou oko čte jako jeden prvek:
 *  prstenec v barvě akcentu, tenká světlá linka těsně u hrany (dává
 *  prstenci hloubku, aby neležel na fotce jako nálepka) a o stupeň hlubší
 *  stín. Nic se nehýbe, nic nebliká.
 *
 *  Barva jde z `--kp-a` — tedy z panelu Vzhled (Tweaks). Zlatá `--kp-ref-*`
 *  zůstává pro dekor stránky, ale STAV má patřit značce: když si návštěvník
 *  přepne akcent, přepne se s ním i výběr.
 * ------------------------------------------------------------------------ */
.kp-ref-size {
    --ref-ring: 0 0 0 0 transparent;
    box-shadow:
        var(--ref-ring),
        0 3px 10px rgba(52, 38, 14, 0.34),
        0 10px 24px rgba(50, 36, 13, 0.22),
        0 24px 50px rgba(46, 34, 12, 0.24);
    transition:
        transform 0.32s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1)),
        box-shadow 0.32s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}

.kp-ref-size.is-on {
    --ref-ring:
        0 0 0 1.5px color-mix(in oklab, #FFFFFF 55%, transparent),
        0 0 0 4px var(--kp-a, #3C7A34),
        0 0 22px 0 color-mix(in oklab, var(--kp-a, #3C7A34) 45%, transparent);
}

/* Zaškrtnutí v rohu — potvrzení volby beze slov. Sedí u horní pravé hrany,
   tedy naproti štítku velikosti, aby si nestínily. */
.kp-ref-size__check {
    position: absolute;
    top: 14px;
    right: 14px;
    z-index: 3;
    display: grid;
    place-items: center;
    width: 30px;
    height: 30px;
    border-radius: 999px;
    background: var(--kp-a, #3C7A34);
    color: #FFFFFF;
    box-shadow: 0 4px 14px color-mix(in oklab, var(--kp-a, #3C7A34) 55%, transparent);
    animation: kp-ref-check 0.36s var(--ease-out, cubic-bezier(0.16, 1, 0.3, 1)) both;
}

@keyframes kp-ref-check {
    from { opacity: 0; transform: scale(0.6); }
    to   { opacity: 1; transform: scale(1); }
}

.kp-ref-size:focus-visible {
    outline: 3px solid var(--kp-a, #3C7A34);
    outline-offset: 4px;
}

@media (prefers-reduced-motion: reduce) {
    .kp-ref-size { transition: none; }
    .kp-ref-size__check { animation: none; }
}

@media (max-width: 620px) {
    /* Nadpis a nástroje pod sebou, ne na koncích řádku: „Prohlédnout všechny
       fotky" se na 360px displeji vedle nadpisu nevejde a zalomilo by se to
       doprostřed slova. */
    .kp-ref-gallery__head { align-items: flex-start; }
    .kp-ref-gallery__tools { width: 100%; }
    .kp-ref-playall { flex: 1; justify-content: center; }
}

/* ---- dolní hrana zóny ---------------------------------------------------
   Poslední pás uvnitř `.kp-ref` končil ROVNÝM řezem proti sekci ekosystému
   pod ním, zatímco všechny ostatní předěly na webu drží vlnu. Tady je proto
   vlna jen na SPODNÍ hraně — horní patří galerii nad ní, a dvě vlny nad
   sebou by se četly jako ozdoba, ne jako předěl. */
.kp-ref-trust-section {
    position: relative;
}

.kp-ref-trust-section {
    /* Místo pro vlnu — bez něj by kousala do pilulky nad sebou. */
    padding-bottom: clamp(52px, 5.5vw, 96px);
}

.kp-ref-trust-section::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: clamp(52px, 5.5vw, 96px);
    z-index: 0;
    pointer-events: none;
    /* Barva plochy stránky POD zónou — ta se vlnou vlévá nahoru do krému.
       `--kp-wave-a` má výplň u DOLNÍ hrany, takže její horní okraj je právě
       ta křivka. (Sekce ekosystému vlastní pozadí nemá — `kp-sect--green`
       v CSS vůbec neexistuje — takže pod zónou je prostě plocha stránky.) */
    background: var(--kp-cream, #FBF3E4);
    mask-image: var(--kp-wave-a);
    mask-position: bottom center;
    mask-size: 100% 100%;
    mask-repeat: no-repeat;
    -webkit-mask-image: var(--kp-wave-a);
    -webkit-mask-position: bottom center;
    -webkit-mask-size: 100% 100%;
    -webkit-mask-repeat: no-repeat;
}

/* ==========================================================================
 *  Recenze zákazníků
 *  ---------------------------------------------------------------------
 *  Sekce na /reference a fronta na /recenze/schvalovani. Obojí staví jen na
 *  TOKENECH — žádný natvrdo psaný odstín. Trvalé pravidlo z CLAUDE.md: co má
 *  hex, to v noci svítí a přepínač Vzhledu s tím nehne.
 *
 *  Názvy `kp-reviews` a `kp-modlist` byly před použitím ověřeny grepem — ani
 *  jeden se v žádném stylopisu nevyskytoval. `.kp-card` a `.kp-coop` už patří
 *  jinam a obě kolize se poznaly až poté, co rozbily cizí stránku.
 * ========================================================================== */
.kp-reviews {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
    gap: var(--kp-ref-gap, 20px);
    margin: 0;
    padding: 0;
    list-style: none;
}

.kp-reviews__item {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    padding: 1.4rem 1.5rem;
    border-radius: 20px;
    border: 1px solid var(--kp-line, rgba(0, 0, 0, 0.08));
    background: var(--kp-cream-2, #fff);
    box-shadow: 0 2px 8px rgba(52, 38, 14, 0.08);
}

.kp-reviews__head {
    display: flex;
    align-items: baseline;
    gap: 0.6rem;
    flex-wrap: wrap;
}

/* Hvězdičky jsou obrázek, ne údaj — údaj nese `aria-label` vedle nich.
   Barva jde z akcentu, aby se měnila s panelem Vzhledu. */
.kp-reviews__stars {
    color: var(--kp-a, #3C7A34);
    letter-spacing: 0.08em;
    font-size: 0.95rem;
}

.kp-reviews__title {
    font-family: var(--kp-font-head);
    font-weight: 500;
    font-size: 1.05rem;
    color: var(--kp-ink);
}

.kp-reviews__body {
    margin: 0;
    color: var(--kp-ink);
    line-height: 1.6;
}

.kp-reviews__meta {
    margin: 0;
    font-size: 0.85rem;
    color: color-mix(in oklab, var(--kp-ink) 62%, transparent);
}

.kp-reviews__cta {
    margin-top: 1.4rem;
    text-align: center;
}

/* ---- schvalovací fronta majitele ---------------------------------------- */
.kp-modlist {
    display: flex;
    flex-direction: column;
    gap: var(--kp-ref-gap, 20px);
    margin: 0;
    padding: 0;
    list-style: none;
}

.kp-modlist__item {
    padding: 1.4rem 1.5rem;
    border-radius: 20px;
    border: 1px solid var(--kp-line, rgba(0, 0, 0, 0.08));
    background: var(--kp-cream-2, #fff);
}

.kp-modlist__head {
    display: flex;
    align-items: baseline;
    gap: 0.6rem;
    flex-wrap: wrap;
}

.kp-modlist__title {
    font-family: var(--kp-font-head);
    font-weight: 500;
    font-size: 1.05rem;
    color: var(--kp-ink);
}

.kp-modlist__stars {
    color: var(--kp-a, #3C7A34);
    letter-spacing: 0.08em;
}

.kp-modlist__meta {
    margin: 0.35rem 0 0.8rem;
    font-size: 0.85rem;
    color: color-mix(in oklab, var(--kp-ink) 62%, transparent);
}

.kp-modlist__body {
    margin: 0 0 1.1rem;
    color: var(--kp-ink);
    line-height: 1.6;
}

/* Rozhodnutí v jedné řadě: schválit, důvod, zamítnout. Na telefonu pod sebou,
   protože pole s důvodem potřebuje šířku a tři prvky vedle sebe by z něj
   udělaly proužek na pár znaků. */
.kp-modlist__actions {
    display: flex;
    gap: 0.6rem;
    align-items: center;
    flex-wrap: wrap;
}

.kp-modlist__note {
    flex: 1 1 16rem;
    min-width: 12rem;
}

@media (max-width: 560px) {
    .kp-modlist__actions {
        flex-direction: column;
        align-items: stretch;
    }
}

/* ---- obal fronty ---------------------------------------------------------
 *  Fronta je čtení, ne mřížka: dlouhý text recenze se čte na jednom sloupci a
 *  na 1560px široké stránce by se rozjel přes celou obrazovku. Strop je
 *  proto na OBALU, ne na položce — ta si pak drží vlastní vnitřní odsazení.
 * ------------------------------------------------------------------------- */
.kp-modwrap {
    max-width: 72rem;
    margin-inline: auto;
}

/* Počet čekajících je jediný údaj, kvůli kterému sem majitel chodí, takže
   stojí v hlavičce a ne až nad seznamem. Pilulka bere barvu z akcentu —
   panel Vzhledu jí tedy hýbe stejně jako vším ostatním. */
.kp-modcount {
    display: inline-block;
    margin: 0.9rem auto 0;
    padding: 0.35rem 0.9rem;
    border-radius: 999px;
    border: 1px solid color-mix(in oklab, var(--kp-a) 30%, transparent);
    background: color-mix(in oklab, var(--kp-a) 10%, transparent);
    color: var(--kp-a-deep, var(--kp-a));
    font-size: 0.9rem;
    font-weight: 500;
}

/* Prázdná fronta není chyba, je to dobrá zpráva — vypadá tedy jako
   poděkování po odeslání poptávky, ne jako hlášení „nic nenalezeno". */
.kp-modempty {
    text-align: center;
}

.kp-modempty > .kp-lead {
    margin-inline: auto;
}

/* Zamítnutí je nevratné, takže NESMÍ vypadat stejně lákavě jako schválení.
   Ghost tlačítko s červeným okrajem: dá se najít, ale ruka na něj nesklouzne. */
.kp-modlist__reject {
    border-color: color-mix(in oklab, #B4442E 45%, transparent);
    color: #B4442E;
}

.kp-modlist__reject:hover:not(:disabled) {
    background: color-mix(in oklab, #B4442E 10%, transparent);
    border-color: #B4442E;
}

[data-theme="dark"] .kp-modlist__reject {
    border-color: color-mix(in oklab, #E58B74 45%, transparent);
    color: #E58B74;
}

[data-theme="dark"] .kp-modlist__reject:hover:not(:disabled) {
    background: color-mix(in oklab, #E58B74 14%, transparent);
    border-color: #E58B74;
}

/* ---- pozvánka k napsání recenze -----------------------------------------
 *  Stojí tam, kde jindy je seznam recenzí, a nesmí vypadat jako jeho náhrada
 *  — proto užší blok bez rámečku a karet. Netvrdí nic o počtu recenzí, jen
 *  zve; sekce se seznamem ji ukazuje pod ním týmž `Vyzva` fragmentem.
 * ------------------------------------------------------------------------- */
.kp-invite {
    max-width: 46rem;
    margin-inline: auto;
    text-align: center;
}

.kp-invite > .kp-lead {
    margin-inline: auto;
}

.kp-invite > .kp-reviews__cta {
    margin-top: 1.1rem;
}
