{"title":"Colección de bordados","description":"","products":[{"product_id":"babero-personalizado-bordado-en-punto-de-cruz","title":"Babero personalizado bordado en punto de cruz","description":"\u003cdiv id=\"babero-personalizer\" style=\"max-width:750px;margin:20px auto;text-align:center;font-family:Arial,sans-serif;\"\u003e\n\n  \u003c!-- Miniaturas babero --\u003e\n  \u003cdiv id=\"babero-thumbs\" style=\"display:flex;justify-content:center;gap:10px;margin-bottom:15px;\"\u003e\n    \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0980\/3546\/6589\/files\/ejemplo_babero.jpg?v=1756422520\" class=\"babero-thumb\" width=\"60\" height=\"60\" style=\"cursor:pointer;border:1px solid #ddd;border-radius:6px;\"\u003e\n    \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0980\/3546\/6589\/files\/BABERO_AMAZON_2.jpg?v=1757172235\" class=\"babero-thumb\" width=\"60\" height=\"60\" style=\"cursor:pointer;border:1px solid #ddd;border-radius:6px;\"\u003e\n    \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0980\/3546\/6589\/files\/BABERO_AMAZON_3.jpg?v=1757172288\" class=\"babero-thumb\" width=\"60\" height=\"60\" style=\"cursor:pointer;border:1px solid #ddd;border-radius:6px;\"\u003e\n  \u003c\/div\u003e\n\n  \u003c!-- Canvas --\u003e\n  \u003ccanvas id=\"baberoCanvas\" width=\"400\" height=\"400\"\u003e\u003c\/canvas\u003e\n\n  \u003c!-- Nota --\u003e\n  \u003cp style=\"font-size:12px;color:#666;margin-top:8px;\"\u003e\n    La previsualización es orientativa y no refleja con exactitud el resultado final del bordado.\n  \u003c\/p\u003e\n\n  \u003c!-- Controles --\u003e\n  \u003cdiv style=\"display:flex;flex-wrap:wrap;gap:10px;justify-content:space-between;max-width:750px;margin:0 auto;\"\u003e\n    \u003cinput type=\"text\" id=\"customText\" placeholder=\"Escribe un nombre\" style=\"flex:1 1 100%;padding:8px;border:1px solid #ccc;border-radius:4px;\"\u003e\n    \u003cinput type=\"color\" id=\"textColor\" value=\"#000000\" style=\"flex:1 1 48%;\"\u003e\n    \u003cselect id=\"fontFamily\" style=\"flex:1 1 48%;padding:6px;border:1px solid #ccc;border-radius:4px;\"\u003e\n      \u003coption\u003eArial\u003c\/option\u003e\n      \u003coption\u003eGeorgia\u003c\/option\u003e\n      \u003coption\u003eCourier New\u003c\/option\u003e\n      \u003coption\u003eTimes New Roman\u003c\/option\u003e\n    \u003c\/select\u003e\n    \u003cinput type=\"range\" id=\"fontSize\" min=\"10\" max=\"80\" value=\"30\" style=\"flex:1 1 48%;\"\u003e\n\n    \u003cdiv style=\"flex:1 1 100%;\"\u003e\n      \u003clabel\u003eIconos:\u003c\/label\u003e\n      \u003cdiv style=\"display:flex;gap:5px;justify-content:center;\"\u003e\n        \u003cimg class=\"icon-thumb\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0980\/3546\/6589\/files\/161.png?v=1757175634\" width=\"40\" height=\"40\" style=\"cursor:pointer;\"\u003e\n        \u003cimg class=\"icon-thumb\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0980\/3546\/6589\/files\/png-clipart-computer-icons-star-pink-singer-purple-cdr.png?v=1757175685\" width=\"40\" height=\"40\" style=\"cursor:pointer;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cinput type=\"range\" id=\"iconSize\" min=\"20\" max=\"120\" value=\"50\" style=\"flex:1 1 48%;\"\u003e\n    \u003cbutton id=\"resetDesign\" style=\"flex:1 1 100%;padding:8px;border:1px solid #007bff;border-radius:6px;background:#007bff;color:white;font-weight:bold;cursor:pointer;\"\u003eReiniciar diseño\u003c\/button\u003e\n  \u003c\/div\u003e\n\n  \u003c!-- Botón Agregar al carrito --\u003e\n  \u003cbutton id=\"addToCartBtn\" style=\"margin-top:20px;padding:12px 20px;background:#28a745;color:white;border:none;border-radius:6px;font-size:16px;cursor:pointer;\"\u003e\n    Agregar al carrito\n  \u003c\/button\u003e\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n  #baberoCanvas {\n    width: 90%;\n    max-width: 400px;\n    height: auto;\n    border: 2px solid #e6e6e6;\n    border-radius: 10px;\n    display: block;\n    margin: 0 auto 5px;\n    touch-action: none;\n  }\n\u003c\/style\u003e\n\n\u003cscript\u003e\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n  const canvas = document.getElementById(\"baberoCanvas\");\n  const ctx = canvas.getContext(\"2d\");\n  const internalSize = 400;\n  canvas.width = internalSize;\n  canvas.height = internalSize;\n\n  let baberoImg = new Image();\n  let customText = \"\";\n  let textColor = \"#000000\";\n  let fontFamily = \"Arial\";\n  let fontSize = 30;\n  let textX = 200, textY = 200;\n  let currentIcon = null;\n  let iconSize = 50;\n  let iconX = 300, iconY = 300;\n  let dragging = null;\n\n  function draw() {\n    ctx.clearRect(0,0,canvas.width,canvas.height);\n    if (baberoImg.src) ctx.drawImage(baberoImg,0,0,canvas.width,canvas.height);\n    if (customText) {\n      ctx.fillStyle = textColor;\n      ctx.font = fontSize+\"px \"+fontFamily;\n      ctx.textAlign = \"center\";\n      ctx.fillText(customText,textX,textY);\n    }\n    if (currentIcon) {\n      ctx.drawImage(currentIcon, iconX-iconSize\/2, iconY-iconSize\/2, iconSize, iconSize);\n    }\n  }\n\n  function getMousePos(e){\n    const rect = canvas.getBoundingClientRect();\n    const scaleX = internalSize \/ canvas.clientWidth;\n    const scaleY = internalSize \/ canvas.clientHeight;\n    const clientX = e.clientX !== undefined ? e.clientX : e.touches[0].clientX;\n    const clientY = e.clientY !== undefined ? e.clientY : e.touches[0].clientY;\n    return {\n      x: (clientX - rect.left) * scaleX,\n      y: (clientY - rect.top) * scaleY\n    };\n  }\n\n  canvas.addEventListener(\"mousedown\", startDrag);\n  canvas.addEventListener(\"touchstart\", startDrag);\n  canvas.addEventListener(\"mousemove\", drag);\n  canvas.addEventListener(\"touchmove\", drag);\n  canvas.addEventListener(\"mouseup\", endDrag);\n  canvas.addEventListener(\"touchend\", endDrag);\n\n  function startDrag(e){\n    e.preventDefault();\n    const pos = getMousePos(e);\n    if(customText){\n      ctx.font = fontSize+\"px \"+fontFamily;\n      const textWidth = ctx.measureText(customText).width;\n      if(pos.x \u003e textX-textWidth\/2 \u0026\u0026 pos.x \u003c textX+textWidth\/2 \u0026\u0026\n         pos.y \u003e textY-fontSize \u0026\u0026 pos.y \u003c textY){\n        dragging = \"text\"; return;\n      }\n    }\n    if(currentIcon){\n      if(pos.x \u003e iconX-iconSize\/2 \u0026\u0026 pos.x \u003c iconX+iconSize\/2 \u0026\u0026\n         pos.y \u003e iconY-iconSize\/2 \u0026\u0026 pos.y \u003c iconY+iconSize\/2){\n        dragging = \"icon\"; return;\n      }\n    }\n  }\n  function drag(e){\n    if(!dragging) return;\n    e.preventDefault();\n    const pos = getMousePos(e);\n    if(dragging==\"text\"){ textX = pos.x; textY = pos.y; }\n    if(dragging==\"icon\"){ iconX = pos.x; iconY = pos.y; }\n    draw();\n  }\n  function endDrag(){ dragging = null; }\n\n  document.getElementById(\"customText\").addEventListener(\"input\", e=\u003e{customText=e.target.value;draw();});\n  document.getElementById(\"textColor\").addEventListener(\"input\", e=\u003e{textColor=e.target.value;draw();});\n  document.getElementById(\"fontFamily\").addEventListener(\"change\", e=\u003e{fontFamily=e.target.value;draw();});\n  document.getElementById(\"fontSize\").addEventListener(\"input\", e=\u003e{fontSize=e.target.value;draw();});\n  document.getElementById(\"iconSize\").addEventListener(\"input\", e=\u003e{iconSize=e.target.value;draw();});\n  document.querySelectorAll(\".icon-thumb\").forEach(img=\u003e{\n    img.addEventListener(\"click\",()=\u003e{ currentIcon = new Image(); currentIcon.src=img.src; currentIcon.onload=draw; });\n  });\n  document.getElementById(\"resetDesign\").addEventListener(\"click\",()=\u003e{\n    customText=\"\"; document.getElementById(\"customText\").value=\"\";\n    textColor=\"#000000\"; document.getElementById(\"textColor\").value=\"#000000\";\n    fontFamily=\"Arial\"; document.getElementById(\"fontFamily\").value=\"Arial\";\n    fontSize=30; document.getElementById(\"fontSize\").value=30;\n    currentIcon=null; document.getElementById(\"iconSize\").value=50;\n    textX=200;textY=200;iconX=300;iconY=300;draw();\n  });\n  document.querySelectorAll(\".babero-thumb\").forEach(img=\u003e{\n    img.addEventListener(\"click\",()=\u003e{baberoImg.src=img.src;baberoImg.onload=draw;});\n  });\n\n  draw();\n\n  document.getElementById(\"addToCartBtn\").addEventListener(\"click\", function() {\n    const canvasDataURL = canvas.toDataURL(\"image\/png\");\n    const params = new URLSearchParams();\n    params.append(\"id\", \"{{ product.variants[0].id }}\");\n    params.append(\"quantity\", \"1\");\n    params.append(\"properties[Nombre]\", customText);\n    params.append(\"properties[Color]\", textColor);\n    params.append(\"properties[Fuente]\", fontFamily);\n    params.append(\"properties[Tamaño]\", fontSize);\n    params.append(\"properties[Icono]\", currentIcon ? currentIcon.src : \"\");\n    params.append(\"properties[Icono tamaño]\", iconSize);\n    params.append(\"properties[Imagen personalizada]\", canvasDataURL);\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/x-www-form-urlencoded\" },\n      body: params.toString()\n    })\n    .then(res=\u003eres.json())\n    .then(data=\u003e{\n      alert(\"Producto agregado al carrito con tu personalización!\");\n      window.location.href=\"\/cart\";\n    })\n    .catch(err=\u003econsole.error(err));\n  });\n});\n\u003c\/script\u003e","brand":"Creando Recuerdos","offers":[{"title":"Default Title","offer_id":58373927010653,"sku":null,"price":18.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0980\/3546\/6589\/files\/ImagendeWhatsApp2025-08-29alas02.20.52_5a7e6beb.jpg?v=1756426921"},{"product_id":"tote-bag-musical","title":"Tote Bag 'Musical'","description":"","brand":"Mimú","offers":[{"title":"Default Title","offer_id":62464110952797,"sku":null,"price":12.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0980\/3546\/6589\/files\/TOTEBAG_MUSICAL.jpg?v=1762191497"},{"product_id":"tote-bag-flores-con-inicial","title":"Tote Bag 'Flores' (con inicial)","description":"","brand":"Mimú","offers":[{"title":"Default Title","offer_id":62476324143453,"sku":null,"price":14.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0980\/3546\/6589\/files\/TOTEBAGG.jpg?v=1762289384"},{"product_id":"pack-de-2-neceseres-a-juego","title":"Pack de 2 neceseres a juego","description":"","brand":"Mimú","offers":[{"title":"Default Title","offer_id":63227784724829,"sku":null,"price":16.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0980\/3546\/6589\/files\/neceser.jpg?v=1769623927"},{"product_id":"pack-body-camiseta-a-juego","title":"Pack Body + Camiseta a juego","description":"","brand":"Mimú","offers":[{"title":"Default Title","offer_id":63271599079773,"sku":null,"price":30.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0980\/3546\/6589\/files\/1000367910.png?v=1770055161"}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0980\/3546\/6589\/collections\/neceser.jpg?v=1769703404","url":"https:\/\/mimu.digital\/collections\/coleccion-de-bordados.oembed","provider":"Mimú","version":"1.0","type":"link"}