{"product_id":"bikini-dual-head-shaver","title":"Bikini Dual Head Shaver","description":"\u003cp\u003eSmooth Painless Shave\u003c\/p\u003e\n\u003cp\u003eSafe for Bikini and Underarm\u003c\/p\u003e\n\u003cp\u003eRechargeable \u0026amp; Cordless\u003c\/p\u003e\n\u003cp\u003eCompact, Travel Friendly\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0738\/9485\/4793\/files\/WhatsApp_Image_2026-03-20_at_3.17.43_AM.jpg?v=1773961896\" alt=\"\"\u003e\u003c\/p\u003e\n\n\n\u003cstyle\u003e\n  #vc-wrap {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 16px;\n    padding: 24px 0;\n    font-family: inherit;\n    width: 100%;\n    box-sizing: border-box;\n  }\n\n  #vc-viewport {\n    overflow: hidden;\n    width: 100%;\n    box-sizing: border-box;\n  }\n\n  #vc-track {\n    display: flex;\n    gap: 12px;\n    transition: transform 0.55s cubic-bezier(0.77, 0, 0.18, 1);\n    will-change: transform;\n  }\n\n  .vc-card {\n    \/* Width set dynamically by JS *\/\n    flex-shrink: 0;\n    border-radius: 16px;\n    overflow: hidden;\n    position: relative;\n    background: #111;\n    \/* Aspect ratio 9:16 for vertical videos — adjusts height automatically *\/\n    aspect-ratio: 9 \/ 16;\n  }\n\n  .vc-card video {\n    width: 100%;\n    height: 100%;\n    \/* contain = no zoom\/crop, whole video visible *\/\n    object-fit: contain;\n    display: block;\n    background: #000;\n  }\n\n  .vc-placeholder {\n    position: absolute;\n    inset: 0;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    gap: 12px;\n    background: #1a1a1a;\n    color: #555;\n    font-size: 13px;\n    letter-spacing: 0.1em;\n    text-transform: uppercase;\n  }\n\n  .vc-placeholder svg {\n    width: 48px;\n    height: 48px;\n    fill: #333;\n  }\n\n  \/* Controls *\/\n  #vc-controls {\n    display: flex;\n    align-items: center;\n    gap: 16px;\n    margin-top: 4px;\n  }\n\n  .vc-btn {\n    width: 44px;\n    height: 44px;\n    border-radius: 50%;\n    border: 1px solid #ddd;\n    background: #fff;\n    cursor: pointer;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    transition: background 0.2s, border-color 0.2s;\n    flex-shrink: 0;\n  }\n\n  .vc-btn:hover:not(:disabled) {\n    background: #000;\n    border-color: #000;\n    color: #fff;\n  }\n\n  .vc-btn:disabled {\n    opacity: 0.25;\n    cursor: not-allowed;\n  }\n\n  .vc-btn svg {\n    width: 18px;\n    height: 18px;\n    stroke: currentColor;\n    fill: none;\n    stroke-width: 2;\n    stroke-linecap: round;\n    stroke-linejoin: round;\n  }\n\n  #vc-dots {\n    display: flex;\n    gap: 7px;\n    align-items: center;\n    flex-wrap: wrap;\n    justify-content: center;\n  }\n\n  .vc-dot {\n    width: 8px;\n    height: 8px;\n    border-radius: 4px;\n    background: #ccc;\n    border: none;\n    cursor: pointer;\n    padding: 0;\n    transition: background 0.25s, width 0.25s;\n  }\n\n  .vc-dot.active {\n    background: #000;\n    width: 22px;\n  }\n\n  #vc-counter {\n    font-size: 12px;\n    color: #999;\n    letter-spacing: 0.05em;\n  }\n\n  \/* ── Responsive overrides ── *\/\n\n  \/* Large desktop: show 2 cards side by side *\/\n  @media (min-width: 768px) {\n    .vc-card {\n      border-radius: 20px;\n    }\n    #vc-track {\n      gap: 16px;\n    }\n  }\n\u003c\/style\u003e\n\n\u003cdiv id=\"vc-wrap\"\u003e\n\n  \u003cdiv id=\"vc-viewport\"\u003e\n    \u003cdiv id=\"vc-track\"\u003e\n\n      \u003c!-- Video 1 --\u003e\n      \u003cdiv class=\"vc-card\"\u003e\n        \u003cvideo autoplay loop muted playsinline\u003e\n          \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/4952492101bb478abcefa2cac9cffe29.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n        \u003cdiv class=\"vc-placeholder\"\u003e\n          \u003csvg viewbox=\"0 0 24 24\"\u003e\u003cpolygon points=\"5,3 19,12 5,21\"\u003e\u003c\/polygon\u003e\u003c\/svg\u003e\n          Video 1\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Video 2 --\u003e\n      \u003cdiv class=\"vc-card\"\u003e\n        \u003cvideo autoplay loop muted playsinline\u003e\n          \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/6ab70ff7019f4e1aadfc25b31b0153c6.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n        \u003cdiv class=\"vc-placeholder\"\u003e\n          \u003csvg viewbox=\"0 0 24 24\"\u003e\u003cpolygon points=\"5,3 19,12 5,21\"\u003e\u003c\/polygon\u003e\u003c\/svg\u003e\n          Video 2\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Video 3 --\u003e\n      \u003cdiv class=\"vc-card\"\u003e\n        \u003cvideo autoplay loop muted playsinline\u003e\n          \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/90723319664f4b908241d6cb63bede65.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n        \u003cdiv class=\"vc-placeholder\"\u003e\n          \u003csvg viewbox=\"0 0 24 24\"\u003e\u003cpolygon points=\"5,3 19,12 5,21\"\u003e\u003c\/polygon\u003e\u003c\/svg\u003e\n          Video 3\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Video 4 --\u003e\n      \u003cdiv class=\"vc-card\"\u003e\n        \u003cvideo autoplay loop muted playsinline\u003e\n          \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/a1742175e81a4e63aeb287302ee48dd1.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n        \u003cdiv class=\"vc-placeholder\"\u003e\n          \u003csvg viewbox=\"0 0 24 24\"\u003e\u003cpolygon points=\"5,3 19,12 5,21\"\u003e\u003c\/polygon\u003e\u003c\/svg\u003e\n          Video 4\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Video 5 --\u003e\n      \u003cdiv class=\"vc-card\"\u003e\n        \u003cvideo autoplay loop muted playsinline\u003e\n          \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/e1e6aff2cdee4b918246a0cc3c699e5d.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n        \u003cdiv class=\"vc-placeholder\"\u003e\n          \u003csvg viewbox=\"0 0 24 24\"\u003e\u003cpolygon points=\"5,3 19,12 5,21\"\u003e\u003c\/polygon\u003e\u003c\/svg\u003e\n          Video 5\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"vc-controls\"\u003e\n    \u003cbutton class=\"vc-btn\" id=\"vc-prev\" aria-label=\"Previous\"\u003e\n      \u003csvg viewbox=\"0 0 24 24\"\u003e\u003cpolyline points=\"15,18 9,12 15,6\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\n    \u003c\/button\u003e\n    \u003cdiv id=\"vc-dots\"\u003e\u003c\/div\u003e\n    \u003cbutton class=\"vc-btn\" id=\"vc-next\" aria-label=\"Next\"\u003e\n      \u003csvg viewbox=\"0 0 24 24\"\u003e\u003cpolyline points=\"9,18 15,12 9,6\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\n    \u003c\/button\u003e\n  \u003c\/div\u003e\n\n  \u003cp id=\"vc-counter\"\u003e\u003c\/p\u003e\n\n\u003c\/div\u003e\n\n\u003cscript\u003e\n(function () {\n  var GAP_MOBILE  = 12;\n  var GAP_DESKTOP = 16;\n  var BREAKPOINT  = 768; \/\/ px — below this = mobile (1 card), above = desktop (2 cards)\n\n  var track    = document.getElementById('vc-track');\n  var viewport = document.getElementById('vc-viewport');\n  var prevBtn  = document.getElementById('vc-prev');\n  var nextBtn  = document.getElementById('vc-next');\n  var dotsEl   = document.getElementById('vc-dots');\n  var counterEl = document.getElementById('vc-counter');\n  var cards    = Array.from(track.querySelectorAll('.vc-card'));\n  var total    = cards.length;\n  var current  = 0;\n  var perPage, pages, cardW, gap;\n\n  \/* Hide placeholder when video has a real src *\/\n  cards.forEach(function (card) {\n    var src = card.querySelector('source');\n    var ph  = card.querySelector('.vc-placeholder');\n    var vid = card.querySelector('video');\n    if (src \u0026\u0026 src.getAttribute('src') \u0026\u0026 !src.getAttribute('src').startsWith('YOUR')) {\n      if (ph) ph.style.display = 'none';\n    } else {\n      if (vid) vid.style.display = 'none';\n    }\n  });\n\n  \/* ── Layout calculation ── *\/\n  function calcLayout() {\n    var containerW = viewport.parentElement.offsetWidth || window.innerWidth;\n    var isMobile   = containerW \u003c BREAKPOINT;\n\n    perPage = isMobile ? 1 : 2;\n    gap     = isMobile ? GAP_MOBILE : GAP_DESKTOP;\n\n    \/* Card width: fill available space evenly *\/\n    cardW = Math.floor((containerW - gap * (perPage - 1)) \/ perPage);\n\n    \/* Apply widths to cards *\/\n    cards.forEach(function (card) {\n      card.style.width = cardW + 'px';\n      card.style.flex  = '0 0 ' + cardW + 'px';\n    });\n\n    \/* Update track gap *\/\n    track.style.gap = gap + 'px';\n\n    \/* Viewport = exactly the cards + gaps that are visible *\/\n    viewport.style.width = (cardW * perPage + gap * (perPage - 1)) + 'px';\n\n    pages = Math.ceil(total \/ perPage);\n  }\n\n  \/* ── Dots ── *\/\n  function buildDots() {\n    dotsEl.innerHTML = '';\n    for (var i = 0; i \u003c pages; i++) {\n      var d = document.createElement('button');\n      d.className = 'vc-dot' + (i === 0 ? ' active' : '');\n      d.setAttribute('aria-label', 'Page ' + (i + 1));\n      (function (idx) {\n        d.addEventListener('click', function () { goTo(idx); });\n      })(i);\n      dotsEl.appendChild(d);\n    }\n  }\n\n  \/* ── Navigate ── *\/\n  function goTo(page) {\n    current = Math.max(0, Math.min(page, pages - 1));\n\n    \/* Offset = how many cards are before current page × (card width + gap) *\/\n    var offset = current * perPage * (cardW + gap);\n    track.style.transform = 'translateX(-' + offset + 'px)';\n\n    dotsEl.querySelectorAll('.vc-dot').forEach(function (d, i) {\n      d.classList.toggle('active', i === current);\n    });\n\n    prevBtn.disabled = current === 0;\n    nextBtn.disabled = current === pages - 1;\n\n    var first = current * perPage + 1;\n    var last  = Math.min(first + perPage - 1, total);\n    counterEl.textContent = first + '\\u2013' + last + ' \/ ' + total;\n  }\n\n  \/* ── Resize handler ── *\/\n  function resize() {\n    calcLayout();\n    buildDots();\n    \/* Clamp current page in case perPage changed *\/\n    current = Math.min(current, pages - 1);\n    goTo(current);\n  }\n\n  prevBtn.addEventListener('click', function () { goTo(current - 1); });\n  nextBtn.addEventListener('click', function () { goTo(current + 1); });\n\n  \/* Init *\/\n  resize();\n  window.addEventListener('resize', resize);\n})();\n\u003c\/script\u003e","brand":"Elorea","offers":[{"title":"Default Title","offer_id":45406773477513,"sku":null,"price":5499.0,"currency_code":"PKR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0738\/9485\/4793\/files\/WhatsAppImage2026-03-20at3.16.16AM.jpg?v=1774143035","url":"https:\/\/theelorea.store\/products\/bikini-dual-head-shaver","provider":"Elorea","version":"1.0","type":"link"}