{"id":1107,"date":"2026-09-17T18:04:08","date_gmt":"2026-09-17T18:04:08","guid":{"rendered":"https:\/\/czechpeptide.com\/?page_id=1107"},"modified":"2026-09-18T13:09:15","modified_gmt":"2026-09-18T13:09:15","slug":"shopp","status":"publish","type":"page","link":"https:\/\/czechpeptide.com\/cz\/shopp\/","title":{"rendered":"Shopp"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Shop \u2014 Peptides<\/title>\n\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700;800&#038;display=swap\" rel=\"stylesheet\">\n<script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n\n<script>\ntailwind.config = {\n  theme: {\n    extend: {\n      fontFamily: { sans: ['Inter', 'sans-serif'] },\n      colors: {\n        brand: { DEFAULT: '#b142f5', hover: '#9a2ad9', light: '#f7ebff', border: '#d794f9' }\n      }\n    }\n  }\n}\n<\/script>\n\n<style>\n  body { background-color: #fcfcfd; color: #1f2937; font-family: 'Inter', sans-serif; }\n  .product-image-bg { background: radial-gradient(circle at center, #f7ebff 0%, #f3f4f6 70%); }\n  .card-hover { transition: box-shadow .2s ease, transform .2s ease, border-color .2s ease; }\n  .card-hover:hover { box-shadow: 0 10px 25px -8px rgba(177,66,245,0.25); border-color: #d794f9; transform: translateY(-2px); }\n<\/style>\n<\/head>\n<body class=\"antialiased min-h-screen pb-16\">\n\n<!-- HEADER -->\n<header class=\"border-b border-purple-100 bg-white\">\n  <div class=\"max-w-6xl mx-auto px-4 sm:px-6 py-5 flex flex-wrap items-center justify-between gap-3\">\n    <div>\n      <span class=\"text-[10px] sm:text-[11px] font-bold tracking-wider text-brand uppercase\">Research Peptides<\/span>\n      <h1 class=\"text-xl sm:text-2xl font-extrabold text-gray-900 leading-tight\">Shop<\/h1>\n    <\/div>\n\n    <div class=\"flex-1 min-w-[160px] max-w-sm order-3 sm:order-none\">\n      <label for=\"product-search\" class=\"sr-only\">Search products<\/label>\n      <div class=\"relative\">\n        <svg class=\"w-4 h-4 text-gray-400 absolute left-3 top-1\/2 -translate-y-1\/2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 21l-4.35-4.35M17 11a6 6 0 11-12 0 6 6 0 0112 0z\"><\/path><\/svg>\n        <input\n          type=\"text\"\n          id=\"product-search\"\n          oninput=\"renderGrid()\"\n          placeholder=\"    Search products by name\u2026\"\n          class=\"w-full pl-9 pr-3 py-2.5 text-xs sm:text-sm rounded-full border border-purple-200 bg-white shadow-sm focus:outline-none focus:ring-2 focus:ring-brand\/40 focus:border-brand transition-colors\"\n        >\n      <\/div>\n    <\/div>\n\n    <a href=\"https:\/\/czechpeptide.com\/cart\" class=\"flex items-center gap-1.5 sm:gap-2 text-[10px] sm:text-xs font-semibold text-gray-600 hover:text-brand transition-colors\">\n      <svg class=\"w-4 h-4 sm:w-5 sm:h-5 text-brand\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z\"><\/path><\/svg>\n      <span id=\"cart-count-label\">Cart (0)<\/span>\n    <\/a>\n  <\/div>\n<\/header>\n\n<main class=\"max-w-6xl mx-auto px-4 sm:px-6 py-8 sm:py-10\">\n\n  <!-- PRODUCT GRID -->\n  <div id=\"product-grid\" class=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-3 sm:gap-5\"><\/div>\n  <p id=\"no-results\" class=\"hidden text-center text-gray-500 text-xs sm:text-sm py-10\">No products match that search.<\/p>\n\n<\/main>\n\n<!-- Cart Modal -->\n<div id=\"cart-modal\" class=\"fixed inset-0 z-50 hidden bg-gray-900 bg-opacity-50 backdrop-blur-sm flex items-center justify-center p-4 transition-opacity\">\n  <div class=\"bg-white rounded-2xl border-2 border-brand p-6 max-w-sm w-full shadow-2xl transform scale-95 transition-transform\" id=\"cart-modal-content\">\n    <div class=\"flex items-center justify-center w-12 h-12 bg-green-100 rounded-full mb-4 mx-auto\">\n      <svg class=\"w-6 h-6 text-green-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"><\/path><\/svg>\n    <\/div>\n    <h2 class=\"text-xl font-extrabold text-center text-gray-900 mb-1\">Added to Cart!<\/h2>\n    <p class=\"text-center text-sm text-gray-500 mb-6\">\n      <span id=\"modal-qty-text\" class=\"font-bold text-brand\">1x<\/span> <span id=\"modal-name-text\">item<\/span> added.\n    <\/p>\n    <div class=\"flex flex-col gap-2.5\">\n      <button onclick=\"goToCart()\" class=\"w-full bg-brand hover:bg-brand-hover text-white font-bold py-3 rounded-full shadow-md transition-transform active:scale-95 text-sm\">Go to Cart<\/button>\n      <button onclick=\"closeModal()\" class=\"w-full bg-white border-2 border-brand text-brand hover:bg-brand-light font-bold py-2.5 rounded-full transition-colors text-sm\">Continue Shopping<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n\/*\n * ===================== PRODUCT CONFIG =====================\n * One entry per card in the grid. To swap in a real product later,\n * just edit its fields \u2014 nothing else in this file needs to change.\n *\n *   id       -> WooCommerce product ID (used for the live price lookup\n *               and for \"Add to cart\"; same-origin Store API assumed,\n *               see fetchAndRenderProducts()\/addToCart() below)\n *   name     -> product title shown on the card\n *   subtitle -> small eyebrow line above the name (e.g. dose\/format)\n *   price    -> fallback price in K\u010d, used until\/unless the live\n *               Store API price loads successfully\n *   image    -> product image URL\n *   url      -> \"View product\" destination\n *\n * Each entry below now points at its own real product (id, name,\n * image, and view-product URL taken from that product's own page).\n * ============================================================\n *\/\nconst PRODUCTS = [\n  { id: 404, name: 'GHK-Cu 50mg', subtitle: 'Peptide Blend', price: 799, image: 'https:\/\/czechpeptide.com\/wp-content\/uploads\/2026\/04\/ghkcu.png', url: 'https:\/\/czechpeptide.com\/ghk-cu50mg' },\n  { id: 100, name: 'BPC-157 \/ TB500 5\/5mg', subtitle: 'Peptide Blend', price: 899, image: 'https:\/\/czechpeptide.com\/wp-content\/uploads\/2026\/03\/Bpc157_tb500_5mg_5mg_1997067883.jpeg', url: 'https:\/\/czechpeptide.com\/bpc157tb500' },\n  { id: 102, name: 'CJC-1295 + Ipamorelin 5\/5mg', subtitle: 'Peptide Blend', price: 899, image: 'https:\/\/czechpeptide.com\/wp-content\/uploads\/2026\/03\/Cjc1295_ipamorelin_batch_004_c95efa3893.jpeg', url: 'https:\/\/czechpeptide.com\/ipamorelin-cjc' },\n  { id: 428, name: 'Melanotan II 10mg', subtitle: 'Peptide Blend', price: 749, image: 'https:\/\/czechpeptide.com\/wp-content\/uploads\/2026\/04\/Mt2_10mg_batch_004_a5c51c4d9d.jpeg', url: 'https:\/\/czechpeptide.com\/melanotan2' },\n  { id: 328, name: 'Selank 5mg', subtitle: 'Peptide Blend', price: 699, image: 'https:\/\/czechpeptide.com\/wp-content\/uploads\/2026\/09\/selankspray-e1789245402393.jpeg', url: 'https:\/\/czechpeptide.com\/selank' },\n  { id: 432, name: 'Retatrutide GLP-3 15mg', subtitle: 'Peptide Blend', price: 999, image: 'https:\/\/czechpeptide.com\/wp-content\/uploads\/2026\/04\/retatrutide15mg.png', url: 'https:\/\/czechpeptide.com\/retatrutide-2' },\n  { id: 326, name: 'Semax 5mg', subtitle: 'Peptide Blend', price: 679, image: 'https:\/\/czechpeptide.com\/wp-content\/uploads\/2026\/09\/semaxspray-e1789245335225.jpeg', url: 'https:\/\/czechpeptide.com\/semax' },\n  { id: 542, name: 'Bacteriostatic Water 3ml', subtitle: 'Laboratory Solvent', price: 99, image: 'https:\/\/czechpeptide.com\/wp-content\/uploads\/2026\/08\/bacteriostatic-scaled.png', url: 'https:\/\/czechpeptide.com\/bacteriostatic-water' }\n];\n\nlet cartCount = 0;\nlet cartNonce = null;\n\nfunction formatPrice(price) { return price.toLocaleString('cs-CZ'); }\n\nfunction productCardHTML(p, index) {\n  return `\n    <div class=\"bg-white border border-purple-200 rounded-xl sm:rounded-2xl shadow-sm card-hover flex flex-col overflow-hidden\">\n      <a href=\"${p.url}\" class=\"product-image-bg flex items-center justify-center h-28 sm:h-44 p-3\">\n        <img decoding=\"async\" src=\"${p.image}\" alt=\"${p.name}\" class=\"max-w-[85%] max-h-[85%] object-contain mix-blend-multiply\">\n      <\/a>\n      <div class=\"flex flex-col flex-1 p-2.5 sm:p-4 gap-1 sm:gap-2\">\n        <span class=\"text-[8px] sm:text-[10px] font-bold tracking-wider text-brand uppercase\">${p.subtitle}<\/span>\n        <a href=\"${p.url}\" class=\"font-extrabold text-gray-900 text-[11px] sm:text-sm leading-tight hover:text-brand transition-colors\">${p.name}<\/a>\n        <div class=\"flex items-center gap-1 mt-0.5\">\n          <span class=\"w-1.5 h-1.5 rounded-full bg-green-500\"><\/span>\n          <span class=\"text-[8px] sm:text-[10px] font-bold text-green-600\">In stock<\/span>\n        <\/div>\n        <div class=\"flex-1\"><\/div>\n        <span class=\"font-extrabold text-gray-900 text-xs sm:text-base\" id=\"price-${index}\">${formatPrice(p.price)} K\u010d<\/span>\n        <div class=\"flex flex-col gap-1.5 mt-1\">\n          <button onclick=\"addToCart(${index})\" id=\"atc-btn-${index}\" class=\"bg-brand hover:bg-brand-hover text-white font-bold py-2 rounded-full shadow-sm transition-transform active:scale-[0.98] text-[10px] sm:text-xs disabled:opacity-50 disabled:cursor-not-allowed\">\n            Add to cart\n          <\/button>\n          <a href=\"${p.url}\" class=\"text-center border border-purple-200 text-brand hover:bg-brand-light font-bold py-2 rounded-full transition-colors text-[10px] sm:text-xs\">\n            View product\n          <\/a>\n        <\/div>\n      <\/div>\n    <\/div>`;\n}\n\nfunction renderGrid() {\n  const grid = document.getElementById('product-grid');\n  const noResults = document.getElementById('no-results');\n  const query = (document.getElementById('product-search').value || '').trim().toLowerCase();\n\n  \/\/ Filter by product name, but keep each card's original PRODUCTS\n  \/\/ index (not its position in the filtered list) so price lookups\n  \/\/ and \"Add to cart\" keep pointing at the right product.\n  const visible = PRODUCTS\n    .map((p, i) => ({ p, i }))\n    .filter(({ p }) => !query || p.name.toLowerCase().includes(query));\n\n  grid.innerHTML = visible.map(({ p, i }) => productCardHTML(p, i)).join('');\n  noResults.classList.toggle('hidden', visible.length > 0);\n\n  \/\/ Prices come from the live Store API lookup, so re-apply anything\n  \/\/ already fetched onto the freshly rendered cards.\n  applyFetchedPrices();\n}\n\n\/*\n * Live price\/stock lookup, same approach\/assumptions as the individual\n * product page: relative same-origin call to WooCommerce's built-in\n * Store API. Falls back to the hardcoded PRODUCTS[i].price on any error.\n *\n * Results are cached by original PRODUCTS index in fetchedInfo, then\n * applyFetchedPrices() paints them onto whichever cards are currently\n * rendered \u2014 this way search filtering (which re-renders the grid)\n * never loses prices that already loaded.\n *\/\nconst fetchedInfo = {};\n\nfunction applyFetchedPrices() {\n  Object.entries(fetchedInfo).forEach(([i, info]) => {\n    const priceEl = document.getElementById('price-' + i);\n    if (priceEl && info.price != null) priceEl.innerText = formatPrice(info.price) + ' K\u010d';\n    const btn = document.getElementById('atc-btn-' + i);\n    if (btn && info.outOfStock) btn.disabled = true;\n  });\n}\n\nasync function fetchAndRenderProducts() {\n  await Promise.all(PRODUCTS.map(async (p, i) => {\n    try {\n      const res = await fetch('\/wp-json\/wc\/store\/v1\/products\/' + p.id, { headers: { 'Accept': 'application\/json' } });\n      if (!res.ok) throw new Error('HTTP ' + res.status);\n      const data = await res.json();\n      if (data && data.prices && data.prices.price) {\n        const minorUnit = data.prices.currency_minor_unit ?? 2;\n        const fetched = parseInt(data.prices.price, 10) \/ Math.pow(10, minorUnit);\n        if (Number.isFinite(fetched) && fetched > 0) {\n          fetchedInfo[i] = { ...fetchedInfo[i], price: fetched };\n        }\n      }\n      if (data.is_in_stock === false) fetchedInfo[i] = { ...fetchedInfo[i], outOfStock: true };\n      applyFetchedPrices();\n    } catch (err) {\n      console.warn('Could not fetch live price for product', p.id, '- using fallback. Reason:', err);\n    }\n  }));\n}\n\nasync function ensureCartSession(forceRefresh) {\n  if (cartNonce && !forceRefresh) return;\n  const res = await fetch('\/wp-json\/wc\/store\/v1\/cart', { method: 'GET', credentials: 'same-origin', headers: { 'Accept': 'application\/json' } });\n  if (!res.ok) throw new Error('Could not start a cart session (HTTP ' + res.status + ')');\n  cartNonce = res.headers.get('Nonce') || res.headers.get('X-WC-Store-API-Nonce');\n  if (!cartNonce) console.warn('No Store API nonce header received \u2014 add-to-cart may fail and fall back to the classic method.');\n}\n\nasync function storeApiAddItem(id, quantity) {\n  await ensureCartSession(false);\n  const buildHeaders = () => {\n    const headers = { 'Content-Type': 'application\/json', 'Accept': 'application\/json' };\n    if (cartNonce) { headers['Nonce'] = cartNonce; headers['X-WC-Store-API-Nonce'] = cartNonce; }\n    return headers;\n  };\n  let res = await fetch('\/wp-json\/wc\/store\/v1\/cart\/add-item', { method: 'POST', credentials: 'same-origin', headers: buildHeaders(), body: JSON.stringify({ id, quantity }) });\n  if (res.status === 403) {\n    await ensureCartSession(true);\n    res = await fetch('\/wp-json\/wc\/store\/v1\/cart\/add-item', { method: 'POST', credentials: 'same-origin', headers: buildHeaders(), body: JSON.stringify({ id, quantity }) });\n  }\n  if (!res.ok) {\n    const errBody = await res.json().catch(() => null);\n    throw new Error((errBody && errBody.message) || ('Add to cart failed (HTTP ' + res.status + ')'));\n  }\n  return res.json();\n}\n\nfunction classicAddToCartFallback(id, quantity) {\n  window.location.href = '\/?add-to-cart=' + encodeURIComponent(id) + '&quantity=' + encodeURIComponent(quantity);\n}\n\nasync function addToCart(index) {\n  const p = PRODUCTS[index];\n  const btn = document.getElementById('atc-btn-' + index);\n  const originalText = btn.innerText;\n  btn.innerText = 'Adding\u2026';\n  btn.disabled = true;\n\n  try {\n    await storeApiAddItem(p.id, 1);\n    cartCount += 1;\n    document.getElementById('cart-count-label').innerText = 'Cart (' + cartCount + ')';\n    document.getElementById('modal-qty-text').innerText = '1x';\n    document.getElementById('modal-name-text').innerText = p.name;\n    const modal = document.getElementById('cart-modal');\n    const modalContent = document.getElementById('cart-modal-content');\n    modal.classList.remove('hidden');\n    setTimeout(() => { modalContent.classList.remove('scale-95'); modalContent.classList.add('scale-100'); }, 10);\n    btn.innerText = originalText;\n    btn.disabled = false;\n  } catch (err) {\n    console.error('Store API add-to-cart failed, falling back to classic add-to-cart link:', err);\n    classicAddToCartFallback(p.id, 1);\n  }\n}\n\nfunction closeModal() {\n  const modal = document.getElementById('cart-modal');\n  const modalContent = document.getElementById('cart-modal-content');\n  modalContent.classList.remove('scale-100');\n  modalContent.classList.add('scale-95');\n  setTimeout(() => { modal.classList.add('hidden'); }, 150);\n}\n\nfunction goToCart() { window.location.href = 'https:\/\/czechpeptide.com\/cart'; }\n\nrenderGrid();\nfetchAndRenderProducts();\n<\/script>\n\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Shop \u2014 Peptides Research Peptides Shop Search products Cart (0) No products match that search. Added to Cart! 1x item [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-1107","page","type-page","status-publish","hentry"],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"rttpg_featured_image_url":null,"rttpg_author":{"display_name":"Wiki","author_link":"https:\/\/czechpeptide.com\/cz\/author\/lukaskuppens\/"},"rttpg_comment":0,"rttpg_category":null,"rttpg_excerpt":"Shop \u2014 Peptides Research Peptides Shop Search products Cart (0) No products match that search. Added to Cart! 1x item [&hellip;]","_links":{"self":[{"href":"https:\/\/czechpeptide.com\/cz\/wp-json\/wp\/v2\/pages\/1107","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/czechpeptide.com\/cz\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/czechpeptide.com\/cz\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/czechpeptide.com\/cz\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/czechpeptide.com\/cz\/wp-json\/wp\/v2\/comments?post=1107"}],"version-history":[{"count":38,"href":"https:\/\/czechpeptide.com\/cz\/wp-json\/wp\/v2\/pages\/1107\/revisions"}],"predecessor-version":[{"id":1164,"href":"https:\/\/czechpeptide.com\/cz\/wp-json\/wp\/v2\/pages\/1107\/revisions\/1164"}],"wp:attachment":[{"href":"https:\/\/czechpeptide.com\/cz\/wp-json\/wp\/v2\/media?parent=1107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}