{"product_id":"libro-interactivo-de-la-granja-para-ninos","title":"Libro Sensorial de Granja para Niños","description":"\u003cstyle\u003e\n\/* ==========================================\n   MILGENIAL\n   LIBRO SENSORIAL DE LA GRANJA\n   SKU 3116-0\n========================================== *\/\n\n#mg3116 {\n  --green: #08A56E;\n  --green-hover: #07875b;\n  --ink: #19382e;\n  --muted: #607368;\n  --soft: #f0f9f4;\n  --line: #deebe3;\n\n  max-width: 860px;\n  width: 100%;\n  margin: 24px auto;\n  color: var(--ink);\n  background: #fff;\n  font-family: \"Poppins\", \"Inter\", Arial, sans-serif;\n  line-height: 1.6;\n}\n\n#mg3116 *,\n#mg3116 *::before,\n#mg3116 *::after {\n  box-sizing: border-box;\n}\n\n#mg3116 h2,\n#mg3116 h3,\n#mg3116 p {\n  margin: 0;\n}\n\n#mg3116 .mg-green {\n  color: var(--green);\n}\n\n#mg3116 .mg-label {\n  display: block;\n  margin-bottom: 13px;\n  color: var(--green);\n  font-size: 11px;\n  font-weight: 800;\n  text-transform: uppercase;\n  letter-spacing: 1.3px;\n}\n\n#mg3116 h2 {\n  font-size: clamp(29px, 5vw, 43px);\n  font-weight: 800;\n  line-height: 1.16;\n  letter-spacing: -1.3px;\n}\n\n#mg3116 h3 {\n  font-size: clamp(23px, 3.7vw, 31px);\n  font-weight: 750;\n  line-height: 1.25;\n  letter-spacing: -.7px;\n}\n\n#mg3116 p {\n  color: var(--muted);\n  font-size: 16px;\n  line-height: 1.75;\n}\n\n\/* HERO *\/\n\n#mg3116 .mg-hero {\n  padding: 46px 30px;\n  border-radius: 19px;\n  background: var(--soft);\n  text-align: center;\n}\n\n#mg3116 .mg-hero h2 {\n  max-width: 700px;\n  margin: 0 auto;\n}\n\n#mg3116 .mg-hero p {\n  max-width: 620px;\n  margin: 19px auto 0;\n}\n\n#mg3116 .mg-tags {\n  display: flex;\n  justify-content: center;\n  flex-wrap: wrap;\n  gap: 9px;\n  margin-top: 24px;\n}\n\n#mg3116 .mg-tags span {\n  display: inline-flex;\n  align-items: center;\n  padding: 8px 13px;\n  border-radius: 30px;\n  border: 1px solid #d2e8d9;\n  background: #fff;\n  color: #227d53;\n  font-size: 12px;\n  font-weight: 700;\n}\n\n\/* SECCIONES *\/\n\n#mg3116 .mg-section {\n  padding: 42px 8px;\n}\n\n#mg3116 .mg-section h3 {\n  max-width: 680px;\n}\n\n#mg3116 .mg-section p {\n  max-width: 690px;\n  margin-top: 16px;\n}\n\n\/* IMAGEN REAL DE USO *\/\n\n#mg3116 .mg-image-section {\n  padding: 4px 8px 43px;\n}\n\n#mg3116 .mg-image-frame {\n  max-width: 620px;\n  width: 100%;\n  margin: 0 auto;\n  overflow: hidden;\n  border: 1px solid var(--line);\n  border-radius: 17px;\n  background: #f5faf7;\n}\n\n#mg3116 .mg-image-frame img {\n  display: block !important;\n  width: 100% !important;\n  max-width: 100% !important;\n  height: auto !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  border: 0 !important;\n}\n\n#mg3116 .mg-placeholder {\n  aspect-ratio: 1 \/ 1;\n  min-height: 260px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-direction: column;\n  gap: 12px;\n  padding: 28px;\n  text-align: center;\n}\n\n#mg3116 .mg-placeholder svg {\n  width: 39px;\n  height: 39px;\n  color: var(--green);\n}\n\n#mg3116 .mg-placeholder strong {\n  font-size: 17px;\n  color: var(--ink);\n}\n\n#mg3116 .mg-placeholder p {\n  max-width: 390px;\n  font-size: 13px;\n}\n\n\/* BENEFICIOS *\/\n\n#mg3116 .mg-benefits {\n  padding: 43px 26px 48px;\n  background: var(--soft);\n  border-radius: 19px;\n}\n\n#mg3116 .mg-benefits-head {\n  text-align: center;\n}\n\n#mg3116 .mg-benefits-head h3 {\n  max-width: 640px;\n  margin: auto;\n}\n\n#mg3116 .mg-benefits-grid {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  gap: 12px;\n  margin-top: 29px;\n}\n\n#mg3116 .mg-benefit {\n  padding: 24px 19px;\n  border: 1px solid var(--line);\n  border-radius: 15px;\n  background: #fff;\n}\n\n#mg3116 .mg-benefit-icon {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  width: 45px;\n  height: 45px;\n  margin-bottom: 17px;\n  border-radius: 12px;\n  background: #e7f8ed;\n  color: var(--green);\n}\n\n#mg3116 .mg-benefit-icon svg {\n  width: 25px;\n  height: 25px;\n}\n\n#mg3116 .mg-benefit h4 {\n  margin: 0 0 9px;\n  color: var(--ink);\n  font-size: 16px;\n  font-weight: 800;\n  line-height: 1.35;\n}\n\n#mg3116 .mg-benefit p {\n  font-size: 13px;\n  line-height: 1.7;\n}\n\n\/* BLOQUE SENTIMENTAL *\/\n\n#mg3116 .mg-moment {\n  padding: 49px 15px;\n  text-align: center;\n}\n\n#mg3116 .mg-moment h3 {\n  max-width: 620px;\n  margin: 0 auto;\n}\n\n#mg3116 .mg-moment p {\n  max-width: 590px;\n  margin: 17px auto 0;\n}\n\n\/* CTA FINAL *\/\n\n#mg3116 .mg-final {\n  padding: 45px 29px 49px;\n  border-radius: 19px;\n  background: var(--soft);\n  text-align: center;\n}\n\n#mg3116 .mg-final h3 {\n  max-width: 660px;\n  margin: 0 auto;\n}\n\n#mg3116 .mg-final p {\n  max-width: 570px;\n  margin: 18px auto 0;\n}\n\n#mg3116 .mg-buy {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 13px;\n\n  width: 100%;\n  max-width: 470px;\n  min-height: 62px;\n\n  margin: 27px auto 0;\n  padding: 17px 20px;\n\n  border: 0;\n  border-radius: 12px;\n\n  background: #18a558;\n  color: #fff;\n\n  font-family: inherit;\n  font-size: 16px;\n  font-weight: 750;\n\n  cursor: pointer;\n  transition: background .2s ease;\n}\n\n#mg3116 .mg-buy:hover:not(:disabled) {\n  background: #117c40;\n}\n\n#mg3116 .mg-buy:disabled {\n  opacity: .65;\n  cursor: not-allowed;\n}\n\n#mg3116 .mg-buy:focus-visible {\n  outline: 3px solid var(--ink);\n  outline-offset: 3px;\n}\n\n#mg3116 .mg-buy svg {\n  width: 22px;\n  height: 22px;\n  flex-shrink: 0;\n}\n\n#mg3116 .mg-buy span {\n  flex: 1;\n  text-align: center;\n}\n\n#mg3116 .mg-status {\n  min-height: 22px;\n  margin-top: 12px;\n  font-size: 13px;\n  font-weight: 650;\n}\n\n#mg3116 .mg-status[data-type=\"error\"] {\n  color: #b63030;\n}\n\n#mg3116 .mg-status[data-type=\"success\"] {\n  color: #087d53;\n}\n\n\/* MINI CARRITO ALTERNATIVO *\/\n\n#mg3116-cart {\n  position: fixed;\n  inset: 0 0 0 auto;\n\n  width: min(440px, 100%);\n  max-width: 100%;\n\n  height: 100dvh;\n  max-height: 100dvh;\n\n  margin: 0;\n  padding: 24px;\n\n  border: 0;\n  background: #fff;\n  color: #19382e;\n\n  font-family: inherit;\n  overflow-y: auto;\n}\n\n#mg3116-cart::backdrop {\n  background: rgba(0, 0, 0, .45);\n}\n\n#mg3116-cart .mg-cart-head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 16px;\n}\n\n#mg3116-cart h2 {\n  margin: 0;\n  font-size: 24px;\n}\n\n#mg3116-cart button {\n  padding: 10px 14px;\n  border: 0;\n  border-radius: 8px;\n  background: #eff8f3;\n  font: inherit;\n  cursor: pointer;\n}\n\n#mg3116-cart ul {\n  list-style: none;\n  padding: 0;\n  margin: 20px 0;\n}\n\n#mg3116-cart li {\n  padding: 14px 0;\n  border-bottom: 1px solid #dcebe3;\n}\n\n#mg3116-cart a {\n  display: block;\n  margin-top: 20px;\n  padding: 15px;\n  border-radius: 10px;\n  background: #08A56E;\n  color: #fff;\n  font-weight: 700;\n  text-align: center;\n  text-decoration: none;\n}\n\n\/* RESPONSIVE *\/\n\n@media (max-width: 600px) {\n\n  #mg3116 {\n    margin: 16px auto;\n  }\n\n  #mg3116 h2 {\n    font-size: 32px;\n    letter-spacing: -1px;\n  }\n\n  #mg3116 h3 {\n    font-size: 25px;\n  }\n\n  #mg3116 p {\n    font-size: 14px;\n  }\n\n  #mg3116 .mg-hero {\n    padding: 36px 19px;\n    border-radius: 16px;\n  }\n\n  #mg3116 .mg-hero p {\n    margin-top: 16px;\n  }\n\n  #mg3116 .mg-tags {\n    gap: 7px;\n    margin-top: 20px;\n  }\n\n  #mg3116 .mg-tags span {\n    padding: 7px 11px;\n    font-size: 11px;\n  }\n\n  #mg3116 .mg-section {\n    padding: 35px 5px;\n  }\n\n  #mg3116 .mg-image-section {\n    padding: 0 0 34px;\n  }\n\n  #mg3116 .mg-image-frame {\n    border-radius: 13px;\n  }\n\n  #mg3116 .mg-benefits {\n    padding: 36px 17px 40px;\n    border-radius: 15px;\n  }\n\n  #mg3116 .mg-benefits-grid {\n    grid-template-columns: 1fr;\n    gap: 10px;\n    margin-top: 24px;\n  }\n\n  #mg3116 .mg-benefit {\n    display: grid;\n    grid-template-columns: 45px 1fr;\n    column-gap: 14px;\n    padding: 18px;\n  }\n\n  #mg3116 .mg-benefit-icon {\n    grid-row: span 2;\n    margin: 0;\n  }\n\n  #mg3116 .mg-benefit h4 {\n    margin-bottom: 4px;\n  }\n\n  #mg3116 .mg-benefit p {\n    font-size: 12px;\n  }\n\n  #mg3116 .mg-moment {\n    padding: 39px 8px;\n  }\n\n  #mg3116 .mg-final {\n    padding: 39px 19px 44px;\n    border-radius: 15px;\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  #mg3116 .mg-buy {\n    transition: none;\n  }\n}\n\u003c\/style\u003e\n\u003csection id=\"mg3116\" aria-label=\"Libro sensorial interactivo de la granja para niños\"\u003e\u003c!-- HERO --\u003e\n\u003cdiv class=\"mg-hero\"\u003e\n\u003cspan class=\"mg-label\"\u003e Libro sensorial de la granja \u003c\/span\u003e\n\u003ch2\u003eSus manitos descubren. \u003cspan class=\"mg-green\"\u003e Su imaginación hace el resto. \u003c\/span\u003e\n\u003c\/h2\u003e\n\u003cp\u003eUn libro para tocar, explorar y aprender jugando. Con el Libro Sensorial de la Granja, los más pequeños pueden descubrir animales, explorar formas y entretenerse con actividades que invitan a usar sus manos.\u003c\/p\u003e\n\u003cdiv class=\"mg-tags\"\u003e\n\u003cspan\u003eJuego sensorial\u003c\/span\u003e \u003cspan\u003eMotricidad fina\u003c\/span\u003e \u003cspan\u003eSin pantallas\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- INTRO --\u003e\n\u003cdiv class=\"mg-section\"\u003e\n\u003cspan class=\"mg-label\"\u003e Aprender jugando \u003c\/span\u003e\n\u003ch3\u003eHay mucho por descubrir \u003cspan class=\"mg-green\"\u003e con sus propias manos. \u003c\/span\u003e\n\u003c\/h3\u003e\n\u003cp\u003eTocar, manipular, observar y volver a intentar. Cada actividad del libro invita a explorar de manera práctica, mientras los niños juegan a su propio ritmo.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c!-- IMAGEN DEL PRODUCTO EN USO --\u003e\n\u003cdiv class=\"mg-image-section\"\u003e\n\u003cdiv class=\"mg-image-frame\"\u003e\n\u003cdiv class=\"mg-placeholder\"\u003e\n\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n          \u003crect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"\u003e\u003c\/rect\u003e\n          \u003ccircle cx=\"8.5\" cy=\"9.5\" r=\"1.5\"\u003e\u003c\/circle\u003e\n          \u003cpath d=\"M21 15l-5-5L5 19\"\u003e\u003c\/path\u003e\n        \u003c\/svg\u003e \u003cstrong\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0758\/3698\/1562\/files\/modelo1_e76e1c4d-6da2-485b-8f0b-36d859da5ee4.png?v=1794422006\" alt=\"\"\u003e\u003c\/strong\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- BENEFICIOS --\u003e\n\u003cdiv class=\"mg-benefits\"\u003e\n\u003cdiv class=\"mg-benefits-head\"\u003e\n\u003cspan class=\"mg-label\"\u003e Mucho más que mirar un libro \u003c\/span\u003e\n\u003ch3\u003eTres formas de \u003cspan class=\"mg-green\"\u003e descubrir jugando. \u003c\/span\u003e\n\u003c\/h3\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"mg-benefits-grid\"\u003e\n\u003c!-- SENSORIAL --\u003e\n\u003carticle class=\"mg-benefit\"\u003e\n\u003cdiv class=\"mg-benefit-icon\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n            \u003cpath d=\"M8 13V6a1.5 1.5 0 0 1 3 0v5\"\u003e\u003c\/path\u003e\n            \u003cpath d=\"M11 11V4.5a1.5 1.5 0 0 1 3 0V11\"\u003e\u003c\/path\u003e\n            \u003cpath d=\"M14 11V7a1.5 1.5 0 0 1 3 0v6\"\u003e\u003c\/path\u003e\n            \u003cpath d=\"M17 12a1.5 1.5 0 0 1 3 0v3c0 4-3 6-7 6h-1c-3 0-5-2-7-5l-2-3a1.6 1.6 0 0 1 2.5-2L8 13\"\u003e\u003c\/path\u003e\n          \u003c\/svg\u003e\u003c\/div\u003e\n\u003ch4\u003eExploración sensorial\u003c\/h4\u003e\n\u003cp\u003eDiferentes piezas de fieltro para tocar, observar y descubrir mediante el juego.\u003c\/p\u003e\n\u003c\/article\u003e\n\u003c!-- MOTRICIDAD --\u003e\n\u003carticle class=\"mg-benefit\"\u003e\n\u003cdiv class=\"mg-benefit-icon\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n            \u003crect x=\"3\" y=\"3\" width=\"8\" height=\"8\" rx=\"1\"\u003e\u003c\/rect\u003e\n            \u003crect x=\"13\" y=\"3\" width=\"8\" height=\"8\" rx=\"1\"\u003e\u003c\/rect\u003e\n            \u003crect x=\"3\" y=\"13\" width=\"8\" height=\"8\" rx=\"1\"\u003e\u003c\/rect\u003e\n            \u003cpath d=\"M14 17h7\"\u003e\u003c\/path\u003e\n            \u003cpath d=\"M17.5 13.5v7\"\u003e\u003c\/path\u003e\n          \u003c\/svg\u003e\u003c\/div\u003e\n\u003ch4\u003eMotricidad fina\u003c\/h4\u003e\n\u003cp\u003eManipular las actividades invita a practicar pequeños movimientos de manos y dedos.\u003c\/p\u003e\n\u003c\/article\u003e\n\u003c!-- SIN PANTALLAS --\u003e\n\u003carticle class=\"mg-benefit\"\u003e\n\u003cdiv class=\"mg-benefit-icon\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n            \u003crect x=\"4\" y=\"3\" width=\"16\" height=\"18\" rx=\"2\"\u003e\u003c\/rect\u003e\n            \u003cpath d=\"M8 7h8\"\u003e\u003c\/path\u003e\n            \u003cpath d=\"M8 11h5\"\u003e\u003c\/path\u003e\n            \u003cpath d=\"M2 22 22 2\"\u003e\u003c\/path\u003e\n          \u003c\/svg\u003e\u003c\/div\u003e\n\u003ch4\u003eSin necesidad de pantallas\u003c\/h4\u003e\n\u003cp\u003eUna alternativa de entretenimiento con actividades que el niño puede explorar directamente.\u003c\/p\u003e\n\u003c\/article\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- MOMENTO FAMILIAR --\u003e\n\u003cdiv class=\"mg-moment\"\u003e\n\u003cspan class=\"mg-label\"\u003e Pequeños descubrimientos \u003c\/span\u003e\n\u003ch3\u003eUn momento de juego. \u003cspan class=\"mg-green\"\u003e Un mundo por descubrir. \u003c\/span\u003e\n\u003c\/h3\u003e\n\u003cp\u003eAnimales de la granja, actividades para explorar y nuevas cosas para aprender. Un libro pensado para acompañar sus momentos de juego y compartir descubrimientos en familia.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c!-- CTA --\u003e\n\u003cdiv class=\"mg-final\"\u003e\n\u003cspan class=\"mg-label\"\u003e Libro sensorial interactivo \u003c\/span\u003e\n\u003ch3\u003eRegalale nuevas formas \u003cspan class=\"mg-green\"\u003e de aprender jugando. \u003c\/span\u003e\n\u003c\/h3\u003e\n\u003cp\u003eUna alternativa de juego con actividades para tocar, explorar y descubrir.\u003c\/p\u003e\n\u003cbutton type=\"button\" class=\"mg-buy\" id=\"mg3116-buy\" disabled\u003e \u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n        \u003ccircle cx=\"9\" cy=\"21\" r=\"1\"\u003e\u003c\/circle\u003e\n        \u003ccircle cx=\"20\" cy=\"21\" r=\"1\"\u003e\u003c\/circle\u003e\n        \u003cpath d=\"M1 1h4l2.6 13.4a2 2 0 0 0 2 1.6h9.8a2 2 0 0 0 2-1.6L23 6H6\"\u003e\u003c\/path\u003e\n      \u003c\/svg\u003e \u003cspan id=\"mg3116-buy-label\"\u003e Cargando producto... \u003c\/span\u003e \u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n        \u003cpath d=\"M5 12h14\"\u003e\u003c\/path\u003e\n        \u003cpath d=\"m13 6 6 6-6 6\"\u003e\u003c\/path\u003e\n      \u003c\/svg\u003e \u003c\/button\u003e\n\u003cdiv class=\"mg-status\" id=\"mg3116-status\" role=\"status\" aria-live=\"polite\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c!-- MINI CARRITO ALTERNATIVO --\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003c\/p\u003e\u003cdialog id=\"mg3116-cart\" aria-labelledby=\"mg3116-cart-title\"\u003e\n\u003cdiv class=\"mg-cart-head\"\u003e\n\u003ch2 id=\"mg3116-cart-title\"\u003eTu carrito\u003c\/h2\u003e\n\u003cbutton type=\"button\" data-close=\"\" aria-label=\"Cerrar carrito\"\u003e Cerrar \u003c\/button\u003e\n\u003c\/div\u003e\n\u003cdiv data-content=\"\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003ca href=\"\/cart\"\u003e Ver carrito \u003c\/a\u003e \u003c\/dialog\u003e \u003cscript\u003e\n(function () {\n  \"use strict\";\n\n  var root = document.getElementById(\"mg3116\");\n\n  if (!root || root.dataset.ready === \"true\") {\n    return;\n  }\n\n  root.dataset.ready = \"true\";\n\n  \/* CONFIGURACIÓN *\/\n\n  var SKU = \"3116-0\";\n\n  var base =\n    window.Shopify \u0026\u0026 window.Shopify.routes\n      ? window.Shopify.routes.root\n      : \"\/\";\n\n  var button = root.querySelector(\"#mg3116-buy\");\n\n  var label = root.querySelector(\n    \"#mg3116-buy-label\"\n  );\n\n  var status = root.querySelector(\n    \"#mg3116-status\"\n  );\n\n  var modal = document.getElementById(\n    \"mg3116-cart\"\n  );\n\n  var busy = false;\n  var variant = null;\n  var resetTimer = null;\n\n  \/* MENSAJES *\/\n\n  function showMessage(text, type) {\n    status.textContent = text || \"\";\n    status.dataset.type = type || \"\";\n  }\n\n  \/* PETICIONES *\/\n\n  async function getJSON(url, options) {\n    var response = await fetch(url, options);\n\n    var data = await response.json();\n\n    if (!response.ok) {\n      throw new Error(\n        data.description ||\n        data.message ||\n        \"No pudimos completar la solicitud.\"\n      );\n    }\n\n    return data;\n  }\n\n  \/* OBTENER PRODUCTO *\/\n\n  async function loadVariant() {\n    var match = location.pathname.match(\n      \/\\\/products\\\/([^\/]+)\/\n    );\n\n    if (!match) {\n      throw new Error(\n        \"Este botón funciona desde la página del producto.\"\n      );\n    }\n\n    var productURL =\n      base.replace(\/\\\/$\/, \"\") +\n      \"\/products\/\" +\n      encodeURIComponent(match[1]) +\n      \".js\";\n\n    var product = await getJSON(productURL);\n\n    variant = product.variants.find(\n      function (item) {\n        return (\n          String(item.sku || \"\").trim() === SKU\n        );\n      }\n    );\n\n    if (!variant) {\n      button.disabled = true;\n      label.textContent = \"No disponible\";\n\n      showMessage(\n        \"No se encontró la variante del producto.\",\n        \"error\"\n      );\n\n      return;\n    }\n\n    if (!variant.available) {\n      button.disabled = true;\n      label.textContent = \"Sin stock\";\n\n      showMessage(\n        \"Producto no disponible por el momento.\",\n        \"error\"\n      );\n\n      return;\n    }\n\n    button.disabled = false;\n    label.textContent = \"Agregar al carrito\";\n\n    showMessage(\"\", \"\");\n  }\n\n  \/* FORMATO MONEDA *\/\n\n  function money(cents, currency) {\n    return new Intl.NumberFormat(\n      \"es-UY\",\n      {\n        style: \"currency\",\n        currency: currency || \"UYU\"\n      }\n    ).format(cents \/ 100);\n  }\n\n  \/* CARRITO ALTERNATIVO *\/\n\n  modal.querySelector(\"a\").href = base + \"cart\";\n\n  modal.querySelector(\"[data-close]\")\n    .addEventListener(\"click\", function () {\n      modal.close();\n    });\n\n  modal.addEventListener(\"click\", function (e) {\n    if (e.target !== modal) return;\n\n    var rect = modal.getBoundingClientRect();\n\n    if (\n      e.clientX \u003c rect.left ||\n      e.clientX \u003e rect.right ||\n      e.clientY \u003c rect.top ||\n      e.clientY \u003e rect.bottom\n    ) {\n      modal.close();\n    }\n  });\n\n  async function openFallback() {\n    var content = modal.querySelector(\n      \"[data-content]\"\n    );\n\n    content.textContent = \"Cargando tu carrito...\";\n\n    if (!modal.open) {\n      modal.showModal();\n    }\n\n    try {\n      var cart = await getJSON(\n        base + \"cart.js\"\n      );\n\n      var list = document.createElement(\"ul\");\n\n      cart.items.forEach(function (item) {\n        var li = document.createElement(\"li\");\n        var title = document.createElement(\"strong\");\n        var detail = document.createElement(\"div\");\n\n        title.textContent =\n          item.product_title || item.title;\n\n        detail.textContent =\n          \"Cantidad: \" +\n          item.quantity +\n          \" · \" +\n          money(\n            item.final_line_price,\n            cart.currency\n          );\n\n        li.append(title, detail);\n        list.appendChild(li);\n      });\n\n      var total = document.createElement(\"p\");\n\n      total.textContent =\n        \"Subtotal: \" +\n        money(cart.total_price, cart.currency);\n\n      content.replaceChildren(list, total);\n    } catch (error) {\n      content.textContent =\n        \"El producto fue agregado. Podés revisar tu compra desde «Ver carrito».\";\n    }\n  }\n\n  \/* ACTUALIZAR CONTADOR *\/\n\n  function updateCartCount(cart) {\n    if (!cart) return;\n\n    document\n      .querySelectorAll(\"[data-cart-count]\")\n      .forEach(function (element) {\n        element.textContent = cart.item_count;\n      });\n\n    document\n      .querySelectorAll(\".cart-count-bubble\")\n      .forEach(function (element) {\n        var visible = element.querySelector(\n          'span[aria-hidden=\"true\"]'\n        );\n\n        var accessible = element.querySelector(\n          \".visually-hidden\"\n        );\n\n        if (visible) {\n          visible.textContent = cart.item_count;\n        }\n\n        if (accessible) {\n          accessible.textContent =\n            cart.item_count + \" artículos\";\n        }\n\n        if (!visible \u0026\u0026 !accessible) {\n          element.textContent = cart.item_count;\n        }\n\n        element.style.display =\n          cart.item_count \u003e 0 ? \"\" : \"none\";\n      });\n  }\n\n  \/* EVENTOS SHOPIFY *\/\n\n  function notifyCart(cart) {\n    [\n      \"cart:refresh\",\n      \"cart:updated\",\n      \"cart:change\"\n    ].forEach(function (eventName) {\n      document.dispatchEvent(\n        new CustomEvent(eventName, {\n          detail: {\n            source: \"mg3116\",\n            cart: cart || null\n          }\n        })\n      );\n    });\n  }\n\n  \/* AGREGAR AL CARRITO *\/\n\n  async function addToCart() {\n    if (busy || !variant || !variant.available) {\n      return;\n    }\n\n    busy = true;\n    button.disabled = true;\n    label.textContent = \"Agregando...\";\n\n    showMessage(\"\", \"\");\n\n    if (resetTimer) {\n      clearTimeout(resetTimer);\n      resetTimer = null;\n    }\n\n    var added = false;\n\n    try {\n      var drawer = document.querySelector(\n        \"cart-drawer\"\n      );\n\n      var notification = document.querySelector(\n        \"cart-notification\"\n      );\n\n      var component = drawer || notification;\n\n      var canRender =\n        component \u0026\u0026\n        typeof component.getSectionsToRender ===\n          \"function\" \u0026\u0026\n        typeof component.renderContents ===\n          \"function\";\n\n      var payload = {\n        items: [\n          {\n            id: Number(variant.id),\n            quantity: 1\n          }\n        ]\n      };\n\n      if (canRender) {\n        var sections = component\n          .getSectionsToRender()\n          .map(function (section) {\n            return section.id;\n          })\n          .filter(Boolean);\n\n        if (sections.length) {\n          payload.sections = sections.slice(0, 5);\n        }\n\n        payload.sections_url = location.pathname;\n      }\n\n      var result = await getJSON(\n        base + \"cart\/add.js\",\n        {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": \"application\/json\",\n            \"Accept\": \"application\/json\"\n          },\n          body: JSON.stringify(payload)\n        }\n      );\n\n      added = true;\n\n      label.textContent = \"Agregado al carrito\";\n\n      showMessage(\n        \"Producto agregado correctamente.\",\n        \"success\"\n      );\n\n      var cart = null;\n\n      try {\n        cart = await getJSON(\n          base + \"cart.js\"\n        );\n\n        updateCartCount(cart);\n      } catch (cartError) {\n        console.warn(\n          \"MG3116: no se pudo actualizar el contador.\",\n          cartError\n        );\n      }\n\n      var drawerOpened = false;\n\n      if (canRender \u0026\u0026 result.sections) {\n        try {\n          component.classList.remove(\"is-empty\");\n\n          component.renderContents(result);\n\n          drawerOpened = true;\n        } catch (renderError) {\n          console.warn(\n            \"MG3116: no se pudo actualizar el mini-carrito.\",\n            renderError\n          );\n        }\n      }\n\n      if (!drawerOpened) {\n        try {\n          await openFallback();\n        } catch (fallbackError) {\n          console.warn(\n            \"MG3116: no se pudo abrir el mini-carrito.\",\n            fallbackError\n          );\n        }\n      }\n\n      notifyCart(cart);\n\n      resetTimer = setTimeout(function () {\n        if (!busy \u0026\u0026 variant \u0026\u0026 variant.available) {\n          label.textContent = \"Agregar al carrito\";\n        }\n      }, 2200);\n\n    } catch (error) {\n      console.error(\"MG3116:\", error);\n\n      label.textContent = \"Agregar al carrito\";\n\n      showMessage(\n        added\n          ? \"El producto fue agregado. Revisá tu carrito antes de volver a intentarlo.\"\n          : error.message,\n        \"error\"\n      );\n\n    } finally {\n      busy = false;\n      button.disabled =\n        !variant || !variant.available;\n    }\n  }\n\n  button.addEventListener(\n    \"click\",\n    addToCart\n  );\n\n  \/* INICIALIZAR *\/\n\n  loadVariant().catch(function (error) {\n    console.error(\"MG3116:\", error);\n\n    button.disabled = true;\n    label.textContent = \"No disponible\";\n\n    showMessage(\n      error.message ||\n      \"No se pudo cargar el producto.\",\n      \"error\"\n    );\n  });\n\n})();\n\u003c\/script\u003e\u003cp\u003e\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e","brand":"Clara (Yiwu Mayhome Import\u0026export Co.,ltd) (0.0 Unidades - 249,05 $)","offers":[{"title":"Default Title","offer_id":67951839740218,"sku":"3116-0","price":990.0,"currency_code":"UYU","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0758\/3698\/1562\/files\/Portada_cf1195fa-0108-438d-ac65-383812eb4b61.png?v=1794424034","url":"https:\/\/milgenialuruguay.com\/products\/libro-interactivo-de-la-granja-para-ninos","provider":"MilGenial Uruguay","version":"1.0","type":"link"}