// Blog list + article detail — redesigned with 5-category navigation. (function () { if (typeof React === "undefined") return; const DS = window.VElaStvNajmanDesignSystem_bc3fc2; const { Photo, Button } = DS; const Icon = window.VNIcon; const PER_PAGE = 6; const CAT_ICONS = { zacatky: "bee", introdukce: "hexagon", rozvoj: "hive", genetika: "rosette", }; /* ── Blog list ─────────────────────────────────────────────────── */ function Blog({ go }) { const D = window.SHOP_DATA; const [activeCat, setActiveCat] = React.useState(D.blogCats[0].id); const [page, setPage] = React.useState(1); const [fading, setFading] = React.useState(false); const tabsRef = React.useRef(null); // Center a tab in the scrollable bar using getBoundingClientRect for // pixel-perfect positioning. animate=false for instant (on mount), // animate=true for smooth scroll (on tap). function centerTab(id, animate) { const container = tabsRef.current; if (!container) return; const btn = container.querySelector('[data-cat="' + id + '"]'); if (!btn) return; const cRect = container.getBoundingClientRect(); const bRect = btn.getBoundingClientRect(); const to = container.scrollLeft + bRect.left - cRect.left - cRect.width / 2 + bRect.width / 2; if (animate) { container.scrollTo({ left: to, behavior: 'smooth' }); } else { container.scrollLeft = to; } } // Instantly center the initial active tab before first paint React.useLayoutEffect(() => { centerTab(activeCat, false); }, []); const catPosts = D.posts.filter(p => p.cat === activeCat); const totalPages = Math.ceil(catPosts.length / PER_PAGE); const pagePosts = catPosts.slice((page - 1) * PER_PAGE, page * PER_PAGE); const activeCatObj = D.blogCats.find(c => c.id === activeCat) || D.blogCats[0]; function fade(fn) { setFading(true); setTimeout(() => { fn(); setFading(false); }, 180); } function switchCat(id) { if (id === activeCat) return; centerTab(id, true); fade(() => { setActiveCat(id); setPage(1); }); } function switchPage(n) { if (n === page) return; fade(() => setPage(n)); } const gridStyle = { opacity: fading ? 0 : 1, transform: fading ? "translateY(10px)" : "none", transition: "opacity 180ms ease, transform 180ms ease", }; return (
{/* ── Hero ───────────────────────────────────────────────── */}
Blog o chovu

Čtení o chovu a včelách

Od prvních úlů po vlastní chov. Praktické rady pro začátečníky, chov a introdukci matek, zakládání včelstev z oddělků i genetiku a šlechtění.

{/* ── Category tabs ──────────────────────────────────────── */}
{D.blogCats.map(cat => ( ))}
{/* ── Articles ───────────────────────────────────────────── */}
{activeCatObj.label}

Nejnovější články

{catPosts.length} článků
{pagePosts.map(p => ( { e.preventDefault(); go("article", p.id); }} >
{p.tag}
{p.date} · {p.read} čtení

{p.title}

{p.excerpt}

Číst dál
))}
{/* ── Pagination ─────────────────────────────────────── */}
{Array.from({ length: totalPages }, (_, i) => i + 1).map(n => ( ))}
); } /* ── Article detail ────────────────────────────────────────────── */ function Article({ go, postId }) { const D = window.SHOP_DATA; const p = D.posts.find(x => x.id === postId) || D.posts[0]; return (

{p.title}

{p.date}· {p.read} čtení· {p.tag}

{p.excerpt}

Dobrý chov stojí na trpělivém pozorování a poctivých záznamech. V tomhle článku shrnujeme to nejdůležitější tak, jak to děláme přímo u nás na chovné stanici v Hostivicích.

Na čem záleží

Základ je výběr. Z včelstev sledujeme mírnost, plodnost, zimování a hygienické chování — a teprve z těch nejlepších chováme dál. Genetika rozhoduje o tom, jak se vám bude u úlu pracovat celou sezónu.

Mírná, zdravá a nerojívá včelstva nejsou náhoda — jsou výsledkem cílené práce s liniemi.

U inseminovaných matek řídíme i otcovskou stranu, takže víte přesně, z jaké linie potomstvo pochází. Právě tahle dohledatelnost je pro chovatele největší jistota.

Jak to děláme my

Matky odchováváme sami, oplozujeme na vlastním stanovišti a předáváme osobně nebo posíláme v klíckách. Nepočítáme matky na tisíce — záleží nám na kvalitě každé z nich.

); } window.VNBlog = Blog; window.VNArticle = Article; })();