/* @ds-bundle: {"format":3,"namespace":"VElaStvNajmanDesignSystem_bc3fc2","components":[{"name":"PHOTOS","sourcePath":"assets/images.js"},{"name":"CategoryTile","sourcePath":"components/commerce/CategoryTile.jsx"},{"name":"ProductCard","sourcePath":"components/commerce/ProductCard.jsx"},{"name":"Badge","sourcePath":"components/core/Badge.jsx"},{"name":"Button","sourcePath":"components/core/Button.jsx"},{"name":"IconButton","sourcePath":"components/core/IconButton.jsx"},{"name":"QuantityStepper","sourcePath":"components/core/QuantityStepper.jsx"},{"name":"Rating","sourcePath":"components/core/Rating.jsx"},{"name":"Tag","sourcePath":"components/core/Tag.jsx"},{"name":"Input","sourcePath":"components/forms/Input.jsx"},{"name":"Select","sourcePath":"components/forms/Select.jsx"},{"name":"Photo","sourcePath":"components/media/Photo.jsx"},{"name":"SectionHeading","sourcePath":"components/media/SectionHeading.jsx"}],"sourceHashes":{"assets/images.js":"285167a8416f","components/commerce/CategoryTile.jsx":"85ccf2f053c1","components/commerce/ProductCard.jsx":"f1c5e2f14093","components/core/Badge.jsx":"3bf5e2227116","components/core/Button.jsx":"b9161fc72ca8","components/core/IconButton.jsx":"b926800db454","components/core/QuantityStepper.jsx":"0e4183979a89","components/core/Rating.jsx":"b8d65192c1c7","components/core/Tag.jsx":"2cc3c139c908","components/forms/Input.jsx":"c17fd4b1ae4c","components/forms/Select.jsx":"68099eb960b0","components/media/Photo.jsx":"9ab30f6fa384","components/media/SectionHeading.jsx":"128e8655ae1b","ui_kits/eshop/About.jsx":"c03c9926347c","ui_kits/eshop/Account.jsx":"550589b278fb","ui_kits/eshop/App.jsx":"90bb94228398","ui_kits/eshop/Auth.jsx":"bf842b2e636d","ui_kits/eshop/Bits.jsx":"c6ea8fedad2c","ui_kits/eshop/Blog.jsx":"e81fb3b8b6e7","ui_kits/eshop/Category.jsx":"0370d0863b8a","ui_kits/eshop/Chrome.jsx":"46d75bdc13f2","ui_kits/eshop/Home.jsx":"f8dbba5cda16","ui_kits/eshop/Icons.jsx":"6ed35dc3b9a2","ui_kits/eshop/Legal.jsx":"0e1973248d99","ui_kits/eshop/Preorder.jsx":"2f75e71596c9","ui_kits/eshop/Product.jsx":"682b834bf3c2","ui_kits/eshop/ProductCardPro.jsx":"e1919903d815","ui_kits/eshop/QuickView.jsx":"2580e1d16abd","ui_kits/eshop/data.js":"47ca53ac281d"},"inlinedExternals":[],"unexposedExports":[]} */ (() => { const __ds_ns = (window.VElaStvNajmanDesignSystem_bc3fc2 = window.VElaStvNajmanDesignSystem_bc3fc2 || {}); const __ds_scope = {}; (__ds_ns.__errors = __ds_ns.__errors || []); // assets/images.js try { (() => { /* ============================================================ Curated temporary photography — Rodinné včelařství Najman Warm, natural-light honey / bee / landscape shots (Unsplash). The brand owner replaces these with their own product photos. Layouts are built so real photos drop straight in. For product jars, category tiles, blog thumbnails and reviews we use the .vn-photo placeholder treatment (honeycomb texture + warm wash) — an intentional "your photo here" empty state that already looks premium and tells the owner exactly where to shoot. ============================================================ */ const U = (id, w = 1200) => `https://images.unsplash.com/photo-${id}?w=${w}&q=80&auto=format&fit=crop`; const PHOTOS = { // honey dipper dripping into an open jar — warm, tactile heroDipper: U("1558642452-9d2a7deb7f62", 1600), // glowing jar of honey with marigold + citrus, dark warm backdrop jarGlow: U("1471943311424-646960669fbc", 1200), // beekeeper tending hives in a green meadow beekeeper: U("1473973266408-ed4e27abdd47", 1400), // bumblebee on a yellow flower, soft golden bokeh beeFlower: U("1568526381923-caf3fd520382", 1200), // forest canopy from above — Brdy / Křivoklát woodland forest: U("1599940824399-b87987ceb72a", 1400) }; /* Tone guidance for any replacement photo: warm temperature, natural daylight, shallow depth of field, honey-gold + cream + green earth tones. No cold/blue casts, no studio-white clinical product shots, no stocky "people at laptop". */ Object.assign(__ds_scope, { PHOTOS }); })(); } catch (e) { __ds_ns.__errors.push({ path: "assets/images.js", error: String((e && e.message) || e) }); } // components/core/Badge.jsx try { (() => { function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const CSS = ` .vn-badge{ display:inline-flex;align-items:center;gap:5px; font-family:var(--font-body);font-weight:var(--weight-semibold); font-size:var(--text-xs);line-height:1;letter-spacing:var(--tracking-wide); padding:6px 11px;border-radius:var(--radius-pill);white-space:nowrap; } .vn-badge--gold{ background:var(--accent); color:var(--bily-vosk); } .vn-badge--gold-soft{ background:var(--accent-wash); color:var(--tmavy-med); } .vn-badge--green{ background:var(--accent-secondary); color:var(--bily-vosk); } .vn-badge--green-soft{ background:var(--accent-secondary-wash); color:var(--lucni-zelena-tmava); } .vn-badge--cream{ background:var(--kremova-plast); color:var(--tmava-hlina); } .vn-badge svg{ width:13px;height:13px;stroke-width:2; } `; if (typeof document !== "undefined" && !document.getElementById("vn-badge-css")) { const s = document.createElement("style"); s.id = "vn-badge-css"; s.textContent = CSS; document.head.appendChild(s); } function Badge({ children, tone = "gold-soft", icon, className = "", ...rest }) { const cls = ["vn-badge", `vn-badge--${tone}`, className].filter(Boolean).join(" "); return /*#__PURE__*/React.createElement("span", _extends({ className: cls }, rest), icon, children); } Object.assign(__ds_scope, { Badge }); })(); } catch (e) { __ds_ns.__errors.push({ path: "components/core/Badge.jsx", error: String((e && e.message) || e) }); } // components/core/Button.jsx try { (() => { function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const CSS = ` .vn-btn{ font-family:var(--font-body); font-weight:var(--weight-semibold); display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2); border:var(--border-width-strong) solid transparent; border-radius:var(--radius-md); cursor:pointer;text-decoration:none;white-space:nowrap; transition:background-color var(--dur-base) var(--ease-out), border-color var(--dur-base) var(--ease-out), color var(--dur-base) var(--ease-out), transform var(--dur-fast) var(--ease-soft), box-shadow var(--dur-base) var(--ease-out); } .vn-btn:active{ transform:translateY(1px) scale(0.99); } .vn-btn:disabled,.vn-btn[aria-disabled="true"]{ opacity:.45;cursor:not-allowed;transform:none;box-shadow:none; } .vn-btn--sm{ font-size:var(--text-base); padding:8px 16px; min-height:38px; } .vn-btn--md{ font-size:var(--text-base); padding:12px 22px; min-height:48px; } .vn-btn--lg{ font-size:var(--text-base); padding:16px 30px; min-height:56px; } .vn-btn--block{ display:flex;width:100%; } .vn-btn--primary{ background:var(--accent); color:var(--text-on-accent); box-shadow:var(--shadow-cta); } .vn-btn--primary:hover:not(:disabled){ background:var(--accent-hover); } .vn-btn--secondary{ background:transparent; color:var(--tmavy-med); border-color:var(--border-strong); } .vn-btn--secondary:hover:not(:disabled){ background:var(--kremova-plast); border-color:var(--tmavy-med); } .vn-btn--ghost{ background:transparent; color:var(--tmavy-med); border-color:transparent; padding-inline:10px; } .vn-btn--ghost:hover:not(:disabled){ background:var(--accent-wash); } .vn-btn--green{ background:var(--accent-secondary); color:var(--bily-vosk); } .vn-btn--green:hover:not(:disabled){ background:var(--lucni-zelena-tmava); } .vn-btn svg{ width:1.15em;height:1.15em;flex:none; } `; if (typeof document !== "undefined" && !document.getElementById("vn-button-css")) { const s = document.createElement("style"); s.id = "vn-button-css"; s.textContent = CSS; document.head.appendChild(s); } function Button({ children, variant = "primary", size = "md", block = false, href, iconStart, iconEnd, disabled = false, className = "", ...rest }) { const cls = ["vn-btn", `vn-btn--${variant}`, `vn-btn--${size}`, block ? "vn-btn--block" : "", className].filter(Boolean).join(" "); const content = /*#__PURE__*/React.createElement(React.Fragment, null, iconStart, children && /*#__PURE__*/React.createElement("span", null, children), iconEnd); if (href && !disabled) { return /*#__PURE__*/React.createElement("a", _extends({ className: cls, href: href }, rest), content); } return /*#__PURE__*/React.createElement("button", _extends({ className: cls, disabled: disabled }, rest), content); } Object.assign(__ds_scope, { Button }); })(); } catch (e) { __ds_ns.__errors.push({ path: "components/core/Button.jsx", error: String((e && e.message) || e) }); } // components/core/IconButton.jsx try { (() => { function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const CSS = ` .vn-iconbtn{ position:relative;display:inline-flex;align-items:center;justify-content:center; width:44px;height:44px;border-radius:var(--radius-pill); background:transparent;border:none;cursor:pointer;color:var(--tmava-hlina); transition:background-color var(--dur-base) var(--ease-out), color var(--dur-base) var(--ease-out), transform var(--dur-fast) var(--ease-soft); } .vn-iconbtn:hover{ background:var(--accent-wash); color:var(--tmavy-med); } .vn-iconbtn:active{ transform:scale(0.92); } .vn-iconbtn--sm{ width:38px;height:38px; } .vn-iconbtn--solid{ background:var(--kremova-plast); } .vn-iconbtn--solid:hover{ background:var(--accent-wash); } .vn-iconbtn svg{ width:22px;height:22px;stroke-width:1.7; } .vn-iconbtn--sm svg{ width:18px;height:18px; } .vn-iconbtn__count{ position:absolute;top:2px;right:0px;min-width:18px;height:18px;padding:0 5px; display:flex;align-items:center;justify-content:center; background:var(--accent);color:var(--bily-vosk); font-family:var(--font-body);font-size:11px;font-weight:var(--weight-bold); border-radius:var(--radius-pill);border:2px solid var(--surface-page); line-height:1; } `; if (typeof document !== "undefined" && !document.getElementById("vn-iconbtn-css")) { const s = document.createElement("style"); s.id = "vn-iconbtn-css"; s.textContent = CSS; document.head.appendChild(s); } function IconButton({ children, label, size = "md", solid = false, count, className = "", ...rest }) { const cls = ["vn-iconbtn", size === "sm" ? "vn-iconbtn--sm" : "", solid ? "vn-iconbtn--solid" : "", className].filter(Boolean).join(" "); return /*#__PURE__*/React.createElement("button", _extends({ className: cls, "aria-label": label, title: label }, rest), children, count != null && count > 0 && /*#__PURE__*/React.createElement("span", { className: "vn-iconbtn__count" }, count)); } Object.assign(__ds_scope, { IconButton }); })(); } catch (e) { __ds_ns.__errors.push({ path: "components/core/IconButton.jsx", error: String((e && e.message) || e) }); } // components/core/QuantityStepper.jsx try { (() => { function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const CSS = ` .vn-stepper{ display:inline-flex;align-items:center; border:var(--border-width) solid var(--border-strong); border-radius:var(--radius-md);background:var(--surface-card);overflow:hidden; } .vn-stepper__btn{ width:44px;height:44px;border:none;background:transparent;cursor:pointer; display:flex;align-items:center;justify-content:center;color:var(--tmavy-med); font-size:20px;line-height:1; transition:background-color var(--dur-fast) var(--ease-out); } .vn-stepper__btn:hover:not(:disabled){ background:var(--accent-wash); } .vn-stepper__btn:disabled{ color:var(--text-faint);cursor:not-allowed; } .vn-stepper__val{ min-width:40px;text-align:center;font-family:var(--font-body); font-weight:var(--weight-semibold);font-size:var(--text-base);color:var(--tmava-hlina); font-variant-numeric:tabular-nums; } .vn-stepper--sm .vn-stepper__btn{ width:36px;height:36px;font-size:17px; } .vn-stepper--sm .vn-stepper__val{ min-width:32px;font-size:var(--text-sm); } `; if (typeof document !== "undefined" && !document.getElementById("vn-stepper-css")) { const s = document.createElement("style"); s.id = "vn-stepper-css"; s.textContent = CSS; document.head.appendChild(s); } function QuantityStepper({ value = 1, min = 1, max = 99, onChange, size = "md", className = "", ...rest }) { const cls = ["vn-stepper", size === "sm" ? "vn-stepper--sm" : "", className].filter(Boolean).join(" "); const set = v => onChange && onChange(Math.max(min, Math.min(max, v))); return /*#__PURE__*/React.createElement("div", _extends({ className: cls }, rest), /*#__PURE__*/React.createElement("button", { className: "vn-stepper__btn", "aria-label": "Ubrat", disabled: value <= min, onClick: () => set(value - 1) }, "\u2212"), /*#__PURE__*/React.createElement("span", { className: "vn-stepper__val", "aria-live": "polite" }, value), /*#__PURE__*/React.createElement("button", { className: "vn-stepper__btn", "aria-label": "P\u0159idat", disabled: value >= max, onClick: () => set(value + 1) }, "+")); } Object.assign(__ds_scope, { QuantityStepper }); })(); } catch (e) { __ds_ns.__errors.push({ path: "components/core/QuantityStepper.jsx", error: String((e && e.message) || e) }); } // components/core/Rating.jsx try { (() => { function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const CSS = ` .vn-rating{ display:inline-flex;align-items:center;gap:8px; } .vn-rating__stars{ display:inline-flex;gap:2px;color:var(--accent); } .vn-rating__stars svg{ width:1em;height:1em;display:block; } .vn-rating--sm{ font-size:15px; } .vn-rating--md{ font-size:19px; } .vn-rating--lg{ font-size:24px; } .vn-rating__count{ font-family:var(--font-body);font-size:var(--text-sm);color:var(--text-muted); } `; if (typeof document !== "undefined" && !document.getElementById("vn-rating-css")) { const s = document.createElement("style"); s.id = "vn-rating-css"; s.textContent = CSS; document.head.appendChild(s); } function Star({ fill }) { // fill: 1 = full, 0.5 = half, 0 = empty const id = "g" + Math.random().toString(36).slice(2, 8); return /*#__PURE__*/React.createElement("svg", { viewBox: "0 0 24 24", "aria-hidden": "true" }, /*#__PURE__*/React.createElement("defs", null, /*#__PURE__*/React.createElement("linearGradient", { id: id }, /*#__PURE__*/React.createElement("stop", { offset: `${fill * 100}%`, stopColor: "currentColor" }), /*#__PURE__*/React.createElement("stop", { offset: `${fill * 100}%`, stopColor: "transparent" }))), /*#__PURE__*/React.createElement("path", { d: "M12 2.5l2.7 5.9 6.3.6-4.7 4.2 1.4 6.3-5.7-3.3-5.7 3.3 1.4-6.3L2 9l6.3-.6z", fill: fill === 0 ? "none" : `url(#${id})`, stroke: "currentColor", strokeWidth: "1.4", strokeLinejoin: "round" })); } function Rating({ value = 5, count, size = "sm", className = "", ...rest }) { const cls = ["vn-rating", `vn-rating--${size}`, className].filter(Boolean).join(" "); const stars = [0, 1, 2, 3, 4].map(i => { const f = Math.max(0, Math.min(1, value - i)); return /*#__PURE__*/React.createElement(Star, { key: i, fill: f }); }); return /*#__PURE__*/React.createElement("span", _extends({ className: cls }, rest), /*#__PURE__*/React.createElement("span", { className: "vn-rating__stars", "aria-label": `Hodnocení ${value} z 5` }, stars), count != null && /*#__PURE__*/React.createElement("span", { className: "vn-rating__count" }, "(", count, ")")); } Object.assign(__ds_scope, { Rating }); })(); } catch (e) { __ds_ns.__errors.push({ path: "components/core/Rating.jsx", error: String((e && e.message) || e) }); } // components/core/Tag.jsx try { (() => { function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const CSS = ` .vn-tag{ display:inline-flex;align-items:center;gap:6px; font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-medium); color:var(--lucni-zelena-tmava); } .vn-tag__dot{ width:7px;height:7px;border-radius:50%;background:var(--accent-secondary);flex:none; } .vn-tag svg{ width:14px;height:14px;color:var(--accent-secondary);stroke-width:1.8;flex:none; } .vn-tag--chip{ background:var(--accent-secondary-wash);padding:5px 10px;border-radius:var(--radius-sm); } `; if (typeof document !== "undefined" && !document.getElementById("vn-tag-css")) { const s = document.createElement("style"); s.id = "vn-tag-css"; s.textContent = CSS; document.head.appendChild(s); } function Tag({ children, icon, chip = false, className = "", ...rest }) { const cls = ["vn-tag", chip ? "vn-tag--chip" : "", className].filter(Boolean).join(" "); return /*#__PURE__*/React.createElement("span", _extends({ className: cls }, rest), icon ? icon : /*#__PURE__*/React.createElement("span", { className: "vn-tag__dot" }), children); } Object.assign(__ds_scope, { Tag }); })(); } catch (e) { __ds_ns.__errors.push({ path: "components/core/Tag.jsx", error: String((e && e.message) || e) }); } // components/forms/Input.jsx try { (() => { function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const CSS = ` .vn-field{ display:flex;flex-direction:column;gap:6px;font-family:var(--font-body); } .vn-field__label{ font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--tmavy-med); } .vn-field__wrap{ position:relative;display:flex;align-items:center; } .vn-input{ width:100%;font-family:var(--font-body);font-size:var(--text-base);color:var(--tmava-hlina); background:var(--surface-card); border:var(--border-width) solid var(--border-strong);border-radius:var(--radius-md); padding:13px 15px;min-height:48px; transition:border-color var(--dur-base) var(--ease-out), box-shadow var(--dur-base) var(--ease-out), background-color var(--dur-base) var(--ease-out); } .vn-input::placeholder{ color:var(--text-faint); } .vn-input:hover{ border-color:var(--tmavy-med-svetly); } .vn-input:focus{ outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-wash); } .vn-input--has-icon{ padding-left:44px; } .vn-field__icon{ position:absolute;left:14px;display:flex;color:var(--text-muted);pointer-events:none; } .vn-field__icon svg{ width:19px;height:19px;stroke-width:1.8; } .vn-field--pill .vn-input{ border-radius:var(--radius-pill); } .vn-field__hint{ font-size:var(--text-xs);color:var(--text-muted); } .vn-field--error .vn-input{ border-color:var(--chyba);background:var(--chyba-jemna); } `; if (typeof document !== "undefined" && !document.getElementById("vn-input-css")) { const s = document.createElement("style"); s.id = "vn-input-css"; s.textContent = CSS; document.head.appendChild(s); } function Input({ label, hint, icon, error = false, pill = false, id, className = "", ...rest }) { const fid = id || (label ? "in-" + label.replace(/\s+/g, "-").toLowerCase() : undefined); const wrapCls = ["vn-field", pill ? "vn-field--pill" : "", error ? "vn-field--error" : "", className].filter(Boolean).join(" "); return /*#__PURE__*/React.createElement("div", { className: wrapCls }, label && /*#__PURE__*/React.createElement("label", { className: "vn-field__label", htmlFor: fid }, label), /*#__PURE__*/React.createElement("div", { className: "vn-field__wrap" }, icon && /*#__PURE__*/React.createElement("span", { className: "vn-field__icon" }, icon), /*#__PURE__*/React.createElement("input", _extends({ id: fid, className: ["vn-input", icon ? "vn-input--has-icon" : ""].filter(Boolean).join(" ") }, rest))), hint && /*#__PURE__*/React.createElement("span", { className: "vn-field__hint" }, hint)); } Object.assign(__ds_scope, { Input }); })(); } catch (e) { __ds_ns.__errors.push({ path: "components/forms/Input.jsx", error: String((e && e.message) || e) }); } // components/forms/Select.jsx try { (() => { function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const CSS = ` .vn-select{ position:relative; display:flex; flex-direction:column; gap:6px; font-family:var(--font-body); } .vn-select__label{ font-size:var(--text-sm); font-weight:var(--weight-semibold); color:var(--tmavy-med); } /* Trigger — fully rounded to match the rest of the soft, rounded UI. */ .vn-select__trigger{ appearance:none; width:100%; display:flex; align-items:center; justify-content:space-between; gap:10px; font-family:var(--font-body); font-size:var(--text-sm); font-weight:var(--weight-medium); color:var(--tmava-hlina); background:var(--surface-card); cursor:pointer; text-align:left; border:var(--border-width) solid var(--border-strong); border-radius:var(--radius-pill); padding:11px 16px 11px 18px; min-height:46px; transition:border-color var(--dur-base) var(--ease-out), box-shadow var(--dur-base) var(--ease-out), background-color var(--dur-base) var(--ease-out); } .vn-select__trigger:hover{ border-color:var(--tmavy-med-svetly); } .vn-select__trigger:focus-visible{ outline:none; border-color:var(--accent); box-shadow:0 0 0 3px var(--accent-wash); } .vn-select[data-open="true"] .vn-select__trigger{ border-color:var(--accent); box-shadow:0 0 0 3px var(--accent-wash); } .vn-select__chevron{ flex:none; color:var(--text-muted); display:flex; transition:transform var(--dur-base) var(--ease-soft); } .vn-select[data-open="true"] .vn-select__chevron{ transform:rotate(180deg); } .vn-select__chevron svg{ width:18px; height:18px; } .vn-select--quiet .vn-select__trigger{ border-color:transparent; background:var(--kremova-plast); } .vn-select--quiet .vn-select__trigger:hover{ background:var(--plast-tmava); } /* Rounded, warm popover list — no native OS blue anywhere. */ .vn-select__panel{ position:absolute; top:calc(100% + 8px); left:0; right:0; z-index:50; background:var(--surface-card); border:var(--border-width) solid var(--border-soft); border-radius:var(--radius-lg); box-shadow:var(--shadow-md); padding:6px; max-height:280px; overflow-y:auto; opacity:0; transform:translateY(-6px) scale(.99); transform-origin:top center; pointer-events:none; transition:opacity var(--dur-fast) var(--ease-out), transform var(--dur-base) var(--ease-soft); } .vn-select[data-open="true"] .vn-select__panel{ opacity:1; transform:translateY(0) scale(1); pointer-events:auto; } .vn-select__opt{ display:flex; align-items:center; justify-content:space-between; gap:10px; font-size:var(--text-sm); color:var(--tmava-hlina); cursor:pointer; padding:10px 12px; border-radius:var(--radius-md); white-space:nowrap; transition:background-color var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out); } .vn-select__opt:hover{ background:var(--accent-wash); color:var(--tmavy-med); } .vn-select__opt[aria-selected="true"]{ color:var(--tmavy-med); font-weight:var(--weight-semibold); } .vn-select__opt[aria-selected="true"] .vn-select__check{ opacity:1; } .vn-select__check{ flex:none; opacity:0; color:var(--accent); display:flex; } .vn-select__check svg{ width:16px; height:16px; } `; if (typeof document !== "undefined" && !document.getElementById("vn-select-css")) { const s = document.createElement("style"); s.id = "vn-select-css"; s.textContent = CSS; document.head.appendChild(s); } function norm(o) { return typeof o === "string" ? { value: o, label: o } : o; } function Select({ label, options = [], value, defaultValue, onChange, quiet = false, id, className = "", placeholder = "Vyberte…", ...rest }) { const opts = options.map(norm); const isControlled = value !== undefined; const [internal, setInternal] = React.useState(defaultValue !== undefined ? defaultValue : opts[0] ? opts[0].value : ""); const current = isControlled ? value : internal; const [open, setOpen] = React.useState(false); const ref = React.useRef(null); const fid = id || (label ? "sel-" + label.replace(/\s+/g, "-").toLowerCase() : undefined); React.useEffect(() => { if (!open) return; const onDoc = e => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); }; const onKey = e => { if (e.key === "Escape") setOpen(false); }; document.addEventListener("mousedown", onDoc); document.addEventListener("keydown", onKey); return () => { document.removeEventListener("mousedown", onDoc); document.removeEventListener("keydown", onKey); }; }, [open]); const pick = val => { if (!isControlled) setInternal(val); setOpen(false); if (onChange) onChange({ target: { value: val } }); }; const currentLabel = (opts.find(o => o.value === current) || {}).label || placeholder; return /*#__PURE__*/React.createElement("div", _extends({ className: ["vn-select", quiet ? "vn-select--quiet" : "", className].filter(Boolean).join(" "), "data-open": open, ref: ref }, rest), label && /*#__PURE__*/React.createElement("label", { className: "vn-select__label", htmlFor: fid }, label), /*#__PURE__*/React.createElement("button", { type: "button", id: fid, className: "vn-select__trigger", "aria-haspopup": "listbox", "aria-expanded": open, onClick: () => setOpen(o => !o) }, /*#__PURE__*/React.createElement("span", null, currentLabel), /*#__PURE__*/React.createElement("span", { className: "vn-select__chevron" }, /*#__PURE__*/React.createElement("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor" }, /*#__PURE__*/React.createElement("path", { d: "M6 9l6 6 6-6", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })))), /*#__PURE__*/React.createElement("div", { className: "vn-select__panel", role: "listbox", tabIndex: -1 }, opts.map(o => /*#__PURE__*/React.createElement("div", { key: o.value, role: "option", "aria-selected": o.value === current, className: "vn-select__opt", onClick: () => pick(o.value) }, /*#__PURE__*/React.createElement("span", null, o.label), /*#__PURE__*/React.createElement("span", { className: "vn-select__check" }, /*#__PURE__*/React.createElement("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor" }, /*#__PURE__*/React.createElement("path", { d: "M5 12.5l4.5 4.5L19 7", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round" }))))))); } Object.assign(__ds_scope, { Select }); })(); } catch (e) { __ds_ns.__errors.push({ path: "components/forms/Select.jsx", error: String((e && e.message) || e) }); } // components/media/Photo.jsx try { (() => { function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const CSS = ` .vn-photo{ position:relative;overflow:hidden;border-radius:var(--radius-lg); background-color:var(--kremova-plast); background-image: radial-gradient(120% 100% at 70% 10%, var(--medova-zlata-jemna) 0%, transparent 55%), radial-gradient(120% 120% at 20% 100%, var(--lucni-zelena-jemna) 0%, transparent 60%); isolation:isolate; } .vn-photo::before{ content:"";position:absolute;inset:0; background-image:url("HONEYCOMB_URL"); background-size:34px 60px;opacity:.5;mix-blend-mode:multiply; -webkit-mask-image:radial-gradient(140% 120% at 50% 40%, #000 30%, transparent 78%); mask-image:radial-gradient(140% 120% at 50% 40%, #000 30%, transparent 78%); } .vn-photo__label{ position:absolute;inset:0;z-index:1; display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px; text-align:center;padding:16px;color:var(--text-muted); } .vn-photo__label svg{ width:30px;height:30px;opacity:.7;stroke-width:1.4; } .vn-photo__label span{ font-family:var(--font-body);font-size:var(--text-sm);font-weight:var(--weight-medium); letter-spacing:var(--tracking-wide); } .vn-photo__img{ position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:2;display:block; } `; if (typeof document !== "undefined" && !document.getElementById("vn-photo-css")) { // Resolve honeycomb asset relative to where the bundle is loaded. // Consumers can set window.__VN_HONEYCOMB__ to point at the copied asset. const honey = typeof window !== "undefined" && window.__VN_HONEYCOMB__ || "assets/honeycomb.svg"; const st = document.createElement("style"); st.id = "vn-photo-css"; st.textContent = CSS.replace("HONEYCOMB_URL", honey); document.head.appendChild(st); } function Photo({ src, alt = "", ratio = "4 / 5", radius, label = "Foto produktu", className = "", style = {}, ...rest }) { const [failed, setFailed] = React.useState(false); const cls = ["vn-photo", className].filter(Boolean).join(" "); const st = { aspectRatio: ratio, ...(radius ? { borderRadius: radius } : {}), ...style }; return /*#__PURE__*/React.createElement("div", _extends({ className: cls, style: st }, rest), /*#__PURE__*/React.createElement("span", { className: "vn-photo__label", "aria-hidden": src && !failed ? "true" : "false" }, /*#__PURE__*/React.createElement("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor" }, /*#__PURE__*/React.createElement("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }), /*#__PURE__*/React.createElement("circle", { cx: "8.5", cy: "8.5", r: "1.5" }), /*#__PURE__*/React.createElement("path", { d: "M21 15l-5-5L5 21", strokeLinecap: "round", strokeLinejoin: "round" })), /*#__PURE__*/React.createElement("span", null, label)), src && !failed && /*#__PURE__*/React.createElement("img", { className: "vn-photo__img", src: src, alt: alt, loading: "lazy", decoding: "async", onError: () => setFailed(true) })); } Object.assign(__ds_scope, { Photo }); })(); } catch (e) { __ds_ns.__errors.push({ path: "components/media/Photo.jsx", error: String((e && e.message) || e) }); } // components/commerce/CategoryTile.jsx try { (() => { function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const CSS = ` .vn-cattile{ position:relative;display:block;border-radius:var(--radius-xl);overflow:hidden; text-decoration:none;color:inherit;isolation:isolate; transition:transform var(--dur-base) var(--ease-soft),box-shadow var(--dur-base) var(--ease-out); } .vn-cattile:hover{ transform:translateY(-3px);box-shadow:var(--shadow-md);text-decoration:none; } .vn-cattile .vn-photo{ border-radius:0; } .vn-cattile__scrim{ position:absolute;inset:0;z-index:3; background:linear-gradient(to top, rgba(44,38,32,.72) 0%, rgba(44,38,32,.15) 45%, transparent 75%); } .vn-cattile__body{ position:absolute;left:0;right:0;bottom:0;z-index:4;padding:20px 22px; display:flex;align-items:flex-end;justify-content:space-between;gap:12px; } .vn-cattile__name{ font-family:var(--font-body);font-weight:var(--weight-semibold); font-size:var(--text-h3);line-height:1.15;color:var(--bily-vosk);margin:0; } .vn-cattile__count{ font-family:var(--font-body);font-size:var(--text-sm);color:var(--medova-zlata-jemna);display:block;margin-top:4px; } .vn-cattile__arrow{ flex:none;width:38px;height:38px;border-radius:var(--radius-pill); background:var(--accent);color:var(--bily-vosk); display:flex;align-items:center;justify-content:center; transition:transform var(--dur-base) var(--ease-soft); } .vn-cattile:hover .vn-cattile__arrow{ transform:translateX(3px); } .vn-cattile__arrow svg{ width:18px;height:18px;stroke-width:2.2; } `; if (typeof document !== "undefined" && !document.getElementById("vn-cattile-css")) { const s = document.createElement("style"); s.id = "vn-cattile-css"; s.textContent = CSS; document.head.appendChild(s); } function CategoryTile({ name, count, image, href = "#", ratio = "4 / 5", className = "", ...rest }) { return /*#__PURE__*/React.createElement("a", _extends({ className: ["vn-cattile", className].filter(Boolean).join(" "), href: href }, rest), /*#__PURE__*/React.createElement(__ds_scope.Photo, { src: image, alt: name, ratio: ratio, label: name }), /*#__PURE__*/React.createElement("span", { className: "vn-cattile__scrim" }), /*#__PURE__*/React.createElement("div", { className: "vn-cattile__body" }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h3", { className: "vn-cattile__name" }, name), count != null && /*#__PURE__*/React.createElement("span", { className: "vn-cattile__count" }, count, " produkt\u016F")), /*#__PURE__*/React.createElement("span", { className: "vn-cattile__arrow" }, /*#__PURE__*/React.createElement("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor" }, /*#__PURE__*/React.createElement("path", { d: "M5 12h14M13 6l6 6-6 6", strokeLinecap: "round", strokeLinejoin: "round" }))))); } Object.assign(__ds_scope, { CategoryTile }); })(); } catch (e) { __ds_ns.__errors.push({ path: "components/commerce/CategoryTile.jsx", error: String((e && e.message) || e) }); } // components/commerce/ProductCard.jsx try { (() => { function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const CSS = ` .vn-pcard{ container-type:inline-size; display:flex;flex-direction:column;background:var(--surface-card); border-radius:var(--radius-lg);overflow:hidden; border:var(--border-width) solid var(--border-soft); transition:transform var(--dur-base) var(--ease-soft), box-shadow var(--dur-base) var(--ease-out), border-color var(--dur-base) var(--ease-out); } .vn-pcard:hover{ transform:translateY(-4px);box-shadow:var(--shadow-md);border-color:var(--border-strong); } .vn-pcard__media{ position:relative; } .vn-pcard__media .vn-photo{ border-radius:0; } .vn-pcard__flags{ position:absolute;top:12px;left:12px;z-index:3;display:flex;gap:6px; } .vn-pcard__wish{ position:absolute;top:10px;right:10px;z-index:3; width:40px;height:40px;border-radius:var(--radius-pill);border:none;cursor:pointer; background:rgba(251,248,241,.85);backdrop-filter:blur(4px); display:flex;align-items:center;justify-content:center;color:var(--tmavy-med); transition:background-color var(--dur-base) var(--ease-out),transform var(--dur-fast) var(--ease-soft); } .vn-pcard__wish:hover{ background:var(--bily-vosk); } .vn-pcard__wish:active{ transform:scale(.9); } .vn-pcard__wish svg{ width:20px;height:20px;stroke-width:1.7; } .vn-pcard__wish[aria-pressed="true"]{ color:var(--chyba); } .vn-pcard__wish[aria-pressed="true"] svg{ fill:var(--chyba); } .vn-pcard__body{ display:flex;flex-direction:column;gap:8px;padding:18px 18px 20px; } .vn-pcard__name{ font-family:var(--font-display);font-weight:var(--weight-semibold); font-size:var(--text-h3);line-height:1.2;color:var(--text-body);margin:0; font-variation-settings:var(--fraunces-soft-heading); } .vn-pcard__name a{ color:inherit;text-decoration:none; } .vn-pcard__name a:hover{ text-decoration:underline;text-decoration-thickness:1px; } .vn-pcard__meta{ font-size:var(--text-sm);font-weight:var(--weight-medium);color:var(--text-muted); } /* Region label inside the card reads as quiet meta, not the green provenance tag. */ .vn-pcard .vn-tag{ color:var(--text-muted);font-weight:var(--weight-medium); } .vn-pcard .vn-tag__dot{ background:var(--text-muted); } .vn-pcard__foot{ display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:6px;flex-wrap:wrap; } .vn-pcard__price{ display:flex;align-items:baseline;gap:8px; } .vn-pcard__price b{ font-family:var(--font-body);font-weight:var(--weight-semibold);font-size:var(--text-price);color:var(--text-body); } .vn-pcard__price s{ color:var(--text-faint);font-size:var(--text-sm);text-decoration:line-through; } .vn-pcard__add{ display:inline-flex;align-items:center;gap:7px;border:none;cursor:pointer; background:var(--accent);color:var(--bily-vosk); font-family:var(--font-body);font-weight:var(--weight-semibold);font-size:var(--text-sm); padding:10px 16px;border-radius:var(--radius-pill);min-height:42px; box-shadow:var(--shadow-cta); transition:background-color var(--dur-base) var(--ease-out),transform var(--dur-fast) var(--ease-soft); } .vn-pcard__add:hover{ background:var(--accent-hover); } .vn-pcard__add:active{ transform:scale(.96); } .vn-pcard__add svg{ width:17px;height:17px;stroke-width:2;flex:none; } .vn-pcard__add-label{ display:inline; } /* On narrow cards (2-up mobile grid) collapse quick-add to an icon-only pill so the price + button never overflow. */ @container (max-width: 215px){ .vn-pcard__add{ padding:11px;min-width:44px;justify-content:center; } .vn-pcard__add-label{ display:none; } } `; if (typeof document !== "undefined" && !document.getElementById("vn-pcard-css")) { const s = document.createElement("style"); s.id = "vn-pcard-css"; s.textContent = CSS; document.head.appendChild(s); } function Heart() { return /*#__PURE__*/React.createElement("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor" }, /*#__PURE__*/React.createElement("path", { d: "M12 20.5l-1.45-1.32C5.4 14.55 2 11.5 2 7.75 2 5.13 4.04 3 6.6 3c1.54 0 3.02.74 3.9 1.9C11.38 3.74 12.86 3 14.4 3 16.96 3 19 5.13 19 7.75c0 3.75-3.4 6.8-8.55 11.43z", transform: "translate(.5 0)", strokeLinecap: "round", strokeLinejoin: "round" })); } function Plus() { return /*#__PURE__*/React.createElement("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor" }, /*#__PURE__*/React.createElement("path", { d: "M12 5v14M5 12h14", strokeLinecap: "round" })); } function ProductCard({ name, region, weight, price, oldPrice, currency = "Kč", image, imageLabel = "Foto sklenice", rating, reviewCount, badge, href = "#", wishlisted = false, onWishlist, wishlist = true, onAdd, addLabel = "Do košíku", className = "", ...rest }) { return /*#__PURE__*/React.createElement("article", _extends({ className: ["vn-pcard", className].filter(Boolean).join(" ") }, rest), /*#__PURE__*/React.createElement("div", { className: "vn-pcard__media" }, badge && /*#__PURE__*/React.createElement("div", { className: "vn-pcard__flags" }, /*#__PURE__*/React.createElement(__ds_scope.Badge, { tone: badge.tone || "gold" }, badge.label || badge)), wishlist && /*#__PURE__*/React.createElement("button", { className: "vn-pcard__wish", "aria-label": "P\u0159idat do obl\xEDben\xFDch", "aria-pressed": wishlisted, onClick: e => { e.stopPropagation(); e.preventDefault(); onWishlist && onWishlist(); } }, /*#__PURE__*/React.createElement(Heart, null)), /*#__PURE__*/React.createElement("a", { href: href, "aria-label": name }, /*#__PURE__*/React.createElement(__ds_scope.Photo, { src: image, alt: name, ratio: "4 / 5", label: imageLabel }))), /*#__PURE__*/React.createElement("div", { className: "vn-pcard__body" }, region && /*#__PURE__*/React.createElement(__ds_scope.Tag, null, region), /*#__PURE__*/React.createElement("h3", { className: "vn-pcard__name" }, /*#__PURE__*/React.createElement("a", { href: href }, name)), /*#__PURE__*/React.createElement("div", { className: "vn-pcard__meta" }, weight, rating != null && /*#__PURE__*/React.createElement("span", { style: { marginLeft: weight ? 10 : 0, display: "inline-flex", verticalAlign: "middle" } }, /*#__PURE__*/React.createElement(__ds_scope.Rating, { value: rating, count: reviewCount, size: "sm" }))), /*#__PURE__*/React.createElement("div", { className: "vn-pcard__foot" }, /*#__PURE__*/React.createElement("span", { className: "vn-pcard__price" }, /*#__PURE__*/React.createElement("b", null, price, " ", currency), oldPrice && /*#__PURE__*/React.createElement("s", null, oldPrice, " ", currency)), /*#__PURE__*/React.createElement("button", { className: "vn-pcard__add", onClick: e => { e.stopPropagation(); e.preventDefault(); onAdd && onAdd(); }, "aria-label": addLabel }, /*#__PURE__*/React.createElement(Plus, null), " ", /*#__PURE__*/React.createElement("span", { className: "vn-pcard__add-label" }, addLabel))))); } Object.assign(__ds_scope, { ProductCard }); })(); } catch (e) { __ds_ns.__errors.push({ path: "components/commerce/ProductCard.jsx", error: String((e && e.message) || e) }); } // components/media/SectionHeading.jsx try { (() => { function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const CSS = ` .vn-secthead{ display:flex;flex-direction:column;gap:12px;max-width:640px; } .vn-secthead--center{ align-items:center;text-align:center;margin-inline:auto; } .vn-secthead__title{ font-family:var(--font-display);color:var(--text-heading); font-size:var(--text-h2);line-height:var(--leading-snug);letter-spacing:var(--tracking-tight); font-weight:var(--weight-semibold);margin:0; font-variation-settings:var(--fraunces-soft-heading); } .vn-secthead__lead{ font-size:var(--text-lead);line-height:var(--leading-relaxed);color:var(--text-muted);margin:0; } .vn-secthead__row{ display:flex;align-items:flex-end;justify-content:space-between;gap:24px;flex-wrap:wrap; } `; if (typeof document !== "undefined" && !document.getElementById("vn-secthead-css")) { const s = document.createElement("style"); s.id = "vn-secthead-css"; s.textContent = CSS; document.head.appendChild(s); } function SectionHeading({ eyebrow, title, lead, align = "start", action, className = "", ...rest }) { const head = /*#__PURE__*/React.createElement("div", _extends({ className: ["vn-secthead", align === "center" ? "vn-secthead--center" : "", className].filter(Boolean).join(" ") }, rest), eyebrow && /*#__PURE__*/React.createElement("span", { className: "vn-eyebrow" }, eyebrow), title && /*#__PURE__*/React.createElement("h2", { className: "vn-secthead__title" }, title), lead && /*#__PURE__*/React.createElement("p", { className: "vn-secthead__lead" }, lead)); if (action) { return /*#__PURE__*/React.createElement("div", { className: "vn-secthead__row" }, head, action); } return head; } Object.assign(__ds_scope, { SectionHeading }); })(); } catch (e) { __ds_ns.__errors.push({ path: "components/media/SectionHeading.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/About.jsx try { (() => { // About + a light Checkout + Contact pages. (function () { if (typeof React === "undefined") return; const DS = window.VElaStvNajmanDesignSystem_bc3fc2; const { Photo, Button, SectionHeading, Input, Select, Tag } = DS; const Icon = window.VNIcon; // 5.6 — newsletter with success state + subtle confetti function Confetti() { const bits = React.useMemo(() => Array.from({ length: 16 }, () => ({ l: Math.random() * 100, d: (Math.random() * 0.25).toFixed(2), c: ["var(--accent)", "var(--accent-secondary)", "var(--medova-zlata-svetla)"][Math.floor(Math.random() * 3)], r: Math.floor(Math.random() * 360), x: Math.round((Math.random() - 0.5) * 140) })), []); return /*#__PURE__*/React.createElement("div", { className: "kit-confetti", "aria-hidden": "true" }, bits.map((b, i) => /*#__PURE__*/React.createElement("span", { key: i, style: { left: b.l + "%", background: b.c, animationDelay: b.d + "s", transform: "rotate(" + b.r + "deg)", "--x": b.x + "px" } }))); } function NewsletterForm() { const [email, setEmail] = React.useState(""); const [burst, setBurst] = React.useState(false); const [done, setDone] = React.useState(false); const submit = e => { e.preventDefault(); if (!email) return; setBurst(true); setTimeout(() => setDone(true), 700); setTimeout(() => setBurst(false), 1100); }; return /*#__PURE__*/React.createElement("div", { className: "kit-news__formwrap" }, done ? /*#__PURE__*/React.createElement("p", { className: "kit-news__thanks" }, /*#__PURE__*/React.createElement(Icon, { name: "check", size: 18 }), " D\u011Bkujeme! Prvn\xED n\xE1kup se slevou 10\xA0% \u010Dek\xE1 ve va\u0161\xED schr\xE1nce.") : /*#__PURE__*/React.createElement("form", { className: "kit-news__form" + (burst ? " is-done" : ""), onSubmit: submit }, /*#__PURE__*/React.createElement(Input, { type: "email", required: true, placeholder: "vas@email.cz", "aria-label": "E-mail", value: email, onChange: e => setEmail(e.target.value) }), /*#__PURE__*/React.createElement(Button, { variant: "primary", type: "submit", iconStart: burst ? /*#__PURE__*/React.createElement(Icon, { name: "check", size: 18 }) : undefined }, burst ? "Přihlášen!" : "Odebírat")), burst && /*#__PURE__*/React.createElement(Confetti, null)); } function About({ go }) { const D = window.SHOP_DATA; const [lightbox, setLightbox] = React.useState(null); // Ocenění — newest first (left → right), horizontal drag-scroll like Satur const diplomas = [{ ic: "rosette", t: "Med roku 2025 — zlato", d: "1. místo v národní soutěži Med roku za květový med." }, { ic: "spark", t: "Regionální potravina 2024", d: "Ocenění Regionální potravina Středočeského kraje." }, { ic: "shield", t: "Český med — certifikát 2024", d: "Certifikát kvality Českého svazu včelařů." }, { ic: "rosette", t: "Zlatá plástev 2023", d: "Ocenění za senzorickou kvalitu našeho květového medu." }, { ic: "rosette", t: "Krajská soutěž medu 2023", d: "1. místo v krajské soutěži medu." }, { ic: "shield", t: "Český med — certifikát 2022", d: "Certifikát výborné kvality Českého svazu včelařů." }, { ic: "leaf", t: "Medové slavnosti 2021", d: "Ocenění poroty za med z lipových oblastí." }, { ic: "spark", t: "Regionální produkt 2020", d: "Značka Regionální produkt Brdy a Podbrdsko." }, { ic: "rosette", t: "Med roku 2019 — stříbro", d: "2. místo za tmavý medovicový med z Brd." }, { ic: "shield", t: "Laboratorní rozbor 2018", d: "Nezávislý akreditovaný rozbor — žádné přidané cukry." }, { ic: "leaf", t: "Včela roku 2016", d: "Ocenění regionálního svazu včelařů za vzorný chov." }, { ic: "spark", t: "Medová výstava 2013", d: "První ocenění poroty místní medové výstavy v Hostivicích." }]; const sliderRef = React.useRef(null); const dragged = React.useRef(false); React.useEffect(() => { const el = sliderRef.current; if (!el) return; let down = false, startX = 0, startScroll = 0; const onDown = e => { if (e.pointerType !== "mouse") return; // touch uses native scroll down = true; dragged.current = false; startX = e.pageX; startScroll = el.scrollLeft; el.classList.add("is-dragging"); }; const onMove = e => { if (!down) return; const dx = e.pageX - startX; if (Math.abs(dx) > 4) dragged.current = true; el.scrollLeft = startScroll - dx; }; const onUp = () => { down = false; el.classList.remove("is-dragging"); }; el.addEventListener("pointerdown", onDown); window.addEventListener("pointermove", onMove); window.addEventListener("pointerup", onUp); return () => { el.removeEventListener("pointerdown", onDown); window.removeEventListener("pointermove", onMove); window.removeEventListener("pointerup", onUp); }; }, []); return /*#__PURE__*/React.createElement("main", { className: "kit" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell kit-about__hero" }, /*#__PURE__*/React.createElement(Photo, { src: DS.PHOTOS && DS.PHOTOS.beekeeper, ratio: "auto", radius: "var(--radius-jar)", className: "kit-about__photo", style: { height: "100%" }, alt: "V\u010Dela\u0159 u \xFAl\u016F", label: "Foto v\u010Delnice" }), /*#__PURE__*/React.createElement("div", { className: "kit-about__copy" }, /*#__PURE__*/React.createElement("span", { className: "vn-eyebrow" }, "N\xE1\u0161 p\u0159\xEDb\u011Bh"), /*#__PURE__*/React.createElement("h1", null, "Mal\xE9 rodinn\xE9 v\u010Dela\u0159stv\xED z Hostivic"), /*#__PURE__*/React.createElement("p", null, "Za\u010Dalo to v roce 2012 jedn\xEDm \xFAlem na zahrad\u011B \u2014 a zv\u011Bdavost\xED, kam a\u017E n\xE1s v\u010Dely zavedou. Z kon\xED\u010Dku se brzy stala pr\xE1ce, kterou d\u011Bl\xE1me cel\xE1 rodina."), /*#__PURE__*/React.createElement("p", null, "Dnes se star\xE1me o v\xEDce ne\u017E \u0161edes\xE1t vlastn\xEDch v\u010Delstev. Nekupujeme ciz\xED med na p\u0159ebalen\xED \u2014 v\xEDme, z kter\xE9 louky ka\u017Ed\xE1 sklenice poch\xE1z\xED."), /*#__PURE__*/React.createElement("p", null, "Med nikdy nep\u0159ih\u0159\xEDv\xE1me nad 40 \xB0C a pln\xEDme ho ru\u010Dn\u011B, sklenici po sklenici. Nepo\u010D\xEDt\xE1me ho na tuny, ale na louky, na l\xE9ta a na lidi, kte\u0159\xED se k n\xE1m vracej\xED."), /*#__PURE__*/React.createElement("p", { style: { fontFamily: "var(--font-body)", fontStyle: "italic", color: "var(--tmavy-med)" } }, "V\u011B\u0159\xEDme, \u017Ee poctivost m\xE1 chu\u0165. U n\xE1s v\u017Edycky v\xEDte, odkud v\xE1\u0161 med je a kdo za n\xEDm stoj\xED."), /*#__PURE__*/React.createElement("div", { style: { marginTop: 4 } }, /*#__PURE__*/React.createElement(Button, { variant: "secondary", onClick: () => go("blog"), iconEnd: /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 16 }) }, "P\u0159e\u010D\xEDst cel\xFD p\u0159\xEDb\u011Bh")))), /*#__PURE__*/React.createElement("section", { className: "kit-section--alt" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement(SectionHeading, { align: "center", eyebrow: "V\u010Dela\u0159\xEDme od roku 2012", title: "Na\u0161e pr\xE1ce v \u010D\xEDslech", style: { marginBottom: 34 } }), /*#__PURE__*/React.createElement("div", { className: "kit-numbers" }, [{ n: "2012", l: "Začínáme s prvním úlem" }, { n: "60+", l: "Vlastních včelstev" }, { n: "5", l: "Oblastí původu medu" }, { n: "40 °C", l: "Med nikdy nepřehříváme" }].map((s, i) => /*#__PURE__*/React.createElement("div", { className: "kit-number", key: i }, /*#__PURE__*/React.createElement("b", null, s.n), /*#__PURE__*/React.createElement("span", null, s.l)))))), /*#__PURE__*/React.createElement("section", { className: "kit-section" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement(SectionHeading, { align: "center", eyebrow: "\u010Cemu v\u011B\u0159\xEDme", title: "Na\u0161e hodnoty", style: { marginBottom: 8 } }), /*#__PURE__*/React.createElement("div", { className: "kit-values" }, [{ ic: "leaf", t: "Poctivost", d: "Čistý med bez přidaných cukrů a aditiv. Nikdy ho nepřihříváme nad 40 °C." }, { ic: "pin", t: "Původ", d: "Víme, z které louky každá sklenice pochází. Žádné míchání šarží napříč kraji." }, { ic: "dipper", t: "Řemeslo", d: "Stáčíme a plníme ručně, sklenici po sklenici — tak, jak se to dělalo vždycky." }].map((v, i) => /*#__PURE__*/React.createElement("div", { className: "kit-value", key: i }, /*#__PURE__*/React.createElement("div", { className: "kit-value__head" }, /*#__PURE__*/React.createElement("span", { className: "kit-value__ic" }, /*#__PURE__*/React.createElement(Icon, { name: v.ic, size: 24, strokeWidth: 1.6 })), /*#__PURE__*/React.createElement("h3", null, v.t)), /*#__PURE__*/React.createElement("p", null, v.d)))))), /*#__PURE__*/React.createElement("section", { className: "kit-section--alt" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement("div", { className: "kit-awards" }, /*#__PURE__*/React.createElement("header", { className: "kit-awards__head" }, /*#__PURE__*/React.createElement("span", { className: "vn-eyebrow" }, "Ocen\u011Bn\xED"), /*#__PURE__*/React.createElement("h2", null, "Na\u0161e pr\xE1ce m\xE1 i raz\xEDtka"), /*#__PURE__*/React.createElement("p", null, "Med pravideln\u011B p\u0159ihla\u0161ujeme do sout\u011B\u017E\xED a nech\xE1v\xE1me nez\xE1visle rozebrat v akreditovan\xE9 laborato\u0159i. Tady je d\u016Fkaz na pap\xED\u0159e.")), /*#__PURE__*/React.createElement("div", { className: "kit-diplomas", ref: sliderRef }, diplomas.map((a, i) => /*#__PURE__*/React.createElement("button", { className: "kit-diploma", key: i, onClick: () => { if (dragged.current) return; setLightbox(a.t); }, "aria-label": "Zobrazit: " + a.t }, /*#__PURE__*/React.createElement("span", { className: "kit-diploma__media" }, /*#__PURE__*/React.createElement(Photo, { ratio: "3 / 4", radius: "0", label: "Diplom \u2014 sken" }), /*#__PURE__*/React.createElement("span", { className: "kit-diploma__badge" }, /*#__PURE__*/React.createElement(Icon, { name: a.ic, size: 17 })), /*#__PURE__*/React.createElement("span", { className: "kit-diploma__zoom" }, /*#__PURE__*/React.createElement(Icon, { name: "plus", size: 15 }))), /*#__PURE__*/React.createElement("span", { className: "kit-diploma__t" }, a.t), /*#__PURE__*/React.createElement("span", { className: "kit-diploma__d" }, a.d))))))), lightbox && /*#__PURE__*/React.createElement("div", { className: "kit-lightbox", "data-open": "true", onClick: e => { if (e.target === e.currentTarget) setLightbox(null); } }, /*#__PURE__*/React.createElement("button", { className: "kit-lightbox__close", onClick: () => setLightbox(null), "aria-label": "Zav\u0159\xEDt" }, /*#__PURE__*/React.createElement(Icon, { name: "close", size: 22 })), /*#__PURE__*/React.createElement("div", { className: "kit-lightbox__inner" }, /*#__PURE__*/React.createElement(Photo, { ratio: "3 / 4", label: lightbox }))), /*#__PURE__*/React.createElement("section", { className: "kit-section" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement("div", { className: "kit-section__head" }, /*#__PURE__*/React.createElement(SectionHeading, { eyebrow: "P\u016Fvod a terroir", title: "Med z konkr\xE9tn\xEDch m\xEDst", lead: "Nem\xEDch\xE1me \u0161ar\u017Ee nap\u0159\xED\u010D kraji. Ka\u017Ed\xE1 sklenice nese jedno konkr\xE9tn\xED m\xEDsto a jeho chu\u0165." })), /*#__PURE__*/React.createElement("div", { className: "kit-terroir" }, [{ name: "Brdské lesy", arg: "lesni", img: DS.PHOTOS && DS.PHOTOS.forest, desc: "Tmavý medovicový med ze smrkových lesů Brd. Sytý, sladově hořký, bohatý na minerály." }, { name: "Křivoklátsko — údolí Oty Pavla", arg: "lesni", img: DS.PHOTOS && DS.PHOTOS.beeFlower, desc: "Lesní med z chráněné krajinné oblasti. Pryskyřičný, s dlouhou kořeněnou dochutí." }, { name: "Lipové aleje", arg: "kvetove", img: DS.PHOTOS && DS.PHOTOS.heroDipper, desc: "Jemný květový a lipový med z alejí kolem Hostivic. Svěží, s typickou lipovou vůní." }].map((t, i) => /*#__PURE__*/React.createElement("a", { key: i, className: "kit-terroir__card", href: "#", onClick: e => { e.preventDefault(); go("category", t.arg); } }, /*#__PURE__*/React.createElement("div", { className: "kit-terroir__media" }, /*#__PURE__*/React.createElement(Photo, { src: t.img, ratio: "16 / 10", label: t.name })), /*#__PURE__*/React.createElement("div", { className: "kit-terroir__body" }, /*#__PURE__*/React.createElement("h3", { className: "kit-terroir__name" }, t.name), /*#__PURE__*/React.createElement("p", { className: "kit-terroir__desc" }, t.desc), /*#__PURE__*/React.createElement("span", { className: "kit-terroir__link" }, "Med z t\xE9to oblasti ", /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 15 })))))))), /*#__PURE__*/React.createElement("section", { className: "kit-section--alt" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement("div", { className: "kit-visit" }, /*#__PURE__*/React.createElement("div", { className: "kit-visit__media" }, /*#__PURE__*/React.createElement(Photo, { src: DS.PHOTOS && DS.PHOTOS.forest, ratio: "4 / 3", label: "Foto v\u010Delnice u dvora", style: { height: "100%" } })), /*#__PURE__*/React.createElement("div", { className: "kit-visit__copy" }, /*#__PURE__*/React.createElement("span", { className: "vn-eyebrow kit-visit__eyebrow" }, /*#__PURE__*/React.createElement(Icon, { name: "door", size: 15 }), " Stavte se"), /*#__PURE__*/React.createElement("h2", null, "P\u0159ij\u010Fte se pod\xEDvat ke dvoru"), /*#__PURE__*/React.createElement("p", null, "R\xE1di v\xE1m uk\xE1\u017Eeme \xFAly, pov\xEDme, jak se kter\xFD med rod\xED, a nech\xE1me ochutnat rovnou ze sklenice. Sta\u010D\xED se p\u0159edem ozvat \u2014 odb\u011Br ze dvora si domluv\xEDme kdykoli."), /*#__PURE__*/React.createElement("p", { className: "kit-visit__addr" }, /*#__PURE__*/React.createElement(Icon, { name: "pin", size: 16 }), " Na Samot\u011B 1029, 253 01 Hostivice"), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Button, { variant: "primary", onClick: () => go("contact"), iconEnd: /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 18 }) }, "Domluvit n\xE1v\u0161t\u011Bvu"))))))); } function Checkout({ go, items }) { const total = items.reduce((s, i) => s + i.price * i.qty, 0); const count = items.reduce((s, i) => s + i.qty, 0); const freeAt = 4; const left = Math.max(0, freeAt - count); const pct = Math.min(100, count / freeAt * 100); const ship = left === 0 ? 0 : 79; return /*#__PURE__*/React.createElement("main", { className: "kit" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell", style: { paddingBlock: "var(--section-y-tight) var(--section-y)" } }, /*#__PURE__*/React.createElement("nav", { className: "kit-breadcrumb" }, /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("home"); } }, "Dom\u016F"), /*#__PURE__*/React.createElement(Icon, { name: "chevronRight", size: 13 }), /*#__PURE__*/React.createElement("span", null, "Pokladna")), /*#__PURE__*/React.createElement("h1", { style: { marginBottom: 6 } }, "Pokladna"), /*#__PURE__*/React.createElement("p", { style: { color: "var(--text-muted)", fontSize: "var(--text-sm)", marginTop: 0, marginBottom: 28, display: "flex", alignItems: "center", gap: 8 } }, /*#__PURE__*/React.createElement(Icon, { name: "check", size: 16, style: { color: "var(--accent-secondary)" } }), " N\xE1kup bez registrace \u2014 sta\u010D\xED vyplnit doru\u010Dovac\xED \xFAdaje."), /*#__PURE__*/React.createElement("div", { style: { display: "grid", gridTemplateColumns: "1fr", gap: 32 }, className: "kit-checkout-grid" }, /*#__PURE__*/React.createElement("div", { style: { display: "flex", flexDirection: "column", gap: 26 } }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h3", { style: { marginTop: 0 } }, "Doru\u010Dovac\xED \xFAdaje"), /*#__PURE__*/React.createElement("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: 14 } }, /*#__PURE__*/React.createElement(Input, { label: "Jm\xE9no", placeholder: "Jan" }), /*#__PURE__*/React.createElement(Input, { label: "P\u0159\xEDjmen\xED", placeholder: "Nov\xE1k" }), /*#__PURE__*/React.createElement(Input, { label: "E-mail", type: "email", placeholder: "jan@email.cz" }), /*#__PURE__*/React.createElement(Input, { label: "Telefon", placeholder: "+420 \u2026" }), /*#__PURE__*/React.createElement("div", { style: { gridColumn: "1 / -1" } }, /*#__PURE__*/React.createElement(Input, { label: "Ulice a \u010D.p.", placeholder: "Na Samot\u011B 1029" })), /*#__PURE__*/React.createElement(Input, { label: "M\u011Bsto", placeholder: "Hostivice" }), /*#__PURE__*/React.createElement(Input, { label: "PS\u010C", placeholder: "253 01" }))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h3", null, "Doprava"), /*#__PURE__*/React.createElement("div", { style: { display: "flex", flexDirection: "column", gap: 10 } }, ["Rozvoz po Hostivicích a okolí (zdarma od 4 ks)", "Osobní odběr ze dvora", "Zásilkovna", "Kurýr po ČR"].map((o, i) => /*#__PURE__*/React.createElement("label", { key: i, className: "kit-fopt" }, /*#__PURE__*/React.createElement("input", { type: "radio", name: "ship", defaultChecked: i === 0 }), " ", /*#__PURE__*/React.createElement("span", null, o))))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h3", null, "Platba"), /*#__PURE__*/React.createElement("div", { className: "kit-pay" }, /*#__PURE__*/React.createElement("span", { "data-pri": "true" }, "Dob\xEDrka"), /*#__PURE__*/React.createElement("span", { "data-pri": "true" }, "Z\xE1silkovna / Packeta"), /*#__PURE__*/React.createElement("span", null, "Karta"), /*#__PURE__*/React.createElement("span", null, "Apple\xA0Pay"), /*#__PURE__*/React.createElement("span", null, "Google\xA0Pay"), /*#__PURE__*/React.createElement("span", null, "Bankovn\xED p\u0159evod")), /*#__PURE__*/React.createElement("p", { className: "kit-trustrow" }, /*#__PURE__*/React.createElement(Icon, { name: "shield", size: 16 }), " Zabezpe\u010Den\xE1 platba \xB7 v \u010Cesku pos\xEDl\xE1me prioritn\u011B Z\xE1silkovnou nebo na dob\xEDrku."))), /*#__PURE__*/React.createElement("aside", { style: { background: "var(--surface-alt)", borderRadius: "var(--radius-xl)", padding: 24, alignSelf: "start" } }, /*#__PURE__*/React.createElement("h3", { style: { marginTop: 0 } }, "Souhrn objedn\xE1vky"), items.length > 0 && /*#__PURE__*/React.createElement("div", { className: "kit-cofree" }, /*#__PURE__*/React.createElement("p", { className: "kit-cofree__msg" }, /*#__PURE__*/React.createElement(Icon, { name: "truck", size: 16 }), left > 0 ? /*#__PURE__*/React.createElement("span", null, "P\u0159idejte je\u0161t\u011B ", /*#__PURE__*/React.createElement("strong", null, left, " ks"), " a rozvoz m\xE1te zdarma.") : /*#__PURE__*/React.createElement("span", null, "M\xE1te n\xE1rok na ", /*#__PURE__*/React.createElement("strong", null, "rozvoz zdarma"), " v okol\xED Hostivic.")), /*#__PURE__*/React.createElement("div", { className: "kit-cofree__bar" }, /*#__PURE__*/React.createElement("i", { style: { width: pct + "%" } }))), items.length === 0 && /*#__PURE__*/React.createElement("p", { style: { color: "var(--text-muted)" } }, "Ko\u0161\xEDk je pr\xE1zdn\xFD."), items.map(it => /*#__PURE__*/React.createElement("div", { key: it.id, style: { padding: "8px 0", fontSize: "var(--text-sm)", borderBottom: "1px solid var(--border-soft)" } }, /*#__PURE__*/React.createElement("div", { style: { display: "flex", justifyContent: "space-between", gap: 12 } }, /*#__PURE__*/React.createElement("span", null, it.qty, "\xD7 ", it.name, it.weight ? " · " + it.weight : ""), /*#__PURE__*/React.createElement("b", { style: { whiteSpace: "nowrap" } }, it.price * it.qty, " K\u010D")), it.preorder && /*#__PURE__*/React.createElement("div", { style: { color: "var(--medova-zlata-tmava)", fontSize: "var(--text-xs)", marginTop: 4 } }, "P\u0159edobjedn\xE1vka \u2014 ode\u0161leme po naskladn\u011Bn\xED (", it.preorder, ")"))), /*#__PURE__*/React.createElement("div", { style: { display: "flex", justifyContent: "space-between", padding: "10px 0", color: "var(--text-muted)", fontSize: "var(--text-sm)" } }, /*#__PURE__*/React.createElement("span", null, "Doprava"), /*#__PURE__*/React.createElement("span", null, ship === 0 ? "zdarma" : ship + " Kč")), /*#__PURE__*/React.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "baseline", paddingTop: 8 } }, /*#__PURE__*/React.createElement("span", null, "Celkem"), /*#__PURE__*/React.createElement("b", { style: { fontFamily: "var(--font-body)", fontWeight: 600, fontSize: "var(--text-price)", color: "var(--text-body)" } }, total + ship, " K\u010D")), /*#__PURE__*/React.createElement("div", { style: { marginTop: 16 } }, /*#__PURE__*/React.createElement(Button, { variant: "primary", block: true, size: "lg", iconEnd: /*#__PURE__*/React.createElement(Icon, { name: "check", size: 18 }) }, "Z\xE1vazn\u011B objednat")), /*#__PURE__*/React.createElement("p", { style: { fontSize: "var(--text-xs)", color: "var(--text-faint)", textAlign: "center", marginTop: 12, marginBottom: 0 } }, "Odesl\xE1n\xEDm souhlas\xEDte s obchodn\xEDmi podm\xEDnkami."))))); } function Contact({ go }) { return /*#__PURE__*/React.createElement("main", { className: "kit" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell", style: { paddingBlock: "var(--section-y-tight) var(--section-y)" } }, /*#__PURE__*/React.createElement("header", { className: "kit-contact__intro" }, /*#__PURE__*/React.createElement("h1", null, "Kontakt & osobn\xED odb\u011Br"), /*#__PURE__*/React.createElement("p", null, "Ozv\u011Bte se n\xE1m telefonicky nebo p\u0159es formul\xE1\u0159. Matky a odd\u011Blky se p\u0159eb\xEDraj\xED osobn\u011B na v\u010Delnici v Hostivic\xEDch po p\u0159edchoz\xED domluv\u011B.")), /*#__PURE__*/React.createElement("div", { className: "kit-contact" }, /*#__PURE__*/React.createElement("div", { className: "kit-contact__copy" }, /*#__PURE__*/React.createElement("div", { className: "kit-contact__address" }, /*#__PURE__*/React.createElement("h2", { style: { margin: "0 0 18px" } }, "Adresa"), /*#__PURE__*/React.createElement("ul", { className: "kit-cinfo" }, /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement("span", { className: "kit-cinfo__ic" }, /*#__PURE__*/React.createElement(Icon, { name: "pin", size: 18 })), /*#__PURE__*/React.createElement("span", { className: "kit-cinfo__body" }, /*#__PURE__*/React.createElement("strong", null, "V\u010Delnice Najman \u2014 Na Samot\u011B 1029"), /*#__PURE__*/React.createElement("span", { className: "kit-cinfo__sub" }, "253 01 Hostivice, okres Praha-z\xE1pad"))), /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement("span", { className: "kit-cinfo__ic" }, /*#__PURE__*/React.createElement(Icon, { name: "phone", size: 18 })), /*#__PURE__*/React.createElement("span", { className: "kit-cinfo__body" }, /*#__PURE__*/React.createElement("a", { href: "tel:+420603887482" }, "+420 603 887 482"), /*#__PURE__*/React.createElement("span", { className: "kit-cinfo__sub" }, "Nejl\xE9pe Po\u2013P\xE1 8\u201318 h."))), /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement("span", { className: "kit-cinfo__ic" }, /*#__PURE__*/React.createElement(Icon, { name: "mail", size: 18 })), /*#__PURE__*/React.createElement("span", { className: "kit-cinfo__body" }, /*#__PURE__*/React.createElement("a", { href: "mailto:vcelahostivice@seznam.cz" }, "vcelahostivice@seznam.cz"), /*#__PURE__*/React.createElement("span", { className: "kit-cinfo__sub" }, "Odpov\xEDd\xE1me do 1\u20132 dn\u016F."))), /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement("span", { className: "kit-cinfo__ic" }, /*#__PURE__*/React.createElement(Icon, { name: "clock", size: 18 })), /*#__PURE__*/React.createElement("span", { className: "kit-cinfo__body" }, /*#__PURE__*/React.createElement("strong", null, "Osobn\xED odb\u011Br"), /*#__PURE__*/React.createElement("span", { className: "kit-cinfo__sub" }, "Po domluv\u011B term\xEDnu telefonicky. Zbo\u017E\xED se p\u0159eb\xEDr\xE1 osobn\u011B na v\u010Delnici."))))), /*#__PURE__*/React.createElement("form", { className: "kit-contact__form", onSubmit: e => e.preventDefault() }, /*#__PURE__*/React.createElement("div", { className: "kit-contact__row" }, /*#__PURE__*/React.createElement(Input, { label: "Va\u0161e jm\xE9no", placeholder: "Jan Nov\xE1k" }), /*#__PURE__*/React.createElement(Input, { label: "E-mail", type: "email", placeholder: "jan@email.cz" })), /*#__PURE__*/React.createElement(Input, { label: "Telefon (nepovinn\xE9)", type: "tel", placeholder: "+420 \u2026" }), /*#__PURE__*/React.createElement("div", { className: "vn-field" }, /*#__PURE__*/React.createElement("label", { className: "vn-field__label", style: { display: "block", marginBottom: 6 } }, "Zpr\xE1va"), /*#__PURE__*/React.createElement("textarea", { className: "vn-input", rows: "4", placeholder: "Dobr\xFD den, r\xE1d bych se zeptal na\u2026", style: { width: "100%", resize: "vertical", fontFamily: "var(--font-body)" } })), /*#__PURE__*/React.createElement(Button, { variant: "primary", block: true }, "Odeslat zpr\xE1vu"))), /*#__PURE__*/React.createElement("div", { className: "kit-map" }, /*#__PURE__*/React.createElement("div", { className: "kit-map__ring" }), /*#__PURE__*/React.createElement("div", { className: "kit-map__ring kit-map__ring--2" }), /*#__PURE__*/React.createElement("div", { className: "kit-map__pin" }, /*#__PURE__*/React.createElement(Icon, { name: "pin", size: 30 }), /*#__PURE__*/React.createElement("b", null, "Hostivice"), /*#__PURE__*/React.createElement("span", null, "Na Samot\u011B 1029")))))); } Object.assign(window, { VNAbout: About, VNCheckout: Checkout, VNContact: Contact }); })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/About.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/Account.jsx try { (() => { // Klientská sekce „Můj účet" — levá navigace + sekce (profil, adresy, // objednávky, předobjednávky, oblíbené, hlídací psi, platby, heslo). // Vizuální základ, který se natáhne na WooCommerce „Můj účet". (function () { if (typeof React === "undefined") return; const DS = window.VElaStvNajmanDesignSystem_bc3fc2; const { Button, Input } = DS; const Icon = window.VNIcon; const SECTIONS = [{ id: "profil", label: "Profil", icon: "user" }, { id: "adresy", label: "Adresy", icon: "pin" }, { id: "objednavky", label: "Historie objednávek", icon: "fileText" }, { id: "predobjednavky", label: "Mé předobjednávky", icon: "spark" }, { id: "upozorneni", label: "Hlídací psi", icon: "bell" }, { id: "heslo", label: "Změna hesla", icon: "lock" }]; const ORDER_STATUS = { received: { label: "Přijatá", cls: "received" }, shipped: { label: "Odeslaná", cls: "shipped" }, delivered: { label: "Doručená", cls: "delivered" } }; // ---- malý přepínač (toggle) ---- function Switch({ checked, onChange, label }) { return /*#__PURE__*/React.createElement("button", { type: "button", className: "kit-switch", role: "switch", "aria-checked": checked, "aria-label": label, "data-on": checked, onClick: () => onChange(!checked) }, /*#__PURE__*/React.createElement("span", { className: "kit-switch__knob" })); } function PanelHead({ title, desc }) { return /*#__PURE__*/React.createElement("header", { className: "kit-acc-panel__head" }, /*#__PURE__*/React.createElement("h2", null, title), desc && /*#__PURE__*/React.createElement("p", null, desc)); } // ============================ PROFIL ============================ function ProfilPanel({ user }) { const [name, setName] = React.useState(`${user.firstName} ${user.lastName}`); const [email, setEmail] = React.useState(user.email); const [phone, setPhone] = React.useState(user.phone); const [news, setNews] = React.useState(user.newsletter); return /*#__PURE__*/React.createElement("div", { className: "kit-acc-panel" }, /*#__PURE__*/React.createElement(PanelHead, { title: "Profil", desc: "Va\u0161e kontaktn\xED \xFAdaje. Pou\u017E\xEDv\xE1me je p\u0159i doru\u010Den\xED a pro potvrzen\xED objedn\xE1vek." }), /*#__PURE__*/React.createElement("div", { className: "kit-card kit-form" }, /*#__PURE__*/React.createElement(Input, { label: "Jm\xE9no a p\u0159\xEDjmen\xED", value: name, onChange: e => setName(e.target.value), icon: /*#__PURE__*/React.createElement(Icon, { name: "user" }) }), /*#__PURE__*/React.createElement("div", { className: "kit-form__grid2" }, /*#__PURE__*/React.createElement(Input, { label: "E-mail", type: "email", value: email, onChange: e => setEmail(e.target.value), icon: /*#__PURE__*/React.createElement(Icon, { name: "mail" }) }), /*#__PURE__*/React.createElement(Input, { label: "Telefon", type: "tel", value: phone, onChange: e => setPhone(e.target.value), icon: /*#__PURE__*/React.createElement(Icon, { name: "phone" }) })), /*#__PURE__*/React.createElement("div", { className: "kit-switchrow" }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("span", { className: "kit-switchrow__label" }, "Odeb\xEDrat newsletter"), /*#__PURE__*/React.createElement("span", { className: "kit-switchrow__hint" }, "D\xE1me v\u011Bd\u011Bt, kdy\u017E st\xE1\u010D\xEDme \u010Derstv\xFD med nebo chyst\xE1me d\xE1rkov\xE9 bal\xED\u010Dky.")), /*#__PURE__*/React.createElement(Switch, { checked: news, onChange: setNews, label: "Odeb\xEDrat newsletter" })), /*#__PURE__*/React.createElement("div", { className: "kit-form__actions" }, /*#__PURE__*/React.createElement(Button, { variant: "primary", iconStart: /*#__PURE__*/React.createElement(Icon, { name: "check", size: 17 }) }, "Ulo\u017Eit zm\u011Bny")))); } // ============================ ADRESY ============================ function AddressCard({ kind, addr }) { return /*#__PURE__*/React.createElement("div", { className: "kit-card kit-addr" }, /*#__PURE__*/React.createElement("div", { className: "kit-addr__head" }, /*#__PURE__*/React.createElement("span", { className: "kit-addr__kind" }, /*#__PURE__*/React.createElement(Icon, { name: kind === "shipping" ? "truck" : "fileText", size: 16 }), kind === "shipping" ? "Doručovací adresa" : "Fakturační adresa"), /*#__PURE__*/React.createElement("button", { className: "kit-iconlink", "aria-label": "Upravit adresu" }, /*#__PURE__*/React.createElement(Icon, { name: "edit", size: 16 }), " Upravit")), /*#__PURE__*/React.createElement("address", { className: "kit-addr__body" }, /*#__PURE__*/React.createElement("strong", null, addr.name), addr.street, /*#__PURE__*/React.createElement("br", null), addr.zip, " ", addr.city, /*#__PURE__*/React.createElement("br", null), addr.country)); } function AdresyPanel({ addresses }) { return /*#__PURE__*/React.createElement("div", { className: "kit-acc-panel" }, /*#__PURE__*/React.createElement(PanelHead, { title: "Adresy", desc: "Doru\u010Dovac\xED a faktura\u010Dn\xED adresa pro va\u0161e objedn\xE1vky." }), /*#__PURE__*/React.createElement("div", { className: "kit-addr-grid" }, /*#__PURE__*/React.createElement(AddressCard, { kind: "shipping", addr: addresses.shipping }), /*#__PURE__*/React.createElement(AddressCard, { kind: "billing", addr: addresses.billing }))); } // ====================== HISTORIE OBJEDNÁVEK ====================== function OrderRow({ order, products, onReorder, go }) { const items = order.items.map(it => { const p = products.find(x => x.id === it.id); return p ? `${p.name}${it.qty > 1 ? ` (${it.qty}×)` : ""}` : null; }).filter(Boolean).join(", "); const st = ORDER_STATUS[order.status] || ORDER_STATUS.received; return /*#__PURE__*/React.createElement("div", { className: "kit-order" }, /*#__PURE__*/React.createElement("div", { className: "kit-order__top" }, /*#__PURE__*/React.createElement("div", { className: "kit-order__id" }, /*#__PURE__*/React.createElement("span", { className: "kit-order__num" }, "Objedn\xE1vka \u010D. ", order.number), /*#__PURE__*/React.createElement("span", { className: "kit-order__date" }, order.date)), /*#__PURE__*/React.createElement("span", { className: "kit-ostatus kit-ostatus--" + st.cls }, /*#__PURE__*/React.createElement("span", { className: "kit-ostatus__dot" }), st.label)), /*#__PURE__*/React.createElement("p", { className: "kit-order__items" }, items), /*#__PURE__*/React.createElement("div", { className: "kit-order__foot" }, /*#__PURE__*/React.createElement("span", { className: "kit-order__total" }, order.total, " K\u010D"), /*#__PURE__*/React.createElement("div", { className: "kit-order__btns" }, /*#__PURE__*/React.createElement(Button, { variant: "secondary", size: "sm", onClick: () => go && go("home") }, "Detail"), /*#__PURE__*/React.createElement(Button, { variant: "primary", size: "sm", iconStart: /*#__PURE__*/React.createElement(Icon, { name: "cart", size: 15 }), onClick: () => onReorder && onReorder(order) }, "Objednat znovu")))); } function ObjednavkyPanel({ orders, products, onReorder, go }) { return /*#__PURE__*/React.createElement("div", { className: "kit-acc-panel" }, /*#__PURE__*/React.createElement(PanelHead, { title: "Historie objedn\xE1vek", desc: "P\u0159ehled va\u0161ich objedn\xE1vek a jejich stavu." }), /*#__PURE__*/React.createElement("div", { className: "kit-stack" }, orders.map(o => /*#__PURE__*/React.createElement(OrderRow, { key: o.number, order: o, products: products, onReorder: onReorder, go: go })))); } // ===================== MÉ PŘEDOBJEDNÁVKY ===================== const PRE_STATUS = { preparing: "Přijato — připravujeme", fermenting: "Kvasí — dozrává" }; function PredobjednavkyPanel({ preorders }) { return /*#__PURE__*/React.createElement("div", { className: "kit-acc-panel" }, /*#__PURE__*/React.createElement(PanelHead, { title: "M\xE9 p\u0159edobjedn\xE1vky", desc: "Sez\xF3nn\xED medy, kter\xE9 jste si rezervovali. D\xE1me v\u011Bd\u011Bt hned, jak naskladn\xEDme." }), preorders.length === 0 ? /*#__PURE__*/React.createElement(EmptyState, { icon: "spark", text: "Zat\xEDm nem\xE1te \u017E\xE1dn\xE9 p\u0159edobjedn\xE1vky." }) : /*#__PURE__*/React.createElement("div", { className: "kit-stack" }, preorders.map(pre => /*#__PURE__*/React.createElement("div", { className: "kit-card kit-pre", key: pre.id }, /*#__PURE__*/React.createElement("span", { className: "kit-pre__icon" }, /*#__PURE__*/React.createElement(Icon, { name: "spark", size: 20 })), /*#__PURE__*/React.createElement("div", { className: "kit-pre__main" }, /*#__PURE__*/React.createElement("div", { className: "kit-pre__row" }, /*#__PURE__*/React.createElement("span", { className: "kit-pre__name" }, pre.name), /*#__PURE__*/React.createElement("span", { className: "kit-pre__weight" }, pre.weight)), /*#__PURE__*/React.createElement("p", { className: "kit-pre__note" }, pre.note)), /*#__PURE__*/React.createElement("div", { className: "kit-pre__side" }, /*#__PURE__*/React.createElement("span", { className: "kit-chip kit-chip--gold" }, /*#__PURE__*/React.createElement("span", { className: "kit-ostatus__dot" }), PRE_STATUS[pre.status] || "Rezervováno"), /*#__PURE__*/React.createElement("span", { className: "kit-pre__eta" }, "Naskladn\u011Bn\xED: ", /*#__PURE__*/React.createElement("b", null, pre.restock))))))); } // ========================= OBLÍBENÉ ========================= // Kompaktní mini-karta — malý náhled, název, cena, rychlé přidání. function FavCard({ p, onOpen, onAdd, onNotify, onPreorder, onRemove }) { const { Photo } = DS; const soldOut = p.stock === "out"; const minPrice = p.variants && p.variants.length ? Math.min.apply(null, p.variants.map(v => v.price)) : p.price; return /*#__PURE__*/React.createElement("article", { className: "kit-favcard" }, /*#__PURE__*/React.createElement("div", { className: "kit-favcard__media", onClick: () => onOpen && onOpen(p) }, /*#__PURE__*/React.createElement(Photo, { src: p.image, ratio: "16 / 11", alt: p.name, label: p.weight }), /*#__PURE__*/React.createElement("button", { className: "kit-favcard__heart", "aria-label": "Odebrat " + p.name + " z oblíbených", title: "Odebrat z obl\xEDben\xFDch", onClick: e => { e.stopPropagation(); onRemove(); } }, /*#__PURE__*/React.createElement(Icon, { name: "heartFill", size: 16 }))), /*#__PURE__*/React.createElement("div", { className: "kit-favcard__body" }, p.region && /*#__PURE__*/React.createElement("span", { className: "kit-favcard__region" }, p.region), /*#__PURE__*/React.createElement("h3", { className: "kit-favcard__name", onClick: () => onOpen && onOpen(p) }, p.name), /*#__PURE__*/React.createElement("div", { className: "kit-favcard__foot" }, /*#__PURE__*/React.createElement("span", { className: "kit-favcard__price" }, p.variants && p.variants.length ? "od " : "", minPrice, " K\u010D"), soldOut ? p.restock ? /*#__PURE__*/React.createElement("button", { className: "kit-favcard__add", onClick: () => onPreorder && onPreorder(p), "aria-label": "P\u0159edobjednat" }, /*#__PURE__*/React.createElement(Icon, { name: "check", size: 16 })) : /*#__PURE__*/React.createElement("button", { className: "kit-favcard__add kit-favcard__add--ghost", onClick: () => onNotify && onNotify(p), "aria-label": "Upozornit, a\u017E naskladn\xEDme" }, /*#__PURE__*/React.createElement(Icon, { name: "bell", size: 16 })) : /*#__PURE__*/React.createElement("button", { className: "kit-favcard__add", onClick: onAdd, "aria-label": "Přidat " + p.name + " do košíku" }, /*#__PURE__*/React.createElement(Icon, { name: "plus", size: 16 }))))); } function OblibenePanel({ favorites, products, shared }) { const [favs, setFavs] = React.useState(favorites); const items = favs.map(id => products.find(p => p.id === id)).filter(Boolean); if (items.length === 0) return /*#__PURE__*/React.createElement("div", { className: "kit-acc-panel" }, /*#__PURE__*/React.createElement(PanelHead, { title: "Obl\xEDben\xE9" }), /*#__PURE__*/React.createElement(EmptyState, { icon: "heart", text: "Zat\xEDm nem\xE1te ulo\u017Een\xE9 \u017E\xE1dn\xE9 medy. Klepn\u011Bte na srd\xED\u010Dko u produktu." })); return /*#__PURE__*/React.createElement("div", { className: "kit-acc-panel" }, /*#__PURE__*/React.createElement(PanelHead, { title: "Obl\xEDben\xE9", desc: "Medy, kter\xE9 jste si ulo\u017Eili klepnut\xEDm na srd\xED\u010Dko." }), /*#__PURE__*/React.createElement("div", { className: "kit-favcard-grid" }, items.map(p => /*#__PURE__*/React.createElement(FavCard, { key: p.id, p: p, onOpen: shared.onOpen, onAdd: () => shared.addToCart(p), onNotify: shared.onNotify, onPreorder: shared.onPreorder, onRemove: () => setFavs(f => f.filter(x => x !== p.id)) })))); } // =================== HLÍDACÍ PSI / UPOZORNĚNÍ =================== function UpozorneniPanel({ watches }) { const [list, setList] = React.useState(watches); return /*#__PURE__*/React.createElement("div", { className: "kit-acc-panel" }, /*#__PURE__*/React.createElement(PanelHead, { title: "Hl\xEDdac\xED psi", desc: "Produkty, u kter\xFDch v\xE1s upozorn\xEDme, jakmile je naskladn\xEDme." }), list.length === 0 ? /*#__PURE__*/React.createElement(EmptyState, { icon: "bell", text: "Nehl\xEDd\xE1te \u017E\xE1dn\xE9 produkty. U vyprodan\xE9ho medu klepn\u011Bte na \u201EUpozornit\u201D." }) : /*#__PURE__*/React.createElement("div", { className: "kit-stack" }, list.map(w => /*#__PURE__*/React.createElement("div", { className: "kit-card kit-watch", key: w.id }, /*#__PURE__*/React.createElement("span", { className: "kit-watch__icon" }, /*#__PURE__*/React.createElement(Icon, { name: "bell", size: 19 })), /*#__PURE__*/React.createElement("div", { className: "kit-watch__main" }, /*#__PURE__*/React.createElement("span", { className: "kit-watch__name" }, w.name), /*#__PURE__*/React.createElement("span", { className: "kit-watch__meta" }, w.weight, " \xB7 ", w.restock ? /*#__PURE__*/React.createElement(React.Fragment, null, "o\u010Dek\xE1v\xE1me ", /*#__PURE__*/React.createElement("b", null, w.restock)) : "termín upřesníme")), /*#__PURE__*/React.createElement("button", { className: "kit-iconlink kit-iconlink--danger", onClick: () => setList(l => l.filter(x => x.id !== w.id)) }, /*#__PURE__*/React.createElement(Icon, { name: "close", size: 16 }), " Zru\u0161it"))))); } // ====================== PLATEBNÍ METODY ====================== function PlatbyPanel({ paymentMethods, supportedMethods }) { const [cards, setCards] = React.useState(paymentMethods); const [gate, setGate] = React.useState(false); return /*#__PURE__*/React.createElement("div", { className: "kit-acc-panel" }, /*#__PURE__*/React.createElement(PanelHead, { title: "Platebn\xED metody", desc: "Ulo\u017Een\xE9 karty pro rychlej\u0161\xED platbu. \xDAdaje o kart\u011B nikdy neukl\xE1d\xE1me na na\u0161em webu \u2014 v\u0161e \u0159e\u0161\xED zabezpe\u010Den\xE1 platebn\xED br\xE1na." }), /*#__PURE__*/React.createElement("div", { className: "kit-stack" }, cards.map(c => /*#__PURE__*/React.createElement("div", { className: "kit-card kit-pm", key: c.id }, /*#__PURE__*/React.createElement("span", { className: "kit-pm__chip" }, /*#__PURE__*/React.createElement(Icon, { name: "creditCard", size: 20 })), /*#__PURE__*/React.createElement("div", { className: "kit-pm__main" }, /*#__PURE__*/React.createElement("span", { className: "kit-pm__num" }, c.brand, " \u2022\u2022\u2022\u2022 ", c.last4), /*#__PURE__*/React.createElement("span", { className: "kit-pm__exp" }, "platnost ", c.exp)), /*#__PURE__*/React.createElement("button", { className: "kit-iconlink kit-iconlink--danger", onClick: () => setCards(l => l.filter(x => x.id !== c.id)) }, /*#__PURE__*/React.createElement(Icon, { name: "trash", size: 16 }), " Odebrat")))), /*#__PURE__*/React.createElement("div", { className: "kit-form__actions", style: { justifyContent: "flex-start", marginTop: 16 } }, /*#__PURE__*/React.createElement(Button, { variant: "secondary", iconStart: /*#__PURE__*/React.createElement(Icon, { name: "plus", size: 17 }), onClick: () => setGate(true) }, "P\u0159idat kartu")), /*#__PURE__*/React.createElement("div", { className: "kit-paysupport" }, /*#__PURE__*/React.createElement("span", { className: "vn-eyebrow" }, /*#__PURE__*/React.createElement(Icon, { name: "shield", size: 14 }), " Podporovan\xE9 zp\u016Fsoby platby"), /*#__PURE__*/React.createElement("div", { className: "kit-paysupport__chips" }, supportedMethods.map(m => /*#__PURE__*/React.createElement("span", { className: "kit-paychip", key: m.label }, /*#__PURE__*/React.createElement(Icon, { name: m.icon, size: 16 }), m.label)))), gate && /*#__PURE__*/React.createElement("div", { className: "kit-gate", onClick: () => setGate(false) }, /*#__PURE__*/React.createElement("div", { className: "kit-gate__panel", onClick: e => e.stopPropagation() }, /*#__PURE__*/React.createElement("span", { className: "kit-gate__lock" }, /*#__PURE__*/React.createElement(Icon, { name: "lock", size: 22 })), /*#__PURE__*/React.createElement("h3", null, "Zabezpe\u010Den\xE1 platebn\xED br\xE1na"), /*#__PURE__*/React.createElement("p", null, "Tady se otev\u0159e br\xE1na (GoPay / Stripe), kde bezpe\u010Dn\u011B zad\xE1te \xFAdaje o kart\u011B. \u010C\xEDslo karty nikdy neproch\xE1z\xED na\u0161\xEDm webem."), /*#__PURE__*/React.createElement("div", { className: "kit-gate__skeleton" }, /*#__PURE__*/React.createElement("span", { className: "kit-gate__line", style: { width: "100%" } }), /*#__PURE__*/React.createElement("span", { className: "kit-gate__line", style: { width: "60%" } }), /*#__PURE__*/React.createElement("span", { className: "kit-gate__line", style: { width: "80%" } })), /*#__PURE__*/React.createElement(Button, { variant: "secondary", block: true, onClick: () => setGate(false) }, "Zav\u0159\xEDt")))); } // ======================== ZMĚNA HESLA ======================== function HesloPanel() { return /*#__PURE__*/React.createElement("div", { className: "kit-acc-panel" }, /*#__PURE__*/React.createElement(PanelHead, { title: "Zm\u011Bna hesla", desc: "Pro va\u0161i bezpe\u010Dnost zadejte nejprve st\xE1vaj\xEDc\xED heslo." }), /*#__PURE__*/React.createElement("div", { className: "kit-card kit-form kit-form--narrow" }, /*#__PURE__*/React.createElement(Input, { label: "St\xE1vaj\xEDc\xED heslo", type: "password", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", icon: /*#__PURE__*/React.createElement(Icon, { name: "lock" }), autoComplete: "current-password" }), /*#__PURE__*/React.createElement(Input, { label: "Nov\xE9 heslo", type: "password", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", icon: /*#__PURE__*/React.createElement(Icon, { name: "lock" }), autoComplete: "new-password", hint: "Alespo\u0148 8 znak\u016F." }), /*#__PURE__*/React.createElement(Input, { label: "Potvrzen\xED nov\xE9ho hesla", type: "password", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", icon: /*#__PURE__*/React.createElement(Icon, { name: "lock" }), autoComplete: "new-password" }), /*#__PURE__*/React.createElement("div", { className: "kit-form__actions" }, /*#__PURE__*/React.createElement(Button, { variant: "primary", iconStart: /*#__PURE__*/React.createElement(Icon, { name: "check", size: 17 }) }, "Zm\u011Bnit heslo")))); } function EmptyState({ icon, text }) { return /*#__PURE__*/React.createElement("div", { className: "kit-empty" }, /*#__PURE__*/React.createElement("span", { className: "kit-empty__icon" }, /*#__PURE__*/React.createElement(Icon, { name: icon, size: 26 })), /*#__PURE__*/React.createElement("p", null, text)); } // ============================ SHELL ============================ function Account({ go, section, user, onLogout, addToCart, onQuickView, onNotify, onPreorder }) { const D = window.SHOP_DATA; const acc = D.account; const [active, setActive] = React.useState(section || "profil"); React.useEffect(() => { if (section) setActive(section); }, [section]); const navRef = React.useRef(null); React.useEffect(() => { const nav = navRef.current; if (!nav || nav.scrollWidth <= nav.clientWidth + 4) return; const el = nav.querySelector('[aria-current="true"]'); if (!el) return; const to = el.offsetLeft - nav.clientWidth / 2 + el.offsetWidth / 2; nav.scrollTo({ left: Math.max(0, to), behavior: "smooth" }); }, [active]); const reorder = order => { order.items.forEach(it => { const p = D.products.find(x => x.id === it.id); if (p) addToCart(p, it.qty); }); }; const shared = { onOpen: p => go("product", p.id), addToCart, onQuickView, onNotify, onPreorder }; let panel; switch (active) { case "adresy": panel = /*#__PURE__*/React.createElement(AdresyPanel, { addresses: acc.addresses }); break; case "objednavky": panel = /*#__PURE__*/React.createElement(ObjednavkyPanel, { orders: acc.orders, products: D.products, onReorder: reorder, go: go }); break; case "predobjednavky": panel = /*#__PURE__*/React.createElement(PredobjednavkyPanel, { preorders: acc.preorders }); break; case "upozorneni": panel = /*#__PURE__*/React.createElement(UpozorneniPanel, { watches: acc.watches }); break; case "heslo": panel = /*#__PURE__*/React.createElement(HesloPanel, null); break; default: panel = /*#__PURE__*/React.createElement(ProfilPanel, { user: user || acc.user }); } const u = user || acc.user; const initials = (u.firstName[0] || "") + (u.lastName[0] || ""); return /*#__PURE__*/React.createElement("main", { className: "kit kit-account" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement("nav", { className: "kit-breadcrumb" }, /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("home"); } }, "Dom\u016F"), /*#__PURE__*/React.createElement(Icon, { name: "chevronRight", size: 13 }), " ", /*#__PURE__*/React.createElement("span", null, "M\u016Fj \xFA\u010Det")), /*#__PURE__*/React.createElement("header", { className: "kit-account__hero" }, /*#__PURE__*/React.createElement("span", { className: "kit-account__avatar" }, initials), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h1", null, "M\u016Fj \xFA\u010Det"), /*#__PURE__*/React.createElement("p", null, "V\xEDtejte zp\u011Bt, ", u.firstName, ". Spravujte sv\xE9 objedn\xE1vky, adresy a obl\xEDben\xE9 medy."))), /*#__PURE__*/React.createElement("div", { className: "kit-account__layout" }, /*#__PURE__*/React.createElement("aside", { className: "kit-acc-nav", "aria-label": "Sekce \xFA\u010Dtu", ref: navRef }, SECTIONS.map(s => /*#__PURE__*/React.createElement("button", { key: s.id, className: "kit-acc-nav__item", "aria-current": active === s.id ? "true" : undefined, onClick: () => { setActive(s.id); go("account", s.id); } }, /*#__PURE__*/React.createElement(Icon, { name: s.icon, size: 18 }), " ", /*#__PURE__*/React.createElement("span", null, s.label))), /*#__PURE__*/React.createElement("button", { className: "kit-acc-nav__item kit-acc-nav__item--logout", onClick: onLogout }, /*#__PURE__*/React.createElement(Icon, { name: "logout", size: 18 }), " ", /*#__PURE__*/React.createElement("span", null, "Odhl\xE1sit"))), /*#__PURE__*/React.createElement("section", { className: "kit-acc-content" }, panel)))); } window.VNAccount = Account; })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/Account.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/App.jsx try { (() => { function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } // App shell — routing, cart state, chrome, toast. (function () { if (typeof React === "undefined") return; const DS = window.VElaStvNajmanDesignSystem_bc3fc2; const Icon = window.VNIcon; // 9.4 — announcement bar: 3 rotating messages, auto every 4s, manual arrows function Announce() { const msgs = [{ ic: "truck", node: /*#__PURE__*/React.createElement("span", null, "Rozvoz ", /*#__PURE__*/React.createElement("strong", null, "zdarma"), " po Hostivic\xEDch a okol\xED p\u0159i objedn\xE1vce 4 ks a v\xEDce") }, { ic: "leaf", node: /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement("strong", null, "\u010Cerstv\xFD"), " lipov\xFD med \u2014 sez\xF3nn\xED sn\u016F\u0161ka, jen p\u0159i kv\u011Btu lip") }, { ic: "door", node: /*#__PURE__*/React.createElement("span", null, "Odb\u011Br ze dvora ", /*#__PURE__*/React.createElement("strong", null, "kdykoli"), " \xB7 Na Samot\u011B 1029, Hostivice") }]; const [i, setI] = React.useState(0); React.useEffect(() => { const t = setInterval(() => setI(v => (v + 1) % msgs.length), 4000); return () => clearInterval(t); }, []); const move = d => setI(v => (v + d + msgs.length) % msgs.length); const m = msgs[i]; return /*#__PURE__*/React.createElement("div", { className: "kit-announce" }, /*#__PURE__*/React.createElement("button", { className: "kit-announce__nav", onClick: () => move(-1), "aria-label": "P\u0159edchoz\xED sd\u011Blen\xED" }, "\u2039"), /*#__PURE__*/React.createElement("div", { className: "kit-announce__msg", key: i }, /*#__PURE__*/React.createElement(Icon, { name: m.ic, size: 15 }), " ", m.node), /*#__PURE__*/React.createElement("button", { className: "kit-announce__nav", onClick: () => move(1), "aria-label": "Dal\u0161\xED sd\u011Blen\xED" }, "\u203A")); } // Friendly, honey-themed 404 / error fallback function Error404({ onHome, onShop }) { return /*#__PURE__*/React.createElement("main", { className: "kit kit-404" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell kit-404__inner" }, /*#__PURE__*/React.createElement("div", { className: "kit-404__badge", "aria-hidden": "true" }, /*#__PURE__*/React.createElement("span", null, "404")), /*#__PURE__*/React.createElement("h1", { className: "kit-404__title" }, "Tahle str\xE1nka se n\u011Bkam zatoulala"), /*#__PURE__*/React.createElement("p", { className: "kit-404__lead" }, "Asi ji sl\xEDzla n\u011Bjak\xE1 mlsn\xE1 v\u010Dela \u2014 med v \xFAlu m\xE1me, ale tuhle adresu jsme nena\u0161li ani pod posledn\xEDm pl\xE1stem. Zkuste to pros\xEDm znovu."), /*#__PURE__*/React.createElement("div", { className: "kit-404__cta" }, /*#__PURE__*/React.createElement(DS.Button, { variant: "primary", size: "lg", onClick: onHome, iconStart: /*#__PURE__*/React.createElement(Icon, { name: "home", size: 18 }) }, "Zp\xE1tky dom\u016F"), /*#__PURE__*/React.createElement(DS.Button, { variant: "secondary", size: "lg", onClick: onShop }, "Prohl\xE9dnout med")), /*#__PURE__*/React.createElement("p", { className: "kit-404__hint" }, "\uD83D\uDC1D Tip: prav\xFD med n\u011Bkdy zkrystalizuje \u2014 str\xE1nky se naopak ob\u010Das ztrat\xED."))); } // Catches render errors anywhere in the screen and shows the 404 instead of a white screen class ErrorBoundary extends React.Component { constructor(p) { super(p); this.state = { err: false }; } static getDerivedStateFromError() { return { err: true }; } componentDidUpdate(prev) { if (prev.routeKey !== this.props.routeKey && this.state.err) this.setState({ err: false }); } render() { return this.state.err ? /*#__PURE__*/React.createElement(Error404, { onHome: this.props.onHome, onShop: this.props.onShop }) : this.props.children; } } function App() { const [route, setRoute] = React.useState({ screen: "home", arg: null }); const [cart, setCart] = React.useState([]); const [cartOpen, setCartOpen] = React.useState(false); const [cartPeek, setCartPeek] = React.useState(false); const [menuOpen, setMenuOpen] = React.useState(false); const [quickView, setQuickView] = React.useState(null); const [preorder, setPreorder] = React.useState(null); const [toast, setToast] = React.useState(null); const [user, setUser] = React.useState(null); const [authOpen, setAuthOpen] = React.useState(false); const [cartPulse, setCartPulse] = React.useState(0); const [showTop, setShowTop] = React.useState(false); const toastTimer = React.useRef(null); React.useEffect(() => { const fn = () => setShowTop(window.scrollY > 500); window.addEventListener("scroll", fn, { passive: true }); return () => window.removeEventListener("scroll", fn); }, []); // Preview the 404 page by adding #404 (or any unknown #hash) to the URL React.useEffect(() => { const sync = () => { const h = (window.location.hash || "").replace(/^#/, ""); if (h === "404") setRoute({ screen: "404", arg: null }); }; sync(); window.addEventListener("hashchange", sync); return () => window.removeEventListener("hashchange", sync); }, []); const go = (screen, arg = null) => { setRoute({ screen, arg }); setMenuOpen(false); setCartOpen(false); setCartPeek(false); if (screen !== "product") window.scrollTo({ top: 0, behavior: "auto" });else window.scrollTo({ top: 0 }); }; const login = u => { const acc = window.SHOP_DATA && window.SHOP_DATA.account; const resolved = u || acc && acc.user || null; setUser(resolved); setAuthOpen(false); const fn = resolved && resolved.firstName || ""; const initials = resolved ? (((resolved.firstName || "")[0] || "") + ((resolved.lastName || "")[0] || "")).toUpperCase() : ""; showToast({ kind: "status", title: fn ? "Vítejte zpět, " + fn : "Přihlášeno", sub: "Jsme rádi, že jste zpět.", initials }); }; const logout = () => { setUser(null); go("home"); showToast({ kind: "status", title: "Byli jste odhlášeni", icon: "logout" }); }; const showToast = data => { setToast(data); clearTimeout(toastTimer.current); const dur = data && typeof data === "object" ? 3200 : 2400; toastTimer.current = setTimeout(() => setToast(null), dur); }; const addToCart = (p, qty = 1, opts = {}) => { setCart(c => { const found = c.find(i => i.id === p.id); if (found) return c.map(i => i.id === p.id ? { ...i, qty: i.qty + qty } : i); return [...c, { id: p.id, name: p.name, region: p.region, weight: p.weight, price: p.price, image: p.image, qty, preorder: p.preorder || null }]; }); // Feedback per requirement: bounce the header cart + slide-in toast with the // product name and a "Zobrazit košík →" CTA (auto-dismisses after 3s). The // toast — not an auto-opened drawer — is the confirmation; the CTA opens the // cart. Pass opts.openCart:true to force the drawer open instead. setCartPulse(n => n + 1); showToast({ kind: "cart", name: p.name, weight: p.weight, image: p.image, preorder: p.preorder || null }); if (opts.openCart === true) { setCartPeek(opts.peek !== false); setCartOpen(true); } }; const buyNow = (p, qty = 1) => { addToCart(p, qty); setPreorder(null); setCartOpen(false); go("checkout"); }; const setQty = (id, q) => setCart(c => c.map(i => i.id === id ? { ...i, qty: q } : i)); const removeItem = id => setCart(c => c.filter(i => i.id !== id)); const cartCount = cart.reduce((s, i) => s + i.qty, 0); const notify = p => showToast(`Dáme vědět, až naskádníme: ${p.name}`); let screen; const props = { go, addToCart, onQuickView: setQuickView, onNotify: notify, onPreorder: setPreorder }; switch (route.screen) { case "category": screen = /*#__PURE__*/React.createElement(window.VNCategory, _extends({}, props, { catId: route.arg })); break; case "product": screen = /*#__PURE__*/React.createElement(window.VNProduct, _extends({}, props, { productId: route.arg })); break; case "blog": screen = /*#__PURE__*/React.createElement(window.VNBlog, { go: go }); break; case "article": screen = /*#__PURE__*/React.createElement(window.VNArticle, { go: go, postId: route.arg }); break; case "about": screen = /*#__PURE__*/React.createElement(window.VNAbout, { go: go }); break; case "contact": screen = /*#__PURE__*/React.createElement(window.VNContact, { go: go }); break; case "podminky": screen = /*#__PURE__*/React.createElement(window.VNLegal, { go: go, kind: "podminky" }); break; case "gdpr": screen = /*#__PURE__*/React.createElement(window.VNLegal, { go: go, kind: "gdpr" }); break; case "checkout": screen = /*#__PURE__*/React.createElement(window.VNCheckout, { go: go, items: cart }); break; case "account": screen = user ? /*#__PURE__*/React.createElement(window.VNAccount, { go: go, section: route.arg, user: user, onLogout: logout, addToCart: (p, q = 1) => addToCart(p, q, { peek: true }), onQuickView: setQuickView, onNotify: notify, onPreorder: setPreorder }) : /*#__PURE__*/React.createElement(window.VNHome, props); break; case "404": screen = /*#__PURE__*/React.createElement(Error404, { onHome: () => go("home"), onShop: () => go("category", "med") }); break; default: screen = /*#__PURE__*/React.createElement(window.VNHome, props); } return /*#__PURE__*/React.createElement("div", { className: "kit" }, /*#__PURE__*/React.createElement(Announce, null), /*#__PURE__*/React.createElement(window.VNHeader, { go: go, current: route.screen, currentArg: route.arg, cartCount: cartCount, cartPulse: cartPulse, onCart: () => { setCartPeek(false); setCartOpen(true); }, onMenu: () => setMenuOpen(true), user: user, onProfile: () => setAuthOpen(true), onLogout: logout }), /*#__PURE__*/React.createElement("div", { className: "kit-screen", key: route.screen + ":" + (route.arg || "") }, /*#__PURE__*/React.createElement(ErrorBoundary, { routeKey: route.screen + ":" + (route.arg || ""), onHome: () => go("home"), onShop: () => go("category", "med") }, screen)), /*#__PURE__*/React.createElement(window.VNFooter, { go: go }), /*#__PURE__*/React.createElement(window.VNDrawer, { open: menuOpen, onClose: () => setMenuOpen(false), go: go }), /*#__PURE__*/React.createElement(window.VNCart, { open: cartOpen, peek: cartPeek, onClose: () => { setCartOpen(false); setCartPeek(false); }, items: cart, onQty: setQty, onRemove: removeItem, onAdd: addToCart, onClear: () => setCart([]), onCheckout: () => { setCartOpen(false); setCartPeek(false); go("checkout"); } }), window.VNPreorder && /*#__PURE__*/React.createElement(window.VNPreorder, { product: preorder, onClose: () => setPreorder(null), onAddToCart: addToCart, onBuyNow: buyNow, onContact: () => go("contact") }), window.VNAuth && /*#__PURE__*/React.createElement(window.VNAuth, { open: authOpen, onClose: () => setAuthOpen(false), onLogin: login }), /*#__PURE__*/React.createElement("button", { className: "kit-totop" + (showTop ? " is-visible" : ""), onClick: () => window.scrollTo({ top: 0, behavior: "smooth" }), "aria-label": "Nahoru na za\u010D\xE1tek" }, /*#__PURE__*/React.createElement("svg", { viewBox: "0 0 44 48", width: "44", height: "48", "aria-hidden": "true" }, /*#__PURE__*/React.createElement("path", { className: "kit-totop__hex", d: "M22 2.5 L41.5 13.75 L41.5 34.25 L22 45.5 L2.5 34.25 L2.5 13.75 Z" }), /*#__PURE__*/React.createElement("path", { className: "kit-totop__arr", d: "M14.5 25.5 L22 18 L29.5 25.5" }))), /*#__PURE__*/React.createElement("div", { className: "kit-toast", "data-rich": "true", "data-show": toast && typeof toast === "object" && toast.kind === "cart" ? "true" : undefined }, toast && typeof toast === "object" && toast.kind === "cart" && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: "kit-toast__thumb" }, /*#__PURE__*/React.createElement(DS.Photo, { src: toast.image, ratio: "1 / 1", label: toast.weight })), /*#__PURE__*/React.createElement("div", { className: "kit-toast__main" }, /*#__PURE__*/React.createElement("span", { className: "kit-toast__title" }, /*#__PURE__*/React.createElement(Icon, { name: "check", size: 16 }), " ", toast.preorder ? "Předobjednávka přidána" : "Přidáno do košíku"), /*#__PURE__*/React.createElement("span", { className: "kit-toast__sub" }, toast.name, " \xB7 ", toast.weight)), /*#__PURE__*/React.createElement("button", { className: "kit-toast__cta", onClick: () => { setToast(null); setCartPeek(false); setCartOpen(true); } }, "Zobrazit ko\u0161\xEDk ", /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 15 })))), /*#__PURE__*/React.createElement("div", { className: "kit-toast kit-toast--status", "data-pos": "top", "data-show": toast && !(typeof toast === "object" && toast.kind === "cart") ? "true" : undefined }, toast && !(typeof toast === "object" && toast.kind === "cart") && (typeof toast === "object" ? /*#__PURE__*/React.createElement(React.Fragment, null, toast.initials ? /*#__PURE__*/React.createElement("span", { className: "kit-toast__avatar" }, toast.initials) : /*#__PURE__*/React.createElement("span", { className: "kit-toast__ok" }, /*#__PURE__*/React.createElement(Icon, { name: toast.icon || "check", size: 17 })), /*#__PURE__*/React.createElement("div", { className: "kit-toast__main" }, /*#__PURE__*/React.createElement("span", { className: "kit-toast__title" }, toast.title), toast.sub ? /*#__PURE__*/React.createElement("span", { className: "kit-toast__sub kit-toast__sub--dark" }, toast.sub) : null)) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", { className: "kit-toast__ok" }, /*#__PURE__*/React.createElement(Icon, { name: "check", size: 17 })), " ", /*#__PURE__*/React.createElement("span", { className: "kit-toast__title" }, toast))))); } // NOTE: do not auto-mount here. This file is also concatenated into // _ds_bundle.js; mounting at load time would crash the bundle (and any // consumer that imports it). index.html mounts explicitly after // all kit scripts have loaded. window.VNApp = App; })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/App.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/Auth.jsx try { (() => { // Přihlášení / registrace — modal i samostatná stránka. // Vizuální základ; logika (skutečné přihlášení, Google OAuth) se řeší ve WordPressu. (function () { if (typeof React === "undefined") return; const DS = window.VElaStvNajmanDesignSystem_bc3fc2; const { Button, Input } = DS; const Icon = window.VNIcon; // Oficiální barevné „G" pro standardní přihlášení přes Google. function GoogleMark() { return /*#__PURE__*/React.createElement("svg", { width: "18", height: "18", viewBox: "0 0 48 48", "aria-hidden": "true", style: { flex: "none" } }, /*#__PURE__*/React.createElement("path", { fill: "#4285F4", d: "M45.1 24.5c0-1.6-.1-3.1-.4-4.5H24v8.5h11.8c-.5 2.7-2 5-4.4 6.6v5.5h7.1c4.1-3.8 6.6-9.4 6.6-16.1z" }), /*#__PURE__*/React.createElement("path", { fill: "#34A853", d: "M24 46c5.9 0 10.9-2 14.5-5.4l-7.1-5.5c-2 1.3-4.5 2.1-7.4 2.1-5.7 0-10.5-3.8-12.2-9H4.5v5.7C8.1 41.1 15.4 46 24 46z" }), /*#__PURE__*/React.createElement("path", { fill: "#FBBC05", d: "M11.8 28.2c-.4-1.3-.7-2.7-.7-4.2s.2-2.9.7-4.2v-5.7H4.5C3 17.1 2.1 20.4 2.1 24s.9 6.9 2.4 9.9l7.3-5.7z" }), /*#__PURE__*/React.createElement("path", { fill: "#EA4335", d: "M24 10.7c3.2 0 6.1 1.1 8.4 3.3l6.3-6.3C34.9 4.1 29.9 2 24 2 15.4 2 8.1 6.9 4.5 14.1l7.3 5.7c1.7-5.2 6.5-9.1 12.2-9.1z" })); } // Vlastní obsah formuláře — sdílený pro modal i stránku. function AuthForm({ onLogin, compact }) { const [mode, setMode] = React.useState("login"); // login | register | forgot const D = window.SHOP_DATA; const submit = e => { e.preventDefault(); if (mode === "forgot") { setMode("login"); return; } onLogin && onLogin(D && D.account ? D.account.user : null); }; return /*#__PURE__*/React.createElement("div", { className: "kit-auth__form" }, /*#__PURE__*/React.createElement("div", { className: "kit-auth__brandrow" }, /*#__PURE__*/React.createElement("svg", { width: "34", height: "38", viewBox: "0 0 48 54", fill: "none", "aria-hidden": "true" }, /*#__PURE__*/React.createElement("path", { d: "M24 2 L45.65 14.5 L45.65 39.5 L24 52 L2.35 39.5 L2.35 14.5 Z", stroke: "#7A4E1E", strokeWidth: "2.4", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M24 16 L34.39 22 L34.39 34 L24 40 L13.61 34 L13.61 22 Z", fill: "#C8841E" })), /*#__PURE__*/React.createElement("span", { className: "vn-eyebrow" }, /*#__PURE__*/React.createElement(Icon, { name: "hexagon", size: 13 }), "V\u010Dela\u0159stv\xED Najman")), /*#__PURE__*/React.createElement("h2", { className: "kit-auth__title" }, mode === "login" ? "Vítejte zpět" : mode === "register" ? "Vytvořit účet" : "Zapomenuté heslo"), /*#__PURE__*/React.createElement("p", { className: "kit-auth__sub" }, mode === "login" ? "Přihlaste se ke svému účtu a sledujte objednávky i oblíbené medy." : mode === "register" ? "Založte si účet — uvidíte své objednávky, předobjednávky a oblíbené." : "Zadejte e-mail a pošleme vám odkaz pro obnovení hesla."), /*#__PURE__*/React.createElement("form", { className: "kit-auth__fields", onSubmit: submit }, mode === "register" && /*#__PURE__*/React.createElement(Input, { label: "Jm\xE9no a p\u0159\xEDjmen\xED", type: "text", placeholder: "Anna Nov\xE1kov\xE1", autoComplete: "name", required: true, icon: /*#__PURE__*/React.createElement(Icon, { name: "user" }) }), /*#__PURE__*/React.createElement(Input, { label: "E-mail", type: "email", placeholder: "vas@email.cz", autoComplete: "email", required: true, icon: /*#__PURE__*/React.createElement(Icon, { name: "mail" }) }), mode !== "forgot" && /*#__PURE__*/React.createElement("div", { className: "kit-auth__pwd" }, /*#__PURE__*/React.createElement(Input, { label: "Heslo", type: "password", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", autoComplete: mode === "login" ? "current-password" : "new-password", required: true, icon: /*#__PURE__*/React.createElement(Icon, { name: "lock" }) }), mode === "login" && /*#__PURE__*/React.createElement("button", { type: "button", className: "kit-auth__link kit-auth__forgot", onClick: () => setMode("forgot") }, "Zapomn\u011Bli jste heslo?")), /*#__PURE__*/React.createElement(Button, { type: "submit", variant: "primary", size: "lg", block: true, iconEnd: /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 18 }) }, mode === "login" ? "Přihlásit" : mode === "register" ? "Vytvořit účet" : "Poslat odkaz")), mode !== "forgot" && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: "kit-auth__or" }, /*#__PURE__*/React.createElement("span", null, "nebo")), /*#__PURE__*/React.createElement("button", { type: "button", className: "kit-auth__google", onClick: () => onLogin && onLogin(window.SHOP_DATA && window.SHOP_DATA.account ? window.SHOP_DATA.account.user : null) }, /*#__PURE__*/React.createElement(GoogleMark, null), " Pokra\u010Dovat p\u0159es Google")), /*#__PURE__*/React.createElement("p", { className: "kit-auth__switch" }, mode === "login" ? /*#__PURE__*/React.createElement(React.Fragment, null, "Nem\xE1te \xFA\u010Det? ", /*#__PURE__*/React.createElement("button", { type: "button", className: "kit-auth__link", onClick: () => setMode("register") }, "Vytvo\u0159it \xFA\u010Det")) : mode === "register" ? /*#__PURE__*/React.createElement(React.Fragment, null, "U\u017E m\xE1te \xFA\u010Det? ", /*#__PURE__*/React.createElement("button", { type: "button", className: "kit-auth__link", onClick: () => setMode("login") }, "P\u0159ihl\xE1sit se")) : /*#__PURE__*/React.createElement(React.Fragment, null, "Vzpomn\u011Bli jste si? ", /*#__PURE__*/React.createElement("button", { type: "button", className: "kit-auth__link", onClick: () => setMode("login") }, "Zp\u011Bt na p\u0159ihl\xE1\u0161en\xED")))); } // Modal varianta — otevírá se z profilové ikony v hlavičce. function Auth({ open, onClose, onLogin }) { React.useEffect(() => { const onKey = e => { if (e.key === "Escape" && open) onClose && onClose(); }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [open, onClose]); return /*#__PURE__*/React.createElement("div", { className: "kit-auth", "data-open": open, onClick: onClose }, /*#__PURE__*/React.createElement("div", { className: "kit-auth__panel", onClick: e => e.stopPropagation(), role: "dialog", "aria-modal": "true", "aria-label": "P\u0159ihl\xE1\u0161en\xED" }, /*#__PURE__*/React.createElement("button", { className: "kit-auth__close", onClick: onClose, "aria-label": "Zav\u0159\xEDt" }, /*#__PURE__*/React.createElement(Icon, { name: "close", size: 20 })), /*#__PURE__*/React.createElement(AuthForm, { onLogin: onLogin }))); } Object.assign(window, { VNAuth: Auth, VNAuthForm: AuthForm }); })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/Auth.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/Bits.jsx try { (() => { // Reusable presentational bits for the e-shop kit: // VNTasteProfile (light↔dark + mild↔strong scales), VNBatchSeal (provenance stamp), // VNStock (honest availability badge). All placeholder-friendly. (function () { if (typeof React === "undefined") return; const Icon = window.VNIcon; // ---- Taste profile: two 5-step scales (med) or sweetness (medovina) ---- // Scale defined at module scope so it keeps a stable component identity — // otherwise it remounts on every parent re-render (e.g. switching product // photos) and the fill animation replays. One mount → animate once → static. function Scale({ label, lo, hi, value }) { return /*#__PURE__*/React.createElement("div", { className: "vn-taste__row" }, /*#__PURE__*/React.createElement("span", { className: "vn-taste__lo" }, lo), /*#__PURE__*/React.createElement("span", { className: "vn-taste__track", "aria-label": `${label}: ${value} z 5` }, [1, 2, 3, 4, 5].map(n => /*#__PURE__*/React.createElement("span", { key: n, className: "vn-taste__pip", "data-on": n <= value }))), /*#__PURE__*/React.createElement("span", { className: "vn-taste__hi" }, hi)); } function TasteProfile({ profile, compact }) { if (!profile || !profile.color && !profile.sweet) return null; return /*#__PURE__*/React.createElement("div", { className: "vn-taste" + (compact ? " vn-taste--compact" : "") }, profile.sweet ? /*#__PURE__*/React.createElement(Scale, { label: "Sladkost", lo: "polosuch\xE1", hi: "sladk\xE1", value: profile.sweet }) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Scale, { label: "Barva", lo: "sv\u011Btl\xFD", hi: "tmav\xFD", value: profile.color }), /*#__PURE__*/React.createElement(Scale, { label: "Intenzita", lo: "jemn\xFD", hi: "v\xFDrazn\xFD", value: profile.intensity })), !compact && profile.notes && profile.notes.length > 0 && /*#__PURE__*/React.createElement("div", { className: "vn-taste__notes" }, profile.notes.map((n, i) => /*#__PURE__*/React.createElement("span", { key: i, className: "vn-taste__note" }, n)))); } // ---- Batch seal: circular provenance stamp ---- function BatchSeal({ prov, weight }) { if (!prov) return null; return /*#__PURE__*/React.createElement("div", { className: "vn-seal", role: "img", "aria-label": "Stočeno " + prov.bottled + ", šarže " + prov.lot }, /*#__PURE__*/React.createElement("svg", { className: "vn-seal__ring", viewBox: "0 0 120 120", "aria-hidden": "true" }, /*#__PURE__*/React.createElement("defs", null, /*#__PURE__*/React.createElement("path", { id: "vn-seal-top", d: "M 60 60 m -42 0 a 42 42 0 1 1 84 0" }), /*#__PURE__*/React.createElement("path", { id: "vn-seal-bot", d: "M 18 60 a 42 42 0 0 0 84 0" })), /*#__PURE__*/React.createElement("circle", { cx: "60", cy: "60", r: "56", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeOpacity: ".5" }), /*#__PURE__*/React.createElement("circle", { cx: "60", cy: "60", r: "49", fill: "none", stroke: "currentColor", strokeWidth: "1", strokeOpacity: ".35" }), /*#__PURE__*/React.createElement("text", { className: "vn-seal__arc" }, /*#__PURE__*/React.createElement("textPath", { href: "#vn-seal-top", startOffset: "50%", textAnchor: "middle" }, "RODINN\xC9 V\u010CELA\u0158STV\xCD NAJMAN")), /*#__PURE__*/React.createElement("text", { className: "vn-seal__arc" }, /*#__PURE__*/React.createElement("textPath", { href: "#vn-seal-bot", startOffset: "50%", textAnchor: "middle" }, "HOSTIVICE \xB7 \u010CESKO"))), /*#__PURE__*/React.createElement("span", { className: "vn-seal__center" }, /*#__PURE__*/React.createElement("span", { className: "vn-seal__label" }, "sto\u010Deno"), /*#__PURE__*/React.createElement("b", { className: "vn-seal__date" }, prov.bottled), weight && /*#__PURE__*/React.createElement("span", { className: "vn-seal__wt" }, weight))); } // ---- Honest stock badge ---- const STOCK = { in: { label: "Skladem", cls: "in", icon: "check" }, low: { label: "Poslední kusy", cls: "low", icon: "spark" }, out: { label: "Vyprodáno", cls: "out", icon: "close" } }; function Stock({ status }) { const s = STOCK[status] || STOCK.in; return /*#__PURE__*/React.createElement("span", { className: "vn-stock vn-stock--" + s.cls }, /*#__PURE__*/React.createElement("span", { className: "vn-stock__dot" }), s.label); } Object.assign(window, { VNTasteProfile: TasteProfile, VNBatchSeal: BatchSeal, VNStock: Stock }); })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/Bits.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/Blog.jsx try { (() => { // 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: "hive", rozvoj: "leaf", genetika: "hexagon", tajemstvi: "hexagon", recepty: "dipper", zdravi: "leaf", vcelstvi: "bee", zvcelnice: "hive" }; function catIcon(cat) { return (cat && cat.icon) || CAT_ICONS[cat && cat.id] || "bee"; } /* ── Blog list ─────────────────────────────────────────────────── */ function Blog({ go }) { const D = window.SHOP_DATA; const bh = D.blogHead || {}; const [activeCat, setActiveCat] = React.useState((D.blogCats && D.blogCats[0] && D.blogCats[0].id) || "zacatky"); 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 /*#__PURE__*/React.createElement("main", { className: "kit" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell kit-bloghead2" }, /*#__PURE__*/React.createElement("span", { className: "vn-eyebrow", style: { justifyContent: "center" } }, bh.eyebrow || "Z chovu"), /*#__PURE__*/React.createElement("h1", null, bh.nadpis || "Články o chovu a včelaření"), /*#__PURE__*/React.createElement("p", null, bh.podnadpis || "Praktické rady z včelnice.")), /*#__PURE__*/React.createElement("div", { className: "kit-bcats-wrap" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement("div", { className: "kit-bcats", role: "tablist", ref: tabsRef }, D.blogCats.map(cat => /*#__PURE__*/React.createElement("button", { key: cat.id, role: "tab", "data-cat": cat.id, "aria-selected": cat.id === activeCat, className: "kit-bcat" + (cat.id === activeCat ? " kit-bcat--active" : ""), onClick: () => switchCat(cat.id) }, /*#__PURE__*/React.createElement("span", { className: "kit-bcat__ic" }, /*#__PURE__*/React.createElement(Icon, { name: catIcon(cat), size: 16, strokeWidth: 1.6 })), /*#__PURE__*/React.createElement("span", { className: "kit-bcat__label" }, cat.label)))))), /*#__PURE__*/React.createElement("div", { className: "kit-shell kit-blog-body" }, /*#__PURE__*/React.createElement("div", { className: "kit-bgrid2-hd" }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("span", { className: "vn-eyebrow", style: { marginBottom: 6 } }, activeCatObj.label), /*#__PURE__*/React.createElement("h2", { style: { margin: 0 } }, "Nejnov\u011Bj\u0161\xED \u010Dl\xE1nky")), /*#__PURE__*/React.createElement("span", { className: "kit-bgrid2-count" }, catPosts.length, " \u010Dl\xE1nk\u016F")), /*#__PURE__*/React.createElement("div", { className: "kit-bgrid2", style: gridStyle }, pagePosts.map(p => /*#__PURE__*/React.createElement("a", { key: p.id, className: "kit-bcard2", href: "#", onClick: e => { e.preventDefault(); go("article", p.id); } }, /*#__PURE__*/React.createElement("div", { className: "kit-bcard2__media" }, /*#__PURE__*/React.createElement(Photo, { src: p.image, ratio: "3 / 2", label: "N\xE1hled \u010Dl\xE1nku" }), /*#__PURE__*/React.createElement("span", { className: "kit-bcard2__badge" }, p.tag)), /*#__PURE__*/React.createElement("div", { className: "kit-bcard2__body" }, /*#__PURE__*/React.createElement("div", { className: "kit-bcard2__meta" }, /*#__PURE__*/React.createElement("span", null, p.date), /*#__PURE__*/React.createElement("span", { className: "kit-bcard2__dot" }, "\xB7"), /*#__PURE__*/React.createElement("span", null, p.read, " \u010Dten\xED")), /*#__PURE__*/React.createElement("h3", { className: "kit-bcard2__title" }, p.title), /*#__PURE__*/React.createElement("p", { className: "kit-bcard2__excerpt" }, p.excerpt), /*#__PURE__*/React.createElement("span", { className: "kit-bcard2__more" }, "\u010C\xEDst d\xE1l ", /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 14 })))))), /*#__PURE__*/React.createElement("div", { className: "kit-bpagi", style: gridStyle }, /*#__PURE__*/React.createElement("button", { className: "kit-bpagi__arrow", disabled: page <= 1, onClick: () => page > 1 && switchPage(page - 1), "aria-label": "P\u0159edchoz\xED strana" }, /*#__PURE__*/React.createElement(Icon, { name: "arrowLeft", size: 16 })), Array.from({ length: totalPages }, (_, i) => i + 1).map(n => /*#__PURE__*/React.createElement("button", { key: n, className: "kit-bpagi__num" + (n === page ? " kit-bpagi__num--active" : ""), onClick: () => switchPage(n), "aria-current": n === page ? "page" : undefined }, n)), /*#__PURE__*/React.createElement("button", { className: "kit-bpagi__arrow", disabled: page >= totalPages, onClick: () => page < totalPages && switchPage(page + 1), "aria-label": "Dal\u0161\xED strana" }, /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 16 }))))); } /* ── Article detail ────────────────────────────────────────────── */ function Article({ go, postId }) { /* CHOV_ARTICLE_CMS_PATCH */ const D = window.SHOP_DATA || {}; const initial = (D.posts || []).find(x => x.id === postId || x.slug === postId) || (D.posts || [])[0] || {}; const [article, setArticle] = React.useState(initial); const [loading, setLoading] = React.useState(false); function normalizePost(raw) { const dateIso = raw.datumPublikace || raw.datumPublikacie || raw.date || ""; const date = dateIso ? new Date(dateIso).toLocaleDateString("cs-CZ", { day: "numeric", month: "long", year: "numeric" }) : (initial.date || ""); return { id: raw.slug || raw.id || initial.id, slug: raw.slug || initial.slug || initial.id, title: raw.titulek || raw.title || initial.title || "Článek", excerpt: raw.perex || raw.excerpt || initial.excerpt || "", body: raw.obsah || raw.body || initial.body || "", date, tag: raw.tag || initial.tag || "Blog", read: initial.read || (raw.casCteni ? raw.casCteni + " min" : ""), image: initial.image || raw.image, }; } React.useEffect(() => { const slug = initial.slug || initial.id || postId; if (!slug) return; let cancelled = false; setLoading(true); fetch("/api/cms/blog/" + encodeURIComponent(slug), { headers: { Accept: "application/json" }, }) .then(res => res.ok ? res.json() : null) .then(data => { if (cancelled || !data) return; setArticle(normalizePost(data)); }) .catch(() => { if (!cancelled) setArticle(initial); }) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, [postId]); const p = article || initial; const body = (p.body || p.obsah || p.excerpt || "").trim(); const paragraphs = body ? body.split(/\n{2,}|\r?\n/).map(x => x.trim()).filter(Boolean) : []; return (

{p.title}

{p.date}·{p.read || (loading ? "načítání" : "")} čtení· {p.tag}
{p.excerpt &&

{p.excerpt}

} {paragraphs.map((text, i) =>

{text}

)} {!paragraphs.length && loading &&

Načítáme článek z CMS…

}
); } window.VNBlog = Blog; window.VNArticle = Article; })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/Blog.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/Category.jsx try { (() => { // Products page — všechny produkty na jedné stránce s filtračními pilulkami // (filtr na místě, bez načítání). Dropdown deep-linkuje konkrétní kategorii. (function () { if (typeof React === "undefined") return; const Icon = window.VNIcon; const HONEY = ["kvetove", "pastovany", "lesni"]; const FILTERS = [{ id: "vse", label: "Vše" }, { id: "med", label: "Med" }, { id: "medovina", label: "Medovina" }, { id: "propolis", label: "Vosk a propolis" }, { id: "gift", label: "Dárkové balíčky" }]; const matchFilter = (p, f) => f === "vse" ? true : f === "med" ? HONEY.includes(p.cat) : p.cat === f; function Products({ go, catId, addToCart, onQuickView, onNotify, onPreorder }) { const D = window.SHOP_DATA; const norm = id => !id || id === "all" ? "vse" : FILTERS.some(f => f.id === id) ? id : "vse"; const [filter, setFilter] = React.useState(norm(catId)); const [loading, setLoading] = React.useState(true); const [fading, setFading] = React.useState(false); // initial skeleton (once) React.useEffect(() => { const t = setTimeout(() => setLoading(false), 500); return () => clearTimeout(t); }, []); // deep-link: sync the active filter when the nav passes a category React.useEffect(() => { setFilter(norm(catId)); }, [catId]); const counts = React.useMemo(() => { const c = {}; FILTERS.forEach(f => { c[f.id] = D.products.filter(p => matchFilter(p, f.id)).length; }); return c; }, []); const items = D.products.filter(p => matchFilter(p, filter)).sort((a, b) => b.reviews - a.reviews); const pick = id => { if (id === filter) return; setFading(true); setTimeout(() => { setFilter(id); setFading(false); }, 160); }; const gridStyle = { opacity: fading ? 0 : 1, transform: fading ? "translateY(8px)" : "none", transition: "opacity 160ms ease, transform 160ms ease", paddingBottom: "var(--section-y)" }; return /*#__PURE__*/React.createElement("main", { className: "kit" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell kit-cathead" }, /*#__PURE__*/React.createElement("nav", { className: "kit-breadcrumb" }, /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("home"); } }, "Dom\u016F"), /*#__PURE__*/React.createElement(Icon, { name: "chevronRight", size: 13 }), " ", /*#__PURE__*/React.createElement("span", null, "Produkty")), /*#__PURE__*/React.createElement("h1", null, "Na\u0161e produkty"), /*#__PURE__*/React.createElement("p", null, "Med z konkr\xE9tn\xEDch oblast\xED, medovina z vlastn\xEDho medu a p\u0159\xEDrodn\xED produkty z \xFAlu \u2014 v\u0161echno na jednom m\xEDst\u011B.")), /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement("div", { className: "kit-pfilter", role: "tablist", "aria-label": "Filtr produkt\u016F" }, FILTERS.map(f => /*#__PURE__*/React.createElement("button", { key: f.id, role: "tab", "aria-selected": filter === f.id, className: "kit-pfilter__btn" + (filter === f.id ? " is-active" : ""), onClick: () => pick(f.id) }, f.label, /*#__PURE__*/React.createElement("span", { className: "kit-pfilter__count" }, counts[f.id])))), /*#__PURE__*/React.createElement("div", { className: "kit-pgrid", style: gridStyle }, loading && [0, 1, 2, 3, 4, 5].map(i => /*#__PURE__*/React.createElement("div", { className: "vn-skel", key: "s" + i, "aria-hidden": "true" }, /*#__PURE__*/React.createElement("div", { className: "vn-skel__img" }), /*#__PURE__*/React.createElement("div", { className: "vn-skel__body" }, /*#__PURE__*/React.createElement("div", { className: "vn-skel__line vn-skel__line--sm" }), /*#__PURE__*/React.createElement("div", { className: "vn-skel__line vn-skel__line--lg" }), /*#__PURE__*/React.createElement("div", { className: "vn-skel__line vn-skel__line--sm" })))), !loading && items.length === 0 && /*#__PURE__*/React.createElement("div", { className: "kit-pempty" }, /*#__PURE__*/React.createElement("p", { className: "kit-pempty__t" }, "Brzy p\u0159id\xE1me"), /*#__PURE__*/React.createElement("p", null, "Tahle \u010D\xE1st nab\xEDdky se pr\xE1v\u011B p\u0159ipravuje.")), !loading && items.map(p => /*#__PURE__*/React.createElement(window.VNProductCard, { key: p.id, product: p, onOpen: pr => go("product", pr.id), onAdd: () => addToCart(p), onQuickView: onQuickView, onNotify: onNotify, onPreorder: onPreorder }))))); } window.VNCategory = Products; })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/Category.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/Chrome.jsx try { (() => { // E-shop chrome: header, mobile drawer, slide-in cart, search overlay, footer. (function () { if (typeof React === "undefined") return; const DS = window.VElaStvNajmanDesignSystem_bc3fc2; const { Button, IconButton, Input } = DS; const Icon = window.VNIcon; // Sesterský web — chovatelská větev značky (chov včelích matek a oddělků). const SISTER_URL = "https://chov.vcelarstvinajman.cz"; const NAV = [{ id: "category", label: "Produkty" }, { id: "blog", label: "Blog" }, { id: "about", label: "O nás" }, { id: "contact", label: "Kontakt" }, { id: "chov", label: "Chov", external: true, href: SISTER_URL }]; function Logo({ onClick, footer }) { return /*#__PURE__*/React.createElement("a", { className: "kit-logo", onClick: e => { e.preventDefault(); onClick && onClick(); }, href: "#" }, /*#__PURE__*/React.createElement("svg", { className: "kit-logo__mark", width: "38", height: "43", viewBox: "0 0 48 54", fill: "none", "aria-hidden": "true" }, /*#__PURE__*/React.createElement("path", { d: "M24 2 L45.65 14.5 L45.65 39.5 L24 52 L2.35 39.5 L2.35 14.5 Z", stroke: "#7A4E1E", strokeWidth: "2.4", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M24 16 L34.39 22 L34.39 34 L24 40 L13.61 34 L13.61 22 Z", fill: "#C8841E" })), /*#__PURE__*/React.createElement("span", { className: "kit-logo__wm" }, /*#__PURE__*/React.createElement("span", { className: "a" }, "V\u010Dela\u0159stv\xED Najman"), /*#__PURE__*/React.createElement("span", { className: "b" }, "Rodinn\xE9 \xB7 Hostivice"))); } function ProfileMenu({ user, go, onLogout, onClose }) { return /*#__PURE__*/React.createElement("div", { className: "kit-pmenu", "data-open": "true" }, /*#__PURE__*/React.createElement("div", { className: "kit-pmenu__head" }, /*#__PURE__*/React.createElement("span", { className: "kit-pmenu__name" }, user.firstName, " ", user.lastName), /*#__PURE__*/React.createElement("span", { className: "kit-pmenu__email" }, user.email)), /*#__PURE__*/React.createElement("button", { className: "kit-pmenu__item", onClick: () => { onClose(); go("account", "profil"); } }, /*#__PURE__*/React.createElement(Icon, { name: "user", size: 18 }), " ", /*#__PURE__*/React.createElement("span", null, "M\u016Fj profil")), /*#__PURE__*/React.createElement("button", { className: "kit-pmenu__item", onClick: () => { onClose(); go("account", "objednavky"); } }, /*#__PURE__*/React.createElement(Icon, { name: "fileText", size: 18 }), " ", /*#__PURE__*/React.createElement("span", null, "Objedn\xE1vky")), /*#__PURE__*/React.createElement("div", { className: "kit-pmenu__sep" }), /*#__PURE__*/React.createElement("button", { className: "kit-pmenu__item kit-pmenu__item--logout", onClick: () => { onClose(); onLogout(); } }, /*#__PURE__*/React.createElement(Icon, { name: "logout", size: 18 }), " ", /*#__PURE__*/React.createElement("span", null, "Odhl\xE1sit"))); } function HeaderProfile({ user, go, onProfile, onLogout }) { const [open, setOpen] = React.useState(false); const ref = React.useRef(null); React.useEffect(() => { if (!open) return; const onDoc = e => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); }; const onKey = e => { if (e.key === "Escape") setOpen(false); }; document.addEventListener("mousedown", onDoc); window.addEventListener("keydown", onKey); return () => { document.removeEventListener("mousedown", onDoc); window.removeEventListener("keydown", onKey); }; }, [open]); if (!user) { return /*#__PURE__*/React.createElement("button", { className: "kit-avatarbtn", "aria-label": "P\u0159ihl\xE1sit se", title: "P\u0159ihl\xE1sit se", onClick: onProfile }, /*#__PURE__*/React.createElement(Icon, { name: "user" })); } const initials = ((user.firstName[0] || "") + (user.lastName[0] || "")).toUpperCase(); return /*#__PURE__*/React.createElement("div", { className: "kit-header__profile", ref: ref }, /*#__PURE__*/React.createElement("button", { className: "kit-avatarbtn kit-avatarbtn--in", "aria-label": "M\u016Fj \xFA\u010Det", title: "M\u016Fj \xFA\u010Det", "aria-expanded": open, onClick: () => setOpen(v => !v) }, /*#__PURE__*/React.createElement("span", { className: "kit-avatarbtn__initials" }, initials)), open && /*#__PURE__*/React.createElement(ProfileMenu, { user: user, go: go, onLogout: onLogout, onClose: () => setOpen(false) })); } function Header({ go, current, currentArg, cartCount, cartPulse, onCart, onMenu, user, onProfile, onLogout }) { const [scrolled, setScrolled] = React.useState(false); const [bump, setBump] = React.useState(false); React.useEffect(() => { if (!cartPulse) return; setBump(true); const t = setTimeout(() => setBump(false), 360); return () => clearTimeout(t); }, [cartPulse]); React.useEffect(() => { const sc = document.querySelector(".kit-scrollroot") || window; const t = sc === window ? document.documentElement : sc; const fn = () => setScrolled((t.scrollTop || window.scrollY) > 8); sc.addEventListener("scroll", fn, { passive: true }); return () => sc.removeEventListener("scroll", fn); }, []); return /*#__PURE__*/React.createElement("header", { className: "kit-header", "data-scrolled": scrolled }, /*#__PURE__*/React.createElement("div", { className: "kit-shell kit-header__bar" }, /*#__PURE__*/React.createElement(IconButton, { className: "kit-header__menu-btn", label: "Menu", onClick: onMenu }, /*#__PURE__*/React.createElement(Icon, { name: "menu" })), /*#__PURE__*/React.createElement(Logo, { onClick: () => go("home") }), /*#__PURE__*/React.createElement("nav", { className: "kit-nav" }, NAV.map((n, i) => n.dropdown ? /*#__PURE__*/React.createElement("div", { key: i, className: "kit-nav__item" }, /*#__PURE__*/React.createElement("button", { className: "kit-nav__drop-trigger", onMouseDown: e => e.preventDefault(), onClick: () => go(n.id) }, n.label, " ", /*#__PURE__*/React.createElement(Icon, { name: "chevronDown", size: 13, style: { flexShrink: 0 } })), /*#__PURE__*/React.createElement("div", { className: "kit-nav__dropdown" }, n.dropdown.map((d, j) => /*#__PURE__*/React.createElement("a", { key: j, href: "#", "aria-current": current === n.id && (d.arg || null) === (currentArg || null) ? "true" : undefined, onClick: e => { e.preventDefault(); go(n.id, d.arg); e.currentTarget.blur(); } }, d.label)))) : n.external ? /*#__PURE__*/React.createElement("a", { key: i, href: n.href, target: "_blank", rel: "noopener noreferrer", title: "Chov v\u010Del\xEDch matek" }, n.label) : /*#__PURE__*/React.createElement("a", { key: i, href: "#", "aria-current": current === n.id && (n.arg || null) === (currentArg || null) ? "true" : undefined, onClick: e => { e.preventDefault(); go(n.id, n.arg); } }, n.label))), /*#__PURE__*/React.createElement("div", { className: "kit-header__actions" }, /*#__PURE__*/React.createElement(HeaderProfile, { user: user, go: go, onProfile: onProfile, onLogout: onLogout }), /*#__PURE__*/React.createElement("span", { className: "kit-cartbump" + (bump ? " is-bump" : "") }, /*#__PURE__*/React.createElement(IconButton, { label: "Ko\u0161\xEDk", count: cartCount, onClick: onCart }, /*#__PURE__*/React.createElement(Icon, { name: "cart" })))))); } function Drawer({ open, onClose, go }) { return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: "kit-scrim", "data-open": open, onClick: onClose }), /*#__PURE__*/React.createElement("aside", { className: "kit-drawer", "data-open": open, "aria-hidden": !open }, /*#__PURE__*/React.createElement("div", { className: "kit-drawer__head" }, /*#__PURE__*/React.createElement(Logo, { onClick: () => { onClose(); go("home"); } }), /*#__PURE__*/React.createElement(IconButton, { label: "Zav\u0159\xEDt", onClick: onClose }, /*#__PURE__*/React.createElement(Icon, { name: "close" }))), /*#__PURE__*/React.createElement("nav", { className: "kit-drawer__nav" }, NAV.map((n, i) => n.dropdown ? /*#__PURE__*/React.createElement(React.Fragment, { key: i }, /*#__PURE__*/React.createElement("span", { className: "kit-drawer__nav-cat" }, n.label), n.dropdown.map((d, j) => /*#__PURE__*/React.createElement("a", { key: j, href: "#", className: "kit-drawer__nav-sub", onClick: e => { e.preventDefault(); onClose(); go(n.id, d.arg); } }, d.label, /*#__PURE__*/React.createElement(Icon, { name: "chevronRight", size: 16 })))) : n.external ? /*#__PURE__*/React.createElement("a", { key: i, href: n.href, target: "_blank", rel: "noopener noreferrer", title: "Chov v\u010Del\xEDch matek" }, n.label, /*#__PURE__*/React.createElement(Icon, { name: "chevronRight", size: 18 })) : /*#__PURE__*/React.createElement("a", { key: i, href: "#", onClick: e => { e.preventDefault(); onClose(); go(n.id, n.arg); } }, n.label, /*#__PURE__*/React.createElement(Icon, { name: "chevronRight", size: 18 })))), /*#__PURE__*/React.createElement("div", { className: "kit-drawer__foot" }, /*#__PURE__*/React.createElement("p", { style: { margin: "0 0 6px" } }, "Na Samot\u011B 1029, Hostivice"), /*#__PURE__*/React.createElement("a", { href: "#" }, "+420 603 887 482")))); } function CartLine({ item, onQty, onRemove }) { const { Photo, QuantityStepper } = DS; return /*#__PURE__*/React.createElement("div", { className: "kit-line" }, /*#__PURE__*/React.createElement("div", { className: "kit-line__thumb" }, /*#__PURE__*/React.createElement(Photo, { src: item.image, ratio: "1 / 1", label: item.weight })), /*#__PURE__*/React.createElement("div", { className: "kit-line__main" }, /*#__PURE__*/React.createElement("p", { className: "kit-line__name" }, item.name), /*#__PURE__*/React.createElement("p", { className: "kit-line__meta" }, item.region, " \xB7 ", item.weight), item.preorder && /*#__PURE__*/React.createElement("p", { className: "kit-line__preorder" }, /*#__PURE__*/React.createElement("span", { className: "kit-line__preorder-dot" }), "P\u0159edobjedn\xE1vka \u2014 ode\u0161leme po naskladn\u011Bn\xED (", item.preorder, ")"), /*#__PURE__*/React.createElement("div", { className: "kit-line__row" }, /*#__PURE__*/React.createElement(QuantityStepper, { size: "sm", value: item.qty, onChange: v => onQty(item.id, v) }), /*#__PURE__*/React.createElement("span", { className: "kit-line__price" }, item.price * item.qty, " K\u010D")), /*#__PURE__*/React.createElement("button", { className: "kit-line__remove", onClick: () => onRemove(item.id) }, "Odebrat"))); } function Cart({ open, onClose, items, onQty, onRemove, onCheckout, onAdd, peek, onClear }) { const { Photo } = DS; const D = window.SHOP_DATA; const total = items.reduce((s, i) => s + i.price * i.qty, 0); const count = items.reduce((s, i) => s + i.qty, 0); const freeAt = 4; const left = Math.max(0, freeAt - count); const pct = Math.min(100, count / freeAt * 100); // "Mohlo by se hodit" — nabízí produkty, které v košíku ještě NEJSOU (podle // druhu, napříč variantami — porovnání přes název) a jsou skladem, aby šly // rovnou dokoupit. Řazeno dle oblíbenosti, max 3. Sekce zmizí, až jsou // v košíku všechny dostupné druhy z nabídky. const cartNames = new Set(items.map(i => i.name)); const cartIds = new Set(items.map(i => i.id)); const inCart = p => cartNames.has(p.name) || cartIds.has(p.id) || items.some(i => String(i.id).indexOf(p.id + "-") === 0); const recs = D && D.products ? D.products.filter(p => !inCart(p) && p.stock !== "out").sort((a, b) => b.reviews - a.reviews).slice(0, 3) : []; return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: "kit-scrim", "data-open": open, "data-peek": peek ? "true" : undefined, onClick: onClose, style: { zIndex: "var(--z-cart)" } }), /*#__PURE__*/React.createElement("aside", { className: "kit-cart", "data-open": open, "aria-hidden": !open }, /*#__PURE__*/React.createElement("div", { className: "kit-cart__head" }, /*#__PURE__*/React.createElement("h3", null, "V\xE1\u0161 ko\u0161\xEDk", count ? ` · ${count}` : ""), items.length > 0 ? /*#__PURE__*/React.createElement("button", { className: "kit-cart__clear", onClick: onClear, "aria-label": "Vypr\xE1zdnit cel\xFD ko\u0161\xEDk" }, /*#__PURE__*/React.createElement(Icon, { name: "trash", size: 16 }), " Vypr\xE1zdnit ko\u0161\xEDk") : /*#__PURE__*/React.createElement(IconButton, { label: "Zav\u0159\xEDt", onClick: onClose }, /*#__PURE__*/React.createElement(Icon, { name: "close" }))), /*#__PURE__*/React.createElement("div", { className: "kit-cart__body" }, items.length === 0 ? /*#__PURE__*/React.createElement("div", { className: "kit-cart__empty" }, /*#__PURE__*/React.createElement("div", { style: { width: 120, margin: "0 auto 18px" } }, /*#__PURE__*/React.createElement(Photo, { ratio: "1 / 1", label: "Zat\xEDm pr\xE1zdno" })), /*#__PURE__*/React.createElement("p", { className: "kit-cart__empty-hl" }, "Pl\xE1stve jsou pln\xE9."), /*#__PURE__*/React.createElement("p", null, "Ko\u0161\xEDk zat\xEDm ne. Poj\u010Fme to zm\u011Bnit."), /*#__PURE__*/React.createElement(Button, { variant: "primary", onClick: onClose }, "Prohl\xE9dnout nab\xEDdku")) : items.map(it => /*#__PURE__*/React.createElement(CartLine, { key: it.id, item: it, onQty: onQty, onRemove: onRemove }))), items.length > 0 && recs.length > 0 && /*#__PURE__*/React.createElement("div", { className: "kit-cart__recs" }, /*#__PURE__*/React.createElement("p", { className: "vn-eyebrow", style: { margin: "0 0 12px" } }, "Mohlo by se hodit"), recs.map(p => /*#__PURE__*/React.createElement("div", { key: p.id, className: "kit-cart__rec" }, /*#__PURE__*/React.createElement("div", { className: "kit-cart__rec-thumb" }, /*#__PURE__*/React.createElement(Photo, { src: p.image, ratio: "1 / 1", label: p.weight })), /*#__PURE__*/React.createElement("div", { className: "kit-cart__rec-info" }, /*#__PURE__*/React.createElement("span", { className: "kit-cart__rec-name" }, p.name), /*#__PURE__*/React.createElement("span", { className: "kit-cart__rec-meta" }, p.weight, " \xB7 ", p.price, " K\u010D")), /*#__PURE__*/React.createElement("button", { className: "kit-cart__rec-btn", onClick: () => onAdd && onAdd(p), "aria-label": "Přidat " + p.name }, /*#__PURE__*/React.createElement(Icon, { name: "plus", size: 17 }), "Do ko\u0161\xEDku")))), items.length > 0 && /*#__PURE__*/React.createElement("div", { className: "kit-cart__foot" }, /*#__PURE__*/React.createElement("div", { className: "kit-cart__ship" }, /*#__PURE__*/React.createElement(Icon, { name: "truck", size: 18 }), left > 0 ? /*#__PURE__*/React.createElement("span", null, "P\u0159idejte je\u0161t\u011B ", left, " ks a m\xE1te ", /*#__PURE__*/React.createElement("strong", null, "rozvoz zdarma"), ".") : /*#__PURE__*/React.createElement("span", null, "M\xE1te n\xE1rok na ", /*#__PURE__*/React.createElement("strong", null, "rozvoz zdarma"), " v okol\xED.")), /*#__PURE__*/React.createElement("div", { className: "kit-cart__progress" }, /*#__PURE__*/React.createElement("i", { style: { width: pct + "%" } })), /*#__PURE__*/React.createElement("div", { className: "kit-cart__total" }, /*#__PURE__*/React.createElement("span", null, "Celkem (s DPH)"), /*#__PURE__*/React.createElement("b", null, total, " K\u010D")), /*#__PURE__*/React.createElement(Button, { variant: "primary", block: true, size: "lg", onClick: onCheckout, iconEnd: /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 18 }) }, "Do pokladny")))); } function Footer({ go }) { // Footer links to homepage sections: navigate home, then scroll to the anchor. const goHomeTo = id => { go("home"); setTimeout(() => { const el = document.getElementById(id); if (el) window.scrollTo({ top: el.getBoundingClientRect().top + window.scrollY - 80, behavior: "smooth" }); }, 80); }; return /*#__PURE__*/React.createElement("footer", { className: "kit-footer" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell kit-footer__top" }, /*#__PURE__*/React.createElement("div", { className: "kit-footer__brand" }, /*#__PURE__*/React.createElement(Logo, { onClick: () => go("home") }), /*#__PURE__*/React.createElement("p", { style: { marginTop: 14 } }, "Mal\xE9 rodinn\xE9 v\u010Dela\u0159stv\xED z Hostivic. Med z konkr\xE9tn\xEDch luk a les\u016F, st\xE1\u010Den\xFD s l\xE1skou k \u0159emeslu."), /*#__PURE__*/React.createElement("div", { className: "kit-footer__social" }, /*#__PURE__*/React.createElement("a", { href: "#", "aria-label": "Instagram" }, /*#__PURE__*/React.createElement(Icon, { name: "instagram", size: 20 })), /*#__PURE__*/React.createElement("a", { href: "#", "aria-label": "Facebook" }, /*#__PURE__*/React.createElement(Icon, { name: "facebook", size: 20 })), /*#__PURE__*/React.createElement("a", { href: "#", "aria-label": "YouTube" }, /*#__PURE__*/React.createElement(Icon, { name: "youtube", size: 20 })), /*#__PURE__*/React.createElement("a", { href: "#", "aria-label": "WhatsApp" }, /*#__PURE__*/React.createElement(Icon, { name: "whatsapp", size: 20 })))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h4", null, "Obchod"), /*#__PURE__*/React.createElement("div", { className: "kit-footer__links" }, /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("category", "med"); } }, "Med"), /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("category", "medovina"); } }, "Medovina"), /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("category", "propolis"); } }, "P\u0159\xEDrodn\xED produkty"), /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("category", "gift"); } }, "D\xE1rkov\xE9 bal\xED\u010Dky"))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h4", null, "V\u010Dela\u0159stv\xED"), /*#__PURE__*/React.createElement("div", { className: "kit-footer__links" }, /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("about"); } }, "N\xE1\u0161 p\u0159\xEDb\u011Bh"), /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("blog"); } }, "Blog / Z v\u010Delnice"), /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("contact"); } }, "Rozvoz a odb\u011Br"), /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); goHomeTo("vn-faq"); } }, "\u010Cast\xE9 dotazy"))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h4", null, "Kontakt"), /*#__PURE__*/React.createElement("div", { className: "kit-footer__contact" }, "Na Samot\u011B 1029", /*#__PURE__*/React.createElement("br", null), "253 01 Hostivice", /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("a", { href: "tel:+420603887482" }, "+420 603 887 482"), /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("a", { href: "mailto:vcelahostivice@seznam.cz" }, "vcelahostivice@seznam.cz")))), /*#__PURE__*/React.createElement("div", { className: "kit-shell kit-footer__sister" }, /*#__PURE__*/React.createElement(Icon, { name: "bee", size: 18 }), /*#__PURE__*/React.createElement("span", null, "Chov\xE1te v\u010Dely? Na\u0161e matky a odd\u011Blky najdete na ", /*#__PURE__*/React.createElement("a", { href: SISTER_URL, target: "_blank", rel: "noopener noreferrer" }, "Chov Najman ", /*#__PURE__*/React.createElement(Icon, { name: "arrowUpRight", size: 14 })))), /*#__PURE__*/React.createElement("div", { className: "kit-shell kit-footer__bottom" }, /*#__PURE__*/React.createElement("span", null, "\xA9 2026 Rodinn\xE9 v\u010Dela\u0159stv\xED Najman \xB7 I\u010CO 12345678"), /*#__PURE__*/React.createElement("span", { style: { display: "flex", gap: 18 } }, /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("podminky"); } }, "Obchodn\xED podm\xEDnky"), /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("gdpr"); } }, "Ochrana \xFAdaj\u016F (GDPR)")))); } Object.assign(window, { VNHeader: Header, VNDrawer: Drawer, VNCart: Cart, VNFooter: Footer, VNLogo: Logo, VN_NAV: NAV }); })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/Chrome.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/Home.jsx try { (() => { // Homepage — hero, proč u nás + srovnání, bestsellery, příběh, doprava, // dárky, ocenění, recenze, časté dotazy, garance + newsletter. (function () { if (typeof React === "undefined") return; const DS = window.VElaStvNajmanDesignSystem_bc3fc2; const { Button, SectionHeading, Photo, ProductCard, CategoryTile, Badge, Rating, Input } = DS; const Icon = window.VNIcon; const GOOGLE_REVIEWS = "https://www.google.com/maps/search/?api=1&query=Včelařství+Najman+Hostivice"; const MAPS_URL = "https://www.google.com/maps/search/?api=1&query=Na+Samotě+1029+Hostivice"; // Review card — text clamped to 3 lines; "Číst více" appears only when truncated // and links straight through to the reviews (like a Google reviews widget). function ReviewCard({ r }) { const ref = React.useRef(null); const [truncated, setTruncated] = React.useState(false); React.useEffect(() => { const el = ref.current; if (el) setTruncated(el.scrollHeight - el.clientHeight > 2); }, []); return /*#__PURE__*/React.createElement("div", { className: "kit-rev" }, /*#__PURE__*/React.createElement(Rating, { value: r.rating, size: "sm" }), /*#__PURE__*/React.createElement("p", { className: "kit-rev__text", ref: ref }, "\u201E", r.text, "\u201C"), truncated && /*#__PURE__*/React.createElement("a", { className: "kit-rev__more", href: GOOGLE_REVIEWS, target: "_blank", rel: "noopener noreferrer" }, "\u010C\xEDst v\xEDce ", /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 13 })), /*#__PURE__*/React.createElement("div", { className: "kit-rev__who" }, /*#__PURE__*/React.createElement("span", { className: "kit-rev__av" }, r.name[0]), /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement("b", null, r.name), /*#__PURE__*/React.createElement("span", null, r.place)))); } // Newsletter — subtle confetti + success state (mirrors About.jsx) function Confetti() { const bits = React.useMemo(() => Array.from({ length: 16 }, () => ({ l: Math.random() * 100, d: (Math.random() * 0.25).toFixed(2), c: ["var(--accent)", "var(--accent-secondary)", "var(--medova-zlata-svetla)"][Math.floor(Math.random() * 3)], r: Math.floor(Math.random() * 360), x: Math.round((Math.random() - 0.5) * 140) })), []); return /*#__PURE__*/React.createElement("div", { className: "kit-confetti", "aria-hidden": "true" }, bits.map((b, i) => /*#__PURE__*/React.createElement("span", { key: i, style: { left: b.l + "%", background: b.c, animationDelay: b.d + "s", transform: "rotate(" + b.r + "deg)", "--x": b.x + "px" } }))); } function NewsletterForm() { const [email, setEmail] = React.useState(""); const [burst, setBurst] = React.useState(false); const [done, setDone] = React.useState(false); const submit = e => { e.preventDefault(); if (!email) return; setBurst(true); setTimeout(() => setDone(true), 700); setTimeout(() => setBurst(false), 1100); }; return /*#__PURE__*/React.createElement("div", { className: "kit-news__formwrap" }, done ? /*#__PURE__*/React.createElement("p", { className: "kit-news__thanks" }, /*#__PURE__*/React.createElement(Icon, { name: "check", size: 18 }), " Hotovo! D\xE1me v\u011Bd\u011Bt, a\u017E sto\u010D\xEDme \u010Derstvou sn\u016F\u0161ku \u2014 a 10 % na prvn\xED n\xE1kup m\xE1te ve schr\xE1nce.") : /*#__PURE__*/React.createElement("form", { className: "kit-news__form" + (burst ? " is-done" : ""), onSubmit: submit }, /*#__PURE__*/React.createElement(Input, { type: "email", required: true, placeholder: "vas@email.cz", "aria-label": "E-mail", value: email, onChange: e => setEmail(e.target.value) }), /*#__PURE__*/React.createElement(Button, { variant: "primary", type: "submit", iconStart: burst ? /*#__PURE__*/React.createElement(Icon, { name: "check", size: 18 }) : undefined }, burst ? "Přihlášen!" : "Odebírat")), burst && /*#__PURE__*/React.createElement(Confetti, null)); } // Časté dotazy — single-open accordion. Rozbíjí reálné nákupní brzdy // (krystalizace, trvanlivost, cena, doprava, osobní odběr). function HomeFaq() { const faqs = [{ q: "Med mi ztuhnul — je zkažený?", a: "Naopak — je to důkaz pravosti. Krystalizace je přirozený proces každého nepřihřátého medu a nijak nesnižuje jeho kvalitu. Chcete-li ho zase tekutý, postavte sklenici do vlažné lázně do 40 °C a nechte pomalu rozpustit. Nikdy ho nepřehřívejte v mikrovlnce — přišel by o enzymy i vůni." }, { q: "Jak dlouho med vydrží?", a: "Med je jednou z mála potravin, která prakticky nepodléhá zkáze. V zavřené sklenici, při pokojové teplotě a mimo přímé slunce vydrží roky. Datum minimální trvanlivosti i číslo šarže najdete na každém víčku." }, { q: "Proč je váš med dražší než z obchodu?", a: "Protože nekupujeme cizí med na přebalení. Chováme vlastní včely, stáčíme za studena z konkrétních oblastí a plníme ručně, sklenici po sklenici. Platíte za dohledatelný původ a poctivé řemeslo — ne za míchanici nejasného původu z regálu." }, { q: "Jak a kdy med dorazí?", a: "Objednávky obvykle odesíláme do 2 pracovních dnů. Po Hostivicích a okolí rozvážíme osobně — od 4 kusů zdarma. Do zbytku ČR posíláme Zásilkovnou, kurýrem nebo na dobírku." }, { q: "Dá se med vyzvednout osobně?", a: "Ano. Odběr ze dvora na adrese Na Samotě 1029 v Hostivicích si můžete domluvit kdykoli — rádi vám u toho ukážeme úly a necháme ochutnat rovnou ze sklenice." }]; const [open, setOpen] = React.useState(-1); return /*#__PURE__*/React.createElement("div", { className: "kit-faq" }, faqs.map((f, i) => /*#__PURE__*/React.createElement("div", { className: "kit-faq__item", key: i, "data-open": open === i }, /*#__PURE__*/React.createElement("button", { className: "kit-faq__q", "aria-expanded": open === i, onClick: () => setOpen(open === i ? -1 : i) }, /*#__PURE__*/React.createElement("span", null, f.q), /*#__PURE__*/React.createElement("span", { className: "kit-faq__chev" }, /*#__PURE__*/React.createElement(Icon, { name: "chevronDown", size: 18 }))), open === i && /*#__PURE__*/React.createElement("div", { className: "kit-faq__a" }, /*#__PURE__*/React.createElement("p", null, f.a))))); } function Home({ go, addToCart, onQuickView, onNotify, onPreorder }) { const D = window.SHOP_DATA; const best = ["lipovy", "brdsky", "medovina"].map(id => D.products.find(p => p.id === id)); return /*#__PURE__*/React.createElement("main", { className: "kit" }, /*#__PURE__*/React.createElement("section", { className: "kit-hero" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell kit-hero__inner" }, /*#__PURE__*/React.createElement("div", { className: "kit-hero__copy" }, /*#__PURE__*/React.createElement("h1", null, "Med, u kter\xE9ho v\xEDte,", /*#__PURE__*/React.createElement("br", null), "z kter\xE9 louky je."), /*#__PURE__*/React.createElement("p", { className: "kit-hero__sub" }, "V\u010Dely si sami chov\xE1me a \u0161lecht\xEDme. Med st\xE1\u010D\xEDme za studena z konkr\xE9tn\xEDch oblast\xED \u2014 od lipov\xFDch alej\xED po brdsk\xE9 lesy. Za ka\u017Edou sklenic\xED je jedna louka a jedno l\xE9to."), /*#__PURE__*/React.createElement("div", { className: "kit-hero__cta" }, /*#__PURE__*/React.createElement(Button, { variant: "primary", size: "lg", onClick: () => go("category", "med"), iconEnd: /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 18 }) }, "Vybrat med podle chuti"), /*#__PURE__*/React.createElement(Button, { variant: "secondary", size: "lg", onClick: () => go("about") }, "Poznat n\xE1\u0161 p\u0159\xEDb\u011Bh"))), /*#__PURE__*/React.createElement("div", { className: "kit-hero__media" }, /*#__PURE__*/React.createElement(Photo, { src: DS.PHOTOS && DS.PHOTOS.heroDipper, ratio: "4 / 5", radius: "var(--radius-jar)", alt: "Med st\xE9k\xE1 z medov\xE9 l\u017E\xEDce do sklenice", label: "Hero foto \u2014 med ve sv\u011Btle" }), /*#__PURE__*/React.createElement("div", { className: "kit-hero__chip" }, /*#__PURE__*/React.createElement("span", { className: "dot" }, /*#__PURE__*/React.createElement(Icon, { name: "leaf", size: 16 })), " 100 % \u010Desk\xFD med, nikdy nep\u0159ih\u0159\xE1t\xFD")))), /*#__PURE__*/React.createElement("section", { className: "kit-section--alt" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement("div", { className: "kit-section__head" }, /*#__PURE__*/React.createElement(SectionHeading, { eyebrow: "Nejobl\xEDben\u011Bj\u0161\xED", title: "Co si u n\xE1s berete nej\u010Dast\u011Bji", action: /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("category"); } }, "Zobrazit v\u0161e ", /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 15, style: { verticalAlign: "-2px" } })) })), /*#__PURE__*/React.createElement("div", { className: "kit-pgrid kit-pgrid--4" }, best.map(p => /*#__PURE__*/React.createElement(window.VNProductCard, { key: p.id, product: p, onOpen: pr => go("product", pr.id), onAdd: () => addToCart(p), onQuickView: onQuickView, onNotify: onNotify, onPreorder: onPreorder }))))), /*#__PURE__*/React.createElement("section", { className: "kit-section" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement(SectionHeading, { align: "center", eyebrow: "Pro\u010D my", title: "Med, za kter\xFDm stoj\xED konkr\xE9tn\xED lid\xE9", style: { marginBottom: 36 } }), /*#__PURE__*/React.createElement("div", { className: "kit-why" }, [{ ic: "hive", t: "Rodinné včelařství od roku 2012", d: "Více než deset let zkušeností a péče o každý úl." }, { ic: "bee", t: "Vlastní včelstva v Čechách", d: "Chováme vlastní včely — přímí producenti, ne zprostředkovatelé." }, { ic: "dipper", t: "Žádné přidávané cukry ani aditiva", d: "Čistý med přímou cestou z úlu až k vám." }, { ic: "rosette", t: "Certifikovaná kvalita", d: "Pravidelná kontrola kvality a plná transparentnost původu." }].map((v, i) => /*#__PURE__*/React.createElement("div", { className: "kit-why__item", key: i }, /*#__PURE__*/React.createElement("span", { className: "kit-why__ic" }, /*#__PURE__*/React.createElement(Icon, { name: v.ic, size: 30, strokeWidth: 1.5 })), /*#__PURE__*/React.createElement("h3", { className: "kit-why__t" }, v.t), /*#__PURE__*/React.createElement("p", { className: "kit-why__d" }, v.d)))))), /*#__PURE__*/React.createElement("section", { className: "kit-storydark" }, /*#__PURE__*/React.createElement("div", { className: "kit-storydark__hc", "aria-hidden": "true" }), /*#__PURE__*/React.createElement("div", { className: "kit-shell kit-storydark__inner" }, /*#__PURE__*/React.createElement("div", { className: "kit-storydark__media" }, /*#__PURE__*/React.createElement(Photo, { src: window.SHOP_DATA._beekeeper || DS.PHOTOS && DS.PHOTOS.beekeeper, ratio: "4 / 5", alt: "V\u010Dela\u0159 u \xFAl\u016F na louce", label: "Foto rodiny u v\u010Delnice" })), /*#__PURE__*/React.createElement("div", { className: "kit-storydark__copy" }, /*#__PURE__*/React.createElement("span", { className: "vn-eyebrow kit-storydark__eyebrow" }, "N\xE1\u0161 p\u0159\xEDb\u011Bh"), /*#__PURE__*/React.createElement("h2", { className: "kit-storydark__title" }, "V\u010Dela\u0159\xEDme s l\xE1skou k ", /*#__PURE__*/React.createElement("em", null, "\u0159emeslu")), /*#__PURE__*/React.createElement("p", { className: "kit-storydark__lead kit-dropcap" }, "Za\u010D\xEDnali jsme s p\xE1r \xFAly za domem. Dnes m\xE1me v\u010Delnice v lipov\xFDch alej\xEDch, v Brdech i na K\u0159ivokl\xE1tsku \u2014 a po\u0159\xE1d st\xE1\u010D\xEDme ru\u010Dn\u011B, sklenici po sklenici. Med se u n\xE1s nepo\u010D\xEDt\xE1 na tuny, ale na louky, na l\xE9ta a na lidi, kte\u0159\xED se k n\xE1m vracej\xED."), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Button, { variant: "primary", onClick: () => go("about") }, "Poznat n\xE1\u0161 p\u0159\xEDb\u011Bh"))))), /*#__PURE__*/React.createElement("section", { className: "kit-section--alt" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement("div", { className: "kit-gift" }, /*#__PURE__*/React.createElement("div", { className: "kit-gift__media" }, /*#__PURE__*/React.createElement(Photo, { src: DS.PHOTOS && DS.PHOTOS.heroDipper, ratio: "1 / 1", label: "Foto d\xE1rkov\xE9 krabi\u010Dky", style: { height: "100%" } })), /*#__PURE__*/React.createElement("div", { className: "kit-gift__copy" }, /*#__PURE__*/React.createElement("span", { className: "vn-eyebrow" }, /*#__PURE__*/React.createElement(Icon, { name: "gift", size: 15 }), " D\xE1rkov\xE9 bal\xED\u010Dky"), /*#__PURE__*/React.createElement("h2", null, D.gift.name), /*#__PURE__*/React.createElement("p", { className: "kit-gift__items" }, D.gift.items, ", v\u0161e v d\u0159ev\u011Bn\xE9 krabi\u010Dce s ru\u010Dn\u011B psanou karti\u010Dkou."), /*#__PURE__*/React.createElement("div", { className: "kit-gift__price" }, /*#__PURE__*/React.createElement("b", null, D.gift.price, " K\u010D"), /*#__PURE__*/React.createElement("s", null, D.gift.oldPrice, " K\u010D"), /*#__PURE__*/React.createElement(Badge, { tone: "gold" }, "U\u0161et\u0159\xEDte ", D.gift.oldPrice - D.gift.price, " K\u010D")), /*#__PURE__*/React.createElement("div", { style: { display: "flex", gap: 12, flexWrap: "wrap" } }, /*#__PURE__*/React.createElement(Button, { variant: "primary", size: "lg", onClick: () => addToCart({ id: "gift", name: D.gift.name, region: "Dárkový balíček", weight: "set", price: D.gift.price }), iconStart: /*#__PURE__*/React.createElement(Icon, { name: "gift", size: 18 }) }, "Do ko\u0161\xEDku"), /*#__PURE__*/React.createElement(Button, { variant: "ghost", onClick: () => go("category", "gift"), style: { color: "var(--medova-zlata-svetla)" } }, "Dal\u0161\xED d\xE1rky")))))), /*#__PURE__*/React.createElement("section", { className: "kit-section--tight" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement("div", { className: "kit-quality" }, /*#__PURE__*/React.createElement(SectionHeading, { align: "center", eyebrow: "D\u016Fv\u011Bra", title: "Ocen\u011Bn\xED a kvalita", style: { marginBottom: 30 } }), /*#__PURE__*/React.createElement("div", { className: "kit-quality__grid" }, [{ ic: "rosette", t: "Med roku 2025 — zlato", d: "1. místo v národní soutěži Med roku za náš květový med." }, { ic: "shield", t: "Nezávislé laboratorní rozbory", d: "Každou šarži měříme na HMF, vlhkost a pyl v akreditované laboratoři." }, { ic: "check", t: "Registrovaný výrobce potravin", d: "Evidovaný chovatel a výrobce potravin v ČR — IČO 12345678." }].map((a, i) => /*#__PURE__*/React.createElement("div", { className: "kit-award", key: i }, /*#__PURE__*/React.createElement("span", { className: "kit-award__medal" }, /*#__PURE__*/React.createElement(Icon, { name: a.ic, size: 26 })), /*#__PURE__*/React.createElement("p", { className: "kit-award__t" }, a.t), /*#__PURE__*/React.createElement("p", { className: "kit-award__d" }, a.d)))), /*#__PURE__*/React.createElement("div", { className: "kit-quality__foot" }, /*#__PURE__*/React.createElement(Button, { variant: "secondary", onClick: () => go("about") }, "V\u0161echna ocen\u011Bn\xED v sekci O n\xE1s"))))), /*#__PURE__*/React.createElement("section", { className: "kit-section--alt" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement("div", { className: "kit-section__head" }, /*#__PURE__*/React.createElement(SectionHeading, { align: "center", eyebrow: "Co \u0159\xEDk\xE1te vy", title: "Z\xE1kazn\xEDci, kte\u0159\xED se vracej\xED" })), /*#__PURE__*/React.createElement("div", { className: "kit-revs" }, D.reviews.map((r, i) => /*#__PURE__*/React.createElement(ReviewCard, { key: i, r: r }))), /*#__PURE__*/React.createElement("div", { className: "kit-revs__foot" }, /*#__PURE__*/React.createElement("span", { className: "g" }, /*#__PURE__*/React.createElement(Rating, { value: 4.9, size: "sm" }), " 4,9 z 5 \xB7 168 hodnocen\xED na Googlu"), /*#__PURE__*/React.createElement("a", { href: GOOGLE_REVIEWS, target: "_blank", rel: "noopener noreferrer" }, "Zobrazit Google profil ", /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 14, style: { verticalAlign: "-2px" } }))))), /*#__PURE__*/React.createElement("section", { className: "kit-section", id: "vn-faq" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement("div", { className: "kit-section__head" }, /*#__PURE__*/React.createElement(SectionHeading, { align: "center", eyebrow: "\u010Cast\xE9 dotazy", title: "Ne\u017E si objedn\xE1te" })), /*#__PURE__*/React.createElement(HomeFaq, null))), /*#__PURE__*/React.createElement("section", { className: "kit-section--alt" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement(SectionHeading, { align: "center", eyebrow: "Bez rizika", title: "Nakupujete \xFApln\u011B v klidu", style: { marginBottom: 36 } }), /*#__PURE__*/React.createElement("div", { className: "kit-risk" }, [{ ic: "shield", t: "Záruka spokojenosti", d: "Nechutná? Ozvěte se do 30 dnů a med vám vyměníme, nebo vrátíme peníze. Bez okolků." }, { ic: "truck", t: "Rozvoz zdarma", d: "Po Hostivicích a okolí od 4 kusů. Zbytek ČR Zásilkovnou, kurýrem či na dobírku." }, { ic: "leaf", t: "100 % český med", d: "Bez přidaných cukrů, nikdy nepřihřátý nad 40 °C, s dohledatelnou šarží." }].map((g, i) => /*#__PURE__*/React.createElement("div", { className: "kit-risk__card", key: i }, /*#__PURE__*/React.createElement("span", { className: "kit-risk__ic" }, /*#__PURE__*/React.createElement(Icon, { name: g.ic, size: 24, strokeWidth: 1.6 })), /*#__PURE__*/React.createElement("h3", { className: "kit-risk__t" }, g.t), /*#__PURE__*/React.createElement("p", { className: "kit-risk__d" }, g.d)))), /*#__PURE__*/React.createElement("div", { className: "kit-news", style: { marginTop: 40 } }, /*#__PURE__*/React.createElement("div", { className: "kit-news__hc" }), /*#__PURE__*/React.createElement("div", { className: "kit-news__inner" }, /*#__PURE__*/React.createElement("span", { className: "vn-eyebrow" }, /*#__PURE__*/React.createElement(Icon, { name: "mail", size: 15 }), " Newsletter"), /*#__PURE__*/React.createElement("h2", null, "Med je sez\xF3nn\xED. D\xE1me v\xE1m v\u011Bd\u011Bt."), /*#__PURE__*/React.createElement("p", null, "P\u0159ihlaste se a ozveme se, jen kdy\u017E sto\u010D\xEDme novou sn\u016F\u0161ku nebo chyst\xE1me d\xE1rkov\xE9 bal\xED\u010Dky \u2014 plus 10 % na prvn\xED n\xE1kup."), /*#__PURE__*/React.createElement(NewsletterForm, null), /*#__PURE__*/React.createElement("p", { style: { fontSize: "var(--text-xs)", color: "rgba(251,248,241,.6)" } }, "Odhl\xE1s\xEDte se kdykoli jedn\xEDm kliknut\xEDm. \u017D\xE1dn\xFD spam.")))))); } // map product → ProductCard props function prodProps(p) { return { name: p.name, region: p.region, weight: p.weight, price: p.price, oldPrice: p.oldPrice, rating: p.rating, reviewCount: p.reviews, badge: p.badge, image: p.image, imageLabel: "Foto · " + p.weight }; } window.VNHome = Home; window.VNprodProps = prodProps; })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/Home.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/Icons.jsx try { (() => { // Line-icon set for the e-shop UI kit (Lucide-style, 1.7 stroke). // Exposed as window.VNIcon — usage: (function () { // This file is also concatenated into _ds_bundle.js. Bail when React is // absent (e.g. a consumer loading only the bundle) so nothing throws. if (typeof React === "undefined") return; const P = { search: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("circle", { cx: "11", cy: "11", r: "7" }), /*#__PURE__*/React.createElement("path", { d: "M21 21l-4.3-4.3", strokeLinecap: "round" })), heart: /*#__PURE__*/React.createElement("path", { d: "M12 20.5l-1.5-1.4C5.4 14.6 3 11.8 3 8.5 3 6 4.9 4 7.3 4c1.5 0 2.9.7 3.7 1.9C11.8 4.7 13.2 4 14.7 4 17.1 4 19 6 19 8.5c0 3.3-2.4 6.1-7.5 10.6z", strokeLinecap: "round", strokeLinejoin: "round" }), heartFill: /*#__PURE__*/React.createElement("path", { d: "M12 20.5l-1.5-1.4C5.4 14.6 3 11.8 3 8.5 3 6 4.9 4 7.3 4c1.5 0 2.9.7 3.7 1.9C11.8 4.7 13.2 4 14.7 4 17.1 4 19 6 19 8.5c0 3.3-2.4 6.1-7.5 10.6z", fill: "currentColor", stroke: "none" }), cart: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", { d: "M3 4h2l2.2 11.2a1 1 0 001 .8h9.4a1 1 0 001-.8L21 7.5H6", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("circle", { cx: "9", cy: "20", r: "1.5" }), /*#__PURE__*/React.createElement("circle", { cx: "18", cy: "20", r: "1.5" })), menu: /*#__PURE__*/React.createElement("path", { d: "M4 7h16M4 12h16M4 17h16", strokeLinecap: "round" }), close: /*#__PURE__*/React.createElement("path", { d: "M6 6l12 12M18 6L6 18", strokeLinecap: "round" }), pin: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", { d: "M12 21s7-5.6 7-11a7 7 0 10-14 0c0 5.4 7 11 7 11z" }), /*#__PURE__*/React.createElement("circle", { cx: "12", cy: "10", r: "2.4" })), hexagon: /*#__PURE__*/React.createElement("path", { d: "M12 2.6l8.2 4.7v9.4L12 21.4 3.8 16.7V7.3z", strokeLinejoin: "round" }), truck: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", { d: "M2 6h11v9H2zM13 9h4l3 3v3h-7z", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("circle", { cx: "6.5", cy: "18", r: "1.6" }), /*#__PURE__*/React.createElement("circle", { cx: "16.5", cy: "18", r: "1.6" })), door: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", { d: "M5 21V4a1 1 0 011-1h9a1 1 0 011 1v17M3 21h18", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("circle", { cx: "13", cy: "12", r: ".9", fill: "currentColor", stroke: "none" })), chevronDown: /*#__PURE__*/React.createElement("path", { d: "M6 9l6 6 6-6", strokeLinecap: "round", strokeLinejoin: "round" }), chevronRight: /*#__PURE__*/React.createElement("path", { d: "M9 6l6 6-6 6", strokeLinecap: "round", strokeLinejoin: "round" }), arrowRight: /*#__PURE__*/React.createElement("path", { d: "M5 12h14M13 6l6 6-6 6", strokeLinecap: "round", strokeLinejoin: "round" }), arrowUpRight: /*#__PURE__*/React.createElement("path", { d: "M7 17L17 7M8 7h9v9", strokeLinecap: "round", strokeLinejoin: "round" }), arrowLeft: /*#__PURE__*/React.createElement("path", { d: "M19 12H5M11 6l-6 6 6 6", strokeLinecap: "round", strokeLinejoin: "round" }), plus: /*#__PURE__*/React.createElement("path", { d: "M12 5v14M5 12h14", strokeLinecap: "round" }), minus: /*#__PURE__*/React.createElement("path", { d: "M5 12h14", strokeLinecap: "round" }), check: /*#__PURE__*/React.createElement("path", { d: "M5 12.5l4.5 4.5L19 7", strokeLinecap: "round", strokeLinejoin: "round" }), leaf: /*#__PURE__*/React.createElement("path", { d: "M5 20c0-8 5-13 14-14 0 9-5 14-14 14zM5 20c2.5-5 5.5-7.5 9-9.5", strokeLinecap: "round", strokeLinejoin: "round" }), mail: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("rect", { x: "3", y: "5", width: "18", height: "14", rx: "2" }), /*#__PURE__*/React.createElement("path", { d: "M4 7l8 6 8-6", strokeLinecap: "round" })), phone: /*#__PURE__*/React.createElement("path", { d: "M5 4h4l1.5 5-2.5 1.5a11 11 0 005.5 5.5L19 18l-1 4a16 16 0 01-13-14z", strokeLinejoin: "round" }), instagram: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("rect", { x: "3.5", y: "3.5", width: "17", height: "17", rx: "5" }), /*#__PURE__*/React.createElement("circle", { cx: "12", cy: "12", r: "4" }), /*#__PURE__*/React.createElement("circle", { cx: "17", cy: "7", r: "1", fill: "currentColor", stroke: "none" })), facebook: /*#__PURE__*/React.createElement("path", { d: "M14 8.5h2.5V5H14c-2 0-3.5 1.5-3.5 3.5V11H8v3.5h2.5V21H14v-6.5h2.5L17 11h-3V8.8c0-.2.1-.3.4-.3z", fill: "currentColor", stroke: "none" }), youtube: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("rect", { x: "3", y: "6", width: "18", height: "12", rx: "3.5" }), /*#__PURE__*/React.createElement("path", { d: "M11 9.5l4 2.5-4 2.5z", fill: "currentColor", stroke: "none" })), whatsapp: /*#__PURE__*/React.createElement("path", { d: "M5 19l1-3.4A7 7 0 1119 9.5 7 7 0 018.4 18L5 19zM9.5 9c-.3 0-.6.1-.8.4-.3.4-.6 1-.4 1.8.3 1.4 1.6 2.9 3.4 3.6.8.3 1.5.2 1.9-.1.3-.2.5-.6.4-1 0-.1-.1-.2-.3-.3l-1.2-.5c-.1 0-.3 0-.4.1l-.3.4c-.1.1-.2.1-.3.1-.6-.3-1.4-1-1.7-1.7 0-.1 0-.2.1-.3l.3-.4v-.4l-.5-1.1c-.1-.2-.2-.3-.3-.3z", fill: "currentColor", stroke: "none" }), quote: /*#__PURE__*/React.createElement("path", { d: "M9 7H5v5h3v5H4M19 7h-4v5h3v5h-4", strokeLinejoin: "round" }), star: /*#__PURE__*/React.createElement("path", { d: "M12 3l2.6 5.5 6 .6-4.5 4 1.3 5.9L12 21l-5.4 3 1.3-5.9-4.5-4 6-.6z", strokeLinejoin: "round" }), shield: /*#__PURE__*/React.createElement("path", { d: "M12 3l7 2.5v5c0 4.5-3 8-7 9.5-4-1.5-7-5-7-9.5v-5z", strokeLinejoin: "round" }), fileText: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", { d: "M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M14 3v5h5M8.5 13h7M8.5 16.5h7", strokeLinecap: "round" })), filter: /*#__PURE__*/React.createElement("path", { d: "M4 6h16M7 12h10M10 18h4", strokeLinecap: "round" }), grid: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("rect", { x: "4", y: "4", width: "7", height: "7", rx: "1" }), /*#__PURE__*/React.createElement("rect", { x: "13", y: "4", width: "7", height: "7", rx: "1" }), /*#__PURE__*/React.createElement("rect", { x: "4", y: "13", width: "7", height: "7", rx: "1" }), /*#__PURE__*/React.createElement("rect", { x: "13", y: "13", width: "7", height: "7", rx: "1" })), gift: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("rect", { x: "3.5", y: "8.5", width: "17", height: "5", rx: "1" }), /*#__PURE__*/React.createElement("path", { d: "M5 13.5V20h14v-6.5M12 8.5V20M12 8.5C12 6 10.5 4.5 9 4.5S6.5 6 8 8.5h4zM12 8.5C12 6 13.5 4.5 15 4.5S17.5 6 16 8.5h-4z", strokeLinejoin: "round" })), spark: /*#__PURE__*/React.createElement("path", { d: "M12 3l1.6 6.4L20 11l-6.4 1.6L12 19l-1.6-6.4L4 11l6.4-1.6z", strokeLinejoin: "round" }), hive: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", { d: "M5 7.5l7-3.2 7 3.2", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("rect", { x: "6", y: "7.5", width: "12", height: "3.4", rx: "1.2" }), /*#__PURE__*/React.createElement("rect", { x: "4.6", y: "10.9", width: "14.8", height: "3.4", rx: "1.2" }), /*#__PURE__*/React.createElement("rect", { x: "6", y: "14.3", width: "12", height: "4", rx: "1.2" }), /*#__PURE__*/React.createElement("path", { d: "M10.4 16.3h3.2" })), bee: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", { d: "M12 8.2c-2.1 0-3.4 2-3.4 4.6s1.3 5 3.4 5 3.4-2.4 3.4-5-1.3-4.6-3.4-4.6z" }), /*#__PURE__*/React.createElement("path", { d: "M8.8 12.3h6.4M9.1 15.2h5.8" }), /*#__PURE__*/React.createElement("path", { d: "M9 9.2C6.6 6.9 4.2 7.5 4.2 9.4c0 1.7 2 2.3 3.9 1.2", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M15 9.2c2.4-2.3 4.8-1.7 4.8.2 0 1.7-2 2.3-3.9 1.2", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M10.8 7.6l-.9-2M13.2 7.6l.9-2", strokeLinecap: "round" })), dipper: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", { d: "M12 3.5v7", strokeLinecap: "round" }), /*#__PURE__*/React.createElement("ellipse", { cx: "12", cy: "14", rx: "3.6", ry: "4.2" }), /*#__PURE__*/React.createElement("path", { d: "M8.6 12.6h6.8M8.6 15.4h6.8" }), /*#__PURE__*/React.createElement("path", { d: "M12 18.2c0 1.4 0 2.3 0 2.3", strokeLinecap: "round" })), rosette: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("circle", { cx: "12", cy: "9", r: "5" }), /*#__PURE__*/React.createElement("path", { d: "M9.8 9l1.5 1.5L14.4 7.4", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M9.3 13.2L7.5 20.5l4.5-2.6 4.5 2.6-1.8-7.3", strokeLinejoin: "round" })), user: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("circle", { cx: "12", cy: "8", r: "4" }), /*#__PURE__*/React.createElement("path", { d: "M5 20c0-3.9 3.1-7 7-7s7 3.1 7 7", strokeLinecap: "round" })), creditCard: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("rect", { x: "3", y: "5", width: "18", height: "14", rx: "2.5" }), /*#__PURE__*/React.createElement("path", { d: "M3 9.5h18", strokeLinecap: "round" }), /*#__PURE__*/React.createElement("path", { d: "M6.5 15h3.5", strokeLinecap: "round" })), bell: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", { d: "M6 9.5a6 6 0 1112 0c0 4.5 2 5.5 2 5.5H4s2-1 2-5.5z", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M9.5 19a2.5 2.5 0 005 0", strokeLinecap: "round" })), lock: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("rect", { x: "4.5", y: "10.5", width: "15", height: "9.5", rx: "2.2" }), /*#__PURE__*/React.createElement("path", { d: "M8 10.5V8a4 4 0 018 0v2.5", strokeLinecap: "round" }), /*#__PURE__*/React.createElement("circle", { cx: "12", cy: "15", r: "1.1", fill: "currentColor", stroke: "none" })), logout: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", { d: "M14 4h3.5a1.5 1.5 0 011.5 1.5v13a1.5 1.5 0 01-1.5 1.5H14", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M10 12h9M16 8.5l3.5 3.5L16 15.5", strokeLinecap: "round", strokeLinejoin: "round" })), edit: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", { d: "M4 20h4L18.5 9.5a2 2 0 00-2.83-2.83L5 17.5z", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M14 8.2l2.8 2.8", strokeLinecap: "round" })), trash: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", { d: "M4 7h16M9 7V5a1 1 0 011-1h4a1 1 0 011 1v2M6.5 7l.9 13a1 1 0 001 .95h7.2a1 1 0 001-.95L17.5 7", strokeLinecap: "round", strokeLinejoin: "round" })), bank: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", { d: "M4 9.5l8-5 8 5M5 9.5v9M19 9.5v9M9 9.5v9M15 9.5v9M3 21.5h18", strokeLinecap: "round", strokeLinejoin: "round" })), smartphone: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("rect", { x: "7", y: "3", width: "10", height: "18", rx: "2.5" }), /*#__PURE__*/React.createElement("path", { d: "M11 18h2", strokeLinecap: "round" })), wallet: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("rect", { x: "3", y: "6.5", width: "18", height: "12", rx: "2.5" }), /*#__PURE__*/React.createElement("path", { d: "M16 11.5h3.5v3H16a1.5 1.5 0 010-3z", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M3 9.5c0-1 .8-2 2-2.4L15 4", strokeLinecap: "round", strokeLinejoin: "round" })), check2: /*#__PURE__*/React.createElement("path", { d: "M5 12.5l4.5 4.5L19 7", strokeLinecap: "round", strokeLinejoin: "round" }), clock: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("circle", { cx: "12", cy: "12", r: "8.5" }), /*#__PURE__*/React.createElement("path", { d: "M12 7.5V12l3 2", strokeLinecap: "round", strokeLinejoin: "round" })) }; window.VNIcon = function VNIcon({ name, size = 24, className = "", style = {}, strokeWidth = 1.5 }) { const g = P[name]; if (!g) return null; const filled = name === "heartFill" || name === "facebook" || name === "youtube" || name === "whatsapp"; return /*#__PURE__*/React.createElement("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: strokeWidth, className: className, style: style, "aria-hidden": "true" }, g); }; })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/Icons.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/Legal.jsx try { (() => { // Legal pages — Obchodní podmínky + Ochrana údajů (GDPR). // Layout: sticky left TOC sidebar (desktop) + main prose column. (function () { if (typeof React === "undefined") return; const DS = window.VElaStvNajmanDesignSystem_bc3fc2; const { Button } = DS; const Icon = window.VNIcon; const DOCS = { podminky: { eyebrow: "Právní informace", title: "Obchodní podmínky", updated: "Platné od 1. ledna 2026", intro: "Tyto obchodní podmínky upravují práva a povinnosti mezi rodinným včelařstvím Najman a kupujícím při nákupu v našem e-shopu. Doporučujeme se s nimi seznámit ještě před objednáním.", sections: [{ h: "Základní údaje o prodávajícím", p: ["Prodávajícím je Rodinné včelařství Najman se sídlem Na Samotě 1029, 253 01 Hostivice, IČO 12345678. Kontaktní e-mail vcelahostivice@seznam.cz, telefon +420 603 887 482.", "Vztahy neupravené těmito podmínkami se řídí právním řádem České republiky, zejména občanským zákoníkem a zákonem o ochraně spotřebitele."] }, { h: "Objednávka a uzavření smlouvy", p: ["Kupní smlouva vzniká odesláním objednávky kupujícím a jejím potvrzením ze strany prodávajícího (zpravidla e-mailem). Údaje uvedené v objednávce považujeme za správné.", "Před odesláním má kupující možnost zkontrolovat a změnit obsah košíku i zadané údaje."] }, { h: "Ceny a platební podmínky", p: ["Všechny ceny jsou uvedeny včetně DPH. Platit lze dobírkou, převodem na účet, platební kartou nebo přes platební bránu (Apple Pay / Google Pay).", "Zboží zůstává do úplného zaplacení majetkem prodávajícího."] }, { h: "Dodací podmínky", p: ["Rozvoz po Hostivicích a okolí zajišťujeme osobně, od 4 kusů zdarma. Po celé ČR odesíláme prostřednictvím Zásilkovny nebo kurýra. Možný je i osobní odběr ze dvora po předchozí domluvě.", "Objednávky zpravidla expedujeme do 2 pracovních dnů. O odeslání informujeme e-mailem."] }, { h: "Odstoupení od smlouvy", p: ["Kupující — spotřebitel má právo odstoupit od smlouvy do 14 dnů od převzetí zboží bez udání důvodu. U potravin podléhajících rychlé zkáze nebo zboží v uzavřeném obalu, které nelze vrátit z hygienických důvodů, může být toto právo omezeno dle zákona.", "Nad rámec zákona nabízíme záruku spokojenosti — pokud nechutná, ozvěte se nám a domluvíme se."] }, { h: "Reklamace a vady", p: ["Práva z vadného plnění se řídí občanským zákoníkem. Reklamaci uplatněte e-mailem nebo telefonicky; vyřídíme ji bez zbytečného odkladu, nejpozději do 30 dnů.", "Krystalizace medu není vadou — je přirozeným projevem pravosti."] }, { h: "Ochrana osobních údajů", p: ["Zpracování osobních údajů se řídí samostatným dokumentem Ochrana údajů (GDPR), dostupným v patičce webu."] }, { h: "Závěrečná ustanovení", p: ["Tyto podmínky může prodávající měnit; pro objednávku platí znění účinné v okamžiku jejího odeslání.", "Toto je vzorové znění pro účely prototypu — před spuštěním doporučujeme právní revizi."] }] }, gdpr: { eyebrow: "Právní informace", title: "Ochrana osobních údajů", updated: "Platné od 1. ledna 2026", intro: "Vážíme si vašeho soukromí. Tento dokument vysvětluje, jaké osobní údaje zpracováváme, proč, jak dlouho a jaká máte práva.", sections: [{ h: "Správce údajů", p: ["Správcem osobních údajů je Rodinné včelařství Najman, Na Samotě 1029, 253 01 Hostivice, IČO 12345678, e-mail vcelahostivice@seznam.cz."] }, { h: "Jaké údaje zpracováváme", p: ["Zpracováváme údaje, které nám sami poskytnete: jméno a příjmení, doručovací a fakturační adresu, e-mail a telefon, obsah objednávek a komunikaci s námi. Údaje o platební kartě nezpracováváme — ty zpracovává poskytovatel platební brány."] }, { h: "Účel a právní základ", p: ["Údaje zpracováváme za účelem vyřízení objednávky a plnění smlouvy, vedení účetnictví dle zákona a — máte-li zájem — na základě vašeho souhlasu pro zasílání newsletteru."] }, { h: "Doba uchování", p: ["Údaje uchováváme po dobu nezbytně nutnou: pro plnění objednávky a zákonem stanovenou dobu (např. účetní doklady 10 let). Souhlas s newsletterem platí do jeho odvolání."] }, { h: "Předání třetím stranám", p: ["Údaje předáváme jen v nezbytném rozsahu zpracovatelům, kteří nám pomáhají — dopravcům (Zásilkovna, kurýr), poskytovateli platební brány a účetní. Údaje neprodáváme."] }, { h: "Cookies", p: ["Web používá nezbytné cookies pro správnou funkci. Analytické či marketingové cookies používáme pouze s vaším souhlasem, který lze kdykoli odvolat v nastavení prohlížeče."] }, { h: "Vaše práva", p: ["Máte právo na přístup ke svým údajům, jejich opravu nebo výmaz, na omezení zpracování, přenositelnost a právo vznést námitku. Souhlas se zpracováním můžete kdykoli odvolat."] }, { h: "Kontakt a dozorový úřad", p: ["S žádostí či dotazem se obraťte na vcelahostivice@seznam.cz. Máte rovněž právo podat stížnost u Úřadu pro ochranu osobních údajů (uoou.cz).", "Toto je vzorové znění pro účely prototypu — před spuštěním doporučujeme právní revizi."] }] } }; function Legal({ go, kind }) { const d = DOCS[kind] || DOCS.podminky; const secId = i => kind + "-s" + i; const [active, setActive] = React.useState(0); // Scrollspy — highlight active section in sidebar React.useEffect(() => { const els = d.sections.map((_, i) => document.getElementById(secId(i))).filter(Boolean); if (!els.length) return; const io = new IntersectionObserver(entries => { const vis = entries.filter(e => e.isIntersecting); if (!vis.length) return; vis.sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top); const id = vis[0].target.id; const idx = parseInt(id.replace(kind + "-s", ""), 10); if (!isNaN(idx)) setActive(idx); }, { rootMargin: "-100px 0px -55% 0px", threshold: 0 }); els.forEach(el => io.observe(el)); return () => io.disconnect(); }, [kind]); const jump = i => { if (i === 0) { window.scrollTo({ top: 0, behavior: "smooth" }); return; } const el = document.getElementById(secId(i)); if (el) window.scrollTo({ top: el.getBoundingClientRect().top + window.scrollY - 132, behavior: "smooth" }); }; return /*#__PURE__*/React.createElement("main", { className: "kit" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell kit-legal" }, /*#__PURE__*/React.createElement("nav", { className: "kit-breadcrumb" }, /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("home"); } }, "Dom\u016F"), /*#__PURE__*/React.createElement(Icon, { name: "chevronRight", size: 13 }), " ", /*#__PURE__*/React.createElement("span", { className: "kit-breadcrumb__here" }, d.title)), /*#__PURE__*/React.createElement("div", { className: "kit-legal__layout" }, /*#__PURE__*/React.createElement("aside", { className: "kit-legal__sidebar" }, /*#__PURE__*/React.createElement("nav", { className: "kit-legal__toc", "aria-label": "Obsah dokumentu" }, /*#__PURE__*/React.createElement("p", { className: "kit-legal__toc-h" }, "Obsah"), /*#__PURE__*/React.createElement("ol", null, d.sections.map((s, i) => /*#__PURE__*/React.createElement("li", { key: i }, /*#__PURE__*/React.createElement("a", { href: "#" + secId(i), className: "kit-legal__toc-link" + (active === i ? " is-active" : ""), onClick: e => { e.preventDefault(); jump(i); } }, /*#__PURE__*/React.createElement("span", { className: "kit-legal__toc-num" }, String(i + 1).padStart(2, "0")), /*#__PURE__*/React.createElement("span", { className: "kit-legal__toc-label" }, s.h))))))), /*#__PURE__*/React.createElement("div", { className: "kit-legal__main" }, /*#__PURE__*/React.createElement("header", { className: "kit-legal__head" }, /*#__PURE__*/React.createElement("span", { className: "vn-eyebrow" }, /*#__PURE__*/React.createElement(Icon, { name: "shield", size: 15 }), " ", d.eyebrow), /*#__PURE__*/React.createElement("h1", null, d.title), /*#__PURE__*/React.createElement("p", { className: "kit-legal__updated" }, /*#__PURE__*/React.createElement(Icon, { name: "clock", size: 15 }), " ", d.updated), /*#__PURE__*/React.createElement("p", { className: "kit-legal__intro" }, d.intro)), /*#__PURE__*/React.createElement("div", { className: "kit-prose kit-legal__body" }, d.sections.map((s, i) => /*#__PURE__*/React.createElement("section", { className: "kit-legal__sec", id: secId(i), key: i }, /*#__PURE__*/React.createElement("h2", null, /*#__PURE__*/React.createElement("span", { className: "kit-legal__num" }, String(i + 1).padStart(2, "0")), s.h), s.p.map((para, j) => /*#__PURE__*/React.createElement("p", { key: j }, para))))), /*#__PURE__*/React.createElement("div", { className: "kit-legal__foot" }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("p", { className: "kit-legal__foot-h" }, "M\xE1te dotaz k podm\xEDnk\xE1m nebo zpracov\xE1n\xED \xFAdaj\u016F?"), /*#__PURE__*/React.createElement("p", { className: "kit-legal__foot-d" }, "R\xE1di v\xE1m odpov\xEDme \u2014 ozv\u011Bte se kdykoli.")), /*#__PURE__*/React.createElement(Button, { variant: "primary", onClick: () => go("contact"), iconEnd: /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 18 }) }, "Napsat n\xE1m")))))); } window.VNLegal = Legal; })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/Legal.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/Preorder.jsx try { (() => { // Preorder modal (Režim A — vyprodáno s termínem, platba předem). (function () { if (typeof React === "undefined") return; const DS = window.VElaStvNajmanDesignSystem_bc3fc2; const { Photo, Button, QuantityStepper, Tag } = DS; const Icon = window.VNIcon; function Preorder({ product, onClose, onAddToCart, onBuyNow, onContact }) { const open = !!product; const p = product || {}; const variants = p.variants && p.variants.length ? p.variants : null; const [vIdx, setVIdx] = React.useState(0); const [qty, setQty] = React.useState(1); React.useEffect(() => { setVIdx(0); setQty(1); }, [product && product.id]); React.useEffect(() => { const onKey = e => { if (e.key === "Escape") onClose(); }; document.addEventListener("keydown", onKey); return () => document.removeEventListener("keydown", onKey); }, [onClose]); const variant = variants ? variants[Math.min(vIdx, variants.length - 1)] : null; const price = variant ? variant.price : p.price; const weight = variant ? variant.w : p.weight; const restock = variant && variant.restock || p.restock || "brzy"; const item = { ...p, id: variant ? p.id + "-" + weight : p.id, price, weight, preorder: restock }; return /*#__PURE__*/React.createElement("div", { className: "vn-sheet", "data-open": open, onClick: e => { if (e.target === e.currentTarget) onClose(); } }, /*#__PURE__*/React.createElement("div", { className: "vn-sheet__panel", role: "dialog", "aria-modal": "true", "aria-label": "Předobjednávka — " + p.name }, /*#__PURE__*/React.createElement("button", { className: "vn-sheet__close", onClick: onClose, "aria-label": "Zav\u0159\xEDt" }, /*#__PURE__*/React.createElement(Icon, { name: "close", size: 20 })), open && /*#__PURE__*/React.createElement("div", { className: "vn-sheet__body" }, /*#__PURE__*/React.createElement("div", { className: "vn-sheet__head" }, /*#__PURE__*/React.createElement("div", { className: "vn-sheet__thumb" }, /*#__PURE__*/React.createElement(Photo, { src: p.image, ratio: "1 / 1", label: weight })), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Tag, { icon: /*#__PURE__*/React.createElement(Icon, { name: "pin", size: 13 }) }, p.region), /*#__PURE__*/React.createElement("h3", { className: "vn-sheet__name" }, p.name), /*#__PURE__*/React.createElement("span", { className: "vn-stock vn-stock--out" }, /*#__PURE__*/React.createElement("span", { className: "vn-stock__dot" }), " Vyprod\xE1no"))), /*#__PURE__*/React.createElement("div", { className: "vn-sheet__notice" }, /*#__PURE__*/React.createElement(Icon, { name: "truck", size: 18 }), /*#__PURE__*/React.createElement("p", null, /*#__PURE__*/React.createElement("strong", null, "Platba p\u0159edem."), " Med ode\u0161leme po naskladn\u011Bn\xED \u2014 orienta\u010Dn\u011B ", /*#__PURE__*/React.createElement("strong", null, restock), ", nejpozd\u011Bji do ", p.latest || "—", ".", " ", /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); } }, "Podm\xEDnky p\u0159edobjedn\xE1vky"))), variants && /*#__PURE__*/React.createElement("div", { className: "vn-sheet__row" }, /*#__PURE__*/React.createElement("span", { className: "vn-sheet__label" }, "Balen\xED"), /*#__PURE__*/React.createElement("div", { className: "kit-pdp__pills" }, variants.map((v, i) => /*#__PURE__*/React.createElement("button", { key: i, type: "button", className: "kit-pill", "data-active": i === vIdx, onClick: () => setVIdx(i) }, v.w)))), /*#__PURE__*/React.createElement("div", { className: "vn-sheet__buyrow" }, /*#__PURE__*/React.createElement("div", { className: "vn-sheet__price" }, /*#__PURE__*/React.createElement("b", null, price * qty, " K\u010D"), /*#__PURE__*/React.createElement("span", null, "v\u010D. DPH", weight ? " · " + weight : "")), /*#__PURE__*/React.createElement(QuantityStepper, { value: qty, onChange: setQty, max: 20 })), /*#__PURE__*/React.createElement("div", { className: "vn-sheet__actions" }, /*#__PURE__*/React.createElement(Button, { variant: "primary", size: "lg", block: true, onClick: () => onBuyNow(item, qty), iconStart: /*#__PURE__*/React.createElement(Icon, { name: "check", size: 18 }) }, "Koupit ihned"), /*#__PURE__*/React.createElement(Button, { variant: "secondary", size: "lg", block: true, onClick: () => { onAddToCart(item, qty); onClose(); }, iconStart: /*#__PURE__*/React.createElement(Icon, { name: "cart", size: 18 }) }, "P\u0159idat do ko\u0161\xEDku")), /*#__PURE__*/React.createElement("button", { className: "vn-sheet__contact", onClick: () => { onClose(); onContact(); } }, "Dotaz k p\u0159edobjedn\xE1vce? Napi\u0161te n\xE1m")))); } window.VNPreorder = Preorder; })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/Preorder.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/Product.jsx try { (() => { // Product detail page (PDP). (function () { if (typeof React === "undefined") return; const DS = window.VElaStvNajmanDesignSystem_bc3fc2; const { Photo, Button, Badge, Tag, Rating, QuantityStepper, SectionHeading, Input } = DS; const Icon = window.VNIcon; function Accordion({ title, children, open: defOpen }) { const [open, setOpen] = React.useState(!!defOpen); return /*#__PURE__*/React.createElement("div", { className: "kit-acc", "data-open": open }, /*#__PURE__*/React.createElement("button", { className: "kit-acc__head", onClick: () => setOpen(o => !o), "aria-expanded": open }, title, /*#__PURE__*/React.createElement(Icon, { name: "chevronDown", size: 20 })), /*#__PURE__*/React.createElement("div", { className: "kit-acc__body" }, /*#__PURE__*/React.createElement("p", null, children))); } // Count-up animation for the price (3.3) — eases the number to its new value. function useCountUp(value, ms) { const [disp, setDisp] = React.useState(value); const prev = React.useRef(value); React.useEffect(() => { const from = prev.current, to = value; prev.current = value; if (from === to) return; const reduce = window.matchMedia && !window.matchMedia('(prefers-reduced-motion: no-preference)').matches; if (reduce) { setDisp(to); return; } let raf, start; const step = t => { if (!start) start = t; const p = Math.min(1, (t - start) / ms); setDisp(Math.round(from + (to - from) * p)); if (p < 1) raf = requestAnimationFrame(step); }; raf = requestAnimationFrame(step); return () => cancelAnimationFrame(raf); }, [value, ms]); return disp; } function Product({ go, addToCart, onNotify, onPreorder, productId }) { const D = window.SHOP_DATA; const p = D.products.find(x => x.id === productId) || D.products[0]; const honeyVariants = p.variants && p.variants.length ? p.variants : null; const [qty, setQty] = React.useState(1); const [activeImg, setActiveImg] = React.useState(0); const [lightbox, setLightbox] = React.useState(false); const touchX = React.useRef(null); const onTouchStart = e => { touchX.current = e.touches[0].clientX; }; const onTouchEnd = e => { if (touchX.current == null) return; const dx = e.changedTouches[0].clientX - touchX.current; touchX.current = null; if (Math.abs(dx) < 40) return; setActiveImg(i => Math.max(0, Math.min(3, dx < 0 ? i + 1 : i - 1))); }; const [vIdx, setVIdx] = React.useState(0); React.useEffect(() => { setQty(1); setActiveImg(0); setLightbox(false); const di = honeyVariants ? Math.max(0, honeyVariants.findIndex(v => v.w === p.weight)) : 0; setVIdx(di); }, [productId]); const variant = honeyVariants ? honeyVariants[Math.min(vIdx, honeyVariants.length - 1)] : null; const curPrice = variant ? variant.price : p.price; const curWeight = variant ? variant.w : p.weight; const dispPrice = useCountUp(curPrice * qty, 150); // 4.1 — sticky buy bar appears only once the real buy box scrolls out of view. // Uses a scroll listener (works everywhere, incl. environments where IO is flaky). const buyRef = React.useRef(null); const [showSticky, setShowSticky] = React.useState(false); React.useEffect(() => { const el = buyRef.current; if (!el) return; const check = () => { const r = el.getBoundingClientRect(); setShowSticky(r.bottom < 80); }; check(); window.addEventListener("scroll", check, { passive: true }); window.addEventListener("resize", check); return () => { window.removeEventListener("scroll", check); window.removeEventListener("resize", check); }; }, [productId, vIdx, soldOut, notified]); // close lightbox on Escape React.useEffect(() => { if (!lightbox) return; const onKey = e => { if (e.key === "Escape") setLightbox(false); }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [lightbox]); const curStock = variant ? variant.stock : p.stock || "in"; const soldOut = curStock === "out"; const curRestock = variant && variant.restock || p.restock || null; const [notifyEmail, setNotifyEmail] = React.useState(""); const [notified, setNotified] = React.useState(false); React.useEffect(() => { setNotified(false); setNotifyEmail(""); }, [productId, vIdx]); const buyItem = { ...p, id: variant ? p.id + "-" + variant.w : p.id, name: p.name, price: curPrice, weight: curWeight }; const preorderItem = { ...p, price: curPrice, weight: curWeight, restock: curRestock }; const HONEY = ["kvetove", "pastovany", "lesni"]; const related = (() => { const pool = D.products.filter(x => x.id !== p.id); const seen = new Set(); const out = []; const add = arr => arr.forEach(x => { if (!seen.has(x.id) && out.length < 3) { seen.add(x.id); out.push(x); } }); add(pool.filter(x => x.cat === p.cat)); // same category first if (HONEY.includes(p.cat)) add(pool.filter(x => HONEY.includes(x.cat))); // then honey siblings add(pool.filter(x => x.cat !== "gift")); // then anything else (skip gift bundle) add(pool); // final fallback return out; })(); const MENU_CAT = { kvetove: { label: "Med", arg: "med" }, pastovany: { label: "Med", arg: "med" }, lesni: { label: "Med", arg: "med" }, medovina: { label: "Medovina", arg: "medovina" }, propolis: { label: "Vosk a propolis", arg: "propolis" }, gift: { label: "Dárkové balíčky", arg: "gift" } }; const crumbCat = MENU_CAT[p.cat] || { label: "Med", arg: "med" }; return /*#__PURE__*/React.createElement("main", { className: "kit" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement("nav", { className: "kit-breadcrumb", style: { paddingTop: 24 } }, /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("home"); } }, "Dom\u016F"), /*#__PURE__*/React.createElement(Icon, { name: "chevronRight", size: 13 }), /*#__PURE__*/React.createElement("a", { href: "#", onClick: e => { e.preventDefault(); go("category", crumbCat.arg); } }, crumbCat.label), /*#__PURE__*/React.createElement(Icon, { name: "chevronRight", size: 13 }), " ", /*#__PURE__*/React.createElement("span", { className: "kit-breadcrumb__here" }, p.name))), /*#__PURE__*/React.createElement("div", { className: "kit-shell kit-pdp" }, /*#__PURE__*/React.createElement("div", { className: "kit-gallery" }, /*#__PURE__*/React.createElement("div", { className: "kit-gallery__main", onClick: () => setLightbox(true), onTouchStart: onTouchStart, onTouchEnd: onTouchEnd, title: "Klikn\u011Bte pro zv\u011Bt\u0161en\xED" }, /*#__PURE__*/React.createElement(Photo, { src: activeImg === 0 ? p.image : undefined, ratio: "1 / 1", alt: p.name, label: "Foto " + (activeImg + 1) + " · " + p.weight }), /*#__PURE__*/React.createElement("button", { className: "kit-gallery__zoom", onClick: e => { e.stopPropagation(); setLightbox(true); }, "aria-label": "Zv\u011Bt\u0161it na cel\xFD obraz" }, /*#__PURE__*/React.createElement(Icon, { name: "plus", size: 18 }))), /*#__PURE__*/React.createElement("div", { className: "kit-gallery__dots", role: "tablist", "aria-label": "Fotografie produktu" }, [0, 1, 2, 3].map(i => /*#__PURE__*/React.createElement("button", { key: i, className: "kit-gallery__dot" + (activeImg === i ? " is-active" : ""), onClick: () => setActiveImg(i), "aria-label": "Foto " + (i + 1), "aria-selected": activeImg === i }))), /*#__PURE__*/React.createElement("div", { className: "kit-gallery__thumbs" }, [0, 1, 2, 3].map(i => /*#__PURE__*/React.createElement(Photo, { key: i, src: i === 0 ? p.image : undefined, ratio: "1 / 1", label: "\xB7", "data-active": activeImg === i, onClick: () => { setActiveImg(i); } })))), /*#__PURE__*/React.createElement("div", { className: "kit-pdp__info" }, /*#__PURE__*/React.createElement("div", { className: "kit-pdp__titlerow" }, /*#__PURE__*/React.createElement("h1", null, p.name), /*#__PURE__*/React.createElement("span", { className: "vn-chip kit-pdp__statuschip vn-chip--" + (curStock === "out" ? "red" : curStock === "low" ? "gold" : "green") }, /*#__PURE__*/React.createElement("span", { className: "vn-chip__dot" }), curStock === "out" ? "Vyprodáno" : curStock === "low" ? "Poslední kusy" : "Skladem")), p.taste && /*#__PURE__*/React.createElement("p", { className: "kit-pdp__taste" }, p.taste), /*#__PURE__*/React.createElement("p", { className: "kit-pdp__desc" }, p.desc), /*#__PURE__*/React.createElement("div", { className: "kit-pdp__selector" + (honeyVariants ? "" : " is-single") }, honeyVariants && /*#__PURE__*/React.createElement("div", { className: "kit-pdp__variants" }, /*#__PURE__*/React.createElement("span", { className: "kit-pdp__variants-label" }, "Vyberte balen\xED"), /*#__PURE__*/React.createElement("div", { className: "kit-pdp__pills" }, honeyVariants.map((v, i) => /*#__PURE__*/React.createElement("button", { key: i, type: "button", className: "kit-pill", "data-active": i === vIdx, disabled: v.stock === "out", onClick: () => { setVIdx(i); setQty(1); }, "aria-pressed": i === vIdx }, /*#__PURE__*/React.createElement("span", { className: "kit-pill__check", "aria-hidden": "true" }, /*#__PURE__*/React.createElement(Icon, { name: "check", size: 13 })), /*#__PURE__*/React.createElement("span", { className: "kit-pill__w" }, v.w), /*#__PURE__*/React.createElement("span", { className: "kit-pill__p" }, v.stock === "out" ? "vyprodáno" : v.price + " Kč"))))), /*#__PURE__*/React.createElement("div", { className: "kit-pdp__priceline" }, /*#__PURE__*/React.createElement("div", { className: "kit-pdp__price" }, /*#__PURE__*/React.createElement("b", null, dispPrice, " K\u010D"), /*#__PURE__*/React.createElement("span", null, "v\u010D. DPH", qty > 1 ? " · " + qty + " ks" : "", " \xB7 ", curWeight)))), /*#__PURE__*/React.createElement("div", { className: "kit-pdp__buybox", ref: buyRef }, soldOut ? curRestock ? /*#__PURE__*/React.createElement("div", { className: "kit-preorder-block" }, /*#__PURE__*/React.createElement("p", { className: "kit-restock" }, /*#__PURE__*/React.createElement(Icon, { name: "truck", size: 16 }), " Nasklad\u0148ujeme: ", /*#__PURE__*/React.createElement("strong", null, curRestock)), /*#__PURE__*/React.createElement(Button, { variant: "primary", size: "lg", block: true, iconStart: /*#__PURE__*/React.createElement(Icon, { name: "check", size: 18 }), onClick: () => onPreorder && onPreorder(preorderItem) }, "P\u0159edobjednat")) : /*#__PURE__*/React.createElement("div", { className: "kit-notify-block" }, notified ? /*#__PURE__*/React.createElement("p", { className: "kit-notify-ok" }, /*#__PURE__*/React.createElement(Icon, { name: "check", size: 16 }), " D\xE1me v\u011Bd\u011Bt, jakmile bude ", curWeight ? curWeight + " " : "", "skladem.") : /*#__PURE__*/React.createElement("form", { className: "kit-notify-form", onSubmit: e => { e.preventDefault(); if (notifyEmail) setNotified(true); } }, /*#__PURE__*/React.createElement(Input, { type: "email", required: true, placeholder: "vas@email.cz", "aria-label": "E-mail pro upozorn\u011Bn\xED", value: notifyEmail, onChange: e => setNotifyEmail(e.target.value) }), /*#__PURE__*/React.createElement(Button, { variant: "secondary", size: "lg", type: "submit", iconStart: /*#__PURE__*/React.createElement(Icon, { name: "mail", size: 18 }) }, "Upozornit, a\u017E naskladn\xEDme"))) : /*#__PURE__*/React.createElement("div", { className: "kit-pdp__buy" }, /*#__PURE__*/React.createElement(QuantityStepper, { value: qty, onChange: setQty, max: 20 }), /*#__PURE__*/React.createElement(Button, { variant: "primary", size: "lg", onClick: () => addToCart(buyItem, qty), iconStart: /*#__PURE__*/React.createElement(Icon, { name: "cart", size: 18 }), style: { flex: 1, minWidth: 180 } }, "Do ko\u0161\xEDku"))), /*#__PURE__*/React.createElement("div", { className: "kit-pdp__ship" }, /*#__PURE__*/React.createElement(Icon, { name: "truck", size: 18 }), " Rozvoz zdarma po Hostivic\xEDch a okol\xED od 4 ks \xB7 odb\u011Br ze dvora"), /*#__PURE__*/React.createElement("div", { className: "kit-prov" }, /*#__PURE__*/React.createElement("div", { className: "kit-prov__data" }, /*#__PURE__*/React.createElement("p", { className: "vn-eyebrow", style: { marginBottom: 8 } }, "P\u016Fvod a kvalita"), /*#__PURE__*/React.createElement("dl", { className: "kit-prov__list" }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("dt", null, "Oblast"), /*#__PURE__*/React.createElement("dd", null, p.region)), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("dt", null, "Sn\u016F\u0161ka"), /*#__PURE__*/React.createElement("dd", null, p.prov ? p.prov.harvest : "—")), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("dt", null, "Datum sto\u010Den\xED"), /*#__PURE__*/React.createElement("dd", null, p.prov ? p.prov.bottled : "—")), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("dt", null, "\u010C\xEDslo \u0161ar\u017Ee"), /*#__PURE__*/React.createElement("dd", { className: "kit-prov__lot" }, /*#__PURE__*/React.createElement("span", { className: "kit-prov__stamp", "aria-hidden": "true" }, /*#__PURE__*/React.createElement(Icon, { name: "hexagon", size: 13 })), p.prov ? p.prov.lot : "—"))), /*#__PURE__*/React.createElement("span", { className: "kit-prov__badge" }, /*#__PURE__*/React.createElement(Icon, { name: "shield", size: 15 }), " Laboratorn\xED rozbor k dispozici")), /*#__PURE__*/React.createElement("a", { className: "kit-prov__map", href: "https://www.google.com/maps/search/?api=1&query=" + encodeURIComponent(p.region + ", Česko"), target: "_blank", rel: "noopener noreferrer", "aria-label": "Zobrazit oblast " + p.region + " na mapě" }, /*#__PURE__*/React.createElement("span", { className: "kit-prov__map-hc", "aria-hidden": "true" }), /*#__PURE__*/React.createElement("span", { className: "kit-prov__medallion" }, /*#__PURE__*/React.createElement("span", { className: "kit-prov__pin" }, /*#__PURE__*/React.createElement(Icon, { name: "pin", size: 26 }))), /*#__PURE__*/React.createElement("span", { className: "kit-prov__region" }, p.region), /*#__PURE__*/React.createElement("span", { className: "kit-prov__maplink" }, "Zobrazit na map\u011B ", /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 14 })))), window.VNTasteProfile && p.profile && (p.profile.color > 0 || p.profile.sweet > 0) && /*#__PURE__*/React.createElement("div", { className: "kit-pdp__taste-block" }, /*#__PURE__*/React.createElement("p", { className: "vn-eyebrow", style: { marginBottom: 10 } }, "Chu\u0165ov\xFD profil"), /*#__PURE__*/React.createElement(window.VNTasteProfile, { profile: p.profile })), /*#__PURE__*/React.createElement("div", { className: "kit-pdp__meta" }, /*#__PURE__*/React.createElement(Accordion, { title: "Jak skladovat", open: true }, "Skladujte v suchu p\u0159i pokojov\xE9 teplot\u011B, mimo p\u0159\xEDm\xE9 slunce. Med vydr\u017E\xED roky \u2014 kvalitu neztr\xE1c\xED."), /*#__PURE__*/React.createElement(Accordion, { title: "Pro\u010D med krystalizuje" }, "Krystalizace je p\u0159irozen\xE1 a je d\u016Fkazem pravosti, ne vady. Sklenici sta\u010D\xED oh\u0159\xE1t ve vodn\xED l\xE1zni do 40 \xB0C a med op\u011Bt zkapaln\xED."), /*#__PURE__*/React.createElement(Accordion, { title: "Doprava a platba" }, "Z\xE1silkovna / Packeta, kur\xFDr, osobn\xED odb\u011Br. Platba kartou, Apple/Google Pay, p\u0159evodem i na dob\xEDrku.")))), /*#__PURE__*/React.createElement("section", { className: "kit-section" }, /*#__PURE__*/React.createElement("div", { className: "kit-shell" }, /*#__PURE__*/React.createElement("div", { className: "kit-section__head" }, /*#__PURE__*/React.createElement(SectionHeading, { eyebrow: "Mohlo by se v\xE1m hodit", title: "Souvisej\xEDc\xED medy" })), /*#__PURE__*/React.createElement("div", { className: "kit-pgrid kit-related" }, related.map(r => /*#__PURE__*/React.createElement(window.VNProductCard, { key: r.id, product: r, onOpen: pr => { go("product", pr.id); window.scrollTo(0, 0); }, onAdd: () => addToCart(r), onNotify: onNotify, onPreorder: onPreorder }))))), lightbox && /*#__PURE__*/React.createElement("div", { className: "kit-gallery__lightbox", onClick: () => setLightbox(false), role: "dialog", "aria-modal": "true", "aria-label": p.name }, /*#__PURE__*/React.createElement("button", { className: "kit-gallery__lightbox-close", onClick: () => setLightbox(false), "aria-label": "Zav\u0159\xEDt" }, /*#__PURE__*/React.createElement(Icon, { name: "close", size: 22 })), /*#__PURE__*/React.createElement("div", { className: "kit-gallery__lightbox-stage", onClick: e => e.stopPropagation(), onTouchStart: onTouchStart, onTouchEnd: onTouchEnd }, /*#__PURE__*/React.createElement(Photo, { src: activeImg === 0 ? p.image : undefined, ratio: "1 / 1", alt: p.name, label: "Foto " + (activeImg + 1) + " · " + p.weight })), /*#__PURE__*/React.createElement("div", { className: "kit-gallery__lightbox-dots" }, [0, 1, 2, 3].map(i => /*#__PURE__*/React.createElement("button", { key: i, className: "kit-gallery__dot" + (activeImg === i ? " is-active" : ""), onClick: e => { e.stopPropagation(); setActiveImg(i); }, "aria-label": "Foto " + (i + 1) })))), /*#__PURE__*/React.createElement("div", { className: "kit-stickybar" + (showSticky ? " is-visible" : ""), "aria-hidden": !showSticky }, /*#__PURE__*/React.createElement("span", { className: "kit-stickybar__price" }, curPrice, " K\u010D", /*#__PURE__*/React.createElement("small", null, "v\u010D. DPH", honeyVariants ? " · " + curWeight : "")), soldOut ? curRestock ? /*#__PURE__*/React.createElement(Button, { variant: "primary", size: "lg", onClick: () => onPreorder && onPreorder(preorderItem), iconStart: /*#__PURE__*/React.createElement(Icon, { name: "check", size: 18 }) }, "P\u0159edobjednat") : /*#__PURE__*/React.createElement(Button, { variant: "secondary", size: "lg", onClick: () => setNotified(true), iconStart: /*#__PURE__*/React.createElement(Icon, { name: "mail", size: 18 }) }, "Upozornit") : /*#__PURE__*/React.createElement(Button, { variant: "primary", size: "lg", onClick: () => addToCart(buyItem, qty), iconStart: /*#__PURE__*/React.createElement(Icon, { name: "cart", size: 18 }) }, "Do ko\u0161\xEDku"))); } window.VNProduct = Product; })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/Product.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/ProductCardPro.jsx try { (() => { // Rich catalog product card for the e-shop kit (kit-level so it compiles fresh // into the standalone). Composes DS Photo/Rating/Badge/Tag/Button + kit Bits. (function () { if (typeof React === "undefined") return; const DS = window.VElaStvNajmanDesignSystem_bc3fc2; const { Photo, Rating, Badge, Tag } = DS; const Icon = window.VNIcon; function ProductCardPro({ product, onOpen, onAdd, onQuickView, onNotify, onPreorder }) { const p = product; const soldOut = p.stock === "out"; const restock = p.restock || null; const [added, setAdded] = React.useState(false); const addedTimer = React.useRef(null); const handleAdd = e => { e.stopPropagation(); onAdd && onAdd(p); setAdded(true); clearTimeout(addedTimer.current); addedTimer.current = setTimeout(() => setAdded(false), 1500); }; React.useEffect(() => () => clearTimeout(addedTimer.current), []); return /*#__PURE__*/React.createElement("article", { className: "vn-pcardx" + (soldOut ? " vn-pcardx--out" : "") }, /*#__PURE__*/React.createElement("div", { className: "vn-pcardx__media", onClick: () => onOpen && onOpen(p) }, /*#__PURE__*/React.createElement(Photo, { src: p.image, ratio: "1 / 1", alt: p.name, label: "Foto · " + p.weight, className: "vn-pcardx__img" }), /*#__PURE__*/React.createElement("div", { className: "vn-pcardx__hoverimg", "aria-hidden": "true" }, /*#__PURE__*/React.createElement(Photo, { src: p.image, ratio: "1 / 1", label: "Detail" })), /*#__PURE__*/React.createElement("div", { className: "vn-pcardx__corner" }, p.badge && /*#__PURE__*/React.createElement("span", { className: "vn-chip vn-chip--" + (p.badge.tone === "green" ? "green" : "gold") }, /*#__PURE__*/React.createElement("span", { className: "vn-chip__dot" }), p.badge.label)), /*#__PURE__*/React.createElement("span", { className: "vn-pcardx__status vn-chip vn-chip--" + (p.stock === "out" ? "red" : p.stock === "low" ? "gold" : "green") }, /*#__PURE__*/React.createElement("span", { className: "vn-chip__dot" }), p.stock === "out" ? "Vyprodáno" : p.stock === "low" ? "Poslední kusy" : "Skladem")), /*#__PURE__*/React.createElement("div", { className: "vn-pcardx__body" }, p.region && /*#__PURE__*/React.createElement(Tag, null, p.region), /*#__PURE__*/React.createElement("h3", { className: "vn-pcardx__name", onClick: () => onOpen && onOpen(p) }, p.name), window.VNTasteProfile && p.profile && (p.profile.color > 0 || p.profile.sweet > 0) && /*#__PURE__*/React.createElement(window.VNTasteProfile, { profile: p.profile, compact: true }), /*#__PURE__*/React.createElement("div", { className: "vn-pcardx__foot" }, /*#__PURE__*/React.createElement("span", { className: "vn-pcardx__price" }, /*#__PURE__*/React.createElement("b", null, p.variants && p.variants.length ? "od " + Math.min.apply(null, p.variants.map(v => v.price)) : p.price, " K\u010D"), /*#__PURE__*/React.createElement("span", { className: "vn-pcardx__vat" }, "\xB7 v\u010D. DPH")), soldOut ? restock ? /*#__PURE__*/React.createElement("button", { className: "vn-pcardx__add", onClick: e => { e.stopPropagation(); onPreorder && onPreorder(p); } }, /*#__PURE__*/React.createElement(Icon, { name: "check", size: 15 }), " P\u0159edobjednat") : /*#__PURE__*/React.createElement("button", { className: "vn-pcardx__notify", onClick: e => { e.stopPropagation(); onNotify && onNotify(p); } }, /*#__PURE__*/React.createElement(Icon, { name: "mail", size: 15 }), " Upozornit") : /*#__PURE__*/React.createElement("button", { className: "vn-pcardx__add" + (added ? " is-added" : ""), onClick: handleAdd, "aria-label": "Přidat " + p.name + " do košíku" }, added ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Icon, { name: "check", size: 16 }), " P\u0159id\xE1no") : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Icon, { name: "plus", size: 16 }), " Do ko\u0161\xEDku"))))); } window.VNProductCard = ProductCardPro; })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/ProductCardPro.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/QuickView.jsx try { (() => { // Quick View modal — product detail without leaving the catalog. (function () { if (typeof React === "undefined") return; const DS = window.VElaStvNajmanDesignSystem_bc3fc2; const { Photo, Button, Badge, Tag, Rating, QuantityStepper } = DS; const Icon = window.VNIcon; function QuickView({ product, onClose, onAdd, onOpenFull }) { const [qty, setQty] = React.useState(1); React.useEffect(() => { setQty(1); }, [product && product.id]); React.useEffect(() => { const onKey = e => { if (e.key === "Escape") onClose(); }; document.addEventListener("keydown", onKey); return () => document.removeEventListener("keydown", onKey); }, [onClose]); const open = !!product; const p = product || {}; const soldOut = p.stock === "out"; return /*#__PURE__*/React.createElement("div", { className: "vn-qv", "data-open": open, onClick: e => { if (e.target === e.currentTarget) onClose(); } }, /*#__PURE__*/React.createElement("div", { className: "vn-qv__panel", role: "dialog", "aria-modal": "true", "aria-label": p.name }, /*#__PURE__*/React.createElement("button", { className: "vn-qv__close", onClick: onClose, "aria-label": "Zav\u0159\xEDt n\xE1hled" }, /*#__PURE__*/React.createElement(Icon, { name: "close", size: 20 })), open && /*#__PURE__*/React.createElement("div", { className: "vn-qv__grid" }, /*#__PURE__*/React.createElement("div", { className: "vn-qv__media" }, /*#__PURE__*/React.createElement(Photo, { src: p.image, ratio: "1 / 1", alt: p.name, label: "Foto · " + p.weight })), /*#__PURE__*/React.createElement("div", { className: "vn-qv__info" }, p.region && /*#__PURE__*/React.createElement(Tag, { icon: /*#__PURE__*/React.createElement(Icon, { name: "pin", size: 14 }) }, p.region), /*#__PURE__*/React.createElement("h3", { className: "vn-qv__name" }, p.name), /*#__PURE__*/React.createElement("div", { className: "vn-qv__rrow" }, window.VNStock && /*#__PURE__*/React.createElement(window.VNStock, { status: p.stock || "in" })), p.taste && /*#__PURE__*/React.createElement("p", { className: "vn-qv__taste" }, p.taste), window.VNTasteProfile && p.profile && (p.profile.color > 0 || p.profile.sweet > 0) && /*#__PURE__*/React.createElement(window.VNTasteProfile, { profile: p.profile }), /*#__PURE__*/React.createElement("p", { className: "vn-qv__desc" }, p.desc), /*#__PURE__*/React.createElement("div", { className: "vn-qv__price" }, /*#__PURE__*/React.createElement("b", null, p.variants && p.variants.length ? "od " + Math.min.apply(null, p.variants.map(v => v.price)) : p.price, " K\u010D"), /*#__PURE__*/React.createElement("span", null, "v\u010D. DPH", p.variants && p.variants.length ? "" : " · " + p.weight)), soldOut ? /*#__PURE__*/React.createElement(Button, { variant: "secondary", size: "lg", block: true, iconStart: /*#__PURE__*/React.createElement(Icon, { name: "mail", size: 18 }) }, "Upozornit, a\u017E naskladn\xEDme") : /*#__PURE__*/React.createElement("div", { className: "vn-qv__buy" }, /*#__PURE__*/React.createElement(QuantityStepper, { value: qty, onChange: setQty, max: 20 }), /*#__PURE__*/React.createElement(Button, { variant: "primary", size: "lg", onClick: () => { onAdd(p, qty); onClose(); }, iconStart: /*#__PURE__*/React.createElement(Icon, { name: "cart", size: 18 }), style: { flex: 1 } }, "Do ko\u0161\xEDku")), /*#__PURE__*/React.createElement("button", { className: "vn-qv__full", onClick: () => { onClose(); onOpenFull(p); } }, "Zobrazit cel\xFD detail ", /*#__PURE__*/React.createElement(Icon, { name: "arrowRight", size: 15 })))))); } window.VNQuickView = QuickView; })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/QuickView.jsx", error: String((e && e.message) || e) }); } // ui_kits/eshop/data.js try { (() => { // Shop data for the Včelařství Najman e-shop UI kit. Demo content only. // Photos use the curated set; product jars use the honeycomb placeholder. (function () { const P = window.VElaStvNajmanDesignSystem_bc3fc2 && window.VElaStvNajmanDesignSystem_bc3fc2.PHOTOS || {}; const products = [{ id: "kvetovy", name: "Květový med", region: "Louky u Hostivic", weight: "500 g", price: 169, rating: 4.8, reviews: 42, badge: null, cat: "kvetove", taste: "Jemný, květinový, středně sladký. Krásně zlatavá barva.", desc: "Snůška z jarních luk a sadů kolem Hostivic. Vyvážená, lahodná chuť, kterou si oblíbí celá rodina.", profile: { color: 2, intensity: 2, notes: ["květinový", "jemně sladký", "máslový"] }, stock: "in", prov: { harvest: "jaro – léto", bottled: "07/2025", lot: "L-2025-KV" }, variants: [{ w: "250 g", price: 99, stock: "in" }, { w: "500 g", price: 169, stock: "in" }, { w: "950 g", price: 289, stock: "in" }] }, { id: "lipovy", name: "Lipový med", region: "Lipové aleje", weight: "500 g", price: 189, rating: 4.9, reviews: 31, badge: { label: "Sezónní", tone: "green" }, cat: "kvetove", image: P.heroDipper, taste: "Výrazná lipová vůně, svěží mentolový tón v dochuti.", desc: "Stáčíme jen v době květu lip. Oblíbený při nachlazení a pro klidný spánek.", profile: { color: 2, intensity: 3, notes: ["lipový květ", "mentolový", "svěží"] }, stock: "low", prov: { harvest: "červen – červenec", bottled: "07/2025", lot: "L-2025-LP" }, variants: [{ w: "250 g", price: 109, stock: "in" }, { w: "500 g", price: 189, stock: "low" }, { w: "950 g", price: 319, stock: "low" }] }, { id: "pastovany", name: "Pastovaný květový med", region: "Sady a louky", weight: "500 g", price: 179, rating: 4.7, reviews: 26, badge: null, cat: "pastovany", taste: "Hebká, krémová konzistence, snadno roztíratelný.", desc: "Pomalu mícháme, dokud nezíská sametovou strukturu. Nekapaje z pečiva.", profile: { color: 2, intensity: 2, notes: ["krémový", "jemný", "máslový"] }, stock: "in", prov: { harvest: "jaro – léto", bottled: "07/2025", lot: "L-2025-PA" }, variants: [{ w: "250 g", price: 105, stock: "in" }, { w: "500 g", price: 179, stock: "in" }, { w: "950 g", price: 305, stock: "in" }] }, { id: "brdsky", name: "Brdský lesní med", region: "Brdské lesy", weight: "500 g", price: 219, rating: 5.0, reviews: 18, badge: { label: "Oblíbené", tone: "gold" }, cat: "lesni", taste: "Tmavý, sytý, sladově hořký. Tóny karamelu a lesa.", desc: "Medovicový med z brdských smrkových lesů. Bohatý na minerály, výrazná osobnost.", profile: { color: 5, intensity: 5, notes: ["karamel", "sladový", "lesní"] }, stock: "in", prov: { harvest: "léto", bottled: "07/2025", lot: "L-2025-BR" }, variants: [{ w: "250 g", price: 125, stock: "in" }, { w: "500 g", price: 219, stock: "in" }, { w: "950 g", price: 379, stock: "in" }] }, { id: "krivoklatsky", name: "Křivoklátský lesní med", region: "Křivoklátsko — údolí Oty Pavla", weight: "500 g", price: 229, rating: 4.9, reviews: 14, badge: null, cat: "lesni", taste: "Lesní, pryskyřičný, dlouhá kořeněná dochuť.", desc: "Z chráněné krajinné oblasti Křivoklátsko. Med z míst, kde se psaly Zlatí úhoři.", profile: { color: 4, intensity: 4, notes: ["pryskyřice", "kořeněný", "lesní"] }, stock: "low", prov: { harvest: "léto", bottled: "07/2025", lot: "L-2025-KR" }, variants: [{ w: "250 g", price: 129, stock: "in" }, { w: "500 g", price: 229, stock: "low" }, { w: "950 g", price: 395, stock: "out" }] }, { id: "medovina", name: "Medovina klasická", region: "Z našeho medu", weight: "0,5 l", price: 249, rating: 4.8, reviews: 22, badge: null, cat: "medovina", taste: "Sladká, hřejivá, plná. 13 % obj.", desc: "Kvašená z vlastního květového medu podle rodinné receptury. Podávejte mírně ohřátou.", profile: { sweet: 5, notes: ["sladká", "hřejivá", "plná"] }, stock: "in", prov: { harvest: "kvašeno z medu", bottled: "07/2025", lot: "L-2025-ME" } }, { id: "medovina-horka", name: "Medovina hořká", region: "Z našeho medu", weight: "0,5 l", price: 269, rating: 4.7, reviews: 9, badge: { label: "Novinka", tone: "gold" }, cat: "medovina", taste: "Polosuchá, s bylinnou hořkostí. 14 % obj.", desc: "Pro ty, kdo mají rádi medovinu méně sladkou. Dobře vychlazená je skvělým aperitivem.", profile: { sweet: 2, notes: ["polosuchá", "bylinná", "hořčejší"] }, stock: "in", prov: { harvest: "kvašeno z medu", bottled: "07/2025", lot: "L-2025-MH" } }, { id: "propolis", name: "Propolisová mast", region: "Z našeho úlu", weight: "30 ml", price: 149, rating: 4.9, reviews: 37, badge: null, cat: "propolis", taste: null, desc: "Mast z propolisu a včelího vosku. Na drobné ranky, popraskanou kůži a opruzeniny.", stock: "out", restock: "srpen 2026", latest: "30. 9. 2026", prov: { harvest: "z úlu", bottled: "07/2025", lot: "L-2025-PR" } }, { id: "balzam", name: "Medový balzám na rty", region: "Z našeho úlu", weight: "5 g", price: 99, rating: 4.8, reviews: 28, badge: null, cat: "propolis", taste: null, desc: "Včelí vosk, med a olej. Hřejivá péče o rty po celý rok.", stock: "out", prov: { harvest: "z úlu", bottled: "07/2025", lot: "L-2025-BA" } }, { id: "darek-vcelnice", name: "Dárkový balíček „Z naší včelnice“", region: "Dárkový balíček", weight: "4 ks", price: 649, oldPrice: 715, rating: 5.0, reviews: 16, badge: { label: "Oblíbené", tone: "gold" }, cat: "gift", taste: null, desc: "Květový med, brdský tmavý med, medovina klasická a balzám na rty — vše v dřevěné krabičce s ručně psanou kartičkou.", stock: "in", prov: { harvest: "set", bottled: "07/2025", lot: "L-2025-DK" } }]; const categories = [{ id: "lesni", name: "Lesní medy", count: 2, ratio: "3 / 4", image: P.forest, blurb: "Tmavé medovicové medy z Brd a Křivoklátska." }, { id: "kvetove", name: "Květové medy", count: 2, ratio: "4 / 5", image: P.beeFlower, blurb: "Jarní snůška z luk a sadů." }, { id: "pastovany", name: "Pastovaný med", count: 1, ratio: "4 / 5", image: P.jarGlow, blurb: "Krémový, sametový, roztíratelný." }, { id: "medovina", name: "Medovina", count: 2, ratio: "3 / 4", image: null, blurb: "Kvašená z našeho vlastního medu." }, { id: "propolis", name: "Vosk a propolis", count: 2, ratio: "4 / 5", image: null, blurb: "Přírodní péče z úlu — propolis, vosk a balzámy." }]; const benefits = [{ icon: "bee", title: "Vlastní chov včel", text: "Včely si sami chováme a šlechtíme." }, { icon: "pin", title: "Med z konkrétních oblastí", text: "Lipové aleje, Brdy, Křivoklátsko." }, { icon: "truck", title: "Rozvoz zdarma v okolí", text: "Hostivice a okolí od 4 ks." }, { icon: "door", title: "Odběr ze dvora", text: "Na Samotě 1029, Hostivice." }]; const blogCats = [{ id: "tajemstvi", label: "Tajemství výroby" }, { id: "recepty", label: "Recepty z kuchyně" }, { id: "zdravi", label: "Med pro zdraví" }, { id: "vcelstvi", label: "Včely a příroda" }, { id: "zvcelnice", label: "Z včelnice" }]; const posts = [ // ── Tajemství výroby ────────────────────────────────────────── { id: "krystalizace", cat: "tajemstvi", title: "Proč med krystalizuje", date: "12. dubna 2025", tag: "Tajemství výroby", read: "4 min", excerpt: "Zkrystalizovaný med není zkažený — naopak je to známka pravosti. Vysvětlíme proč a jak ho znovu zkapalnit." }, { id: "druhy-medu", cat: "tajemstvi", title: "Jak se liší jednotlivé druhy medu", date: "2. dubna 2025", tag: "Tajemství výroby", read: "6 min", image: P.beeFlower, excerpt: "Lipový, lesní, řepkový nebo pastovaný? Každý med má jiný charakter, chuť i složení. Průvodce světem včelího zlata." }, { id: "kvalita-lab", cat: "tajemstvi", title: "Jak poznáme kvalitu medu v laboratoři", date: "22. března 2025", tag: "Tajemství výroby", read: "5 min", excerpt: "Za každou naší šarží stojí analýza HMF, vlhkosti i pylu. Jak funguje laboratorní kontrola a proč je důležitá." }, { id: "staceni-medu", cat: "tajemstvi", title: "Stáčení medu: od úlu ke sklenici", date: "10. března 2025", tag: "Tajemství výroby", read: "5 min", image: P.jarGlow, excerpt: "Ráno v úlu, odpoledne ve sklenici. Jak probíhá celý proces stáčení, aby med zachoval všechny své vlastnosti." }, { id: "pastovany-vznik", cat: "tajemstvi", title: "Pastovaný med: jak vzniká sametová konzistence", date: "25. února 2025", tag: "Tajemství výroby", read: "4 min", excerpt: "Krémová textura není výsledek náhody, ale řízené krystalizace. Vysvětlíme, jak pastování funguje." }, { id: "med-a-teplo", cat: "tajemstvi", title: "Med a teplo: proč ho nikdy nepřihříváme", date: "14. února 2025", tag: "Tajemství výroby", read: "3 min", image: P.heroDipper, excerpt: "Nad 40 °C med ztrácí enzymy, vůni i prospěšné látky. Přesně proto u nás stáčíme za studena." }, { id: "sarze-puvod", cat: "tajemstvi", title: "Průhlednost jako záruka: šarže a původ", date: "3. února 2025", tag: "Tajemství výroby", read: "4 min", excerpt: "Na každé sklenici najdete číslo šarže. Co za ním stojí a proč je pro nás sledovatelnost základní hodnota." }, { id: "med-vlhkost", cat: "tajemstvi", title: "Vlhkost medu: malé číslo s velkým dopadem", date: "22. ledna 2025", tag: "Tajemství výroby", read: "3 min", excerpt: "Med s příliš vysokou vlhkostí začne kvasit. Jak refraktometrem měříme správnou zralost před stáčením." }, // ── Recepty z kuchyně ──────────────────────────────────────── { id: "medovnik", cat: "recepty", title: "Medovník podle babičky", date: "9. března 2025", tag: "Recepty", read: "8 min", excerpt: "Vláčný medový dort, který zvládnete i bez cukrářské praxe. S naším květovým medem." }, { id: "lemonada-lav", cat: "recepty", title: "Medová limonáda s levandulí", date: "28. února 2025", tag: "Recepty", read: "3 min", image: P.jarGlow, excerpt: "Osvěžující nápoj na horkéé dny. Lipový med, citron a sušená levandule — jednoduchá elegance." }, { id: "zebra-lesni", cat: "recepty", title: "Pečená žebra s lesním medem a hořčicí", date: "17. února 2025", tag: "Recepty", read: "6 min", excerpt: "Brdský tmavý med dá žebrům hlubokou karamelovou kůrku. Recept, který zopakujete každý víkend." }, { id: "ovesna-kase", cat: "recepty", title: "Ovesná kaše s pastovaným medem a ořechy", date: "5. února 2025", tag: "Recepty", read: "4 min", image: P.beeFlower, excerpt: "Snídaně, která zasytí a potěší. Krémový pastovaný med se do teplé kaše rozplyne dokonale." }, { id: "medovy-pernik", cat: "recepty", title: "Medový perník na Vánoce", date: "20. listopadu 2024", tag: "Recepty", read: "7 min", excerpt: "Tradiční recept s moderní přípravou. Voní celým domem a vydrží týdny — pokud ho stihnete schovat." }, { id: "medovina-doma", cat: "recepty", title: "Domácí medovina krok za krokem", date: "4. listopadu 2024", tag: "Recepty", read: "9 min", image: P.heroDipper, excerpt: "Kvasit si doma medovinu není složité. Potřebujete dobrý med, trpělivost a pár základních pomůcek." }, { id: "syr-tymian", cat: "recepty", title: "Marinovaný sýr s tymiánem a medem", date: "21. října 2024", tag: "Recepty", read: "3 min", excerpt: "Rychlá lahůdka na prkýnko. Kozí sýr, čerstvý tymián a lžička lesního medu — hotovo za deset minut." }, // ── Med pro zdraví ─────────────────────────────────────────── { id: "med-antibio", cat: "zdravi", title: "Med jako přírodní antibiotikum: co je pravda", date: "6. dubna 2025", tag: "Med pro zdraví", read: "6 min", image: P.beeFlower, excerpt: "Manuka, peroxid a defensiny. Podíváme se, co věda skutečně říká o antibakteriálních účincích medu." }, { id: "med-nachladeni", cat: "zdravi", title: "Jak med pomáhá při nachlazení a kašli", date: "18. března 2025", tag: "Med pro zdraví", read: "5 min", excerpt: "Teplý čaj s lipovým medem není pouhý mýtus — WHO ho doporučuje pro uklidnění kašle u dětí." }, { id: "med-spanek", cat: "zdravi", title: "Med a spánek: stará babská rada, která funguje", date: "2. března 2025", tag: "Med pro zdraví", read: "4 min", image: P.jarGlow, excerpt: "Lžička medu před spaním může pomoci s usínáním. Jak funguje mechanismus a komu nejvíc prospívá." }, { id: "lzicka-denne", cat: "zdravi", title: "Denní lžička medu: návyk, který stojí za to", date: "16. února 2025", tag: "Med pro zdraví", read: "3 min", excerpt: "Nejde o zázrak ani o dietu. Jde o konzistentní příjem antioxidantů a enzymů — a o radost z dobrého jídla." }, { id: "med-kosmetika", cat: "zdravi", title: "Med v kosmetice: masky a peelingy doma", date: "30. ledna 2025", tag: "Med pro zdraví", read: "5 min", excerpt: "Přirozené zvlhčovadlo, antimikrobiální ochrana a jemný peeling v jednom. Recepty, které vyzkoušíte hned." }, { id: "komu-nevhodi", cat: "zdravi", title: "Pro koho med není vhodný", date: "12. ledna 2025", tag: "Med pro zdraví", read: "4 min", image: P.heroDipper, excerpt: "Děti do jednoho roku, cukrovka, alergie na pyl. Kdy je třeba opatrnosti a co říkají lékaři." }, // ── Včely a příroda ────────────────────────────────────────── { id: "rok-vcelare", cat: "vcelstvi", title: "Jak probíhá rok včelaře v Hostivicích", date: "7. dubna 2025", tag: "Včely a příroda", read: "7 min", image: P.beeFlower, excerpt: "Od jarního probuzení po zimní přípravu úlů. Dvanáct měsíců v rytmu přírody a příběh každé sklenice." }, { id: "vce-mizi", cat: "vcelstvi", title: "Proč včely mizí a co s tím dělat", date: "24. března 2025", tag: "Včely a příroda", read: "8 min", excerpt: "Varroáza, pesticidy, úbytek potravní nabídky. Co ohrožuje naše opylovače a jak tomu čelit v praxi." }, { id: "lipy-hloh", cat: "vcelstvi", title: "Proč sázíme lípy a hloh", date: "11. března 2025", tag: "Včely a příroda", read: "5 min", image: P.forest, excerpt: "Každý rok přidáváme nové stromy a keře do krajiny kolem Hostivic. Záměr je jasný: více pylu pro včely." }, { id: "chov-jinak", cat: "vcelstvi", title: "Náš chov: co děláme jinak než průmysl", date: "27. února 2025", tag: "Včely a příroda", read: "6 min", excerpt: "Žádné přikrmování umělými cukry, žádné tlačení na stáčení nezralého medu. Filosofie, o které nelze dělat kompromisy." }, { id: "vcelnice-kraj", cat: "vcelstvi", title: "Včelnice jako součást středočeské krajiny", date: "10. února 2025", tag: "Včely a příroda", read: "5 min", image: P.forest, excerpt: "Naše úly nestojí v monokultuře. Stojí tam, kde krajina skutečně žije — a to se projeví v chuti." }, { id: "zdravi-vcel", cat: "vcelstvi", title: "Šetrné léčení: jak pečujeme o zdraví včel", date: "28. ledna 2025", tag: "Včely a příroda", read: "5 min", excerpt: "Kyselina šťavelová namísto syntetiky, pravidelné kontroly, přirozená selekce. Jak přistupujeme k veterinární péči." }, { id: "med-krajina", cat: "vcelstvi", title: "Jak se příroda odráží v chuti medu", date: "15. ledna 2025", tag: "Včely a příroda", read: "6 min", image: P.beeFlower, excerpt: "Terroir neexistuje jen u vína. Brdský les ochutnáte v tmavém medu stejně jasně jako louka v létovém." }, // ── Z včelnice ─────────────────────────────────────────────── { id: "pravy-med", cat: "zvcelnice", title: "Jak poznat pravý med", date: "28. března 2025", tag: "Z včelnice", read: "6 min", image: P.beeFlower, excerpt: "Pět jednoduchých zkoušek, kterými doma odlišíte poctivý med od pancovaného." }, { id: "jaro-vcelnice", cat: "zvcelnice", title: "Jaro na včelnici: první výlet včel", date: "14. března 2025", tag: "Z včelnice", read: "5 min", excerpt: "Kdy včely poprvé vyletí, co hledají a jak poznáme, že přežily zimu v pořádku. Zápisky z první jarní prohlídky." }, { id: "sklizen-2025", cat: "zvcelnice", title: "Sklizeň 2025: co nám letošní léto přineslo", date: "1. září 2025", tag: "Z včelnice", read: "6 min", image: P.jarGlow, excerpt: "Teplejší jaro, suchý červen, bohatá medovicová snůška v srpnu. Bilance letošní sezóny — upřímně." }, { id: "pribeh-rodiny", cat: "zvcelnice", title: "Jak jsme začínali: příběh rodiny Najmanových", date: "18. února 2025", tag: "Z včelnice", read: "7 min", image: P.forest, excerpt: "Tři úly v zahradě, jeden sen a spousta chyb. Odkud se vzal tenhle projekt a co nás drží při životě." }, { id: "den-na-farme", cat: "zvcelnice", title: "Den na farmě od rána do večera", date: "5. února 2025", tag: "Z včelnice", read: "5 min", excerpt: "Co se děje za branou Na Samotě 1029? Hodina po hodině — s kafem, dešťovkou i dvěma opíchnutíma." }, { id: "mista-okoli", cat: "zvcelnice", title: "Naše oblíbená místa v okolí Hostivic", date: "22. ledna 2025", tag: "Z včelnice", read: "4 min", image: P.beeFlower, excerpt: "Trasy kolem úlů, lipové aleje a místa, odkud pocházejí naše nejoblíbenější snůšky." }]; const reviews = [{ name: "Petra K.", place: "Praha 6", rating: 5, text: "Lipový med je naprostá paráda, voní po celém bytě. A rozvoz až domů je k nezaplacení." }, { name: "Martin D.", place: "Hostivice", rating: 5, text: "Beru ze dvora už třetí rok. Brdský tmavý je můj favorit, na trhu nic podobného nenajdete." }, { name: "Jana V.", place: "Rudná", rating: 5, text: "Darovala jsem balíček s medovinou tchánovi a měla jsem hned u rodiny vyhráno." }, { name: "Tomáš R.", place: "Praha 5", rating: 4, text: "Pastovaný med skvěle drží na pečivu, děti si ho mažou samy. Příště beru víc." }]; const gift = { name: "Dárkový balíček „Z naší včelnice“", items: "Květový med · Brdský tmavý med · Medovina klasická · Balzám na rty", price: 649, oldPrice: 715 }; // ---- Klientská sekce „Můj účet" — demo obsah (napojí se na WooCommerce) ---- const account = { user: { firstName: "Anna", lastName: "Nováková", email: "anna.novakova@email.cz", phone: "+420 605 214 360", newsletter: true }, addresses: { shipping: { name: "Anna Nováková", street: "Lipová 412/7", city: "Hostivice", zip: "253 01", country: "Česká republika" }, billing: { name: "Anna Nováková", street: "Lipová 412/7", city: "Hostivice", zip: "253 01", country: "Česká republika" } }, orders: [{ number: "2026-0142", date: "4. června 2026", status: "delivered", total: 657, items: [{ id: "darek-vcelnice", qty: 1 }] }, { number: "2026-0098", date: "12. května 2026", status: "shipped", total: 358, items: [{ id: "lipovy", qty: 1 }, { id: "kvetovy", qty: 1 }] }, { number: "2026-0061", date: "28. dubna 2026", status: "received", total: 219, items: [{ id: "brdsky", qty: 1 }] }], preorders: [{ id: "lipovy", name: "Lipový med 2026", weight: "500 g", status: "preparing", restock: "červenec 2026", note: "Stáčíme až v době květu lip — dáme vám vědět." }, { id: "medovina-horka", name: "Medovina hořká", weight: "0,5 l", status: "fermenting", restock: "září 2026", note: "Právě kvasí. Naskladníme po dozrání." }], favorites: ["lipovy", "brdsky", "medovina"], watches: [{ id: "propolis", name: "Propolisová mast", weight: "30 ml", restock: "srpen 2026" }, { id: "balzam", name: "Medový balzám na rty", weight: "5 g", restock: null }], paymentMethods: [{ id: "pm1", brand: "Visa", last4: "4242", exp: "06/27" }, { id: "pm2", brand: "Mastercard", last4: "8819", exp: "11/26" }], supportedMethods: [{ label: "Platba kartou", icon: "creditCard" }, { label: "Apple Pay", icon: "smartphone" }, { label: "Google Pay", icon: "smartphone" }, { label: "GoPay", icon: "wallet" }, { label: "Dobírka", icon: "truck" }, { label: "Bankovní převod", icon: "bank" }] }; window.SHOP_DATA = { products, categories, benefits, blogCats, posts, reviews, gift, account }; })(); })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/eshop/data.js", error: String((e && e.message) || e) }); } __ds_ns.PHOTOS = __ds_scope.PHOTOS; __ds_ns.CategoryTile = __ds_scope.CategoryTile; __ds_ns.ProductCard = __ds_scope.ProductCard; __ds_ns.Badge = __ds_scope.Badge; __ds_ns.Button = __ds_scope.Button; __ds_ns.IconButton = __ds_scope.IconButton; __ds_ns.QuantityStepper = __ds_scope.QuantityStepper; __ds_ns.Rating = __ds_scope.Rating; __ds_ns.Tag = __ds_scope.Tag; __ds_ns.Input = __ds_scope.Input; __ds_ns.Select = __ds_scope.Select; __ds_ns.Photo = __ds_scope.Photo; __ds_ns.SectionHeading = __ds_scope.SectionHeading; })();