{"product_id":"gel-blanqueador-dental","title":"(2x1) Blanqueador Dental YASENSHI | Sonrisa de Revista en 3 minutos","description":"\u003cstyle\u003e\n  \/* =========================================\n     YASENSHI - DESCRIPCIÓN DE PRODUCTO\n  ========================================== *\/\n\n  .yasenshi-desc {\n    max-width: 760px;\n    margin: 0 auto;\n    padding: 0 14px 28px;\n    font-family: inherit;\n    color: #171717;\n    box-sizing: border-box;\n  }\n\n  .yasenshi-desc *,\n  .yasenshi-desc *::before,\n  .yasenshi-desc *::after {\n    box-sizing: border-box;\n  }\n\n  \/* =========================================\n     TÍTULOS\n  ========================================== *\/\n\n  .yasenshi-title {\n    margin: 12px 0 8px;\n    text-align: center;\n    font-size: 28px;\n    line-height: 1.12;\n    font-weight: 800;\n    color: #29134f;\n  }\n\n  .yasenshi-title span {\n    color: #6a32a0;\n  }\n\n  .yasenshi-mini-subtitle {\n    margin: 0 auto 20px;\n    text-align: center;\n    font-size: 14px;\n    line-height: 1.4;\n    color: #666;\n  }\n\n  .yasenshi-section-title {\n    margin: 0 0 14px;\n    text-align: center;\n    font-size: 25px;\n    line-height: 1.15;\n    font-weight: 800;\n    color: #29134f;\n  }\n\n  \/* =========================================\n     CARRUSEL INFINITO\n  ========================================== *\/\n\n  .yasenshi-carousel {\n    position: relative;\n    width: 100%;\n    margin: 0 0 32px;\n    overflow: hidden;\n  }\n\n  .yasenshi-carousel-viewport {\n    width: 100%;\n    overflow: hidden;\n    border-radius: 11px;\n    touch-action: pan-y;\n  }\n\n  .yasenshi-carousel-track {\n    display: flex;\n    gap: 10px;\n    will-change: transform;\n  }\n\n  .yasenshi-video-card {\n    flex: 0 0 calc((100% - 10px) \/ 2);\n    min-width: calc((100% - 10px) \/ 2);\n    overflow: hidden;\n    border-radius: 10px;\n    background: #eee;\n  }\n\n  .yasenshi-video-card video {\n    display: block;\n    width: 100%;\n    height: auto;\n    aspect-ratio: 9 \/ 16;\n    object-fit: cover;\n    background: #eee;\n    pointer-events: none;\n  }\n\n  \/* FLECHAS *\/\n\n  .yasenshi-carousel-arrow {\n    position: absolute;\n    z-index: 10;\n    top: 50%;\n    transform: translateY(-50%);\n    width: 34px;\n    height: 34px;\n    padding: 0;\n    border: none;\n    border-radius: 50%;\n    background: rgba(255,255,255,.92);\n    color: #44206f;\n    box-shadow: 0 2px 10px rgba(0,0,0,.16);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    cursor: pointer;\n    font-family: Arial, sans-serif;\n    font-size: 26px;\n    font-weight: 400;\n    line-height: 1;\n  }\n\n  .yasenshi-carousel-arrow:hover {\n    background: #fff;\n  }\n\n  .yasenshi-carousel-arrow.prev {\n    left: 7px;\n  }\n\n  .yasenshi-carousel-arrow.next {\n    right: 7px;\n  }\n\n  \/* =========================================\n     IMÁGENES\n  ========================================== *\/\n\n  .yasenshi-image-section {\n    margin: 0 0 30px;\n  }\n\n  .yasenshi-main-image {\n    display: block;\n    width: 100%;\n    height: auto;\n    border-radius: 12px;\n  }\n\n  \/* =========================================\n     ANTES \/ DESPUÉS\n  ========================================== *\/\n\n  .yasenshi-before-after {\n    margin: 3px 0 30px;\n  }\n\n  .yasenshi-before-after-copy {\n    text-align: center;\n    margin: -3px auto 15px;\n    font-size: 14px;\n    line-height: 1.45;\n    color: #666;\n    max-width: 520px;\n  }\n\n  \/* =========================================\n     BENEFICIOS COMPACTOS\n  ========================================== *\/\n\n  .yasenshi-benefits {\n    display: grid;\n    grid-template-columns: repeat(2, 1fr);\n    gap: 10px;\n    margin: 5px 0 28px;\n  }\n\n  .yasenshi-benefit {\n    min-height: 105px;\n    padding: 15px 13px;\n    border: 1px solid #e9e1ef;\n    border-radius: 12px;\n    background: #fff;\n    text-align: center;\n  }\n\n  .yasenshi-benefit-icon {\n    display: block;\n    margin: 0 0 7px;\n    font-size: 24px;\n    line-height: 1;\n  }\n\n  .yasenshi-benefit-title {\n    margin: 0 0 4px;\n    font-size: 15px;\n    line-height: 1.25;\n    font-weight: 800;\n    color: #35175f;\n  }\n\n  .yasenshi-benefit-text {\n    margin: 0;\n    font-size: 12.5px;\n    line-height: 1.4;\n    color: #666;\n  }\n\n  \/* BENEFICIO GRANDE *\/\n\n  .yasenshi-benefit-wide {\n    grid-column: 1 \/ -1;\n    min-height: auto;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 10px;\n    text-align: left;\n    padding: 13px 16px;\n    background: #faf7fc;\n  }\n\n  .yasenshi-benefit-wide .yasenshi-benefit-icon {\n    margin: 0;\n    flex-shrink: 0;\n  }\n\n  \/* =========================================\n     CIERRE\n  ========================================== *\/\n\n  .yasenshi-final {\n    padding: 21px 17px;\n    text-align: center;\n    border-radius: 14px;\n    background: linear-gradient(\n      135deg,\n      #f5effb 0%,\n      #eee1f8 100%\n    );\n  }\n\n  .yasenshi-final-title {\n    margin: 0 0 5px;\n    font-size: 23px;\n    line-height: 1.15;\n    font-weight: 800;\n    color: #35145f;\n  }\n\n  .yasenshi-final-text {\n    margin: 0;\n    font-size: 14px;\n    line-height: 1.45;\n    color: #555;\n  }\n\n  \/* =========================================\n     MOBILE\n  ========================================== *\/\n\n  @media (max-width: 480px) {\n\n    .yasenshi-desc {\n      padding-left: 10px;\n      padding-right: 10px;\n    }\n\n    .yasenshi-title {\n      font-size: 24px;\n    }\n\n    .yasenshi-section-title {\n      font-size: 22px;\n    }\n\n    .yasenshi-carousel-track {\n      gap: 8px;\n    }\n\n    .yasenshi-video-card {\n      flex-basis: calc((100% - 8px) \/ 2);\n      min-width: calc((100% - 8px) \/ 2);\n      border-radius: 8px;\n    }\n\n    .yasenshi-carousel-arrow {\n      width: 31px;\n      height: 31px;\n      font-size: 23px;\n    }\n\n    .yasenshi-carousel-arrow.prev {\n      left: 5px;\n    }\n\n    .yasenshi-carousel-arrow.next {\n      right: 5px;\n    }\n\n    .yasenshi-benefits {\n      gap: 8px;\n    }\n\n    .yasenshi-benefit {\n      padding: 13px 9px;\n    }\n\n    .yasenshi-benefit-title {\n      font-size: 14px;\n    }\n\n    .yasenshi-benefit-text {\n      font-size: 12px;\n    }\n  }\n\u003c\/style\u003e\n\n\n\u003cdiv class=\"yasenshi-desc\"\u003e\n\n  \u003c!-- =====================================\n       VALIDACIÓN SOCIAL + VIDEOS\n  ====================================== --\u003e\n\n  \u003ch2 class=\"yasenshi-title\"\u003e\n    Así lo usan quienes \u003cspan\u003eya lo probaron\u003c\/span\u003e\n  \u003c\/h2\u003e\n\n  \u003cp class=\"yasenshi-mini-subtitle\"\u003e\n    Mira Yasenshi en acción.\n  \u003c\/p\u003e\n\n\n  \u003cdiv class=\"yasenshi-carousel\" id=\"yasenshiCarousel\"\u003e\n\n    \u003cbutton class=\"yasenshi-carousel-arrow prev\" type=\"button\" aria-label=\"Video anterior\"\u003e\n      ‹\n    \u003c\/button\u003e\n\n    \u003cdiv class=\"yasenshi-carousel-viewport\"\u003e\n\n      \u003cdiv class=\"yasenshi-carousel-track\"\u003e\n\n        \u003c!-- VIDEO 1 --\u003e\n\n        \u003cdiv class=\"yasenshi-video-card\"\u003e\n          \u003cvideo autoplay muted loop playsinline preload=\"metadata\"\u003e\n            \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/36c41076abef4e6ab625e3972ac0b9e9.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n        \u003c\/div\u003e\n\n\n        \u003c!-- VIDEO 2 --\u003e\n\n        \u003cdiv class=\"yasenshi-video-card\"\u003e\n          \u003cvideo autoplay muted loop playsinline preload=\"metadata\"\u003e\n            \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/51a0a39c8c4249d3afd7a1634ecf009e.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n        \u003c\/div\u003e\n\n\n        \u003c!-- VIDEO 3 --\u003e\n\n        \u003cdiv class=\"yasenshi-video-card\"\u003e\n          \u003cvideo autoplay muted loop playsinline preload=\"metadata\"\u003e\n            \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/cd4575c50d03491db51457708b416ab9.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n        \u003c\/div\u003e\n\n\n        \u003c!-- VIDEO 4 --\u003e\n\n        \u003cdiv class=\"yasenshi-video-card\"\u003e\n          \u003cvideo autoplay muted loop playsinline preload=\"metadata\"\u003e\n            \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/340a36d37185417faca91b0a4c60e38f.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n        \u003c\/div\u003e\n\n\n        \u003c!-- VIDEO 5 --\u003e\n\n        \u003cdiv class=\"yasenshi-video-card\"\u003e\n          \u003cvideo autoplay muted loop playsinline preload=\"metadata\"\u003e\n            \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/487d792023284a3cafc68728d734ece0.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n        \u003c\/div\u003e\n\n      \u003c\/div\u003e\n\n    \u003c\/div\u003e\n\n    \u003cbutton class=\"yasenshi-carousel-arrow next\" type=\"button\" aria-label=\"Siguiente video\"\u003e\n      ›\n    \u003c\/button\u003e\n\n  \u003c\/div\u003e\n\n\n  \u003c!-- =====================================\n       CÓMO SE USA\n  ====================================== --\u003e\n\n  \u003cdiv class=\"yasenshi-image-section\"\u003e\n\n    \u003ch2 class=\"yasenshi-section-title\"\u003e\n      ¿Cómo se usa?\n    \u003c\/h2\u003e\n\n    \u003cimg class=\"yasenshi-main-image\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0669\/4436\/8699\/files\/nashehrusaifbaefbsiuerfb.webp?v=1787343075\" alt=\"Cómo usar Yasenshi\" loading=\"lazy\"\u003e\n\n  \u003c\/div\u003e\n\n\n  \u003c!-- =====================================\n       ANTES Y DESPUÉS\n  ====================================== --\u003e\n\n  \u003cdiv class=\"yasenshi-before-after\"\u003e\n\n    \u003ch2 class=\"yasenshi-section-title\"\u003e\n      El cambio está en la sonrisa\n    \u003c\/h2\u003e\n\n    \u003cp class=\"yasenshi-before-after-copy\"\u003e\n      Ayuda a reducir visualmente manchas superficiales y devolverle luminosidad a tu sonrisa.\n    \u003c\/p\u003e\n\n    \u003cimg class=\"yasenshi-main-image\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0669\/4436\/8699\/files\/WhatsApp_Image_2026-08-22_at_19.16.53.jpg?v=1787437762\" alt=\"Antes y después Yasenshi\" loading=\"lazy\"\u003e\n\n  \u003c\/div\u003e\n\n\n  \u003c!-- =====================================\n       BENEFICIOS\n  ====================================== --\u003e\n\n  \u003ch2 class=\"yasenshi-section-title\"\u003e\n    Todo lo que tu sonrisa necesita\n  \u003c\/h2\u003e\n\n\n  \u003cdiv class=\"yasenshi-benefits\"\u003e\n\n    \u003cdiv class=\"yasenshi-benefit\"\u003e\n\n      \u003cspan class=\"yasenshi-benefit-icon\"\u003e\n        ✨\n      \u003c\/span\u003e\n\n      \u003ch3 class=\"yasenshi-benefit-title\"\u003e\n        Ayuda con las manchas\n      \u003c\/h3\u003e\n\n      \u003cp class=\"yasenshi-benefit-text\"\u003e\n        Favorece una apariencia más limpia y luminosa.\n      \u003c\/p\u003e\n\n    \u003c\/div\u003e\n\n\n    \u003cdiv class=\"yasenshi-benefit\"\u003e\n\n      \u003cspan class=\"yasenshi-benefit-icon\"\u003e\n        😁\n      \u003c\/span\u003e\n\n      \u003ch3 class=\"yasenshi-benefit-title\"\u003e\n        Sonrisa más brillante\n      \u003c\/h3\u003e\n\n      \u003cp class=\"yasenshi-benefit-text\"\u003e\n        Para una apariencia más blanca y cuidada.\n      \u003c\/p\u003e\n\n    \u003c\/div\u003e\n\n\n    \u003cdiv class=\"yasenshi-benefit\"\u003e\n\n      \u003cspan class=\"yasenshi-benefit-icon\"\u003e\n        🌿\n      \u003c\/span\u003e\n\n      \u003ch3 class=\"yasenshi-benefit-title\"\u003e\n        Frescura mentolada\n      \u003c\/h3\u003e\n\n      \u003cp class=\"yasenshi-benefit-text\"\u003e\n        Refrescante sabor a menta después de usarlo.\n      \u003c\/p\u003e\n\n    \u003c\/div\u003e\n\n\n    \u003cdiv class=\"yasenshi-benefit\"\u003e\n\n      \u003cspan class=\"yasenshi-benefit-icon\"\u003e\n        🪥\n      \u003c\/span\u003e\n\n      \u003ch3 class=\"yasenshi-benefit-title\"\u003e\n        Fácil de usar\n      \u003c\/h3\u003e\n\n      \u003cp class=\"yasenshi-benefit-text\"\u003e\n        Se integra fácilmente a tu rutina diaria.\n      \u003c\/p\u003e\n\n    \u003c\/div\u003e\n\n\n    \u003cdiv class=\"yasenshi-benefit\"\u003e\n\n      \u003cspan class=\"yasenshi-benefit-icon\"\u003e\n        📦\n      \u003c\/span\u003e\n\n      \u003ch3 class=\"yasenshi-benefit-title\"\u003e\n        Práctico formato\n      \u003c\/h3\u003e\n\n      \u003cp class=\"yasenshi-benefit-text\"\u003e\n        Envase compacto de 30 mL.\n      \u003c\/p\u003e\n\n    \u003c\/div\u003e\n\n\n    \u003cdiv class=\"yasenshi-benefit\"\u003e\n\n      \u003cspan class=\"yasenshi-benefit-icon\"\u003e\n        🧬\n      \u003c\/span\u003e\n\n      \u003ch3 class=\"yasenshi-benefit-title\"\u003e\n        Libre de gluten\n      \u003c\/h3\u003e\n\n      \u003cp class=\"yasenshi-benefit-text\"\u003e\n        Una fórmula práctica para tu cuidado bucal.\n      \u003c\/p\u003e\n\n    \u003c\/div\u003e\n\n\n    \u003cdiv class=\"yasenshi-benefit yasenshi-benefit-wide\"\u003e\n\n      \u003cspan class=\"yasenshi-benefit-icon\"\u003e\n        💜\n      \u003c\/span\u003e\n\n      \u003cdiv\u003e\n        \u003ch3 class=\"yasenshi-benefit-title\"\u003e\n          Pensado para el uso diario\n        \u003c\/h3\u003e\n\n        \u003cp class=\"yasenshi-benefit-text\"\u003e\n          Cuidado bucal simple, práctico y moderno.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n    \u003c\/div\u003e\n\n  \u003c\/div\u003e\n\n\n  \u003c!-- =====================================\n       CIERRE\n  ====================================== --\u003e\n\n  \u003cdiv class=\"yasenshi-final\"\u003e\n\n    \u003ch2 class=\"yasenshi-final-title\"\u003e\n      ✨ Sonrisa de revista\n    \u003c\/h2\u003e\n\n    \u003cp class=\"yasenshi-final-text\"\u003e\n      Más blanca, fresca y cuidada.\n    \u003c\/p\u003e\n\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\n\u003cscript\u003e\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n\n  const carousel = document.querySelector(\"#yasenshiCarousel\");\n\n  if (!carousel) return;\n\n  const viewport = carousel.querySelector(\".yasenshi-carousel-viewport\");\n  const track = carousel.querySelector(\".yasenshi-carousel-track\");\n  const prevButton = carousel.querySelector(\".prev\");\n  const nextButton = carousel.querySelector(\".next\");\n\n  const originalSlides = Array.from(\n    track.querySelectorAll(\".yasenshi-video-card\")\n  );\n\n  const visibleSlides = 2;\n  const cloneCount = visibleSlides;\n\n  \/* =====================================\n     CREAR CLONES PARA LOOP INFINITO\n  ====================================== *\/\n\n  const firstClones = originalSlides\n    .slice(0, cloneCount)\n    .map(slide =\u003e slide.cloneNode(true));\n\n  const lastClones = originalSlides\n    .slice(-cloneCount)\n    .map(slide =\u003e slide.cloneNode(true));\n\n\n  lastClones.reverse().forEach(clone =\u003e {\n    track.insertBefore(clone, track.firstChild);\n  });\n\n\n  firstClones.forEach(clone =\u003e {\n    track.appendChild(clone);\n  });\n\n\n  let index = cloneCount;\n  let isAnimating = false;\n\n  let startX = 0;\n  let currentX = 0;\n  let dragging = false;\n\n\n  function getGap() {\n    const styles = window.getComputedStyle(track);\n    return parseFloat(styles.columnGap || styles.gap || 0);\n  }\n\n\n  function getStep() {\n\n    const slide = track.querySelector(\".yasenshi-video-card\");\n\n    if (!slide) return 0;\n\n    return slide.getBoundingClientRect().width + getGap();\n  }\n\n\n  function setPosition(animate = true) {\n\n    const step = getStep();\n\n    track.style.transition = animate\n      ? \"transform 0.38s cubic-bezier(.25,.8,.25,1)\"\n      : \"none\";\n\n    track.style.transform =\n      `translate3d(${-index * step}px,0,0)`;\n  }\n\n\n  \/* POSICIÓN INICIAL *\/\n\n  requestAnimationFrame(() =\u003e {\n    setPosition(false);\n  });\n\n\n  \/* =====================================\n     SIGUIENTE\n  ====================================== *\/\n\n  function nextSlide() {\n\n    if (isAnimating) return;\n\n    isAnimating = true;\n\n    index++;\n\n    setPosition(true);\n  }\n\n\n  \/* =====================================\n     ANTERIOR\n  ====================================== *\/\n\n  function prevSlide() {\n\n    if (isAnimating) return;\n\n    isAnimating = true;\n\n    index--;\n\n    setPosition(true);\n  }\n\n\n  nextButton.addEventListener(\"click\", nextSlide);\n\n  prevButton.addEventListener(\"click\", prevSlide);\n\n\n  \/* =====================================\n     REAJUSTE INVISIBLE DEL LOOP\n  ====================================== *\/\n\n  track.addEventListener(\"transitionend\", function () {\n\n    const totalOriginals = originalSlides.length;\n\n    \/*\n      Estamos en los clones del principio\n    *\/\n\n    if (index \u003c cloneCount) {\n\n      index += totalOriginals;\n\n      setPosition(false);\n    }\n\n    \/*\n      Estamos en los clones del final\n    *\/\n\n    if (index \u003e= totalOriginals + cloneCount) {\n\n      index -= totalOriginals;\n\n      setPosition(false);\n    }\n\n    isAnimating = false;\n\n  });\n\n\n  \/* =====================================\n     SWIPE EN CELULAR\n  ====================================== *\/\n\n  viewport.addEventListener(\n    \"touchstart\",\n    function (event) {\n\n      if (!event.touches.length) return;\n\n      startX = event.touches[0].clientX;\n      currentX = startX;\n      dragging = true;\n\n    },\n    { passive: true }\n  );\n\n\n  viewport.addEventListener(\n    \"touchmove\",\n    function (event) {\n\n      if (!dragging || !event.touches.length) return;\n\n      currentX = event.touches[0].clientX;\n\n    },\n    { passive: true }\n  );\n\n\n  viewport.addEventListener(\n    \"touchend\",\n    function () {\n\n      if (!dragging) return;\n\n      const distance = currentX - startX;\n\n      dragging = false;\n\n      if (Math.abs(distance) \u003c 35) return;\n\n      if (distance \u003c 0) {\n        nextSlide();\n      } else {\n        prevSlide();\n      }\n\n    },\n    { passive: true }\n  );\n\n\n  \/* =====================================\n     REDIMENSIONAR\n  ====================================== *\/\n\n  window.addEventListener(\"resize\", function () {\n\n    setPosition(false);\n\n  });\n\n\n  \/* =====================================\n     ASEGURAR AUTOPLAY\n  ====================================== *\/\n\n  carousel.querySelectorAll(\"video\").forEach(video =\u003e {\n\n    video.muted = true;\n\n    const promise = video.play();\n\n    if (promise !== undefined) {\n      promise.catch(() =\u003e {});\n    }\n\n  });\n\n});\n\u003c\/script\u003e","brand":"Tu Oferta Express","offers":[{"title":"Default Title","offer_id":44023532322875,"sku":"PROD-0002002","price":799.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0669\/4436\/8699\/files\/Imagen_de_Codex_21_ago_2026_04_11_53_p.m..png?v=1787339570","url":"https:\/\/oferta-express.com\/products\/gel-blanqueador-dental","provider":"Tu Oferta Express","version":"1.0","type":"link"}