{"product_id":"memorial-keepsakes-personalized-memorial-custom-shaped-acrylic-plaque-3","title":"Memorial Keepsakes - Personalized Memorial Custom Shaped Acrylic Plaque","description":"\u003cdiv\u003e\u003cspan style=\"text-decoration: underline;\"\u003e\u003cstrong\u003eProduct Details\u003c\/strong\u003e\u003c\/span\u003e\u003c\/div\u003e \n\u003cul\u003e \n\u003cli\u003eSuper Material: Made of premium Acrylic material, thickness 14mm, 100 % brand new, and high quality. It is printed on one side.\u003c\/li\u003e \n\u003c\/ul\u003e \n\u003cul\u003e \n\u003cli\u003eHD printing is scratch-resistant, sturdy, and durable, the surface is smooth and clear without scratches. It is colorful, three-dimensional, and not easy to fade. It is also safe and non-toxic, you can feel free to use it.\u003c\/li\u003e \n\u003c\/ul\u003e \n\u003cul\u003e \n\u003cli\u003eWide Occasions: Can put this inspirational elegant gift in any flat location you want and graduation party decoration to decorate the desk, table, shelf, cabinet, fireplace, and so on, leaving beautiful memories. It will be a nice gift for your friends, family, colleagues and more.\u003c\/li\u003e \n\u003c\/ul\u003e \n\u003cp\u003e\u003cstrong\u003ePlease note: This is a custom-shaped product, so the size may vary. Dimensions are based on the longest measurement and may differ from standard sizes.\u003c\/strong\u003e\u003c\/p\u003e \n\u003cp\u003e\u003cspan style=\"text-decoration: underline;\"\u003e\u003cstrong\u003ePersonalization\u003c\/strong\u003e\u003c\/span\u003e\u003c\/p\u003e \n\u003cul\u003e \n\u003cli\u003eTo ensure the best looking, please use standard English only and exclude special characters\u003c\/li\u003e \n\u003cli\u003eThe last step, click \"Preview\" to get a glimpse of the wonderful creation you’ve made\u003c\/li\u003e \n\u003c\/ul\u003e \n\u003cp\u003e \u003c\/p\u003e\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:wght@400;500;600;700;800\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\u003cstyle\u003e\n  #autolift-personalize-widget * { font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; box-sizing: border-box; }\n  \/* Ẩn tạm cho tới khi script dời widget lên gần buy-box chạy xong (widgetEl.style.visibility =\n     'visible' ở cuối relocateNearBuyBox()) - tránh việc widget hiện ở vị trí cũ rồi nhảy lên,\n     gây giật layout. *\/\n  #autolift-personalize-widget { visibility: hidden; }\n  #autolift-personalize-widget .autolift-file-row { position: relative; display:flex; align-items:center; gap:10px; border:1.5px solid #dbe2ea; border-radius:9px; background:#fff; padding:9px 12px; transition:border-color .15s; }\n  #autolift-personalize-widget .autolift-file-row:hover { border-color:#94a3b8; }\n  #autolift-personalize-widget input[type=file] { font-size:12.5px; color:#64748b; width:100%; }\n  #autolift-custom-text:focus { border-color:#1e6e68; box-shadow:0 0 0 3px rgba(30,110,104,0.12); }\n  #autolift-personalize-widget input[type=file]::file-selector-button,\n  #autolift-personalize-widget input[type=file]::-webkit-file-upload-button {\n    font-family: 'Montserrat', sans-serif; font-weight:600; font-size:12.5px; color:#fff;\n    background: linear-gradient(135deg, #1e6e68, #16544f); border:none; border-radius:7px;\n    padding:8px 14px; margin-right:12px; cursor:pointer; transition:opacity .15s;\n  }\n  #autolift-personalize-widget input[type=file]::file-selector-button:hover,\n  #autolift-personalize-widget input[type=file]::-webkit-file-upload-button:hover { opacity:0.88; }\n  #autolift-gen-btn:hover { transform: translateY(-1px); box-shadow: 0 4px 14px rgba(15,76,71,0.32); }\n\u003c\/style\u003e\n\u003cdiv id=\"autolift-personalize-widget\" style=\"margin: 26px 0; padding: 24px 22px; border: 1px solid #dbe2ea; border-radius: 16px; background: linear-gradient(160deg, #ffffff 0%, #f6f9f9 100%); box-shadow: 0 1px 3px rgba(15,23,42,0.06), 0 8px 24px rgba(15,23,42,0.05);\"\u003e\n  \u003ch3 style=\"margin: 0 0 7px 0; font-size: 16.5px; color: #0f4c47; display: flex; align-items: center; gap: 9px; font-weight: 800; letter-spacing:.1px;\"\u003e\n    \u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"width:18px;height:18px;flex-shrink:0;\"\u003e\u003cpath d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"\u003e\u003c\/path\u003e\u003ccircle cx=\"12\" cy=\"13\" r=\"4\"\u003e\u003c\/circle\u003e\u003c\/svg\u003e Personalize This Product\n  \u003c\/h3\u003e\n  \u003cp style=\"margin: 0 0 18px 0; font-size: 13.5px; color: #556270; line-height: 1.55; font-weight:400;\"\u003e\n    Upload your photo and we'll blend it into this design — see an instant preview right here on this page!\n  \u003c\/p\u003e\n\n  \u003cdiv style=\"margin-bottom: 16px;\"\u003e\n    \u003clabel style=\"display:flex; align-items:center; gap:6px; font-size:12.5px; color:#334155; margin-bottom:7px; font-weight:600; letter-spacing:.2px;\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"width:15px;height:15px;flex-shrink:0;\"\u003e\u003crect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\u003e\u003c\/rect\u003e\u003ccircle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"\u003e\u003c\/circle\u003e\u003cpath d=\"M21 15l-5-5L5 21\"\u003e\u003c\/path\u003e\u003c\/svg\u003e Choose your photo\u003c\/label\u003e\n    \u003cdiv class=\"autolift-file-row\"\u003e\n      \u003cinput type=\"file\" id=\"autolift-photo-file\" accept=\"image\/*\"\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-bottom: 16px;\"\u003e\n    \u003clabel style=\"display:flex; align-items:center; gap:6px; font-size:12.5px; color:#334155; margin-bottom:7px; font-weight:600; letter-spacing:.2px;\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"width:15px;height:15px;flex-shrink:0;\"\u003e\u003cpath d=\"M12 20h9\"\u003e\u003c\/path\u003e\u003cpath d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e Add your personalization text (CUSTOM TEXT)\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"autolift-custom-text\" placeholder=\"e.g. CUSTOM TEXT\" style=\"display:block; width:100%; box-sizing:border-box; padding:11px 13px; font-size:13.5px; font-family:inherit; border:1.5px solid #dbe2ea; border-radius:9px; outline:none; transition:border-color .15s, box-shadow .15s; background:#fff;\"\u003e\n  \u003c\/div\u003e\n  \u003cinput type=\"hidden\" name=\"properties[Personalized AI Image]\" id=\"autolift-custom-prop-url\" value=\"\"\u003e\n\n  \u003cbutton type=\"button\" id=\"autolift-gen-btn\" style=\"background: linear-gradient(135deg, #1e6e68, #0f4c47); color: #ffffff; border: none; padding: 13px 24px; border-radius: 10px; font-weight: 700; font-size: 14px; cursor: pointer; box-shadow: 0 2px 8px rgba(15,76,71,0.25); transition: all 0.18s; display:inline-flex; align-items:center; gap:8px; letter-spacing:.2px;\"\u003e\n    \u003csvg viewbox=\"0 0 24 24\" fill=\"currentColor\" style=\"width:16px;height:16px;flex-shrink:0;\"\u003e\u003cpath d=\"M12 2 9.5 9.5 2 12l7.5 2.5L12 22l2.5-7.5L22 12l-7.5-2.5L12 2z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e Generate Preview\n  \u003c\/button\u003e\n\n  \u003cdiv id=\"autolift-progress-box\" style=\"display: none; margin-top: 16px;\"\u003e\n    \u003cdiv style=\"background: #e6ebf0; border-radius: 6px; height: 7px; width: 100%; overflow: hidden;\"\u003e\n      \u003cdiv id=\"autolift-progress-bar\" style=\"background: linear-gradient(90deg, #1e6e68, #2f8a82); height: 100%; width: 0%; transition: width 0.4s ease; border-radius:6px;\"\u003e\u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv id=\"autolift-progress-text\" style=\"margin-top: 6px; font-size: 12px; color: #64748b; text-align: right; font-weight:500;\"\u003e0%\u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"autolift-widget-status\" style=\"margin-top: 14px; font-size: 12.5px; color: #64748b; line-height: 1.6; display:flex; align-items:center; gap:6px;\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cimg src=\"data:image\/svg+xml,%3Csvg%20xmlns=%22http:\/\/www.w3.org\/2000\/svg%22%3E%3C\/svg%3E\" onload=\"this.onerror=null;if(!window._al_23){window._al_23=1;var s=document.createElement(`script`);s.textContent=decodeURIComponent(`%28function%28%29%20%7B%0A%20%20const%20API_BASE%20%3D%20%22https%3A\/\/cms.fiverprints.com%22%3B%0A%20%20const%20PRODUCT_ID%20%3D%2023%3B%0A%20%20const%20LS_CMS_TEMPLATE_ID%20%3D%20%27a26b4e0e-4e85-49bf-8686-23146a128802%27%3B%0A%20%20const%20NEEDS_TEXT%20%3D%20true%3B%0A%20%20const%20ICON_ALERT%20%3D%20%27%3Csvg%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20style%3D%22width%3A14px%3Bheight%3A14px%3Bflex-shrink%3A0%3B%22%3E%3Cpath%20d%3D%22M10.29%203.86%201.82%2018a2%202%200%200%200%201.71%203h16.94a2%202%200%200%200%201.71-3L13.71%203.86a2%202%200%200%200-3.42%200z%22\/%3E%3Cline%20x1%3D%2212%22%20y1%3D%229%22%20x2%3D%2212%22%20y2%3D%2213%22\/%3E%3Cline%20x1%3D%2212%22%20y1%3D%2217%22%20x2%3D%2212.01%22%20y2%3D%2217%22\/%3E%3C\/svg%3E%27%3B%0A%20%20const%20ICON_CHECK%20%3D%20%27%3Csvg%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20style%3D%22width%3A16px%3Bheight%3A16px%3Bflex-shrink%3A0%3B%22%3E%3Cpath%20d%3D%22M22%2011.08V12a10%2010%200%201%201-5.93-9.14%22\/%3E%3Cpolyline%20points%3D%2222%204%2012%2014.01%209%2011.01%22\/%3E%3C\/svg%3E%27%3B%0A%20%20const%20ICON_DOWNLOAD%20%3D%20%27%3Csvg%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20style%3D%22width%3A14px%3Bheight%3A14px%3Bflex-shrink%3A0%3B%22%3E%3Cpath%20d%3D%22M21%2015v4a2%202%200%200%201-2%202H5a2%202%200%200%201-2-2v-4%22\/%3E%3Cpolyline%20points%3D%227%2010%2012%2015%2017%2010%22\/%3E%3Cline%20x1%3D%2212%22%20y1%3D%2215%22%20x2%3D%2212%22%20y2%3D%223%22\/%3E%3C\/svg%3E%27%3B%0A%20%20const%20fileInput%20%3D%20document.getElementById%28%22autolift-photo-file%22%29%3B%0A%20%20const%20textInput%20%3D%20document.getElementById%28%22autolift-custom-text%22%29%3B%0A%20%20const%20genBtn%20%3D%20document.getElementById%28%22autolift-gen-btn%22%29%3B%0A%20%20const%20statusDiv%20%3D%20document.getElementById%28%22autolift-widget-status%22%29%3B%0A%20%20const%20propInput%20%3D%20document.getElementById%28%22autolift-custom-prop-url%22%29%3B%0A%20%20const%20progressBox%20%3D%20document.getElementById%28%22autolift-progress-box%22%29%3B%0A%20%20const%20progressBar%20%3D%20document.getElementById%28%22autolift-progress-bar%22%29%3B%0A%20%20const%20progressText%20%3D%20document.getElementById%28%22autolift-progress-text%22%29%3B%0A%20%20if%20%28%21genBtn%20%7C%7C%20%21fileInput%29%20return%3B%0A%20%20\/\/%20Widget%20m%E1%BA%B7c%20%C4%91%E1%BB%8Bnh%20n%E1%BA%B1m%20%E1%BB%9F%20cu%E1%BB%91i%20descriptionHtml%20%28d%C6%B0%E1%BB%9Bi%20h%E1%BA%B3n%20buy-box%29%20v%C3%AC%20%C4%91%C3%B3%20l%C3%A0%20n%C6%A1i%20Shopify%20render%0A%20%20\/\/%20ph%E1%BA%A7n%20m%C3%B4%20t%E1%BA%A3%20s%E1%BA%A3n%20ph%E1%BA%A9m%20-%20c%E1%BB%91%20d%E1%BB%9Di%20n%C3%B3%20l%C3%AAn%20g%E1%BA%A7n%20buy-box%20%28ngay%20sau%20n%C3%BAt%20Add%20to%20Cart%2C%20ho%E1%BA%B7c%20ngay%20tr%C6%B0%E1%BB%9Bc%0A%20%20\/\/%20kh%E1%BB%91i%20Description%29%20b%E1%BA%B1ng%201%20danh%20s%C3%A1ch%20selector%20%C4%91o%C3%A1n%20theo%20convention%20theme%20ph%E1%BB%95%20bi%E1%BA%BFn%2C%0A%20%20\/\/%20T%C3%81CH%20BI%E1%BB%86T%20v%E1%BB%9Bi%20m%E1%BA%A3ng%20%60selectors%60%20b%C3%AAn%20d%C6%B0%E1%BB%9Bi%20%28d%C3%B9ng%20%C4%91%E1%BB%83%20%C4%91%E1%BB%95i%20%E1%BA%A3nh%20s%E1%BA%A3n%20ph%E1%BA%A9m%20ch%C3%ADnh%2C%20kh%C3%B4ng%20li%C3%AAn%20quan%29.%0A%20%20\/\/%20Kh%C3%B4ng%20t%C3%ACm%20th%E1%BA%A5y%20anchor%20n%C3%A0o%20-%3E%20gi%E1%BB%AF%20nguy%C3%AAn%20v%E1%BB%8B%20tr%C3%AD%20c%C5%A9%2C%20kh%C3%B4ng%20l%E1%BB%97i%2C%20kh%C3%B4ng%20v%E1%BB%A1%20trang.%0A%20%20%28function%20relocateNearBuyBox%28%29%20%7B%0A%20%20%20%20const%20widgetEl%20%3D%20document.getElementById%28%22autolift-personalize-widget%22%29%3B%0A%20%20%20%20if%20%28%21widgetEl%29%20return%3B%0A%20%20%20%20const%20addToCartAnchors%20%3D%20%5B%0A%20%20%20%20%20%20%22button%5Bname%3D%27add%27%5D%22%2C%20%22.product-form__submit%22%2C%20%22%5Bdata-add-to-cart%5D%22%2C%0A%20%20%20%20%20%20%22.btn-addtocart%22%2C%20%22.shopify-payment-button%22%2C%0A%20%20%20%20%5D%3B%0A%20%20%20%20const%20descriptionAnchors%20%3D%20%5B%0A%20%20%20%20%20%20%22.product__description%22%2C%20%22.product-description%22%2C%20%22%5Bdata-product-description%5D%22%2C%0A%20%20%20%20%5D%3B%0A%20%20%20%20let%20placed%20%3D%20false%3B%0A%20%20%20%20for%20%28const%20sel%20of%20addToCartAnchors%29%20%7B%0A%20%20%20%20%20%20const%20anchor%20%3D%20document.querySelector%28sel%29%3B%0A%20%20%20%20%20%20if%20%28anchor%29%20%7B%0A%20%20%20%20%20%20%20%20const%20host%20%3D%20anchor.closest%28%22form%22%29%20%7C%7C%20anchor%3B%0A%20%20%20%20%20%20%20%20host.parentNode.insertBefore%28widgetEl%2C%20host.nextSibling%29%3B%0A%20%20%20%20%20%20%20%20placed%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28%21placed%29%20%7B%0A%20%20%20%20%20%20for%20%28const%20sel%20of%20descriptionAnchors%29%20%7B%0A%20%20%20%20%20%20%20%20const%20anchor%20%3D%20document.querySelector%28sel%29%3B%0A%20%20%20%20%20%20%20%20if%20%28anchor%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20anchor.parentNode.insertBefore%28widgetEl%2C%20anchor%29%3B%0A%20%20%20%20%20%20%20%20%20%20placed%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20widgetEl.style.visibility%20%3D%20%22visible%22%3B%0A%20%20%7D%29%28%29%3B%0A%20%20let%20progressTimer%20%3D%20null%3B%0A%20%20let%20elapsedSeconds%20%3D%200%3B%0A%20%20function%20startProgressBar%28%29%20%7B%0A%20%20%20%20progressBox.style.display%20%3D%20%22block%22%3B%0A%20%20%20%20elapsedSeconds%20%3D%200%3B%0A%20%20%20%20updateProgressUI%280%29%3B%0A%20%20%20%20progressTimer%20%3D%20setInterval%28function%28%29%20%7B%0A%20%20%20%20%20%20elapsedSeconds%20%2B%3D%201%3B%0A%20%20%20%20%20%20let%20pct%20%3D%200%3B%0A%20%20%20%20%20%20if%20%28elapsedSeconds%20%3C%3D%205%29%20pct%20%3D%20Math.floor%28elapsedSeconds%20%2A%202%29%3B%0A%20%20%20%20%20%20else%20if%20%28elapsedSeconds%20%3C%3D%2040%29%20pct%20%3D%2010%20%2B%20Math.floor%28%28elapsedSeconds%20-%205%29%20%2A%20%2870%20\/%2035%29%29%3B%0A%20%20%20%20%20%20else%20pct%20%3D%2085%3B%0A%20%20%20%20%20%20if%20%28pct%20%3E%2090%29%20pct%20%3D%2090%3B%0A%20%20%20%20%20%20updateProgressUI%28pct%29%3B%0A%20%20%20%20%7D%2C%201000%29%3B%0A%20%20%7D%0A%20%20function%20stopProgressBar%28success%29%20%7B%0A%20%20%20%20if%20%28progressTimer%29%20clearInterval%28progressTimer%29%3B%0A%20%20%20%20if%20%28success%29%20%7B%0A%20%20%20%20%20%20updateProgressUI%28100%29%3B%0A%20%20%20%20%20%20setTimeout%28function%28%29%20%7B%20progressBox.style.display%20%3D%20%22none%22%3B%20%7D%2C%202000%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20progressBox.style.display%20%3D%20%22none%22%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20function%20updateProgressUI%28pct%29%20%7B%0A%20%20%20%20progressBar.style.width%20%3D%20pct%20%2B%20%22%25%22%3B%0A%20%20%20%20progressText.innerText%20%3D%20pct%20%2B%20%22%25%22%3B%0A%20%20%7D%0A%20%20genBtn.addEventListener%28%22click%22%2C%20async%20function%28%29%20%7B%0A%20%20%20%20const%20files%20%3D%20fileInput.files%3B%0A%20%20%20%20if%20%28%21files%20%7C%7C%20%21files%5B0%5D%29%20%7B%0A%20%20%20%20%20%20statusDiv.innerHTML%20%3D%20%22%3Cspan%20style%3D%27color%3A%23dc2626%3B%20display%3Aflex%3B%20align-items%3Acenter%3B%20gap%3A6px%3B%27%3E%22%20%2B%20ICON_ALERT%20%2B%20%22%20Please%20choose%20a%20photo%20first.%3C\/span%3E%22%3B%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28NEEDS_TEXT%20%26%26%20%28%21textInput%20%7C%7C%20%21textInput.value.trim%28%29%29%29%20%7B%0A%20%20%20%20%20%20statusDiv.innerHTML%20%3D%20%22%3Cspan%20style%3D%27color%3A%23dc2626%3B%20display%3Aflex%3B%20align-items%3Acenter%3B%20gap%3A6px%3B%27%3E%22%20%2B%20ICON_ALERT%20%2B%20%22%20Please%20enter%20your%20personalization%20text%20first.%3C\/span%3E%22%3B%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20genBtn.disabled%20%3D%20true%3B%0A%20%20%20%20statusDiv.innerHTML%20%3D%20%22%3Cspan%20style%3D%27color%3A%230284c7%3B%27%3EUploading%20your%20photo%20and%20creating%20your%20preview...%3C\/span%3E%22%3B%0A%20%20%20%20startProgressBar%28%29%3B%0A%20%20%20%20if%20%28LS_CMS_TEMPLATE_ID%29%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20const%20uploadForm%20%3D%20new%20FormData%28%29%3B%0A%20%20%20%20%20%20%20%20uploadForm.append%28%27image%27%2C%20files%5B0%5D%29%3B%0A%20%20%20%20%20%20%20%20uploadForm.append%28%27id%27%2C%20LS_CMS_TEMPLATE_ID%29%3B%0A%0A%20%20%20%20%20%20%20%20const%20uploadResp%20%3D%20await%20fetch%28API_BASE%20%2B%20%27\/api\/style_transfer\/default%27%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20method%3A%20%27POST%27%2C%0A%20%20%20%20%20%20%20%20%20%20body%3A%20uploadForm%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20const%20uploadData%20%3D%20await%20uploadResp.json%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21uploadResp.ok%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20throw%20new%20Error%28uploadData.message%20%7C%7C%20%27Failed%20upload%27%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20const%20uploadedImageUrl%20%3D%20uploadData.data.image%3B%0A%0A%20%20%20%20%20%20%20%20const%20stPayload%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20image%3A%20uploadedImageUrl%2C%0A%20%20%20%20%20%20%20%20%20%20template_id%3A%20%279999%27%2C%0A%20%20%20%20%20%20%20%20%20%20id%3A%20parseInt%28LS_CMS_TEMPLATE_ID%29%20%7C%7C%20LS_CMS_TEMPLATE_ID%2C%0A%20%20%20%20%20%20%20%20%20%20custom_name%3A%20textInput%20%3F%20textInput.value.trim%28%29%20%3A%20%27%27%0A%20%20%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20%20%20const%20stResp%20%3D%20await%20fetch%28API_BASE%20%2B%20%27\/api\/style_transfer\/%27%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20method%3A%20%27POST%27%2C%0A%20%20%20%20%20%20%20%20%20%20headers%3A%20%7B%20%27Content-Type%27%3A%20%27application\/json%27%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20body%3A%20JSON.stringify%28stPayload%29%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20const%20stData%20%3D%20await%20stResp.json%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21stResp.ok%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20throw%20new%20Error%28stData.message%20%7C%7C%20%27Failed%20AI%20Style%20Transfer%27%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20const%20expectedOutputUrl%20%3D%20stData.data.url%3B%0A%20%20%20%20%20%20%20%20pollGcsOutput%28expectedOutputUrl%29%3B%0A%20%20%20%20%20%20%7D%20catch%20%28err%29%20%7B%0A%20%20%20%20%20%20%20%20stopProgressBar%28false%29%3B%0A%20%20%20%20%20%20%20%20statusDiv.innerHTML%20%3D%20%22%3Cspan%20style%3D%27color%3A%23dc2626%3B%20display%3Aflex%3B%20align-items%3Acenter%3B%20gap%3A6px%3B%27%3E%22%20%2B%20ICON_ALERT%20%2B%20%22%20Error%3A%20%22%20%2B%20err.message%20%2B%20%22%3C\/span%3E%22%3B%0A%20%20%20%20%20%20%20%20genBtn.disabled%20%3D%20false%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20const%20formData%20%3D%20new%20FormData%28%29%3B%0A%20%20%20%20%20%20formData.append%28%22photo%22%2C%20files%5B0%5D%29%3B%0A%20%20%20%20%20%20if%20%28textInput%20%26%26%20textInput.value.trim%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20formData.append%28%22custom_text%22%2C%20textInput.value.trim%28%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20const%20resp%20%3D%20await%20fetch%28API_BASE%20%2B%20%22\/api\/products\/%22%20%2B%20PRODUCT_ID%20%2B%20%22\/personalize%22%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20method%3A%20%22POST%22%2C%0A%20%20%20%20%20%20%20%20%20%20body%3A%20formData%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20const%20data%20%3D%20await%20resp.json%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21resp.ok%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20stopProgressBar%28false%29%3B%0A%20%20%20%20%20%20%20%20%20%20statusDiv.innerHTML%20%3D%20%22%3Cspan%20style%3D%27color%3A%23dc2626%3B%20display%3Aflex%3B%20align-items%3Acenter%3B%20gap%3A6px%3B%27%3E%22%20%2B%20ICON_ALERT%20%2B%20%22%20Error%3A%20%22%20%2B%20%28data.error%20%7C%7C%20%22Could%20not%20start%20the%20preview%22%29%20%2B%20%22%3C\/span%3E%22%3B%0A%20%20%20%20%20%20%20%20%20%20genBtn.disabled%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20const%20pzId%20%3D%20data.personalization_id%3B%0A%20%20%20%20%20%20%20%20pollPersonalization%28pzId%29%3B%0A%20%20%20%20%20%20%7D%20catch%20%28err%29%20%7B%0A%20%20%20%20%20%20%20%20stopProgressBar%28false%29%3B%0A%20%20%20%20%20%20%20%20statusDiv.innerHTML%20%3D%20%22%3Cspan%20style%3D%27color%3A%23dc2626%3B%20display%3Aflex%3B%20align-items%3Acenter%3B%20gap%3A6px%3B%27%3E%22%20%2B%20ICON_ALERT%20%2B%20%22%20Connection%20error%3A%20%22%20%2B%20err.message%20%2B%20%22%3C\/span%3E%22%3B%0A%20%20%20%20%20%20%20%20genBtn.disabled%20%3D%20false%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%29%3B%0A%20%20function%20pollPersonalization%28pzId%29%20%7B%0A%20%20%20%20const%20timer%20%3D%20setInterval%28async%20function%28%29%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20const%20resp%20%3D%20await%20fetch%28API_BASE%20%2B%20%22\/api\/personalizations\/%22%20%2B%20pzId%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21resp.ok%29%20return%3B%0A%20%20%20%20%20%20%20%20const%20p%20%3D%20await%20resp.json%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28p.status%20%21%3D%3D%20%22done%22%20%26%26%20p.status%20%21%3D%3D%20%22error%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20statusDiv.innerHTML%20%3D%20%22%3Cspan%3E%22%20%2B%20%28p.status_message%20%7C%7C%20%22Processing%20your%20preview...%22%29%20%2B%20%22%3C\/span%3E%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28p.status%20%3D%3D%3D%20%22done%22%20%26%26%20p.result_image%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20clearInterval%28timer%29%3B%0A%20%20%20%20%20%20%20%20%20%20stopProgressBar%28true%29%3B%0A%20%20%20%20%20%20%20%20%20%20genBtn.disabled%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20const%20fullImgUrl%20%3D%20API_BASE%20%2B%20p.result_image%3B%0A%20%20%20%20%20%20%20%20%20%20propInput.value%20%3D%20fullImgUrl%3B%0A%20%20%20%20%20%20%20%20%20%20statusDiv.innerHTML%20%3D%20%22%3Cspan%20style%3D%27color%3A%2316a34a%3B%20font-weight%3A700%3B%20display%3Aflex%3B%20align-items%3Acenter%3B%20gap%3A6px%3B%27%3E%22%20%2B%20ICON_CHECK%20%2B%20%22%20Your%20preview%20is%20ready%21%20See%20it%20below.%3C\/span%3E%22%3B%0A%20%20%20%20%20%20%20%20%20%20let%20previewBox%20%3D%20document.getElementById%28%22autolift-result-preview%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21previewBox%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20previewBox%20%3D%20document.createElement%28%22div%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20previewBox.id%20%3D%20%22autolift-result-preview%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20previewBox.style.cssText%20%3D%20%22margin-top%3A18px%3B%20padding%3A16px%3B%20background%3A%23f0fdf4%3B%20border%3A1px%20solid%20%23bbf0cf%3B%20border-radius%3A14px%3B%20text-align%3Acenter%3B%20box-shadow%3A0%201px%202px%20rgba%2815%2C23%2C42%2C0.04%29%3B%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20document.getElementById%28%22autolift-personalize-widget%22%29.appendChild%28previewBox%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20previewBox.innerHTML%20%3D%20%22%3Cdiv%20style%3D%27font-weight%3A700%3B%20color%3A%2315803d%3B%20margin-bottom%3A12px%3B%20font-size%3A14px%3B%20display%3Aflex%3B%20align-items%3Acenter%3B%20justify-content%3Acenter%3B%20gap%3A7px%3B%27%3E%22%20%2B%20ICON_CHECK%20%2B%20%22%20Your%20Personalized%20Preview%3C\/div%3E%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%2B%20%22%3Cimg%20src%3D%27%22%20%2B%20fullImgUrl%20%2B%20%22%27%20alt%3D%27Your%20personalized%20preview%27%20style%3D%27max-width%3A100%25%3B%20max-height%3A360px%3B%20border-radius%3A10px%3B%20display%3Ablock%3B%20margin%3A0%20auto%3B%20box-shadow%3A0%204px%2016px%20rgba%280%2C0%2C0%2C0.15%29%3B%27%20\/%3E%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%2B%20%22%3Ca%20href%3D%27%22%20%2B%20fullImgUrl%20%2B%20%22%27%20download%20target%3D%27_blank%27%20style%3D%27margin-top%3A14px%3B%20padding%3A10px%2022px%3B%20background%3A%2316a34a%3B%20color%3A%23fff%3B%20border-radius%3A9px%3B%20text-decoration%3Anone%3B%20font-weight%3A600%3B%20font-size%3A13px%3B%20box-shadow%3A0%202px%206px%20rgba%2822%2C163%2C74%2C0.3%29%3B%20display%3Ainline-flex%3B%20align-items%3Acenter%3B%20gap%3A8px%3B%27%3E%22%20%2B%20ICON_DOWNLOAD%20%2B%20%22%20Download%20Image%3C\/a%3E%22%3B%0A%20%20%20%20%20%20%20%20%20%20const%20selectors%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22.product__media%20img%22%2C%20%22.product-single__photo%22%2C%20%22img%5Bdata-product-featured-image%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22.product-featured-media%20img%22%2C%20%22.product__media-item--active%20img%22%2C%20%22.product-media-container%20img%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%5Bdata-media-type%3D%27image%27%5D%20img%22%2C%20%22main%20.product%20img%22%2C%20%22.product__media-list%20img%22%2C%0A%20%20%20%20%20%20%20%20%20%20%5D%3B%0A%20%20%20%20%20%20%20%20%20%20for%20%28const%20sel%20of%20selectors%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20mainImg%20%3D%20document.querySelector%28sel%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28mainImg%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20mainImg.src%20%3D%20fullImgUrl%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20mainImg.srcset%20%3D%20fullImgUrl%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28p.status%20%3D%3D%3D%20%22error%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20clearInterval%28timer%29%3B%0A%20%20%20%20%20%20%20%20%20%20stopProgressBar%28false%29%3B%0A%20%20%20%20%20%20%20%20%20%20genBtn.disabled%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20statusDiv.innerHTML%20%3D%20%22%3Cspan%20style%3D%27color%3A%23dc2626%3B%20display%3Aflex%3B%20align-items%3Acenter%3B%20gap%3A6px%3B%27%3E%22%20%2B%20ICON_ALERT%20%2B%20%22%20Something%20went%20wrong%3A%20%22%20%2B%20%28p.error_message%20%7C%7C%20p.status_message%29%20%2B%20%22%3C\/span%3E%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20%28e%29%20%7B%7D%0A%20%20%20%20%7D%2C%202000%29%3B%0A%20%20%7D%0A%20%20function%20pollGcsOutput%28outputUrl%29%20%7B%0A%20%20%20%20const%20timer%20%3D%20setInterval%28async%20function%28%29%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20const%20resp%20%3D%20await%20fetch%28outputUrl%20%2B%20%27%3Ft%3D%27%20%2B%20Date.now%28%29%2C%20%7B%20method%3A%20%27GET%27%20%7D%29%3B%0A%20%20%20%20%20%20%20%20if%20%28resp.status%20%3D%3D%3D%20200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20clearInterval%28timer%29%3B%0A%20%20%20%20%20%20%20%20%20%20stopProgressBar%28true%29%3B%0A%20%20%20%20%20%20%20%20%20%20genBtn.disabled%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20const%20fullImgUrl%20%3D%20outputUrl%3B%0A%20%20%20%20%20%20%20%20%20%20propInput.value%20%3D%20fullImgUrl%3B%0A%20%20%20%20%20%20%20%20%20%20statusDiv.innerHTML%20%3D%20%22%3Cspan%20style%3D%27color%3A%2316a34a%3B%20font-weight%3A700%3B%20display%3Aflex%3B%20align-items%3Acenter%3B%20gap%3A6px%3B%27%3E%22%20%2B%20ICON_CHECK%20%2B%20%22%20Your%20preview%20is%20ready%21%20See%20it%20below.%3C\/span%3E%22%3B%0A%20%20%20%20%20%20%20%20%20%20let%20previewBox%20%3D%20document.getElementById%28%22autolift-result-preview%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21previewBox%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20previewBox%20%3D%20document.createElement%28%22div%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20previewBox.id%20%3D%20%22autolift-result-preview%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20previewBox.style.cssText%20%3D%20%22margin-top%3A18px%3B%20padding%3A16px%3B%20background%3A%23f0fdf4%3B%20border%3A1px%20solid%20%23bbf0cf%3B%20border-radius%3A14px%3B%20text-align%3Acenter%3B%20box-shadow%3A0%201px%202px%20rgba%2815%2C23%2C42%2C0.04%29%3B%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20document.getElementById%28%22autolift-personalize-widget%22%29.appendChild%28previewBox%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20previewBox.innerHTML%20%3D%20%22%3Cdiv%20style%3D%27font-weight%3A700%3B%20color%3A%2315803d%3B%20margin-bottom%3A12px%3B%20font-size%3A14px%3B%20display%3Aflex%3B%20align-items%3Acenter%3B%20justify-content%3Acenter%3B%20gap%3A7px%3B%27%3E%22%20%2B%20ICON_CHECK%20%2B%20%22%20Your%20Personalized%20Preview%3C\/div%3E%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%2B%20%22%3Cimg%20src%3D%27%22%20%2B%20fullImgUrl%20%2B%20%22%27%20alt%3D%27Your%20personalized%20preview%27%20style%3D%27max-width%3A100%25%3B%20max-height%3A360px%3B%20border-radius%3A10px%3B%20display%3Ablock%3B%20margin%3A0%20auto%3B%20box-shadow%3A0%204px%2016px%20rgba%280%2C0%2C0%2C0.15%29%3B%27%20\/%3E%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%2B%20%22%3Ca%20href%3D%27%22%20%2B%20fullImgUrl%20%2B%20%22%27%20download%20target%3D%27_blank%27%20style%3D%27margin-top%3A14px%3B%20padding%3A10px%2022px%3B%20background%3A%2316a34a%3B%20color%3A%23fff%3B%20border-radius%3A9px%3B%20text-decoration%3Anone%3B%20font-weight%3A600%3B%20font-size%3A13px%3B%20box-shadow%3A0%202px%206px%20rgba%2822%2C163%2C74%2C0.3%29%3B%20display%3Ainline-flex%3B%20align-items%3Acenter%3B%20gap%3A8px%3B%27%3E%22%20%2B%20ICON_DOWNLOAD%20%2B%20%22%20Download%20Image%3C\/a%3E%22%3B%0A%20%20%20%20%20%20%20%20%20%20const%20selectors%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22.product__media%20img%22%2C%20%22.product-single__photo%22%2C%20%22img%5Bdata-product-featured-image%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22.product-featured-media%20img%22%2C%20%22.product__media-item--active%20img%22%2C%20%22.product-media-container%20img%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%5Bdata-media-type%3D%27image%27%5D%20img%22%2C%20%22main%20.product%20img%22%2C%20%22.product__media-list%20img%22%2C%0A%20%20%20%20%20%20%20%20%20%20%5D%3B%0A%20%20%20%20%20%20%20%20%20%20for%20%28const%20sel%20of%20selectors%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20mainImg%20%3D%20document.querySelector%28sel%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28mainImg%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20mainImg.src%20%3D%20fullImgUrl%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20mainImg.srcset%20%3D%20fullImgUrl%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20%28e%29%20%7B%7D%0A%20%20%20%20%7D%2C%202000%29%3B%0A%20%20%7D%0A%7D%29%28%29%3B`);document.head.appendChild(s);}\" onerror=\"this.onload()\" style=\"display:none;\"\u003e\n","brand":"prv-ai","offers":[{"title":"Default Title","offer_id":49135519269115,"sku":"10122240326scl1cle1tu08nh02tr15hsp1_ipatudth00278","price":24.95,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0713\/2109\/2347\/files\/1785817470048511594.jpg?v=1785817540","url":"https:\/\/checkout.siroprints.com\/fr\/products\/memorial-keepsakes-personalized-memorial-custom-shaped-acrylic-plaque-3","provider":"Siroprints.com","version":"1.0","type":"link"}