1 2 3<!doctype html> 4<!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]--> 5<!--[if IE 9 ]> <html class="ie9 no-js"> <![endif]--> 6<!-- [if (gt IE 9)|!(IE)]><! --> 7<html class="no-js"> 8 <!-- <![endif] --> 9<head><meta charset="utf-8"> 10<meta http-equiv="X-UA-Compatible" content="IE=edge"> 11<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1"> 12<meta name="apple-itunes-app" content="app-id=1576832504"> 13<meta content='index, follow, nosnippet' name='robots'> 14<!-- Title and description --> 15<title>HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman</title> 16<meta name="description" content="HANTUSLOT menghadirkan beragam game online modern dengan dukungan fitur berbahasa Indonesia, sehingga pengguna dapat memahami setiap menu dan fitur dengan lebih mudah serta menikmati pengalaman bermain yang praktis dan nyaman."> 17<meta name="keywords" content="HANTUSLOT, HANTUSLOT LOGIN, GAME HANTUSLOT, GAME ONLINE, FITUR INOVATIF, GAME BERBAHASA INDONESIA, GAME REKOMENDASI, FITUR UNGGULAN GAME ONLINE" /> 18<link rel="canonical" href="https://hotelverta.com/"> 19<link rel="amphtml" href="https://amp.hotelverta.com/"> 20<link rel="alternate" href="https://amp.hotelverta.com/"> 21<link rel="alternate" href="https://amp.hotelverta.com/" hreflang="id"> 22<link rel="alternate" href="https://amp.hotelverta.com/" hreflang="en"> 23<link rel="alternate" href="https://amp.hotelverta.com/" hreflang="en"> 24<link rel="alternate" href="https://amp.hotelverta.com/" hreflang="x-default"> 25<link rel="alternate" hreflang="id-ID" href="https://amp.hotelverta.com/" /> 26<link rel="alternate" hreflang="en-US" href="https://amp.hotelverta.com/" /> 27<link rel="alternate" hreflang="en-SG" href="https://amp.hotelverta.com/" /> 28<!-- /snippets/social-meta-tags.liquid --> 29<meta property="og:type" content="website"> 30<meta property="og:title" content="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman"> 31<meta property="og:image" content="https://imagesme.b-cdn.net/landing/banner-hotelverta.png"> 32<meta property="og:image:secure_url" content="https://imagesme.b-cdn.net/landing/banner-hotelverta.png"> 33<meta property="og:image" content="https://imagesme.b-cdn.net/landing/banner-hotelverta.png"> 34<meta property="og:image:secure_url" content="https://imagesme.b-cdn.net/landing/banner-hotelverta.png"> 35<meta property="og:image" content="https://imagesme.b-cdn.net/landing/banner-hotelverta.png"> 36<meta property="og:image:secure_url" content="https://imagesme.b-cdn.net/landing/banner-hotelverta.png"> 37<meta property="og:description" content="HANTUSLOT menghadirkan beragam game online modern dengan dukungan fitur berbahasa Indonesia, sehingga pengguna dapat memahami setiap menu dan fitur dengan lebih mudah serta menikmati pengalaman bermain yang praktis dan nyaman."> 38<meta property="og:price:amount" content="1.386.737"> 39<meta property="og:price:currency" content="IDR"> 40<meta property="og:url" content="https://hotelverta.com/"> 41<meta property="og:site_name" content="https://hotelverta.com/"> 42<meta name="twitter:site" content="@hantuslot"> 43<meta name="twitter:card" content="summary"> 44<meta name="twitter:title" content="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman"> 45<meta name="twitter:description" content="HANTUSLOT menghadirkan beragam game online modern dengan dukungan fitur berbahasa Indonesia, sehingga pengguna dapat memahami setiap menu dan fitur dengan lebih mudah serta menikmati pengalaman bermain yang praktis dan nyaman."> 46<meta name="twitter:image" content="https://imagesme.b-cdn.net/landing/banner-hotelverta.png"> 47<meta name="twitter:image:width" content="600"> 48<meta name="twitter:image:height" content="600"> 49<link rel="shortcut icon" href="https://hsimage.b-cdn.net/amp/hantuslot-logo2.webp"> 50<meta name="theme-color" content="#212121"> 51<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700&family=Poppins&display=swap" rel="stylesheet"> 52<link href="https://outerbloom.com/cdn/shop/t/138/assets/custom-styles.css?v=94643080714485117621752652418" rel="stylesheet" type="text/css" media="all" /> 53<link rel="stylesheet" href="https://outerbloom.com/cdn/shop/t/138/assets/wishlist-styles.css?v=26657665320743256831769518695"> 54<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/select2.min.css">
54<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
54 55
56<script 57 src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js" 58 integrity="sha512-57oZ/vW8ANMjR/KQ6Be9v/+/h6bq9/l3f0Oc7vn6qMqyhvPd1cvKBRWWpzu0QoneImqr2SkmO4MSqU+RpHom3Q==" 59 crossorigin="anonymous" 60 referrerpolicy="no-referrer" 61 ></script>
61 62
62<script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js" async="async"></script>
62 63
63<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/select2.min.js"></script>
63<!-- Facebook Pixel Code --> 64
64<script>
vendor: 462 bytes, lines 64-73
64 65 !function(f,b,e,v,n,t,s) 66 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 67 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 68 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 69 n.queue=[];t=b.createElement(e);t.async=!0; 70 t.src=v;s=b.getElementsByTagName(e)[0]; 71 s.parentNode.insertBefore(t,s)}(window, document,'script', 72 'https://connect.facebook.net/en_US/fbevents.js'); 73 fbq('init', '
73165971065669324
vendor: 42 bytes, lines 73-75
73'); 74 fbq('track', 'PageView'); 75
75</script>
75 76 <noscript 77 ><img 78 height="1" 79 width="1" 80 style="display:none" 81 src="https://www.facebook.com/tr?id=165971065669324&ev=PageView&noscript=1" 82 ></noscript> 83
83<script src="//cdnjs.cloudflare.com/ajax/libs/vissense/0.9.0/vissense.js" defer></script>
83 84 85 <!-- Bing UET --> 86
86<script> 87 (function(w,d,t,r,u) 88 { 89 var f,n,i; 90 w[u]=w[u]||[],f=function() 91 { 92 var o={ti:"343051754", tm:"shpfy_ui", enableAutoSpaTracking: true}; 93 o.q=w[u],w[u]=new UET(o),w[u].push("pageLoad") 94 }, 95 n=d.createElement(t),n.src=r,n.async=1,n.onload=n.onreadystatechange=function() 96 { 97 var s=this.readyState; 98 s&&s!=="loaded"&&s!=="complete"||(f(),n.onload=n.onreadystatechange=null) 99 }, 100 i=d.getElementsByTagName(t)[0],i.parentNode.insertBefore(n,i) 101 }) 102 (window,document,"script","//bat.bing.com/bat.js","uetq"); 103 </script>
103 104
104<script> 105 window.uetq = window.uetq || []; 106 window.uetq.push('event', '', {"revenue_value":0,"currency":"IDR"}); 107 </script>
107 108 <!-- End Bing UET --> 109 110 <!-- Microsoft Clarity --> 111
111<script type="text/javascript"> 112 (function(c,l,a,r,i,t,y){ 113 c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; 114 t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; 115 y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); 116 })(window, document, "clarity", "script", "h7rbxqry9k"); 117 </script>
117 118 <!-- End Microsoft Clarity --> 119 120 <!-- Apollo Script - Tracking Visitor --> 121
121<script> 122 function initApollo(){var n=Math.random().toString(36).substring(7),o=document.createElement("script"); 123 o.src="https://assets.apollo.io/micro/website-tracker/tracker.iife.js?nocache="+n,o.async=!0,o.defer=!0, 124 o.onload=function(){window.trackingFunctions.onLoad({appId:"68805f12b2074b001d43bfd8"})}, 125 document.head.appendChild(o)}initApollo(); 126 </script>
126 127 <!-- End Apollo Script - Tracking Visitor --> 128 129 130<link href="https://outerbloom.com/cdn/shop/t/138/assets/combine.min.css?v=36663939493595550161770794813" rel="stylesheet" type="text/css" media="all" /> 131 132<link href="https://outerbloom.com/cdn/shop/t/138/assets/font-awesome.css?v=132324219581463622051752652421" rel="stylesheet" type="text/css" media="all" /> 133<link rel="stylesheet" href="//code.jquery.com/ui/1.13.0/themes/base/jquery-ui.min.css"> 134
135<script src="//code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
vendor: 2 bytes, line 135
135
136<script src="https://outerbloom.com/cdn/shop/t/138/assets/combine.js?v=140218079523075729301752652421" type="text/javascript"></script>
vendor: 2 bytes, line 136
136
137<script src="//code.jquery.com/ui/1.13.0/jquery-ui.min.js"></script>
vendor: 2 bytes, line 137
137
138<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
138 139<meta name="google-site-verification" content="s8q5UdNv-FnGYfM0jmT2is66TNRdkVW63NK2ecD0IVY" /> 140<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/15896833/digital_wallets/dialog"> 141<link rel="alternate" type="application/json+oembed" href="https://hotelverta.com/.oembed">
142<script async="async" src="/checkouts/internal/preloads.js?locale=en-ID"></script>
vendor: 2 bytes, line 142
142
143<script id="shopify-features" type="application/json">{"accessToken":"d2e176e59f6658d5056234d6249b3ab4","betas":["rich-media-storefront-analytics"],"domain":"outerbloom.com","predictiveSearch":true,"shopId":15896833,"locale":"en"}</script>
vendor: 2 bytes, line 143
143
144<script>var Shopify = Shopify || {}; 145Shopify.shop = "outerbloom1.myshopify.com"; 146Shopify.locale = "en"; 147Shopify.currency = {"active":"IDR","rate":"1.0"}; 148Shopify.country = "ID"; 149Shopify.theme = {"name":"web-outerbloom-shopify\/main","id":153139282135,"schema_name":null,"schema_version":null,"theme_store_id":null,"role":"main"}; 150Shopify.theme.handle = "null"; 151Shopify.theme.style = {"id":null,"handle":null}; 152Shopify.cdnHost = "outerbloom.com/cdn"; 153Shopify.routes = Shopify.routes || {}; 154Shopify.routes.root = "/";</script>
vendor: 2 bytes, line 154
154
155<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 2 bytes, line 155
155
156<script>!function(o){function n(){var o=[];function n(){o.push(Array.prototype.slice.apply(arguments))}return n.q=o,n}var t=o.Shopify=o.Shopify||{};t.loadFeatures=n(),t.autoloadFeatures=n()}(window);</script>
vendor: 2 bytes, line 156
156
157<script id="shop-js-analytics" type="application/json">{"pageType":"product"}</script>
vendor: 2 bytes, line 157
157
158<script defer="defer" async type="module" src="https://outerbloom.com/cdn/shopifycloud/shop-js/modules/v2/client.init-shop-cart-sync_BLuSqYWl.en.esm.js"></script>
vendor: 2 bytes, line 158
158
159<script defer="defer" async type="module" src="https://outerbloom.com/cdn/shopifycloud/shop-js/modules/v2/chunk.common_DplD2_3Q.en.esm.js"></script>
vendor: 2 bytes, line 159
159
160<script defer="defer" async type="module" src="https://outerbloom.com/cdn/shopifycloud/shop-js/modules/v2/chunk.modal_BxEbAqG6.en.esm.js"></script>
vendor: 2 bytes, line 160
160
161<script type="module"> 162 await import("https://outerbloom.com/cdn/shopifycloud/shop-js/modules/v2/client.init-shop-cart-sync_BLuSqYWl.en.esm.js"); 163await import("https://outerbloom.com/cdn/shopifycloud/shop-js/modules/v2/chunk.common_DplD2_3Q.en.esm.js"); 164await import("https://outerbloom.com/cdn/shopifycloud/shop-js/modules/v2/chunk.modal_BxEbAqG6.en.esm.js"); 165 166 window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true}); 167 168</script>
vendor: 2 bytes, line 168
168
169<script>(function() { 170 var isLoaded = false; 171 function asyncLoad() { 172 if (isLoaded) return; 173 isLoaded = true; 174 var urls = ["https:\/\/e9e1-180-254-64-204.ngrok.io\/public\/scripts\/shopifyPageScript.js?shop=outerbloom1.myshopify.com","https:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/3.5.1\/jquery.min.js?shop=outerbloom1.myshopify.com","https:\/\/14e1-180-254-64-204.ngrok.io\/public\/scripts\/shopifyPageScript.js?shop=outerbloom1.myshopify.com","https:\/\/6403-180-254-64-204.ngrok.io\/public\/scripts\/shopify-page-script.js?shop=outerbloom1.myshopify.com","https:\/\/googlesignintest.loca.lt\/public\/scripts\/shopify-page-script.js?shop=outerbloom1.myshopify.com","https:\/\/api-na1.hubapi.com\/scriptloader\/v1\/6800477.js?shop=outerbloom1.myshopify.com"]; 175 for (var i = 0; i < urls.length; i++) { 176 var s = document.createElement('script'); 177 s.type = 'text/javascript'; 178 s.async = true; 179 s.src = urls[i]; 180 var x = document.getElementsByTagName('script')[0]; 181 x.parentNode.insertBefore(s, x); 182 } 183 }; 184 if(window.attachEvent) { 185 window.attachEvent('onload', asyncLoad); 186 } else { 187 window.addEventListener('load', asyncLoad, false); 188 } 189})();</script>
vendor: 2 bytes, line 189
189
190<script id="__st">var __st={"a":15896833,"offset":25200,"reqid":"9772bf95-0c76-4bf8-8585-5e940331d073-1771788748","pageurl":"outerbloom.com\/products\/outerbloom-mulan-bag-hampers","u":"aafc7fc1a838","p":"product","rtyp":"product","rid":7881418965207};</script>
vendor: 2 bytes, line 190
190
191<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 2 bytes, line 191
191
192<script id="captcha-bootstrap">!function(){'use strict';const t='contact',e='account',n='new_comment',o=[[t,t],['blogs',n],['comments',n],[t,'customer']],c=[[e,'customer_login'],[e,'guest_login'],[e,'recover_customer_password'],[e,'create_customer']],r=t=>t.map((([t,e])=>`form[action*='/${t}']:not([data-nocaptcha='true']) input[name='form_type'][value='${e}']`)).join(','),a=t=>()=>t?[...document.querySelectorAll(t)].map((t=>t.form)):[];function s(){const t=[...o],e=r(t);return a(e)}const i='password',u='form_key',d=['recaptcha-v3-token','g-recaptcha-response','h-captcha-response',i],f=()=>{try{return window.sessionStorage}catch{return}},m='__shopify_v',_=t=>t.elements[u];function p(t,e,n=!1){try{const o=window.sessionStorage,c=JSON.parse(o.getItem(e)),{data:r}=function(t){const{data:e,action:n}=t;return t[m]||n?{data:e,action:n}:{data:t,action:n}}(c);for(const[e,n]of Object.entries(r))t.elements[e]&&(t.elements[e].value=n);n&&o.removeItem(e)}catch(o){console.error('form repopulation failed',{error:o})}}const l='form_type',E='cptcha';function T(t){t.dataset[E]=!0}const w=window,h=w.document,L='Shopify',v='ce_forms',y='captcha';let A=!1;((t,e)=>{const n=(g='f06e6c50-85a8-45c8-87d0-21a2b65856fe',I='https://cdn.shopify.com/shopifycloud/storefront-forms-hcaptcha/ce_storefront_forms_captcha_hcaptcha.v1.5.2.iife.js',D={infoText:'Protected by hCaptcha',privacyText:'Privacy',termsText:'Terms'},(t,e,n)=>{const o=w[L][v],c=o.bindForm;if(c)return c(t,g,e,D).then(n);var r;o.q.push([[t,g,e,D],n]),r=I,A||(h.body.append(Object.assign(h.createElement('script'),{id:'captcha-provider',async:!0,src:r})),A=!0)});var g,I,D;w[L]=w[L]||{},w[L][v]=w[L][v]||{},w[L][v].q=[],w[L][y]=w[L][y]||{},w[L][y].protect=function(t,e){n(t,void 0,e),T(t)},Object.freeze(w[L][y]),function(t,e,n,w,h,L){const[v,y,A,g]=function(t,e,n){const i=e?o:[],u=t?c:[],d=[...i,...u],f=r(d),m=r(i),_=r(d.filter((([t,e])=>n.includes(e))));return[a(f),a(m),a(_),s()]}(w,h,L),I=t=>{const e=t.target;return e instanceof HTMLFormElement?e:e&&e.form},D=t=>v().includes(t);t.addEventListener('submit',(t=>{const e=I(t);if(!e)return;const n=D(e)&&!e.dataset.hcaptchaBound&&!e.dataset.recaptchaBound,o=_(e),c=g().includes(e)&&(!o||!o.value);(n||c)&&t.preventDefault(),c&&!n&&(function(t){try{if(!f())return;!function(t){const e=f();if(!e)return;const n=_(t);if(!n)return;const o=n.value;o&&e.removeItem(o)}(t);const e=Array.from(Array(32),(()=>Math.random().toString(36)[2])).join('');!function(t,e){_(t)||t.append(Object.assign(document.createElement('input'),{type:'hidden',name:u})),t.elements[u].value=e}(t,e),function(t,e){const n=f();if(!n)return;const o=[...t.querySelectorAll(`input[type='${i}']`)].map((({name:t})=>t)),c=[...d,...o],r={};for(const[a,s]of new FormData(t).entries())c.includes(a)||(r[a]=s);n.setItem(e,JSON.stringify({[m]:1,action:t.action,data:r}))}(t,e)}catch(e){console.error('failed to persist form',e)}}(e),e.submit())}));const S=(t,e)=>{t&&!t.dataset[E]&&(n(t,e.some((e=>e===t))),T(t))};for(const o of['focusin','change'])t.addEventListener(o,(t=>{const e=I(t);D(e)&&S(e,y())}));const B=e.get('form_key'),M=e.get(l),P=B&&M;t.addEventListener('DOMContentLoaded',(()=>{const t=y();if(P)for(const e of t)e.elements[l].value===M&&p(e,B);[...new Set([...A(),...v().filter((t=>'true'===t.dataset.shopifyCaptcha))])].forEach((e=>S(e,t)))}))}(h,new URLSearchParams(w.location.search),n,t,e,['guest_login'])})(!1,!0)}();</script>
vendor: 2 bytes, line 192
192
193<script integrity="sha256-4kQ18oKyAcykRKYeNunJcIwy7WH5gtpwJnB7kiuLZ1E=" data-source-attribution="shopify.loadfeatures" defer="defer" src="https://outerbloom.com/cdn/shopifycloud/storefront/assets/storefront/load_feature-a0a9edcb.js" crossorigin="anonymous"></script>
vendor: 2 bytes, line 193
193
194<script data-source-attribution="shopify.dynamic_checkout.dynamic.init">var Shopify=Shopify||{};Shopify.PaymentButton=Shopify.PaymentButton||{isStorefrontPortableWallets:!0,init:function(){window.Shopify.PaymentButton.init=function(){};var t=document.createElement("script");t.src="https://outerbloom.com/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}}; 195</script>
vendor: 2 bytes, line 195
195
196<script data-source-attribution="shopify.dynamic_checkout.buyer_consent"> 197 function portableWalletsHideBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.add("hidden"),t.setAttribute("aria-hidden","true"),n.removeEventListener("click",e))}function portableWalletsShowBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.remove("hidden"),t.removeAttribute("aria-hidden"),n.addEventListener("click",e))}window.Shopify?.PaymentButton&&(window.Shopify.PaymentButton.hideBuyerConsent=portableWalletsHideBuyerConsent,window.Shopify.PaymentButton.showBuyerConsent=portableWalletsShowBuyerConsent); 198</script>
vendor: 2 bytes, line 198
198
199<script data-source-attribution="shopify.dynamic_checkout.cart.bootstrap">document.addEventListener("DOMContentLoaded",(function(){function t(){return document.querySelector("shopify-accelerated-checkout-cart, shopify-accelerated-checkout")}if(t())Shopify.PaymentButton.init();else{new MutationObserver((function(e,n){t()&&(Shopify.PaymentButton.init(),n.disconnect())})).observe(document.body,{childList:!0,subtree:!0})}})); 200</script>
200 201
202<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
202 203 <!-- /snippets/oldIE-js.liquid --> 204 205 206<!--[if lt IE 9]>
207<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js" type="text/javascript"></script>
vendor: 2 bytes, line 207
207
208<script src="https://outerbloom.com/cdn/shop/t/138/assets/respond.min.js?v=52248677837542619231752652418" type="text/javascript"></script>
208 209<link href="https://outerbloom.com/cdn/shop/t/138/assets/respond-proxy.html" id="respond-proxy" rel="respond-proxy" /> 210<link href="https://outerbloom.com/search?q=142e9156869335090161dced0ac98b64" id="respond-redirect" rel="respond-redirect" />
211<script src="https://outerbloom.com/search?q=142e9156869335090161dced0ac98b64" type="text/javascript"></script>
211 212<![endif]--> 213 214 215 216 217 218 <link href="https://cdn.shopify.com/extensions/019b5a94-a328-79ac-9b0a-d9abe0913c8c/bitbybit-google-signin-136/assets/app.css" rel="stylesheet" type="text/css" media="all"> 219<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
220<script>(function(){if ("sendBeacon" in navigator && "performance" in window) {try {var session_token_from_headers = performance.getEntriesByType('navigation')[0].serverTiming.find(x => x.name == '_s').description;} catch {var session_token_from_headers = undefined;}var session_cookie_matches = document.cookie.match(/_shopify_s=([^;]*)/);var session_token_from_cookie = session_cookie_matches && session_cookie_matches.length === 2 ? session_cookie_matches[1] : "";var session_token = session_token_from_headers || session_token_from_cookie || "";function handle_abandonment_event(e) {var entries = performance.getEntries().filter(function(entry) {return /monorail-edge.shopifysvc.com/.test(entry.name);});if (!window.abandonment_tracked && entries.length === 0) {window.abandonment_tracked = true;var currentMs = Date.now();var navigation_start = performance.timing.navigationStart;var payload = {shop_id: 15896833,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "product"};window.navigator.sendBeacon("https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script>
vendor: 2 bytes, line 220
220
221<script id="web-pixels-manager-setup">(function e(e,d,r,n,o){if(void 0===o&&(o={}),!Boolean(null===(a=null===(i=window.Shopify)||void 0===i?void 0:i.analytics)||void 0===a?void 0:a.replayQueue)){var i,a;window.Shopify=window.Shopify||{};var t=window.Shopify;t.analytics=t.analytics||{};var s=t.analytics;s.replayQueue=[],s.publish=function(e,d,r){return s.replayQueue.push([e,d,r]),!0};try{self.performance.mark("wpm:start")}catch(e){}var l=function(){var e={modern:/Edge?\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(9{2}|\d{3,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(15\.\d+|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(9{2}|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]\d+|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](13[3-9]|1[4-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Android.+Firefox\/(13[5-9]|1[4-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(13[3-9]|1[4-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/([2-9]\d|\d{3,})\.\d+/,legacy:/Edge?\/(1[6-9]|[2-9]\d|\d{3,})\.\d+(\.\d+|)|Firefox\/(5[4-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)|Chrom(ium|e)\/(5[1-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)([\d.]+$|.*Safari\/(?![\d.]+ Edge\/[\d.]+$))|(Maci|X1{2}).+ Version\/(10\.\d+|(1[1-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(3[89]|[4-9]\d|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(10[._]\d+|(1[1-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](13[3-9]|1[4-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(13[5-9]|1[4-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(13[3-9]|1[4-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(5\.\d+|([6-9]|\d{2,})\.\d+)|Android.+MQ{2}Browser\/(14(\.(9|\d{2,})|)|(1[5-9]|[2-9]\d|\d{3,})(\.\d+|))(\.\d+|)|K[Aa][Ii]OS\/(3\.\d+|([4-9]|\d{2,})\.\d+)(\.\d+|)/},d=e.modern,r=e.legacy,n=navigator.userAgent;return n.match(d)?"modern":n.match(r)?"legacy":"unknown"}(),u="modern"===l?"modern":"legacy",c=(null!=n?n:{modern:"",legacy:""})[u],f=function(e){return[e.baseUrl,"/wpm","/b",e.hashVersion,"modern"===e.buildTarget?"m":"l",".js"].join("")}({baseUrl:d,hashVersion:r,buildTarget:u}),m=function(e){var d=e.version,r=e.bundleTarget,n=e.surface,o=e.pageUrl,i=e.monorailEndpoint;return{emit:function(e){var a=e.status,t=e.errorMsg,s=(new Date).getTime(),l=JSON.stringify({metadata:{event_sent_at_ms:s},events:[{schema_id:"web_pixels_manager_load/3.1",payload:{version:d,bundle_target:r,page_url:o,status:a,surface:n,error_msg:t},metadata:{event_created_at_ms:s}}]});if(!i)return console&&console.warn&&console.warn("[Web Pixels Manager] No Monorail endpoint provided, skipping logging."),!1;try{return self.navigator.sendBeacon.bind(self.navigator)(i,l)}catch(e){}var u=new XMLHttpRequest;try{return u.open("POST",i,!0),u.setRequestHeader("Content-Type","text/plain"),u.send(l),!0}catch(e){return console&&console.warn&&console.warn("[Web Pixels Manager] Got an unhandled error while logging to Monorail."),!1}}}}({version:r,bundleTarget:l,surface:e.surface,pageUrl:self.location.href,monorailEndpoint:e.monorailEndpoint});try{o.browserTarget=l,function(e){var d=e.src,r=e.async,n=void 0===r||r,o=e.onload,i=e.onerror,a=e.sri,t=e.scriptDataAttributes,s=void 0===t?{}:t,l=document.createElement("script"),u=document.querySelector("head"),c=document.querySelector("body");if(l.async=n,l.src=d,a&&(l.integrity=a,l.crossOrigin="anonymous"),s)for(var f in s)if(Object.prototype.hasOwnProperty.call(s,f))try{l.dataset[f]=s[f]}catch(e){}if(o&&l.addEventListener("load",o),i&&l.addEventListener("error",i),u)u.appendChild(l);else{if(!c)throw new Error("Did not find a head or body element to append the script");c.appendChild(l)}}({src:f,async:!0,onload:function(){if(!function(){var e,d;return Boolean(null===(d=null===(e=window.Shopify)||void 0===e?void 0:e.analytics)||void 0===d?void 0:d.initialized)}()){var d=window.webPixelsManager.init(e)||void 0;if(d){var r=window.Shopify.analytics;r.replayQueue.forEach((function(e){var r=e[0],n=e[1],o=e[2];d.publishCustomEvent(r,n,o)})),r.replayQueue=[],r.publish=d.publishCustomEvent,r.visitor=d.visitor,r.initialized=!0}}},onerror:function(){return m.emit({status:"failed",errorMsg:"".concat(f," has failed to load")})},sri:function(e){var d=/^sha384-[A-Za-z0-9+/=]+$/;return"string"==typeof e&&d.test(e)}(c)?c:"",scriptDataAttributes:o}),m.emit({status:"loading"})}catch(e){m.emit({status:"failed",errorMsg:(null==e?void 0:e.message)||"Unknown error"})}}})({shopId: 15896833,storefrontBaseUrl: "https://outerbloom.com",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://monorail-edge.shopifysvc.com/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["2dca8a86"],webPixelsConfigList: [{"id":"1830486231","configuration":"{\"pixelCode\":\"CECQHERC77UA05ON51U0\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"22e92c2ad45662f435e4801458fb78cc","type":"APP","apiClientId":4383523,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"870383831","configuration":"{\"accountID\":\"outerbloom1\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"e049d423f49471962495acbe58da1904","type":"APP","apiClientId":32196493313,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"824574167","configuration":"{\"shop\":\"outerbloom1.myshopify.com\", \"backend\": \"api.bitbybit.studio\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"36fb07b4b7984e6df0ea813e1dcb19ee","type":"APP","apiClientId":28314632193,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"521994455","configuration":"{\"config\":\"{\\\"google_tag_ids\\\":[\\\"G-X26HYP4083\\\",\\\"AW-11020267329\\\",\\\"GT-NFDPL5Q\\\"],\\\"target_country\\\":\\\"ID\\\",\\\"gtag_events\\\":[{\\\"type\\\":\\\"begin_checkout\\\",\\\"action_label\\\":[\\\"G-X26HYP4083\\\",\\\"AW-11020267329\\\/RHfSCK6og9gZEMHe74Yp\\\"]},{\\\"type\\\":\\\"search\\\",\\\"action_label\\\":[\\\"G-X26HYP4083\\\",\\\"AW-11020267329\\\/YjjSCKiog9gZEMHe74Yp\\\"]},{\\\"type\\\":\\\"view_item\\\",\\\"action_label\\\":[\\\"G-X26HYP4083\\\",\\\"AW-11020267329\\\/dMv0CKWog9gZEMHe74Yp\\\",\\\"MC-HY9J2ZJTNZ\\\"]},{\\\"type\\\":\\\"purchase\\\",\\\"action_label\\\":[\\\"G-X26HYP4083\\\",\\\"AW-11020267329\\\/Y2DbCJ-og9gZEMHe74Yp\\\",\\\"MC-HY9J2ZJTNZ\\\"]},{\\\"type\\\":\\\"page_view\\\",\\\"action_label\\\":[\\\"G-X26HYP4083\\\",\\\"AW-11020267329\\\/xwQ2CKKog9gZEMHe74Yp\\\",\\\"MC-HY9J2ZJTNZ\\\"]},{\\\"type\\\":\\\"add_payment_info\\\",\\\"action_label\\\":[\\\"G-X26HYP4083\\\",\\\"AW-11020267329\\\/i9yRCLGog9gZEMHe74Yp\\\"]},{\\\"type\\\":\\\"add_to_cart\\\",\\\"action_label\\\":[\\\"G-X26HYP4083\\\",\\\"AW-11020267329\\\/T9poCKuog9gZEMHe74Yp\\\"]}],\\\"enable_monitoring_mode\\\":false}\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"b2a88bafab3e21179ed38636efcd8a93","type":"APP","apiClientId":1780363,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"236060887","configuration":"{\"pixel_id\":\"165971065669324\",\"pixel_type\":\"facebook_pixel\",\"metaapp_system_user_token\":\"-\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"ca16bc87fe92b6042fbaa3acc2fbdaa6","type":"APP","apiClientId":2329312,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"62947543","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"1","type":"CUSTOM","privacyPurposes":["MARKETING"],"name":"Meta pixel (migrated)"},{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0450","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0450","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"Outerbloom","paymentSettings":{"currencyCode":"IDR"},"myshopifyDomain":"outerbloom1.myshopify.com","countryCode":"ID","storefrontUrl":"https:\/\/outerbloom.com"},"customer":null,"cart":null,"checkout":null,"productVariants":[{"price":{"amount":1.386.737.0,"currencyCode":"IDR"},"product":{"title":"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman","vendor":"Outerbloom Hampers","id":"7881418965207","untranslatedTitle":"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman","url":"\/products\/outerbloom-mulan-bag-hampers","type":"Parcel Inhouse"},"id":"45873023910103","image":{"src":"\/\/outerbloom.com\/cdn\/shop\/files\/CNY-Ruby-Mulan-Bag.jpg?v=1766041636"},"sku":"[C]HANTUSLOT","title":"Standard","untranslatedTitle":"Standard"},{"price":{"amount":635000.0,"currencyCode":"IDR"},"product":{"title":"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman","vendor":"Outerbloom Hampers","id":"7881418965207","untranslatedTitle":"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman","url":"\/products\/outerbloom-mulan-bag-hampers","type":"Parcel Inhouse"},"id":"45873024008407","image":{"src":"\/\/outerbloom.com\/cdn\/shop\/files\/CNY-Ruby-Mulan-Bag.jpg?v=1766041636"},"sku":"[C]OBIPCL1004-CNY2026","title":"Custom logo \u0026 photo for frame","untranslatedTitle":"Custom logo \u0026 photo for frame"}],"purchasingCompany":null},},"https://outerbloom.com/cdn","3c1f2529w4065d210p03530cb8m151179d6",{"modern":"","legacy":""},{"shopId":"15896833","storefrontBaseUrl":"https:\/\/outerbloom.com","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"2dca8a86\"]","isMerchantRequest":"false","hashVersion":"3c1f2529w4065d210p03530cb8m151179d6","publish":"custom","events":"[[\"page_viewed\",{}],[\"product_viewed\",{\"productVariant\":{\"price\":{\"amount\":1.386.737.0,\"currencyCode\":\"IDR\"},\"product\":{\"title\":\"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman\",\"vendor\":\"Outerbloom Hampers\",\"id\":\"7881418965207\",\"untranslatedTitle\":\"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman\",\"url\":\"\/products\/outerbloom-mulan-bag-hampers\",\"type\":\"Parcel Inhouse\"},\"id\":\"45873023910103\",\"image\":{\"src\":\"\/\/outerbloom.com\/cdn\/shop\/files\/CNY-Ruby-Mulan-Bag.jpg?v=1766041636\"},\"sku\":\"[C]HANTUSLOT\",\"title\":\"Standard\",\"untranslatedTitle\":\"Standard\"}}]]"});</script>
221<script> 222 window.ShopifyAnalytics = window.ShopifyAnalytics || {}; 223 window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; 224 window.ShopifyAnalytics.meta.currency = 'IDR'; 225 var meta = {"product":{"id":7881418965207,"gid":"gid:\/\/shopify\/Product\/7881418965207","vendor":"Outerbloom Hampers","type":"Parcel Inhouse","handle":"outerbloom-mulan-bag-hampers","variants":[{"id":45873023910103,"price":1.386.73700,"name":"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman - Standard","public_title":"Standard","sku":"[C]HANTUSLOT"},{"id":45873024008407,"price":63500000,"name":"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman - Custom logo \u0026 photo for frame","public_title":"Custom logo \u0026 photo for frame","sku":"[C]OBIPCL1004-CNY2026"}],"remote":false},"page":{"pageType":"product","resourceType":"product","resourceId":7881418965207,"requestId":"9772bf95-0c76-4bf8-8585-5e940331d073-1771788748"}}; 226 for (var attr in meta) { 227 window.ShopifyAnalytics.meta[attr] = meta[attr]; 228 } 229</script>
vendor: 2 bytes, line 229
229
230<script class="analytics"> 231 (function () { 232 var customDocumentWrite = function(content) { 233 var jquery = null; 234 235 if (window.jQuery) { 236 jquery = window.jQuery; 237 } else if (window.Checkout && window.Checkout.$) { 238 jquery = window.Checkout.$; 239 } 240 241 if (jquery) { 242 jquery('body').append(content); 243 } 244 }; 245 246 var hasLoggedConversion = function(token) { 247 if (token) { 248 return document.cookie.indexOf('loggedConversion=' + token) !== -1; 249 } 250 return false; 251 } 252 253 var setCookieIfConversion = function(token) { 254 if (token) { 255 var twoMonthsFromNow = new Date(Date.now()); 256 twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2); 257 258 document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow; 259 } 260 } 261 262 var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || []; 263 if (trekkie.integrations) { 264 return; 265 } 266 trekkie.methods = [ 267 'identify', 268 'page', 269 'ready', 270 'track', 271 'trackForm', 272 'trackLink' 273 ]; 274 trekkie.factory = function(method) { 275 return function() { 276 var args = Array.prototype.slice.call(arguments); 277 args.unshift(method); 278 trekkie.push(args); 279 return trekkie; 280 }; 281 }; 282 for (var i = 0; i < trekkie.methods.length; i++) { 283 var key = trekkie.methods[i]; 284 trekkie[key] = trekkie.factory(key); 285 } 286 trekkie.load = function(config) { 287 trekkie.config = config || {}; 288 trekkie.config.initialDocumentCookie = document.cookie; 289 var first = document.getElementsByTagName('script')[0]; 290 var script = document.createElement('script'); 291 script.type = 'text/javascript'; 292 script.onerror = function(e) { 293 var scriptFallback = document.createElement('script'); 294 scriptFallback.type = 'text/javascript'; 295 scriptFallback.onerror = function(error) { 296 var Monorail = { 297 produce: function produce(monorailDomain, schemaId, payload) { 298 var currentMs = new Date().getTime(); 299 var event = { 300 schema_id: schemaId, 301 payload: payload, 302 metadata: { 303 event_created_at_ms: currentMs, 304 event_sent_at_ms: currentMs 305 } 306 }; 307 return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event)); 308 }, 309 sendRequest: function sendRequest(endpointUrl, payload) { 310 // Try the sendBeacon API 311 if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) { 312 var blobData = new window.Blob([payload], { 313 type: 'text/plain' 314 }); 315 316 if (window.navigator.sendBeacon(endpointUrl, blobData)) { 317 return true; 318 } // sendBeacon was not successful 319 320 } // XHR beacon 321 322 var xhr = new XMLHttpRequest(); 323 324 try { 325 xhr.open('POST', endpointUrl); 326 xhr.setRequestHeader('Content-Type', 'text/plain'); 327 xhr.send(payload); 328 } catch (e) { 329 console.log(e); 330 } 331 332 return false; 333 }, 334 isIos12: function isIos12() { 335 return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1; 336 } 337 }; 338 Monorail.produce('monorail-edge.shopifysvc.com', 339 'trekkie_storefront_load_errors/1.1', 340 {shop_id: 15896833, 341 theme_id: 153139282135, 342 app_name: "storefront", 343 context_url: window.location.href, 344 source_url: "https://outerbloom.com/cdn/s/trekkie.storefront.79c9ee2a1f7d217701a15e49200b1e976848d6d6.min.js"}); 345 346 }; 347 scriptFallback.async = true; 348 scriptFallback.src = 'https://outerbloom.com/cdn/s/trekkie.storefront.79c9ee2a1f7d217701a15e49200b1e976848d6d6.min.js'; 349 first.parentNode.insertBefore(scriptFallback, first); 350 }; 351 script.async = true; 352 script.src = 'https://outerbloom.com/cdn/s/trekkie.storefront.79c9ee2a1f7d217701a15e49200b1e976848d6d6.min.js'; 353 first.parentNode.insertBefore(script, first); 354 }; 355 trekkie.load( 356 {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":15896833,"isMerchantRequest":null,"themeId":153139282135,"themeCityHash":"11250444734202683250","contentLanguage":"en","currency":"IDR","eventMetadataId":"c815f750-2e2f-45fc-a32a-af43a1e585c4"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["65f
35619447","b5387b81"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":true,"source":"trekkie-storefront-renderer","apiClientId":580111}} 357 ); 358 359 var loaded = false; 360 trekkie.ready(function() { 361 if (loaded) return; 362 loaded = true; 363 364 window.ShopifyAnalytics.lib = window.trekkie; 365 366 var originalDocumentWrite = document.write; 367 document.write = customDocumentWrite; 368 try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {}; 369 document.write = originalDocumentWrite; 370 371 window.ShopifyAnalytics.lib.page(null,{"pageType":"product","resourceType":"product","resourceId":7881418965207,"requestId":"9772bf95-0c76-4bf8-8585-5e940331d073-1771788748","shopifyEmitted":true}); 372 373 var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/) 374 var token = match? match[1]: undefined; 375 if (!hasLoggedConversion(token)) { 376 setCookieIfConversion(token); 377 window.ShopifyAnalytics.lib.track("Viewed Product",{"currency":"IDR","variantId":45873023910103,"productId":7881418965207,"productGid":"gid:\/\/shopify\/Product\/7881418965207","name":"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman - Standard","price":"1.386.737.00","sku":"[C]HANTUSLOT","brand":"Outerbloom Hampers","variant":"Standard","category":"Parcel Inhouse","nonInteraction":true,"remote":false},undefined,undefined,{"shopifyEmitted":true}); 378 window.ShopifyAnalytics.lib.track("monorail:\/\/trekkie_storefront_viewed_product\/1.1",{"currency":"IDR","variantId":45873023910103,"productId":7881418965207,"productGid":"gid:\/\/shopify\/Product\/7881418965207","name":"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman - Standard","price":"1.386.737.00","sku":"[C]HANTUSLOT","brand":"Outerbloom Hampers","variant":"Standard","category":"Parcel Inhouse","nonInteraction":true,"remote":false,"referer":"https:\/\/outerbloom.com\/products\/outerbloom-mulan-bag-hampers"}); 379 } 380 }); 381 382 383 var eventsListenerScript = document.createElement('script'); 384 eventsListenerScript.async = true; 385 eventsListenerScript.src = "https://outerbloom.com/cdn/shopifycloud/storefront/assets/shop_events_listener-3da45d37.js"; 386 document.getElementsByTagName('head')[0].appendChild(eventsListenerScript); 387 388})();</script>
388 389
389<script> 390 if (!window.ga || (window.ga && typeof window.ga !== 'function')) { 391 window.ga = function ga() { 392 (window.ga.q = window.ga.q || []).push(arguments); 393 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 394 window.Shopify.analytics.publish("ga_stub_called", {}, {sendTo: "google_osp_migration"}); 395 } 396 console.error("Shopify's Google Analytics stub called with:", Array.from(arguments), "\nSee https://help.shopify.com/manual/promoting-marketing/pixels/pixel-migration#google for more information."); 397 }; 398 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 399 window.Shopify.analytics.publish("ga_stub_initialized", {}, {sendTo: "google_osp_migration"}); 400 } 401 } 402</script>
vendor: 2 bytes, line 402
402
403<script 404 defer 405 src="https://outerbloom.com/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.1.0.min.js" 406 data-application="storefront-renderer" 407 data-shop-id="15896833" 408 data-render-region="gcp-asia-southeast1" 409 data-page-type="product" 410 data-theme-instance-id="153139282135" 411 data-theme-name="" 412 data-theme-version="" 413 data-monorail-region="shop_domain" 414 data-resource-timing-sampling-rate="10" 415 data-shs="true" 416 data-shs-beacon="true" 417 data-shs-export-with-fetch="true" 418 data-shs-logs-sample-rate="1" 419 data-shs-beacon-endpoint="https://outerbloom.com/api/collect" 420></script>
420 421</head><body 422 data-template="product" 423 id="cny-ruby-mulan-bag-hampers" 424 class="template-product template-product" 425 > 426 427 <div class="header-wrapper"> 428 429 <div id="shopify-section-NotifBar" class="shopify-section m-0"> 430 431<style> 432 :root {--topbar-bg: #212121;} 433 #notification {z-index: 99;width: 100%;transition: top 0.2s ease-in-out;} 434 #notification.promo-up {top: -48px!important;} 435 .promo-bg {width: 100%;padding: 6px 0;background-color: #212121;} 436 .notification__message p {margin: 0;color: #ffffff;font-size: 14px!important;} 437 .notification__message p a {text-decoration: underline;color: #ffffff;} 438 @media (max-width: 991px){ 439 .notification__message p {font-size: 14px!important;} 440 } 441</style> 442<input id="clearCookie" class="hide" type="button" value="Delete Cookie" /> 443<div id="notification" class="promo-down promo-bg pl-2 pr-2" data-text="whether-its-cny-or-ramadan-celebrate-your-special-occasion-with-our-exclusively-curated-hampers"> 444 <div class="page-width notification__inner "> 445 446 447 <div class="notification__message text-center"> 448 <p><a href="https://hotelverta.com/" title="Parcel">HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman</a></p> 449 </div> 450 </div> 451</div> 452 453 454 455 456</div> 457 <div id="shopify-section-new-header" class="shopify-section mb-0 mt-0"><link href="https://outerbloom.com/cdn/shop/t/138/assets/section-new-header.css?v=90475746808702572881770794809" rel="stylesheet" type="text/css" media="all" /> 458 459 460<header> 461 <div class="container"> 462 <div class="header-container row justify-content-between pl-lg-0 pr-lg-0"> 463 <div class="header-icons header-icon-left col-3"> 464 <div id="menu-hamburger" class="d-lg-none"> 465 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="10" viewBox="0 0 16 10" fill="none"> 466 <path d="M15.5995 0.949976H0.400342C0.320777 0.949976 0.244471 0.918369 0.18821 0.862108C0.131949 0.805847 0.100342 0.729541 0.100342 0.649976C0.100342 0.570411 0.131949 0.494104 0.18821 0.437843C0.244471 0.381582 0.320777 0.349976 0.400342 0.349976H15.5995C15.6791 0.349976 15.7554 0.381582 15.8117 0.437843C15.8679 0.494104 15.8995 0.570411 15.8995 0.649976C15.8995 0.729541 15.8679 0.805847 15.8117 0.862108C15.7554 0.918369 15.6791 0.949976 15.5995 0.949976ZM15.5995 5.29998H0.400342C0.320777 5.29998 0.244471 5.26837 0.18821 5.21211C0.131949 5.15585 0.100342 5.07954 0.100342 4.99998C0.100342 4.92041 0.131949 4.8441 0.18821 4.78784C0.244471 4.73158 0.320777 4.69998 0.400342 4.69998H15.5995C15.6791 4.69998 15.7554 4.73158 15.8117 4.78784C15.8679 4.8441 15.8995 4.92041 15.8995 4.99998C15.8995 5.07954 15.8679 5.15585 15.8117 5.21211C15.7554 5.26837 15.6791 5.29998 15.5995 5.29998ZM15.5995 9.64998H0.400342C0.320777 9.64998 0.244471 9.61837 0.18821 9.56211C0.131949 9.50585 0.100342 9.42954 0.100342 9.34998C0.100342 9.27041 0.131949 9.1941 0.18821 9.13784C0.244471 9.08158 0.320777 9.04998 0.400342 9.04998H15.5995C15.6791 9.04998 15.7554 9.08158 15.8117 9.13784C15.8679 9.1941 15.8995 9.27041 15.8995 9.34998C15.8995 9.42954 15.8679 9.50585 15.8117 9.56211C15.7554 9.61837 15.6791 9.64998 15.5995 9.64998Z" fill="#212121"/> 467</svg> 468 469 </div> 470 <div id="" class="search-icon"> 471 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none"> 472 <path d="M18.7327 19.513L11.427 12.2073C10.8437 12.7043 10.1729 13.0889 9.41454 13.3612C8.65621 13.6334 7.89398 13.7695 7.12787 13.7695C5.25965 13.7695 3.67843 13.1228 2.3842 11.8293C1.08998 10.5359 0.442871 8.95505 0.442871 7.08683C0.442871 5.2186 1.0892 3.63699 2.38187 2.34199C3.67454 1.04699 5.25498 0.398714 7.12321 0.397159C8.99143 0.395603 10.5734 1.04271 11.8692 2.33849C13.165 3.63427 13.8129 5.21588 13.8129 7.08333C13.8129 7.89377 13.6694 8.67816 13.3824 9.43649C13.0954 10.1948 12.7182 10.8435 12.2507 11.3825L19.5564 18.687L18.7327 19.513ZM7.12904 12.6017C8.67682 12.6017 9.98348 12.0689 11.049 11.0033C12.1146 9.93777 12.6474 8.63071 12.6474 7.08216C12.6474 5.5336 12.1146 4.22694 11.049 3.16216C9.98348 2.09738 8.67682 1.5646 7.12904 1.56383C5.58126 1.56305 4.2742 2.09583 3.20787 3.16216C2.14154 4.22849 1.60876 5.53516 1.60954 7.08216C1.61032 8.62916 2.14309 9.93583 3.20787 11.0022C4.27265 12.0685 5.57932 12.6013 7.12787 12.6005" fill="#212121"/> 473</svg> 474 475 </div> 476 </div> 477 478 <div class="logo col-6 text-center"> 479 <h1 class="hide hidden"><img src="https://imagesme.b-cdn.net/icon/logo-hotelverta.gif" alt="HANTUSLOT" style="height:50px; width:140px;"></h1> 480 <a href="https://hotelverta.com/"><img src="https://imagesme.b-cdn.net/icon/logo-hotelverta.gif" alt="HANTUSLOT" style="height:50px; width:140px;"> 481 </a> 482 </div> 483 484 <div class="header-icon-right header-icons col-3"> 485 <div class="icon icon-account-header d-none d-lg-block"> 486 <a href="https://amp.hotelverta.com/"> 487 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="21" viewBox="0 0 20 21" fill="none"> 488 <path d="M19.015 19.8549C18.4842 18.3662 17.3117 17.0514 15.6819 16.1134C14.052 15.1754 12.0547 14.6667 10.0002 14.6667C7.94569 14.6667 5.94835 15.1754 4.31852 16.1134C2.68869 17.0514 1.51618 18.3662 0.985352 19.8549" stroke="#212121" stroke-linecap="round"/> 489 <path d="M10.0002 10C12.5775 10 14.6668 7.91068 14.6668 5.33335C14.6668 2.75602 12.5775 0.666687 10.0002 0.666687C7.42283 0.666687 5.3335 2.75602 5.3335 5.33335C5.3335 7.91068 7.42283 10 10.0002 10Z" stroke="#212121" stroke-linecap="round"/> 490</svg> 491 492 </a> 493 </div> 494 <div class="icon icon-wishlist-header"> 495 <a href="https://amp.hotelverta.com/"> 496 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none"> 497 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.072
4976 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125ZM12 19.9991C10.4688 19.1241 1.0625 13.5077 1.0625 7.15625C1.06424 5.70638 1.64096 4.31639 2.66618 3.29118C3.69139 2.26596 5.08138 1.68924 6.53125 1.6875C8.84016 1.6875 10.7805 2.92453 11.5953 4.91516C11.6283 4.9954 11.6843 5.06403 11.7564 5.11233C11.8285 5.16063 11.9133 5.18642 12 5.18642C12.0867 5.18642 12.1715 5.16063 12.2436 5.11233C12.3157 5.06403 12.3717 4.9954 12.4047 4.91516C13.2195 2.92453 15.1598 1.6875 17.4688 1.6875C18.9186 1.68924 20.3086 2.26596 21.3338 3.29118C22.359 4.31639 22.9358 5.70638 22.9375 7.15625C22.9375 13.5 13.5312 19.1284 12 19.9991Z" fill="#212121"/> 498</svg> 499 500 501 </a> 502 </div> 503 <div class="icon icon-cart-header"> 504 <a href="https://amp.hotelverta.com/"> 505 <svg xmlns="http://www.w3.org/2000/svg" width="22" height="21" viewBox="0 0 22 21" fill="none"> 506 <path d="M6.33301 10V5.33335C6.33301 4.09568 6.82467 2.90869 7.69984 2.03352C8.57501 1.15835 9.762 0.666687 10.9997 0.666687C12.2374 0.666687 13.4243 1.15835 14.2995 2.03352C15.1747 2.90869 15.6663 4.09568 15.6663 5.33335V10" stroke="#212121" stroke-linecap="round"/> 507 <path d="M1.30956 10.7793C1.47873 8.74817 1.56389 7.73317 2.23356 7.116C2.90323 6.49883 3.92289 6.5 5.96106 6.5H16.0399C18.0769 6.5 19.0966 6.5 19.7662 7.116C20.4359 7.732 20.5211 8.74817 20.6902 10.7793L21.2899 17.973C21.3879 19.1548 21.4369 19.7463 21.0916 20.1232C20.7439 20.5 20.1512 20.5 18.9636 20.5H3.03623C1.84973 20.5 1.25589 20.5 0.909392 20.1232C0.562892 19.7463 0.611892 19.1548 0.711059 17.973L1.30956 10.7793Z" stroke="#212121"/> 508</svg> 509 510 <span class="cart-count">0</span> 511 </a> 512 </div> 513 </div> 514 </div> 515 </div> 516</header> 517 518<nav class="nav-header"> 519 <div class="nav-account-mobile row m-0 d-lg-none"> 520 <div class="col-6 welcome-cust p-0"> 521 522 HANTUSLOT 523 524 </div> 525 526 <div class="col-6 login-register text-right p-0"> 527 <a href="https://amp.hotelverta.com/">Log In</a> | <a href="https://amp.hotelverta.com/">Sign Up</a> 528 </div> 529 530 </div> 531 <ul class="nav-menu container"> 532 533 <li id="new-arrival" class=""> 534 <a href="https://hotelverta.com/"> 535 <span>HANTUSLOT</span> 536 537 </a> 538 539 </li> 540 541 <li id="flowers" class=" has-child"> 542 <a href="https://hotelverta.com/"> 543 <span>HANTUSLOT LOGIN</span> 544 545 <span class="chevron-right d-lg-none"> 546 <svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 547 <path d="M1 1L6 6L1 11" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 548 </svg> 549 </span> 550 551 </a> 552 553 554 <li id="cakes-gifts" class=" has-child"> 555 <a href="https://hotelverta.com/"> 556 <span>GAME ONLINE</span> 557 558 <span class="chevron-right d-lg-none"> 559 <svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 560 <path d="M1 1L6 6L1 11" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 561 </svg> 562 </span> 563 564 </a> 565 566 567 <li id="bunga-papan" class=" has-child"> 568 <a href="https://hotelverta.com/"> 569 <span>FITUR INOVATIF</span> 570 571 <span class="chevron-right d-lg-none"> 572 <svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 573 <path d="M1 1L6 6L1 11" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 574 </svg> 575 </span> 576 577 </a> 578 579 580 <li id="occasions" class=" has-child"> 581 <a href="https://hotelverta.com/"> 582 <span>GAME BAHASA INDONESIA</span> 583
584 <span class="chevron-right d-lg-none"> 585 <svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 586 <path d="M1 1L6 6L1 11" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 587 </svg> 588 </span> 589 590 </a> 591 592 593 <li id="locations" class=" has-child"> 594 <a href="https://hotelverta.com/"> 595 <span>GAME REKOMENDASI</span> 596 597 <span class="chevron-right d-lg-none"> 598 <svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 599 <path d="M1 1L6 6L1 11" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 600 </svg> 601 </span> 602 603 </a> 604 </div> 605 </div> 606 607 </li> 608 609 </ul> 610</nav> 611<div class="overlay-nav"> 612 <!-- Mobile Close Button in Overlay --> 613 <button id="nav-close" class="nav-close-btn d-lg-none"> 614 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 615 <path d="M18 6L6 18M6 6L18 18" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 616 </svg> 617 </button> 618</div> 619
620<script> 621 if ($(window).width() < 992) { 622 // Level 1 menu accordion (main menu items) 623 $(".nav-menu .has-child > a").click(function(e){ 624 e.preventDefault() 625 const parentLi = $(this).parent() 626 const isCurrentlyOpen = parentLi.hasClass("menu-open") 627 628 // Close all other open menus (accordion behavior) 629 $(".nav-menu .has-child").not(parentLi).removeClass("menu-open") 630 $(".nav-menu .megamenu").not($(this).next(".megamenu")).slideUp() 631 632 // Toggle current menu 633 if (isCurrentlyOpen) { 634 parentLi.removeClass("menu-open") 635 $(this).next(".megamenu").slideUp() 636 } else { 637 parentLi.addClass("menu-open") 638 $(this).next(".megamenu").slideDown() 639 } 640 }) 641 642 // Level 2 menu accordion (submenu items with grandchildren) 643 $(document).on('click', '.dropdown-menu .has-submenu > a', function(e){ 644 e.preventDefault() 645 const parentLi = $(this).parent() 646 const isCurrentlyOpen = parentLi.hasClass("submenu-open") 647 const grandchild = $(this).next(".grandchild") 648 649 // Close all other open submenus in the same dropdown (accordion behavior) 650 parentLi.siblings('.has-submenu').removeClass("submenu-open") 651 parentLi.siblings('.has-submenu').find('.grandchild').slideUp() 652 parentLi.siblings('.has-submenu').find('.chevron-right').css('transform', 'rotate(0deg)') 653 654 // Toggle current submenu 655 if (isCurrentlyOpen) { 656 parentLi.removeClass("submenu-open") 657 grandchild.slideUp() 658 $(this).find('.chevron-right').css('transform', 'rotate(0deg)') 659 } else { 660 parentLi.addClass("submenu-open") 661 grandchild.slideDown() 662 $(this).find('.chevron-right').css('transform', 'rotate(90deg)') 663 } 664 }) 665 666 $("#menu-hamburger").click(function(e){ 667 e.preventDefault() 668 $("body").toggleClass("nav_open") 669 }) 670 671 // Handle close button click 672 $("#nav-close").click(function(e){ 673 e.preventDefault() 674 $("body").removeClass("nav_open") 675 // Close all open menus when close button is clicked 676 $(".nav-menu .has-child").removeClass("menu-open") 677 $(".nav-menu .megamenu").slideUp() 678 $(".dropdown-menu .has-submenu").removeClass("submenu-open") 679 $(".dropdown-menu .grandchild").slideUp() 680 $(".dropdown-menu .chevron-right").css('transform', 'rotate(0deg)') 681 }) 682 } 683 684 $(".overlay-nav").click(function(e){ 685 e.preventDefault() 686 $("body").removeClass("nav_open") 687 // Close all open menus when overlay is clicked 688 $(".nav-menu .has-child").removeClass("menu-open") 689 $(".nav-menu .megamenu").slideUp() 690 $(".dropdown-menu .has-submenu").removeClass("submenu-open") 691 $(".dropdown-menu .grandchild").slideUp() 692 $(".dropdown-menu .chevron-right").css('transform', 'rotate(0deg)') 693 }) 694 695 // Update cart count 696 function updateCartCount() { 697 fetch('/cart.js') 698 .then(response => response.json()) 699 .then(cart => { 700 const cartCount = cart.item_count; 701 const cartCountEl = $('.cart-count'); 702 703 if (cartCount > 0) { 704 cartCountEl.text(cartCount).show(); 705 } else { 706 cartCountEl.hide(); 707 } 708 }) 709 .catch(error => console.error('Error fetching cart:', error)); 710 } 711 712 // Initialize cart count on page load 713 $(document).ready(function() { 714 updateCartCount(); 715 716 // Listen for cart changes 717 document.addEventListener('cart-updated', updateCartCount); 718 }); 719</script>
719 720 721 722</div> 723 724 <div id="shopify-section-search-popup" class="shopify-section m-0"><style> 725 #search-trigger { 726 cursor: pointer; 727 } 728 #search-popup { 729 display: none; 730 position: fixed; 731 left: 0; 732 width: 100%; 733 top: 0; 734 height: 100%; 735 justify-content: center; 736 z-index: 9999; 737 background: rgb(196 196 196 / 30%); 738 } 739 #search-input { 740 align-self: center; 741 width: 100%; 742 height: 80px; 743 position: absolute; 744 top: 0; 745 border-bottom: 0.5px solid #A3A3A3; 746 background-color: #fff; 747 } 748 #search-input * { 749 align-self: center; 750 } 751 #search-type { 752 width: 100%; 753 border: none; 754 padding-right: 20px; 755 padding-left: 20px; 756 font-size: 16px; 757 color: #757575; 758 } 759 #search-btn { 760 font-size: 16px; 761 font-weight: 500; 762 } 763 #search-result { 764 background-color: #fff; 765 min-height: 490px; 766 width: 100%; 767 padding-top: 80px; 768 } 769 #search-result .container { 770 padding: 20px 40px; 771 } 772 body.search-popup-open { 773 overflow: hidden; 774 } 775 .search-popup-open #loc_delivery { 776 display: none 777 } 778 .search-header svg { 779 display: none; 780 cursor: pointer; 781 } 782 .wrapper-search-popup { 783 max-height: calc(100vh - 150px); 784 overflow-y: auto; 785 overflow-x: hidden; 786 } 787 788 .group-recommend { 789 padding: 20px 40px; 790 } 791 792 .resultsearch { 793 display: none; 794 } 795 .results { padding: 20px 40px } 796 .resultsearch label { 797 font-weight: 600; 798 padding-bottom: 20px; 799 display: block; 800 margin-bottom: 20px; 801 border-bottom: 1px solid #AAAAAA; 802 } 803 804 ul.result_collection { 805 overflow: auto; 806 } 807 808 .skeleton-loader { 809 padding: 10px 0; 810 } 811 812 .skeleton-item { 813 height: 20px; 814 background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); 815 background-size: 200% 100%; 816 animation: loading 1.5s infinite; 817 margin-bottom: 12px; 818 border-radius: 4px; 819 } 820 821 .skeleton-product-card { 822 display: flex; 823 flex-direction: column; 824 margin-bottom: 15px; 825 } 826 827 .skeleton-product-image { 828 width: 100%; 829 aspect-ratio: 1; 830 background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); 831 background-size: 200% 100%; 832 animation: loading 1.5s infinite; 833 border-radius: 4px; 834 margin-bottom: 10px; 835 } 836 837 .skeleton-product-title { 838 height: 16px; 839 background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); 840 background-size: 200% 100%; 841 animation: loading 1.5s infinite; 842 border-radius: 4px; 843 margin-bottom: 8px; 844 } 845 846 .skeleton-product-price { 847 height: 14px; 848 width: 60%; 849 background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); 850 background-size: 200% 100%; 851 animation: loading 1.5s infinite; 852 border-radius: 4px; 853 } 854 855 @keyframes loading { 856 0% { 857 background-position: 200% 0; 858 } 859 100% { 860 background-position: -200% 0; 861 } 862 } 863 864 ul.result_product { 865 max-height: 400px; 866 overflow: auto; 867 list-style: none; 868 padding: 0; 869 display: grid; 870 grid-template-columns: repeat(2, 1fr); 871 gap: 15px; 872 } 873 874 ul.result_product li.item { 875 margin-bottom: 0; 876 } 877 878 ul.result_product .item_url { 879 display: block; 880 text-decoration: none; 881 color: inherit; 882 } 883 884 ul.result_product .product-card-search { 885 display: flex; 886 flex-direction: row; 887 height: 100%; 888 text-transform: uppercase; 889 text-align: left; 890 gap: 12px; 891 } 892 893 ul.result_product .product-image-search { 894 width: 100px; 895 height: 100px; 896 flex-shrink: 0; 897 object-fit: cover; 898 } 899 900 ul.result_product .product-info-search { 901 display: flex; 902 flex-direction: column; 903 justify-content: center; 904 flex: 1; 905 } 906 907 ul.result_product .product-title-search { 908 font-size: 14px; 909 line-height: 1.4; 910 margin-bottom: 8px; 911 overflow: hidden; 912 text-overflow: ellipsis; 913 display: -webkit-box; 914 -webkit-line-clamp: 2; 915 -webkit-box-orient: vertical; 916 } 917 918 ul.result_product .product-price-search { 919 font-size: 13px; 920 color: #666; 921 font-weight: 500; 922 } 923 924 .group-promotion ul { 925 margin: 0; 926 } 927 .group-promotion li { 928 list-style: none; 929 margin-bottom: 12px; 930 } 931 .group-promotion li a { 932 color: inherit; 933 } 934 935 .group-recent { 936 position: relative; 937 padding: 20px 40px; 938 } 939 .group-recent ul { 940 margin: 0; 941 } 942 .group-recent li { 943 list-style: none; 944 display: inline-block; 945 margin-right: 60px; 946 } 947 .group-recent li a { 948 color: inherit; 949 } 950 951 .last-search svg {
952 width: 20px; 953 vertical-align: middle; 954 } 955 ul.last-search a { 956 vertical-align: middle; 957 padding: 0 10px; 958 } 959 ul.last-search li span { 960 cursor: pointer; 961 } 962 .delete-all-history { 963 position: absolute; 964 top: 25px; 965 right: 40px; 966 text-decoration: underline; 967 color: #e11d1d; 968 cursor: pointer; 969 font-size: 12px; 970 } 971 972 form.search.search-modal__form { 973 position: relative; 974 } 975 976 button.search__button svg { 977 width: 25px; 978 color: #495057; 979 fill: #757582; 980 } 981 982 button.search__button.field__button { 983 position: absolute; 984 top: 50%; 985 margin-top: -12px; 986 } 987 988 .close-search { 989 display: none; 990 position: absolute; 991 right: 65px; 992 top: 10px; 993 cursor: pointer; 994 } 995 996 .site-overlay { 997 position: fixed; 998 top: 0; 999 width: 100vw; 1000 height: 100vh; 1001 z-index: 1000; 1002 background: #0000005c; 1003 visibility: hidden; 1004 opacity: 0; 1005 pointer-events: none; 1006 transition: all .3s linear; 1007 display: block !important; 1008 } 1009 1010 .search-popup-open .site-overlay { 1011 opacity: 1; 1012 visibility: visible; 1013 pointer-events: all; 1014 z-index: -1; 1015 cursor: pointer; 1016 } 1017 1018 @media (min-width: 991px) { 1019 .group-recent ul { 1020 column-count: 3; 1021 } 1022 .group-promotion li a { 1023 font-size: 12px; 1024 font-weight: 400; 1025 } 1026 .group-recent li a { 1027 font-size: 12px; 1028 font-weight: 400; 1029 } 1030 ul.result_product { 1031 grid-template-columns: repeat(3, 1fr); 1032 gap: 20px; 1033 } 1034 } 1035 1036 .moreresult { 1037 padding: 10px 40px; 1038 border-top: 1px solid #AAAAAA; 1039 } 1040 .moreresult * { 1041 align-self: center; 1042 } 1043 .moreresult p { 1044 margin: 0; 1045 font-size: 12px !important; 1046 } 1047 .moreresult svg { 1048 width: 13px; 1049 } 1050 1051 @media (max-width: 992px) { 1052 .icon-key-mobile { 1053 height: auto!important; 1054 width: 10px!important; 1055 } 1056 body.grid-view.search-popup-open .products { 1057 -ms-flex: 0 0 100%!important; 1058 flex: 0 0 100%!important; 1059 max-width: 100%!important; 1060 } 1061 button.search__button svg { 1062 width: 20px; 1063 } 1064 #search-result { 1065 padding-left: 0; 1066 padding-right: 0; 1067 } 1068 #search-result { 1069 padding-top: 55px; 1070 } 1071 #search-input { 1072 height: 55px; 1073 } 1074 .group-recommend { 1075 padding: 20px; 1076 } 1077 1078 #search-type, #search-btn { 1079 font-size: 12px; 1080 } 1081 #search-input { 1082 height: 40px; 1083 } 1084 #search-result { 1085 padding-top: 40px; 1086 } 1087 .close-search { 1088 right: 50px; 1089 top: 6px; 1090 } 1091 #search-input svg { 1092 width: 15px; 1093 } 1094 .result_product li a { 1095 font-size: 12px; 1096 } 1097 ul.result_product li img { 1098 width: 110px !important; 1099 } 1100 .resultsearch label { 1101 font-size: 14px; 1102 margin-bottom: 15px; 1103 padding-bottom: 15px; 1104 } 1105 #search-input .container { 1106 padding: 0 20px; 1107 } 1108 #search-type { 1109 font-size: 14px; 1110 } 1111 #search-btn { 1112 font-size: 12px; 1113 text-decoration: underline; 1114 } 1115 .results { 1116 padding: 15px; 1117 } 1118 .group-recommend h3 { 1119 font-size: 16px; 1120 } 1121 .products .card-body { 1122 padding: 8px 0px 10px; 1123 } 1124 .moreresult { 1125 padding: 10px 20px; 1126 } 1127 ul.result_product { 1128 grid-template-columns: repeat(1, 1fr); 1129 gap: 10px; 1130 } 1131 ul.result_product .product-image-search { 1132 width: 80px; 1133 height: 80px; 1134 } 1135 ul.result_product .product-card-search { 1136 gap: 10px; 1137 } 1138 ul.result_product .product-title-search { 1139 font-size: 12px; 1140 margin-bottom: 6px; 1141 } 1142 ul.result_product .product-price-search { 1143 font-size: 11px; 1144 } 1145 .group-promotion li a { 1146 font-size: 14px; 1147 } 1148 ul.result_collection { 1149 max-height: 200px; 1150 } 1151 } 1152</style> 1153<div id="search-popup"> 1154 <div id="search-input" class="row"> 1155 <div class="container w-100"> 1156 <form 1157 action="/search" 1158 method="get" 1159 role="search" 1160 class="search search-modal__form d-flex justify-content-between" 1161 > 1162 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none"> 1163 <path d="M18.7327 19.513L11.427 12.2073C10.8437 12.7043 10.1729 13.0889 9.41454 13.3612C8.65621 13.6334 7.89398 13.7695 7.12787 13.7695C5.25965 13.7695 3.67843 13.1228 2.3842 11.8293C1.08998 10.5359 0.442871 8.95505 0.442871 7.08683C0.442871 5.2186 1.0892 3.63699 2.38187 2.34199C3.67454 1.04699 5.25498 0.398714 7.12321 0.397159C8.99143 0.395603 10.5734 1.04271 11.8692 2.33849C13.165 3.63427 13.8129 5.21588 13.8129 7.08333C13.8129 7.89377 13.6694 8.67816 13.3824 9.43649C13.0954 10.1948 12.7182 10.8435 12.2507 11.3825L19.5564 18.687L18.7327 19.513ZM7.12904 12.6017C8.67682 12.6017 9.98348 12.0689 11.049 11.0033C12.1146 9.93777 12.6474 8.63071 12.6474 7.08216C12.6474 5.5336 12.1146 4.22694 11.049 3.16216C9.98348 2.09738 8.67682 1.5646 7.12904 1.56383C5.58126 1.56305 4.2742 2.09583 3.20787 3.16216C2.14154 4.22849 1.60876 5.53516 1.60954 7.08216C1.61032 8.62916 2.14309 9.93583 3.20787 11.0022C4.27265 12.0685 5.57932 12.6013 7.12787 12.6005" fill="#212121"/> 1164</svg> 1165 1166 <input type="hidden" name="type" value="product"> 1167 <input 1168 type="text" 1169 id="search-type" 1170 name="q" 1171 class="search-popup" 1172 placeholder="Gifts that linger: Uncover treasures for cherished moments." 1173 > 1174 <div class="close-search"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none"> 1175 <path d="M9 9.708L12.246 12.954C12.3393 13.0473 12.454 13.0973 12.59 13.104C12.726 13.1107 12.8473 13.0607 12.954 12.954C13.0607 12.8473 13.114 12.7293 13.114 12.6C13.114 12.4707 13.0607 12.3527 12.954 12.246L9.708 9L12.954 5.754C13.0473 5.66067 13.0973 5.546 13.104 5.41C13.1107 5.274 13.0607 5.15267 12.954 5.046C12.8473 4.93933 12.7293 4.886 12.6 4.886C12.4707 4.886 12.3527 4.93933 12.246 5.046L9 8.292L5.754 5.046C5.66067 4.95267 5.546 4.90267 5.41 4.896C5.274 4.88933 5.15267 4.93933 5.046 5.046C4.93933 5.15267 4.886 5.27067 4.886 5.4C4.886 5.52933 4.93933 5.64733 5.046 5.754L8.292 9L5.046 12.246C4.95267 12.3393 4.90267 12.4543 4.896 12.591C4.88933 12.7263 4.93933 12.8473 5.046 12.954C5.15267 13.0607 5.27067 13.114 5.4 13.114C5.52933 13.114 5.64733 13.0607 5.754 12.954L9 9.708ZM9.003 18C7.75833 18 6.58833 17.764 5.493 17.292C4.39767 16.8193 3.44467 16.178 2.634 15.368C1.82333 14.558 1.18167 13.606 0.709 12.512C0.236333 11.418 0 10.2483 0 9.003C0 7.75767 0.236333 6.58767 0.709 5.493C1.181 4.39767 1.82133 3.44467 2.63 2.634C3.43867 1.82333 4.391 1.18167 5.487 0.709C6.583 0.236333 7.753 0 8.997 0C10.241 0 11.411 0.236333 12.507 0.709C13.6023 1.181 14.5553 1.82167 15.366 2.631C16.1767 3.44033 16.8183 4.39267 17.291 5.488C17.7637 6.58333 18 7.753 18 8.997C18 10.241 17.764 11.411 17.292
117512.507C16.82 13.603 16.1787 14.556 15.368 15.366C14.5573 16.176 13.6053 16.8177 12.512 17.291C11.4187 17.7643 10.249 18.0007 9.003 18ZM9 17C11.2333 17 13.125 16.225 14.675 14.675C16.225 13.125 17 11.2333 17 9C17 6.76667 16.225 4.875 14.675 3.325C13.125 1.775 11.2333 1 9 1C6.76667 1 4.875 1.775 3.325 3.325C1.775 4.875 1 6.76667 1 9C1 11.2333 1.775 13.125 3.325 14.675C4.875 16.225 6.76667 17 9 17Z" fill="#757575"/> 1176</svg> 1177</div> 1178 <button id="search-btn">Search</button> 1179 </form> 1180 </div> 1181 </div> 1182 <div id="search-result" class="m-auto"> 1183 <div class="container p-0"> 1184 <div class="group-promotion"> 1185 <div class="resultsearch"> 1186 <div class="row results"> 1187 <div class="col-12 col-lg-3 mb-3 mb-lg-0"> 1188 <label>SUGGESTIONS</label> 1189 <ul class="result_collection"></ul> 1190 </div> 1191 <div class="col-12 col-lg-9"> 1192 <label>PRODUCTS</label> 1193 <ul class="result_product"></ul> 1194 </div> 1195 </div> 1196 <div class="d-flex moreresult m-0"> 1197 <p>Search for<span></span></p> 1198 <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 1199<title>icon-arrow-right</title> 1200<path d="M25.057 15.333l-6.862-6.862c-0.26-0.26-0.26-0.682 0-0.943s0.682-0.26 0.943 0l8 8c0.26 0.26 0.26 0.682 0 0.943l-8 8c-0.26 0.26-0.682 0.26-0.943 0s-0.26-0.682 0-0.943l6.862-6.862h-19.724c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h19.724z"></path> 1201</svg> 1202 </div> 1203 </div> 1204 </div> 1205 <div class="group-recent hide"> 1206 <h3>RECENT SEARCH</h3> 1207 <span class="delete-all-history">Hapus riwayat</span> 1208 <ul class="last-search"></ul> 1209 </div> 1210 <div class="group-recommend"> 1211 <h3>YOU MAY ALSO LIKE</h3> 1212 1213 1214 <div class="row popup-recommend c-products-grid infinite-case product-multi-"> 1215 <div class="swiper-wrapper justify-content-between" style="margin-left:1px;"> 1216 1217 1218 <div class="swiper-slide card"> 1219 1220 1221 1222 1223<div class="products" data-lazy="false"> 1224 <div class="bg-products"> 1225 <button type="button" class="wishlist-toggle" data-wishlist-button data-product-handle="nibbl-the-jam-that-stole-breakfast"> 1226 <div class="wishlist-icon-wrapper"> 1227 <svg class="wishlist-icon-outline" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:block;"> 1228 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125ZM12 19.9991C10.4688 19.1241 1.0625 13.5077 1.0625 7.15625C1.06424 5.70638 1.64096 4.31639 2.66618 3.29118C3.69139 2.26596 5.08138 1.68924 6.53125 1.6875C8.84016 1.6875 10.7805 2.92453 11.5953 4.91516C11.6283 4.9954 11.6843 5.06403 11.7564 5.
122811233C11.8285 5.16063 11.9133 5.18642 12 5.18642C12.0867 5.18642 12.1715 5.16063 12.2436 5.11233C12.3157 5.06403 12.3717 4.9954 12.4047 4.91516C13.2195 2.92453 15.1598 1.6875 17.4688 1.6875C18.9186 1.68924 20.3086 2.26596 21.3338 3.29118C22.359 4.31639 22.9358 5.70638 22.9375 7.15625C22.9375 13.5 13.5312 19.1284 12 19.9991Z" fill="#212121"/> 1229 </svg> 1230 <svg class="wishlist-icon-filled" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:none;"> 1231 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125Z" fill="#640000"/> 1232 </svg> 1233</div> 1234 </button> 1235 <a href="/products/nibbl-the-jam-that-stole-breakfast"> 1236 1237 <div class="product-card-img-container p-0 position-relative"> 1238 1239 <img class="product-card-img" lazy="false" src="https://outerbloom.com/cdn/shop/files/The-Jam-That-Stole-Breakfast_350x.jpg?v=1761737780" data-src="https://outerbloom.com/cdn/shop/files/The-Jam-That-Stole-Breakfast_350x.jpg?v=1761737780" alt="Nibbl The Jam That Stole Breakfast" height="200" width="200"> 1240 1241 </div> 1242 <div class="card-body product-card-info"> 1243 <h5 class="h5 mb-0"> 1244 Nibbl The Jam That Stole Breakfast 1245 </h5> 1246 <div class="product-card-price"> 1247 1248 <div class="product-price-sale"> 1249 <s class="product-card-price-before card-money">Rp 155.000</s> 1250 <span class="product-card-discount small"> 1251 (-45%) 1252 </span> 1253 </div> 1254 1255 1256 1257 <div class="price-discount"> 1258 <h4 class="product-card-price-after card-money">Rp 85.000</h4> 1259 </div> 1260 1261 1262 1263 1264 1265 </div> 1266 1267 </div> 1268 </a> 1269 </div> 1270 1271 1272 <div class="wishlist-tooltip" style="display:none;"> 1273 <a href="https://amp.hotelverta.com/">Please login to save to wishlist</a> 1274 </div> 1275</div> 1276 1277 </div> 1278 1279 1280 1281 <div class="swiper-slide card"> 1282 1283 1284 1285 1286<div class="products" data-lazy="false"> 1287 <div class="bg-products"> 1288 <button type="button" class="wishlist-toggle" data-wishlist-button data-product-handle="nibbl-choco-nutocalypse"> 1289 <div class="wishlist-icon-wrapper"> 1290 <svg class="wishlist-icon-outline" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:block;"> 1291 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125ZM12 19.9991C10.4688 19.1241 1.0625 13.5077 1.0625 7.15625C1.06424 5.70638 1.64096 4.31639 2.66618 3.29118C3.69139 2.26596 5.08138 1.68924 6.53125 1.6875C8.84016 1.6875 10.7805 2.92453 11.5953 4.91516C11.6283 4.9954 11.6843 5.06403 11.7564 5.
129111233C11.8285 5.16063 11.9133 5.18642 12 5.18642C12.0867 5.18642 12.1715 5.16063 12.2436 5.11233C12.3157 5.06403 12.3717 4.9954 12.4047 4.91516C13.2195 2.92453 15.1598 1.6875 17.4688 1.6875C18.9186 1.68924 20.3086 2.26596 21.3338 3.29118C22.359 4.31639 22.9358 5.70638 22.9375 7.15625C22.9375 13.5 13.5312 19.1284 12 19.9991Z" fill="#212121"/> 1292 </svg> 1293 <svg class="wishlist-icon-filled" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:none;"> 1294 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125Z" fill="#640000"/> 1295 </svg> 1296</div> 1297 </button> 1298 <a href="/products/nibbl-choco-nutocalypse"> 1299 1300 <div class="product-card-img-container p-0 position-relative"> 1301 1302 <img class="product-card-img" lazy="false" src="https://outerbloom.com/cdn/shop/files/Choco-Nutocalypse_b93c4d9f-8210-4454-9b3f-419d0040ff31_350x.jpg?v=1761789600" data-src="https://outerbloom.com/cdn/shop/files/Choco-Nutocalypse_b93c4d9f-8210-4454-9b3f-419d0040ff31_350x.jpg?v=1761789600" alt="Nibbl Choco Nutocalypse" height="200" width="200"> 1303 1304 </div> 1305 <div class="card-body product-card-info"> 1306 <h5 class="h5 mb-0"> 1307 Nibbl Choco Nutocalypse 1308 </h5> 1309 <div class="product-card-price"> 1310 1311 <div class="product-price-sale"> 1312 <s class="product-card-price-before card-money">Rp 155.000</s> 1313 <span class="product-card-discount small"> 1314 (-45%) 1315 </span> 1316 </div> 1317 1318 1319 1320 <div class="price-discount"> 1321 <h4 class="product-card-price-after card-money">Rp 85.000</h4> 1322 </div> 1323 1324 1325 1326 1327 1328 </div> 1329 1330 </div> 1331 </a> 1332 </div> 1333 1334 1335 <div class="wishlist-tooltip" style="display:none;"> 1336 <a href="https://amp.hotelverta.com/">Please login to save to wishlist</a> 1337 </div> 1338</div> 1339 1340 </div> 1341 1342 1343 1344 <div class="swiper-slide card"> 1345 1346 1347 1348 1349<div class="products" data-lazy="false"> 1350 <div class="bg-products"> 1351 <button type="button" class="wishlist-toggle" data-wishlist-button data-product-handle="nibbl-pistachio-promises-at-3am"> 1352 <div class="wishlist-icon-wrapper"> 1353 <svg class="wishlist-icon-outline" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:block;"> 1354 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125ZM12 19.9991C10.4688 19.1241 1.0625 13.5077 1.0625 7.15625C1.06424 5.70638 1.64096 4.31639 2.66618 3.29118C3.69139 2.26596 5.08138 1.68924 6.53125 1.6875C8.84016 1.6875 10.7805 2.92453 11.5953 4.91516C11.6283 4.9954 11.6843 5.06403 11.7564 5.
135411233C11.8285 5.16063 11.9133 5.18642 12 5.18642C12.0867 5.18642 12.1715 5.16063 12.2436 5.11233C12.3157 5.06403 12.3717 4.9954 12.4047 4.91516C13.2195 2.92453 15.1598 1.6875 17.4688 1.6875C18.9186 1.68924 20.3086 2.26596 21.3338 3.29118C22.359 4.31639 22.9358 5.70638 22.9375 7.15625C22.9375 13.5 13.5312 19.1284 12 19.9991Z" fill="#212121"/> 1355 </svg> 1356 <svg class="wishlist-icon-filled" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:none;"> 1357 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125Z" fill="#640000"/> 1358 </svg> 1359</div> 1360 </button> 1361 <a href="/products/nibbl-pistachio-promises-at-3am"> 1362 1363 <div class="product-card-img-container p-0 position-relative"> 1364 1365 <img class="product-card-img" lazy="false" src="https://outerbloom.com/cdn/shop/files/Pistachio-Promises-at-3AM_8d54b983-3e48-4377-90a0-fdf078746a00_350x.jpg?v=1761789808" data-src="https://outerbloom.com/cdn/shop/files/Pistachio-Promises-at-3AM_8d54b983-3e48-4377-90a0-fdf078746a00_350x.jpg?v=1761789808" alt="Nibbl Pistachio Promises at 3AM" height="200" width="200"> 1366 1367 </div> 1368 <div class="card-body product-card-info"> 1369 <h5 class="h5 mb-0"> 1370 Nibbl Pistachio Promises at 3AM 1371 </h5> 1372 <div class="product-card-price"> 1373 1374 <div class="product-price-sale"> 1375 <s class="product-card-price-before card-money">Rp 195.000</s> 1376 <span class="product-card-discount small"> 1377 (-49%) 1378 </span> 1379 </div> 1380 1381 1382 1383 <div class="price-discount"> 1384 <h4 class="product-card-price-after card-money">Rp 99.000</h4> 1385 </div> 1386 1387 1388 1389 1390 1391 </div> 1392 1393 </div> 1394 </a> 1395 </div> 1396 1397 1398 <div class="wishlist-tooltip" style="display:none;"> 1399 <a href="https://amp.hotelverta.com/">Please login to save to wishlist</a> 1400 </div> 1401</div> 1402 1403 </div> 1404 1405 1406 1407 <div class="swiper-slide card"> 1408 1409 1410 1411 1412<div class="products" data-lazy="false"> 1413 <div class="bg-products"> 1414 <button type="button" class="wishlist-toggle" data-wishlist-button data-product-handle="nibbl-winter-spice-everything-nice"> 1415 <div class="wishlist-icon-wrapper"> 1416 <svg class="wishlist-icon-outline" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:block;"> 1417 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125ZM12 19.9991C10.4688 19.1241 1.0625 13.5077 1.0625 7.15625C1.06424 5.70638 1.64096 4.31639 2.66618 3.29118C3.69139 2.26596 5.08138 1.68924 6.53125 1.6875C8.84016 1.6875 10.7805 2.92453 11.5953 4.91516C11.6283 4.9954 11.6843 5.06403 11.7564 5.
141711233C11.8285 5.16063 11.9133 5.18642 12 5.18642C12.0867 5.18642 12.1715 5.16063 12.2436 5.11233C12.3157 5.06403 12.3717 4.9954 12.4047 4.91516C13.2195 2.92453 15.1598 1.6875 17.4688 1.6875C18.9186 1.68924 20.3086 2.26596 21.3338 3.29118C22.359 4.31639 22.9358 5.70638 22.9375 7.15625C22.9375 13.5 13.5312 19.1284 12 19.9991Z" fill="#212121"/> 1418 </svg> 1419 <svg class="wishlist-icon-filled" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:none;"> 1420 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125Z" fill="#640000"/> 1421 </svg> 1422</div> 1423 </button> 1424 <a href="/products/nibbl-winter-spice-everything-nice"> 1425 1426 <div class="product-card-img-container p-0 position-relative"> 1427 1428 <img class="product-card-img" lazy="false" src="https://outerbloom.com/cdn/shop/files/Winter-Spice-_-Everything-Nice_9ae0c558-6322-442f-b1ed-4f4325f2367a_350x.jpg?v=1761789428" data-src="https://outerbloom.com/cdn/shop/files/Winter-Spice-_-Everything-Nice_9ae0c558-6322-442f-b1ed-4f4325f2367a_350x.jpg?v=1761789428" alt="Nibbl Winter Spice & Everything Nice" height="200" width="200"> 1429 1430 </div> 1431 <div class="card-body product-card-info"> 1432 <h5 class="h5 mb-0"> 1433 Nibbl Winter Spice & Everything Nice 1434 </h5> 1435 <div class="product-card-price"> 1436 1437 <div class="product-price-sale"> 1438 <s class="product-card-price-before card-money">Rp 195.000</s> 1439 <span class="product-card-discount small"> 1440 (-56%) 1441 </span> 1442 </div> 1443 1444 1445 1446 <div class="price-discount"> 1447 <h4 class="product-card-price-after card-money">Rp 85.000</h4> 1448 </div> 1449 1450 1451 1452 1453 1454 </div> 1455 1456 </div> 1457 </a> 1458 </div> 1459 1460 1461 <div class="wishlist-tooltip" style="display:none;"> 1462 <a href="https://amp.hotelverta.com/">Please login to save to wishlist</a> 1463 </div> 1464</div> 1465 1466 </div> 1467 1468 1469 1470 <div class="swiper-slide card"> 1471 1472 1473 1474 1475<div class="products" data-lazy="false"> 1476 <div class="bg-products"> 1477 <button type="button" class="wishlist-toggle" data-wishlist-button data-product-handle="nibbl-say-cheese-regret-nothing"> 1478 <div class="wishlist-icon-wrapper"> 1479 <svg class="wishlist-icon-outline" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:block;"> 1480 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125ZM12 19.9991C10.4688 19.1241 1.0625 13.5077 1.0625 7.15625C1.06424 5.70638 1.64096 4.31639 2.66618 3.29118C3.69139 2.26596 5.08138 1.68924 6.53125 1.6875C8.84016 1.6875 10.7805 2.92453 11.5953 4.91516C11.6283 4.9954 11.6843 5.06403 11.7564 5.
148011233C11.8285 5.16063 11.9133 5.18642 12 5.18642C12.0867 5.18642 12.1715 5.16063 12.2436 5.11233C12.3157 5.06403 12.3717 4.9954 12.4047 4.91516C13.2195 2.92453 15.1598 1.6875 17.4688 1.6875C18.9186 1.68924 20.3086 2.26596 21.3338 3.29118C22.359 4.31639 22.9358 5.70638 22.9375 7.15625C22.9375 13.5 13.5312 19.1284 12 19.9991Z" fill="#212121"/> 1481 </svg> 1482 <svg class="wishlist-icon-filled" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:none;"> 1483 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125Z" fill="#640000"/> 1484 </svg> 1485</div> 1486 </button> 1487 <a href="/products/nibbl-say-cheese-regret-nothing"> 1488 1489 <div class="product-card-img-container p-0 position-relative"> 1490 1491 <img class="product-card-img" lazy="false" src="https://outerbloom.com/cdn/shop/files/Say-Cheese-Regret-Nothing_8a57e2b8-dfd8-4ba1-a120-21756e5dc193_350x.jpg?v=1761789423" data-src="https://outerbloom.com/cdn/shop/files/Say-Cheese-Regret-Nothing_8a57e2b8-dfd8-4ba1-a120-21756e5dc193_350x.jpg?v=1761789423" alt="Nibbl Say Cheese, Regret Nothing" height="200" width="200"> 1492 1493 </div> 1494 <div class="card-body product-card-info"> 1495 <h5 class="h5 mb-0"> 1496 Nibbl Say Cheese, Regret Nothing 1497 </h5> 1498 <div class="product-card-price"> 1499 1500 <div class="product-price-sale"> 1501 <s class="product-card-price-before card-money">Rp 195.000</s> 1502 <span class="product-card-discount small"> 1503 (-56%) 1504 </span> 1505 </div> 1506 1507 1508 1509 <div class="price-discount"> 1510 <h4 class="product-card-price-after card-money">Rp 85.000</h4> 1511 </div> 1512 1513 1514 1515 1516 1517 </div> 1518 1519 </div> 1520 </a> 1521 </div> 1522 1523 1524 <div class="wishlist-tooltip" style="display:none;"> 1525 <a href="https://amp.hotelverta.com/">Please login to save to wishlist</a> 1526 </div> 1527</div> 1528 1529 </div> 1530 1531 1532 1533 <div class="swiper-slide card"> 1534 1535 1536 1537 1538<div class="products" data-lazy="false"> 1539 <div class="bg-products"> 1540 <button type="button" class="wishlist-toggle" data-wishlist-button data-product-handle="nibbl-berry-affair"> 1541 <div class="wishlist-icon-wrapper"> 1542 <svg class="wishlist-icon-outline" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:block;"> 1543 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125ZM12 19.9991C10.4688 19.1241 1.0625 13.5077 1.0625 7.15625C1.06424 5.70638 1.64096 4.31639 2.66618 3.29118C3.69139 2.26596 5.08138 1.68924 6.53125 1.6875C8.84016 1.6875 10.7805 2.92453 11.5953 4.91516C11.6283 4.9954 11.6843 5.06403 11.7564 5.
154311233C11.8285 5.16063 11.9133 5.18642 12 5.18642C12.0867 5.18642 12.1715 5.16063 12.2436 5.11233C12.3157 5.06403 12.3717 4.9954 12.4047 4.91516C13.2195 2.92453 15.1598 1.6875 17.4688 1.6875C18.9186 1.68924 20.3086 2.26596 21.3338 3.29118C22.359 4.31639 22.9358 5.70638 22.9375 7.15625C22.9375 13.5 13.5312 19.1284 12 19.9991Z" fill="#212121"/> 1544 </svg> 1545 <svg class="wishlist-icon-filled" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:none;"> 1546 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125Z" fill="#640000"/> 1547 </svg> 1548</div> 1549 </button> 1550 <a href="/products/nibbl-berry-affair"> 1551 1552 <div class="product-card-img-container p-0 position-relative"> 1553 1554 <img class="product-card-img" lazy="false" src="https://outerbloom.com/cdn/shop/files/Berry-Affair_350x.jpg?v=1761738335" data-src="https://outerbloom.com/cdn/shop/files/Berry-Affair_350x.jpg?v=1761738335" alt="Nibbl Berry Affair" height="200" width="200"> 1555 1556 </div> 1557 <div class="card-body product-card-info"> 1558 <h5 class="h5 mb-0"> 1559 Nibbl Berry Affair 1560 </h5> 1561 <div class="product-card-price"> 1562 1563 <div class="product-price-sale"> 1564 <s class="product-card-price-before card-money">Rp 155.000</s> 1565 <span class="product-card-discount small"> 1566 (-45%) 1567 </span> 1568 </div> 1569 1570 1571 1572 <div class="price-discount"> 1573 <h4 class="product-card-price-after card-money">Rp 85.000</h4> 1574 </div> 1575 1576 1577 1578 1579 1580 </div> 1581 1582 </div> 1583 </a> 1584 </div> 1585 1586 1587 <div class="wishlist-tooltip" style="display:none;"> 1588 <a href="https://amp.hotelverta.com/">Please login to save to wishlist</a> 1589 </div> 1590</div> 1591 1592 </div> 1593 1594 1595 1596 <div class="swiper-slide card"> 1597 1598 1599 1600 1601<div class="products" data-lazy="false"> 1602 <div class="bg-products"> 1603 <button type="button" class="wishlist-toggle" data-wishlist-button data-product-handle="nibbl-chocolate-after-dark"> 1604 <div class="wishlist-icon-wrapper"> 1605 <svg class="wishlist-icon-outline" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:block;"> 1606 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125ZM12 19.9991C10.4688 19.1241 1.0625 13.5077 1.0625 7.15625C1.06424 5.70638 1.64096 4.31639 2.66618 3.29118C3.69139 2.26596 5.08138 1.68924 6.53125 1.6875C8.84016 1.6875 10.7805 2.92453 11.5953 4.91516C11.6283 4.9954 11.6843 5.06403 11.7564 5.
160611233C11.8285 5.16063 11.9133 5.18642 12 5.18642C12.0867 5.18642 12.1715 5.16063 12.2436 5.11233C12.3157 5.06403 12.3717 4.9954 12.4047 4.91516C13.2195 2.92453 15.1598 1.6875 17.4688 1.6875C18.9186 1.68924 20.3086 2.26596 21.3338 3.29118C22.359 4.31639 22.9358 5.70638 22.9375 7.15625C22.9375 13.5 13.5312 19.1284 12 19.9991Z" fill="#212121"/> 1607 </svg> 1608 <svg class="wishlist-icon-filled" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:none;"> 1609 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125Z" fill="#640000"/> 1610 </svg> 1611</div> 1612 </button> 1613 <a href="/products/nibbl-chocolate-after-dark"> 1614 1615 <div class="product-card-img-container p-0 position-relative"> 1616 1617 <img class="product-card-img" lazy="false" src="https://outerbloom.com/cdn/shop/files/Chocolate-After-Dark_350x.jpg?v=1761737267" data-src="https://outerbloom.com/cdn/shop/files/Chocolate-After-Dark_350x.jpg?v=1761737267" alt="Nibbl Chocolate After Dark" height="200" width="200"> 1618 1619 </div> 1620 <div class="card-body product-card-info"> 1621 <h5 class="h5 mb-0"> 1622 Nibbl Chocolate After Dark 1623 </h5> 1624 <div class="product-card-price"> 1625 1626 <div class="product-price-sale"> 1627 <s class="product-card-price-before card-money">Rp 125.000</s> 1628 <span class="product-card-discount small"> 1629 (-32%) 1630 </span> 1631 </div> 1632 1633 1634 1635 <div class="price-discount"> 1636 <h4 class="product-card-price-after card-money">Rp 85.000</h4> 1637 </div> 1638 1639 1640 1641 1642 1643 </div> 1644 1645 </div> 1646 </a> 1647 </div> 1648 1649 1650 <div class="wishlist-tooltip" style="display:none;"> 1651 <a href="https://amp.hotelverta.com/">Please login to save to wishlist</a> 1652 </div> 1653</div> 1654 1655 </div> 1656 1657 1658 1659 <div class="swiper-slide card"> 1660 1661 1662 1663 1664<div class="products" data-lazy="false"> 1665 <div class="bg-products"> 1666 <button type="button" class="wishlist-toggle" data-wishlist-button data-product-handle="nibbl-the-whole-d-mn-thing"> 1667 <div class="wishlist-icon-wrapper"> 1668 <svg class="wishlist-icon-outline" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:block;"> 1669 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125ZM12 19.9991C10.4688 19.1241 1.0625 13.5077 1.0625 7.15625C1.06424 5.70638 1.64096 4.31639 2.66618 3.29118C3.69139 2.26596 5.08138 1.68924 6.53125 1.6875C8.84016 1.6875 10.7805 2.92453 11.5953 4.91516C11.6283 4.9954 11.6843 5.06403 11.7564 5.
166911233C11.8285 5.16063 11.9133 5.18642 12 5.18642C12.0867 5.18642 12.1715 5.16063 12.2436 5.11233C12.3157 5.06403 12.3717 4.9954 12.4047 4.91516C13.2195 2.92453 15.1598 1.6875 17.4688 1.6875C18.9186 1.68924 20.3086 2.26596 21.3338 3.29118C22.359 4.31639 22.9358 5.70638 22.9375 7.15625C22.9375 13.5 13.5312 19.1284 12 19.9991Z" fill="#212121"/> 1670 </svg> 1671 <svg class="wishlist-icon-filled" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:none;"> 1672 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125Z" fill="#640000"/> 1673 </svg> 1674</div> 1675 </button> 1676 <a href="/products/nibbl-the-whole-d-mn-thing"> 1677 1678 <div class="product-card-img-container p-0 position-relative"> 1679 1680 <img class="product-card-img" lazy="false" src="https://outerbloom.com/cdn/shop/files/The-Whole-Dmn-Thing_350x.jpg?v=1761737233" data-src="https://outerbloom.com/cdn/shop/files/The-Whole-Dmn-Thing_350x.jpg?v=1761737233" alt="Nibbl The Whole D*mn Thing" height="200" width="200"> 1681 1682 </div> 1683 <div class="card-body product-card-info"> 1684 <h5 class="h5 mb-0"> 1685 Nibbl The Whole D*mn Thing 1686 </h5> 1687 <div class="product-card-price"> 1688 1689 <div class="product-price-sale"> 1690 <s class="product-card-price-before card-money">Rp 440.000</s> 1691 <span class="product-card-discount small"> 1692 (-35%) 1693 </span> 1694 </div> 1695 1696 1697 1698 <div class="price-discount"> 1699 <h4 class="product-card-price-after card-money">Rp 285.000</h4> 1700 </div> 1701 1702 1703 1704 1705 1706 </div> 1707 1708 </div> 1709 </a> 1710 </div> 1711 1712 1713 <div class="wishlist-tooltip" style="display:none;"> 1714 <a href="https://amp.hotelverta.com/">Please login to save to wishlist</a> 1715 </div> 1716</div> 1717 1718 </div> 1719 1720 1721 1722 <div class="swiper-slide card"> 1723 1724 1725 1726 1727<div class="products" data-lazy="false"> 1728 <div class="bg-products"> 1729 <button type="button" class="wishlist-toggle" data-wishlist-button data-product-handle="the-jade-bouquet"> 1730 <div class="wishlist-icon-wrapper"> 1731 <svg class="wishlist-icon-outline" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:block;"> 1732 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125ZM12 19.9991C10.4688 19.1241 1.0625 13.5077 1.0625 7.15625C1.06424 5.70638 1.64096 4.31639 2.66618 3.29118C3.69139 2.26596 5.08138 1.68924 6.53125 1.6875C8.84016 1.6875 10.7805 2.92453 11.5953 4.91516C11.6283 4.9954 11.6843 5.06403 11.7564 5.
173211233C11.8285 5.16063 11.9133 5.18642 12 5.18642C12.0867 5.18642 12.1715 5.16063 12.2436 5.11233C12.3157 5.06403 12.3717 4.9954 12.4047 4.91516C13.2195 2.92453 15.1598 1.6875 17.4688 1.6875C18.9186 1.68924 20.3086 2.26596 21.3338 3.29118C22.359 4.31639 22.9358 5.70638 22.9375 7.15625C22.9375 13.5 13.5312 19.1284 12 19.9991Z" fill="#212121"/> 1733 </svg> 1734 <svg class="wishlist-icon-filled" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:none;"> 1735 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125Z" fill="#640000"/> 1736 </svg> 1737</div> 1738 </button> 1739 <a href="/products/the-jade-bouquet"> 1740 1741 <div class="product-card-img-container p-0 position-relative"> 1742 1743 <img class="product-card-img" lazy="false" src="https://outerbloom.com/cdn/shop/files/The-Jade-Bouquet_350x.jpg?v=1751618030" data-src="https://outerbloom.com/cdn/shop/files/The-Jade-Bouquet_350x.jpg?v=1751618030" alt="The Jade Bouquet" height="200" width="200"> 1744 1745 </div> 1746 <div class="card-body product-card-info"> 1747 <h5 class="h5 mb-0"> 1748 The Jade Bouquet 1749 </h5> 1750 <div class="product-card-price"> 1751 1752 <div class="product-price-sale"> 1753 <s class="product-card-price-before card-money">Rp 435.000</s> 1754 <span class="product-card-discount small"> 1755 (-34%) 1756 </span> 1757 </div> 1758 1759 1760 1761 <div class="price-discount"> 1762 <h4 class="product-card-price-after card-money">Rp 285.000</h4> 1763 </div> 1764 1765 1766 1767 1768 1769 </div> 1770 1771 </div> 1772 </a> 1773 </div> 1774 1775 1776 <div class="wishlist-tooltip" style="display:none;"> 1777 <a href="https://amp.hotelverta.com/">Please login to save to wishlist</a> 1778 </div> 1779</div> 1780 1781 </div> 1782 1783 1784 1785 <div class="swiper-slide card"> 1786 1787 1788 1789 1790<div class="products" data-lazy="false"> 1791 <div class="bg-products"> 1792 <button type="button" class="wishlist-toggle" data-wishlist-button data-product-handle="the-selena-bouquet"> 1793 <div class="wishlist-icon-wrapper"> 1794 <svg class="wishlist-icon-outline" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:block;"> 1795 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125ZM12 19.9991C10.4688 19.1241 1.0625 13.5077 1.0625 7.15625C1.06424 5.70638 1.64096 4.31639 2.66618 3.29118C3.69139 2.26596 5.08138 1.68924 6.53125 1.6875C8.84016 1.6875 10.7805 2.92453 11.5953 4.91516C11.6283 4.9954 11.6843 5.06403 11.7564 5.
179511233C11.8285 5.16063 11.9133 5.18642 12 5.18642C12.0867 5.18642 12.1715 5.16063 12.2436 5.11233C12.3157 5.06403 12.3717 4.9954 12.4047 4.91516C13.2195 2.92453 15.1598 1.6875 17.4688 1.6875C18.9186 1.68924 20.3086 2.26596 21.3338 3.29118C22.359 4.31639 22.9358 5.70638 22.9375 7.15625C22.9375 13.5 13.5312 19.1284 12 19.9991Z" fill="#212121"/> 1796 </svg> 1797 <svg class="wishlist-icon-filled" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:none;"> 1798 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125Z" fill="#640000"/> 1799 </svg> 1800</div> 1801 </button> 1802 <a href="/products/the-selena-bouquet"> 1803 1804 <div class="product-card-img-container p-0 position-relative"> 1805 1806 <img class="product-card-img" lazy="false" src="https://outerbloom.com/cdn/shop/files/The-Selena-Bouquet_350x.jpg?v=1751618047" data-src="https://outerbloom.com/cdn/shop/files/The-Selena-Bouquet_350x.jpg?v=1751618047" alt="The Selena Bouquet" height="200" width="200"> 1807 1808 </div> 1809 <div class="card-body product-card-info"> 1810 <h5 class="h5 mb-0"> 1811 The Selena Bouquet 1812 </h5> 1813 <div class="product-card-price"> 1814 1815 <div class="product-price-sale"> 1816 <s class="product-card-price-before card-money">Rp 335.000</s> 1817 <span class="product-card-discount small"> 1818 (-29%) 1819 </span> 1820 </div> 1821 1822 1823 1824 <div class="price-discount"> 1825 <h4 class="product-card-price-after card-money">Rp 235.000</h4> 1826 </div> 1827 1828 1829 1830 1831 1832 </div> 1833 1834 </div> 1835 </a> 1836 </div> 1837 1838 1839 <div class="wishlist-tooltip" style="display:none;"> 1840 <a href="https://amp.hotelverta.com/">Please login to save to wishlist</a> 1841 </div> 1842</div> 1843 1844 </div> 1845 1846 1847 </div> 1848 </div> 1849 1850 </div> 1851 </div> 1852 </div> 1853 1854 <div class="site-overlay" style="display: none"></div> 1855</div>
1856<script> 1857 1858 var swiper = new Swiper('.popup-recommend', { 1859 slidesPerView : 4, 1860 spaceBetween: 30, 1861 lazy: true , 1862 speed: 300, 1863 breakpoints: { 1864 // when window width is <= 576px 1865 576: { 1866 slidesPerView: 2, 1867 spaceBetween: 10, 1868 freeMode: true, 1869 resistance : true, 1870 resistanceRatio : 0, 1871 freeModeMomentumRatio : 0.45, 1872 freeModeMomentumVelocityRatio : 1.5 1873 }, 1874 768: { 1875 slidesPerView: 2, 1876 spaceBetween: 10 1877 }, 1878 992: { 1879 slidesPerView: 3, 1880 spaceBetween: 20 1881 } 1882 } 1883 }); 1884 1885 const searchContainer = $("#search-popup") 1886 const searchInput = $(".search-popup") 1887 const result_collection = $('.result_collection') 1888 const result_product = $('.result_product') 1889 const resultsearch = $('.resultsearch') 1890 const resultrecommend = $(".group-recommend") 1891 const moreresult = $(".moreresult") 1892 1893 searchInput.keyup(function(){ 1894 const input = $(this).val() 1895 moreresult.find("p span").text(` â${input}â`) 1896 if(input.length > 2) { 1897 $(".close-search").show() 1898 const url = `https://outerbloom.com/search/suggest.json?resources[limit]=10&resources[limit_scope]=each&resources[type]=collection,product&q=${input}` 1899 $.ajax({
1900 type: 'GET', 1901 url, 1902 beforeSend: function() { 1903 // setting a timeout 1904 // $(placeholder).addClass('loading'); 1905 }, 1906 success: async function(response) { 1907 resultsearch.show() 1908 resultrecommend.hide() 1909 result_collection.html("") 1910 result_product.html("") 1911 const collections = response.resources.results.collections 1912 const products = response.resources.results.products 1913 let collection_length = collections.length 1914 let product_length = products.length 1915 1916 async function getCollectionProductCount(handle) { 1917 try { 1918 const collectionUrl = `https://outerbloom.com/collections/${handle}.json` 1919 const response = await fetch(collectionUrl) 1920 if (response.ok) { 1921 const data = await response.json() 1922 return data.collection.products_count ? data.collection.products_count : 0 1923 } 1924 return 0 1925 } catch (error) { 1926 console.log('Error fetching collection product count:', error) 1927 return 0 1928 } 1929 } 1930 1931 // Show skeleton loader for suggestions 1932 const skeletonHTML = ` 1933 <div class="skeleton-loader"> 1934 <div class="skeleton-item" style="width: 80%;"></div> 1935 <div class="skeleton-item" style="width: 90%;"></div> 1936 <div class="skeleton-item" style="width: 75%;"></div> 1937 <div class="skeleton-item" style="width: 85%;"></div> 1938 <div class="skeleton-item" style="width: 70%;"></div> 1939 </div> 1940 ` 1941 result_collection.html(skeletonHTML) 1942 1943 // Show skeleton loader for products (3 cards on desktop, 2 on mobile) 1944 const productSkeletonHTML = ` 1945 <li class="skeleton-product-card"> 1946 <div class="skeleton-product-image"></div> 1947 <div class="skeleton-product-title"></div> 1948 <div class="skeleton-product-price"></div> 1949 </li> 1950 <li class="skeleton-product-card"> 1951 <div class="skeleton-product-image"></div> 1952 <div class="skeleton-product-title"></div> 1953 <div class="skeleton-product-price"></div> 1954 </li> 1955 <li class="skeleton-product-card"> 1956 <div class="skeleton-product-image"></div> 1957 <div class="skeleton-product-title"></div> 1958 <div class="skeleton-product-price"></div> 1959 </li> 1960 <li class="skeleton-product-card"> 1961 <div class="skeleton-product-image"></div> 1962 <div class="skeleton-product-title"></div> 1963 <div class="skeleton-product-price"></div> 1964 </li> 1965 <li class="skeleton-product-card"> 1966 <div class="skeleton-product-image"></div> 1967 <div class="skeleton-product-title"></div> 1968 <div class="skeleton-product-price"></div> 1969 </li> 1970 <li class="skeleton-product-card"> 1971 <div class="skeleton-product-image"></div> 1972 <div class="skeleton-product-title"></div> 1973 <div class="skeleton-product-price"></div> 1974 </li> 1975 ` 1976 result_product.html(productSkeletonHTML) 1977 1978 // Render products immediately (without waiting for collections) 1979 setTimeout(() => { 1980 result_product.html('') 1981 let productCount = 0 1982 for(let i=0; i<product_length && productCount < 6; i++){ 1983 const product = products[i] 1984 const title = product.title 1985 const url = product.url 1986 const image = product.featured_image.url 1987 const vendor = product.vendor 1988 const price = product.price 1989 const formattedPrice = new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 }).format(price) 1990 1991 // Filter out excluded products 1992 if(vendor === 'AIA' || vendor === 'AXA' || vendor === 'WOM Finance') continue
1993 if(title.includes('Extra Shipping Cost') || title.includes('[US]') || title.includes('Rp')) continue 1994 1995 const html_product = ` 1996 <li class="item" data-vendor="${vendor}"> 1997 <a href="${url}" class="item_url" data-type="product" data-title="${title}" data-url="${url}"> 1998 <div class="product-card-search"> 1999 <img src="${image}" alt="${title}" class="product-image-search"> 2000 <div class="product-info-search"> 2001 <div class="product-title-search">${title}</div> 2002 <div class="product-price-search">${formattedPrice}</div> 2003 </div> 2004 </div> 2005 </a> 2006 </li> 2007 ` 2008 result_product.append(html_product) 2009 productCount++ 2010 } 2011 }, 100) 2012 2013 // Collect unique collections first 2014 const addedTitles = new Set() 2015 const addedHandles = new Set() 2016 const validCollections = [] 2017 2018 for(let i=0; i<collection_length && validCollections.length < 10; i++){ 2019 const title = collections[i].title 2020 const titleLower = title.toLowerCase() 2021 const handle = collections[i].handle 2022 const url = collections[i].url 2023 2024 // Skip if title or handle already added, or if title includes excluded terms 2025 if(addedTitles.has(titleLower) || addedHandles.has(handle)) continue 2026 if(title.includes('AIA') || title.includes('AXA') || title.includes('WOM') || title.includes('Upsell')) continue 2027 2028 const count = await getCollectionProductCount(handle) 2029 2030 // Only add if collection has products 2031 if(count > 0) { 2032 validCollections.push({ title, url }) 2033 addedTitles.add(titleLower) 2034 addedHandles.add(handle) 2035 } 2036 } 2037 2038 // Clear skeleton and render all collections at once 2039 result_collection.html('') 2040 validCollections.forEach(collection => { 2041 const html_collection = ` 2042 <li class="item" data-title="${collection.title}"> 2043 <a href="${collection.url}" data-type="collection" class="item_url" data-title="${collection.title}" data-url="${collection.url}">${collection.title}</a> 2044 </li> 2045 ` 2046 result_collection.append(html_collection) 2047 }) 2048 }, 2049 error: function(xhr) { // if error occured 2050 alert("Error occured.please try again"); 2051 }, 2052 complete: function(response) { 2053 // $(placeholder).removeClass('loading'); 2054 }, 2055 dataType: 'JSON' 2056 }); 2057 } else { 2058 result_collection.html("") 2059 result_product.html("") 2060 2061 resultsearch.hide() 2062 resultrecommend.show() 2063 } 2064 }) 2065 2066 moreresult.click(function(){ 2067 $("#search-btn").trigger("click"); 2068 }) 2069 2070 $(".close-search").click(function(){ 2071 $(this).hide() 2072 searchInput.val("") 2073 searchInput.focus() 2074 resultsearch.hide() 2075 resultrecommend.show() 2076 }) 2077 2078 function setCookie(name,value,days) { 2079 var expires = ""; 2080 if (days) { 2081 var date = new Date(); 2082 date.setTime(date.getTime() + (days*24*60*60*1000)); 2083 expires = "; expires=" + date.toUTCString(); 2084 } 2085 document.cookie = name + "=" + (value || "") + expires + "; path=/"; 2086 } 2087 function getCookie(name) { 2088 var nameEQ = name + "="; 2089 var ca = document.cookie.split(';'); 2090 for(var i=0;i < ca.length;i++) { 2091 var c = ca[i]; 2092 while (c.charAt(0)==' ') c = c.substring(1,c.length); 2093 if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); 2094 } 2095 return null; 2096 } 2097 let last_search_name = [] 2098 let last_search_url = [] 2099 $(".group-recent").hide() 2100 if(getCookie("last_search_name") != null && getCookie("last_search_url") != null){ 2101 if(getCookie("last_search_name") != "" && getCookie("last_search_url") != ""){ 2102 $(".group-recent").show() 2103 last_search_name = getCookie("last_search_name"); 2104 last_search_url = getCookie("last_search_url"); 2105 const arrName = last_search_name.substring(1).split(',').reverse() 2106 const arrUrl = last_search_url.substring(1).split(',').reverse() 2107 console.log(arrName, 'Array Name') 2108 console.log(arrUrl, 'Array Url') 2109 let length = arrName.length 2110 if(arrName.length > 5) { 2111 length = 5 2112 } 2113 for(let n=0;n<length;n++){ 2114 let html2 = `<li><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title/><path d="M12.25,2A9.81,9.81,0,0,0,4.77,5.46L3.41,4.25a1,1,0,0,0-1.07-.16A1,1,0,0,0,1.75,5V9a1,1,0,0,0,1,1h4.5a1,1,0,0,0,.93-.64,1,1,0,0,0-.27-1.11L6.26,6.78a7.86,7.86,0,0,1,6-2.78A8,8,0,1,1,4.72,14.67a1,1,0,0,0-1.89.66A10,10,0,1,0,12.25,2Z" fill="#C9C9C9"/><path d="M16,16a1,1,0,0,1-.6-.2l-4-3A1,1,0,0,1,11,12V8a1,1,0,0,1,2,0v3.5l3.6,2.7a1,1,0,0,1,.2,1.4A1,1,0,0,1,16,16Z" fill="#C9C9C9"/></svg><a href="${arrUrl[n]}">
2114${arrName[n]}</a><span data-title="${arrName[n]}" data-url="${arrUrl[n]}"></span></li>` 2115 $(".group-recent ul").append(html2) 2116 } 2117 } 2118 } 2119 console.log(last_search_name, 'Name') 2120 console.log(last_search_url, 'url') 2121 2122 resultsearch.delegate(".item a", "click", function(){ 2123 let name = [last_search_name] 2124 let url = [last_search_url] 2125 name.push($(this).attr('data-title')) 2126 url.push($(this).attr('data-url')) 2127 setCookie("last_search_name",name,7); 2128 setCookie("last_search_url",url,7); 2129 }) 2130 2131 $(".delete-all-history").click(function() { 2132 setCookie("last_search_name",null,0); 2133 setCookie("last_search_url",null,0); 2134 $(".last-search").hide(); 2135 setTimeout(function(){ 2136 location.reload(); 2137 }, 500); 2138 }) 2139 2140 $("#search-trigger").click(function(){ 2141 search_open() 2142 }) 2143 $(".icon-search-mobile").click(function(){ 2144 search_open() 2145 }) 2146 $(".search-header svg").click(function(){ 2147 search_close() 2148 }) 2149 $(".icon-key-mobile").click(function(){ 2150 search_close() 2151 }) 2152 2153 function search_open() { 2154 $("body").addClass("search-popup-open") 2155 $("#nav-mobile-icon, .search-header label, .icon-search-mobile").hide() 2156 $("#search-popup, .search-header svg, .icon-key-mobile").show() 2157 $(".search-popup").focus() 2158 $('.popup-recommend')[0].swiper.update(); 2159 } 2160 function search_close() { 2161 $("body").removeClass("search-popup-open") 2162 $("#nav-mobile-icon, .search-header label, .icon-search-mobile").show() 2163 $("#search-popup, .search-header svg, .icon-key-mobile").hide() 2164 searchInput.val("") 2165 resultsearch.hide() 2166 resultrecommend.show() 2167 } 2168 2169 $(".site-overlay").click(function(){ 2170 search_close() 2171 }) 2172</script>
2172 2173 2174</div> 2175 </div> 2176 <div class="button-login-daftar"> 2177 <a class="login" href="https://amp.hotelverta.com/" rel="nofollow noreferrer" style="color: black;"> 2178 LOGIN 2179 </a> 2180 <a class="register" href="https://amp.hotelverta.com/" rel="nofollow noreferrer" style="color: black;"> 2181 DAFTAR 2182 </a> 2183</div> 2184 <div id="PageContainer" class="is-moved-by-drawerx"> 2185 <main class="main-content pt-0" role="main"> 2186 2187 <div id="breadcrumbProduct" class="d-none d-lg-block"> 2188 <style> 2189 #breadcrumbProduct { 2190 padding: 20px 0; 2191 } 2192 #breadcrumbProduct ul { 2193 display: flex; 2194 padding: 0; 2195 list-style: none; 2196 margin: 0; 2197 gap: 12px; 2198 } 2199 #breadcrumbProduct ul li { 2200 text-transform: uppercase; 2201 margin: 0; 2202 font-size: 12px; 2203} 2204 #breadcrumbProduct ul li a { 2205 color: #d32f2f; /* Warna merah untuk link breadcrumb agar senada */ 2206 font-weight: 600; 2207 } 2208 2209 #breadcrumbProduct ul li svg { 2210 width: 10px; 2211 height: 10px; 2212 padding: 0; 2213 color: #fbc02d; /* Warna kuning emas untuk pemisah */ 2214 vertical-align: middle; 2215 } 2216 2217.button-login-daftar { 2218 display: grid; 2219 grid-template-columns: repeat(2, 1fr); 2220 font-weight: 800; /* Dibuat lebih tebal agar tegas */ 2221 gap: 5px; /* Tambahan sedikit jarak antar tombol */ 2222} 2223 2224.button-login-daftar a { 2225 text-align: center; 2226 text-decoration: none; 2227 transition: all 0.3s ease; /* Efek halus saat disentuh */ 2228} 2229 2230.login, 2231.register { 2232 color: #fff; 2233 padding: 15px 10px; 2234 font-size: 23px; 2235 text-shadow: 1px 2px 4px rgba(0,0,0,0.5); /* Bayangan teks agar lebih mewah */ 2236 border-radius: 8px; /* Sudut sedikit melengkung agar modern */ 2237} 2238 2239/* Tombol LOGIN: Dominan Merah dengan gradasi Kuning */ 2240.login, 2241.login-button { 2242 background: linear-gradient(to bottom, #ff0000 0%, #fbc02d 100%); 2243 border: 2px solid #ffeb3b; 2244 box-shadow: 0 4px 15px rgba(211, 47, 47, 0.4); 2245} 2246 2247/* Tombol DAFTAR: Dominan Kuning dengan gradasi Merah */ 2248.register, 2249.register-button { 2250 background: linear-gradient(to bottom, #ffeb3b 0%, #d32f2f 100%); 2251 border: 2px solid #ff0000; 2252 box-shadow: 0 4px 15px rgba(251, 192, 45, 0.4); 2253} 2254 2255/* Efek Hover (Saat kursor di atas tombol) */ 2256.button-login-daftar a:hover { 2257 filter: brightness(1.1); 2258 transform: translateY(-2px); /* Tombol sedikit naik */ 2259 box-shadow: 0 6px 20px rgba(0,0,0,0.3); 2260} 2261</style> 2262 2263<div class="container"> 2264 <ul role="navigation" aria-label="breadcrumbs"> 2265 2266 <li><a href="https://hotelverta.com/">HANTUSLOT</a></li> 2267 <li><svg class="icon icon-chevron-right" xmlns="http://www.w3.org/2000/svg" width="7" height="10" viewBox="0 0 7 10" fill="none"> 2268 <path d="M1.51673 0.0583496L6.2334 4.77502L1.51673 9.49168L0.933398 8.90002L5.0584 4.77502L0.933398 0.650016L1.51673 0.0583496Z" fill="#757575"/> 2269</svg></li> 2270 2271 2272 <li>HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman</li> 2273 2274 </ul> 2275</div> 2276 2277 </div> 2278 2279 2280 2281<div id="shopify-section-Product" class="shopify-section product-section mt-0"><link href="https://outerbloom.com/cdn/shop/t/138/assets/product.css?v=124213504851328585011771028916" rel="stylesheet" type="text/css" media="all" /> 2282 2283 2284 2285 2286<!-- /templates/product.liquid --> 2287 2288 2289<!-- <div itemscope itemtype="http://schema.org/Product"> --> 2290 2291 2292 2293 2294 2295 2296<div class="product-parcel-inhouse" data-product-type="hampers"> 2297 <meta itemprop="url" content="https://hotelverta.com/"> 2298 <meta itemprop="image" content="https://imagesme.b-cdn.net/landing/banner-hotelverta.png"> 2299 2300 2301 2302 <input id="data-sku" type="hidden" value="[C]HANTUSLOT"> 2303 <div class="product-single"> 2304 <div id="product-top" class="container"> 2305 <div class="row bg-card product-sticky"> 2306 <div id="product-image" class="col-lg-7 text-center"> 2307 <div class="product-image"> 2308 <div class="row no-gutters"> 2309 2310 <div id="product-featured-image" class="row w-100"> 2311 2312 <div id="thumb-image-product" class="col-lg-2 col-12 d-none d-lg-block"> 2313 2314 <div class="swiper-button-prev carousel-button-prev d-lg-none"><svg class="icon icon-chevron-left" xmlns="http://www.w3.org/2000/svg" width="7" height="12" viewBox="0 0 7 12"> <circle cx="60%" cy="50%" r="12" fill="transparent" /> <path d="M6.35355339,10.6464466 C6.54881554,10.8417088 6.54881554,11.1582912 6.35355339,11.3535534 C6.15829124,11.5488155 5.84170876,11.5488155 5.64644661,11.3535534 L0.646446609,6.35355339 C0.451184464,6.15829124 0.451184464,5.84170876 0.646446609,5.64644661 L5.64644661,0.646446609 C5.84170876,0.451184464 6.15829124,0.451184464 6.35355339,0.646446609 C6.54881554,0.841708755 6.54881554,1.15829124 6.35355339,1.35355339 L1.70710678,6 L6.35355339,10.6464466 Z"/> </svg></div> 2315 2316 <div class="swiper-container gallery-thumbs" style="min-height: 500px"> 2317 <ul class="list-unstyled slider swiper-wrapper slider-nav ProductThumbs thumbnails" id="ProductThumbsx"> 2318 2319 <li class="swiper-slide" data-type="image"> 2320 <a 2321 href="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2322 data-standard="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2323 data-image="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2324 data-position="1" 2325 class="product-single__thumbnail" 2326 > 2327 <img 2328 class="lazyload w-100" 2329 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2330 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2331 width="" 2332 height="" 2333 > 2334 </a> 2335 </li> 2336 2337 2338 2339 2340 <li class="swiper-slide" data-type="video"> 2341 <a 2342 href="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2343 data-standard="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2344 data-video="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2345 data-position="2" 2346 class="product-single__thumbnail" 2347 > 2348 <img 2349 class="lazyload" 2350 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2351 data-src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2352 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2353 width="" 2354 height="" 2355 > 2356 </a> 2357 </li> 2358 2359 2360 2361 <li class="swiper-slide" data-type="image"> 2362 <a 2363 href="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2364 data-standard="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2365 data-image="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2366 data-position="3" 2367 class="product-single__thumbnail" 2368 > 2369 <img 2370 class="lazyload w-100" 2371 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2372 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2373 width="" 2374 height="" 2375 > 2376 </a> 2377 </li> 2378 2379 2380 2381 2382 <li class="swiper-slide" data-type="image"> 2383 <a 2384 href="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2385 data-standard="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2386 data-image="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2387 data-position="4" 2388 class="product-single__thumbnail" 2389 > 2390 <img 2391 class="lazyload w-100" 2392 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2393 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2394 width="" 2395 height="" 2396 > 2397 </a> 2398 </li> 2399 2400 2401 2402 2403 <li class="swiper-slide" data-type="image"> 2404 <a 2405 href="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2406 data-standard="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2407 data-image="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2408 data-position="5" 2409 class="product-single__thumbnail" 2410 > 2411 <img 2412 class="lazyload w-100" 2413 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2414 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2415 width="" 2416 height="" 2417 > 2418 </a> 2419 </li> 2420 2421 2422 2423 2424 <li class="swiper-slide" data-type="image"> 2425 <a 2426 href="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2427 data-standard="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2428 data-image="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2429 data-position="6" 2430 class="product-single__thumbnail" 2431 > 2432 <img 2433 class="lazyload w-100" 2434 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2435 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2436 width="" 2437 height="" 2438 > 2439 </a> 2440 </li> 2441 2442 2443 2444 2445 <li class="swiper-slide" data-type="image"> 2446 <a 2447 href="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2448 data-standard="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2449 data-image="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2450 data-position="7" 2451 class="product-single__thumbnail" 2452 > 2453 <img 2454 class="lazyload w-100" 2455 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2456 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2457 width="" 2458 height="" 2459 > 2460 </a> 2461 </li> 2462 2463 2464 2465 2466 <li class="swiper-slide" data-type="image"> 2467 <a 2468 href="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2469 data-standard="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2470 data-image="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2471 data-position="8" 2472 class="product-single__thumbnail" 2473 > 2474 <img 2475 class="lazyload w-100" 2476 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2477 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2478 width="" 2479 height="" 2480 > 2481 </a> 2482 </li> 2483 2484 2485 2486 </ul> 2487 </div> 2488 2489 <div class="swiper-button-next carousel-button-next d-lg-none"><svg class="icon icon-chevron-right" xmlns="http://www.w3.org/2000/svg" width="7" height="10" viewB
2489ox="0 0 7 10" fill="none"> 2490 <path d="M1.51673 0.0583496L6.2334 4.77502L1.51673 9.49168L0.933398 8.90002L5.0584 4.77502L0.933398 0.650016L1.51673 0.0583496Z" fill="#757575"/> 2491</svg></div> 2492 2493 </div> 2494 2495 <div 2496 id="featured-image-product" 2497 class="col-lg-10 col-12 d-none d-lg-block" 2498 > 2499 <div class="swiper-container gallery-top"> 2500 <div class="swiper-slide product-single__image"> 2501 2502<div class="position-relative product-single__photos slider slider-for" id="ProductPhoto"> 2503 2504 2505 <div class="easyzoom easyzoom--overlay easyzoom--with-thumbnails"> 2506 <a href="https://imagesme.b-cdn.net/landing/banner-hotelverta.png"> 2507 <img 2508 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2509 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2510 id="ProductPhotoImg" 2511 class="lazyload" 2512 > 2513 2514 </a> 2515 </div> 2516 2517 2518</div> 2519 2520 </div> 2521 <div class="swiper-slide product-single__video" style="display: none"> 2522 <video 2523 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2524 playsinline 2525 loop 2526 muted 2527 ></video> 2528 </div> 2529 </div> 2530 </div> 2531 </div> 2532 2533 <div id="featured-image-product2" class="col-12 d-lg-none"> 2534 <div class="swiper-container gallery-mobile"> 2535 <ul class="swiper-wrapper"> 2536<li class="swiper-slide img"> 2537 2538 <img 2539 class="swiper-lazy" 2540 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2541 data-src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2542 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2543 width="" 2544 height="" 2545 > 2546 2547 </li> 2548 2549 2550 2551 <li class="swiper-slide vid"> 2552 <video height="100%" src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" playsinline loop autoplay muted></video> 2553 </li> 2554 2555 2556<li class="swiper-slide img"> 2557 2558 <img 2559 class="swiper-lazy" 2560 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2561 data-src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2562 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2563 width="" 2564 height="" 2565 > 2566 2567 </li> 2568 2569 2570<li class="swiper-slide img"> 2571 2572 <img 2573 class="swiper-lazy" 2574 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2575 data-src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2576 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2577 width="" 2578 height="" 2579 > 2580 2581 </li> 2582 2583 2584<li class="swiper-slide img"> 2585 2586 <img 2587 class="swiper-lazy" 2588 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2589 data-src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2590 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2591 width="" 2592 height="" 2593 > 2594 2595 </li> 2596 2597 2598<li class="swiper-slide img"> 2599 2600 <img 2601 class="swiper-lazy" 2602 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2603 data-src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2604 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2605 width="" 2606 height="" 2607 > 2608 2609 </li> 2610 2611 2612<li class="swiper-slide img"> 2613 2614 <img 2615 class="swiper-lazy" 2616 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2617 data-src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2618 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2619 width="" 2620 height="" 2621 > 2622 2623 </li> 2624 2625 2626<li class="swiper-slide img"> 2627 2628 <img 2629 class="swiper-lazy" 2630 src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2631 data-src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 2632 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 2633 width="" 2634 height="" 2635 > 2636 2637 </li> 2638 2639 2640 </ul> 2641 2642 2643 <div class="swiper-button-prev"><svg class="icon icon-chevron-left" xmlns="http://www.w3.org/2000/svg" width="7" height="12" viewBox="0 0 7 12"> <circle cx="60%" cy="50%" r="12" fill="transparent" /> <path d="M6.35355339,10.6464466 C6.54881554,10.8417088 6.54881554,11.1582912 6.35355339,11.3535534 C6.15829124,11.5488155 5.84170876,11.5488155 5.64644661,11.3535534 L0.646446609,6.35355339 C0.451184464,6.15829124 0.451184464,5.84170876 0.646446609,5.64644661 L5.64644661,0.646446609 C5.84170876,0.451184464 6.15829124,0.451184464 6.35355339,0.646446609 C6.54881554,0.841708755 6.54881554,1.15829124 6.35355339,1.35355339 L1.70710678,6 L6.35355339,10.6464466 Z"/> </svg></div> 2644 <div class="swiper-button-next"><svg class="icon icon-chevron-right" xmlns="http://www.w3.org/2000/svg" width="7" height="10" viewB
2644ox="0 0 7 10" fill="none"> 2645 <path d="M1.51673 0.0583496L6.2334 4.77502L1.51673 9.49168L0.933398 8.90002L5.0584 4.77502L0.933398 0.650016L1.51673 0.0583496Z" fill="#757575"/> 2646</svg></div> 2647 2648 <!-- Add Pagination --> 2649 <div class="swiper-pagination"></div> 2650 2651 </div> 2652 </div> 2653 2654 <div class="product-m-pageleb-video col-12 text-center d-lg-none"> 2655 <!-- product video --> 2656 <style> 2657 .view-video{display:block; margin:auto; padding:5px 10px;font-size:16px;font-weight:bold;border:2px solid #212121;background:#fff;} 2658 .view-video .icon-play{fill:#212121;vertical-align: middle;} 2659 .video-modal{display:none;position:fixed;background: rgba(0,0,0,.5); width:100%; height:100%; overflow:auto; z-index:1; top:0;left:0;} 2660 .close-video{position:absolute;right:9px; top:8%;z-index:2;padding:5px;} 2661 .close-video .icon{width:30px;height:30px;} 2662 .video-container {position: relative;padding-bottom: 48.25%;padding-top: 35px;height: 0;box-shadow: 0 4px 5px 0 rgba(0,0,0,0.14), 0 1px 10px 0 rgba(0,0,0,0.12), 0 2px 4px -1px rgba(0,0,0,0.3);} 2663 .video-container iframe {position: absolute;top:60%;left: 0;width: 100%;height: 100%;} 2664 2665 .youtube { 2666 background-color: #000; 2667 margin-bottom: 30px; 2668 position: relative; 2669 padding-top: 56.25%; 2670 overflow: hidden; 2671 cursor: pointer; 2672 width: 100%; 2673 } 2674 .swiper-slide .youtube { 2675 max-width: 480px; 2676 } 2677 .youtube img { 2678 width: 100%; 2679 top: -16.82%; 2680 left: 0; 2681 opacity: 0.7; 2682 } 2683 .youtube .play-button { 2684 width: 90px; 2685 height: 60px; 2686 background-color: #333; 2687 box-shadow: 0 0 30px rgba( 0,0,0,0.6 ); 2688 z-index: 1; 2689 opacity: 0.8; 2690 border-radius: 6px; 2691 } 2692 .youtube .play-button:before { 2693 content: ""; 2694 border-style: solid; 2695 border-width: 15px 0 15px 26.0px; 2696 border-color: transparent transparent transparent #fff; 2697 } 2698 .youtube img, 2699 .youtube .play-button { 2700 cursor: pointer; 2701 } 2702 .youtube img, 2703 .youtube iframe, 2704 .youtube .play-button, 2705 .youtube .play-button:before { 2706 position: absolute; 2707 } 2708 .youtube .play-button, 2709 .youtube .play-button:before { 2710 top: 50%; 2711 left: 50%; 2712 transform: translate3d( -50%, -50%, 0 ); 2713 } 2714 .youtube iframe { 2715 height: 100%; 2716 width: 100%; 2717 top: 0; 2718 left: 0; 2719 } 2720 </style> 2721 2722 2723 </div> 2724</div> 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742<div class="product-desc-add position-relative d-none d-lg-block m-0"> 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805</div> 2806
2807<script> 2808 if ($(window).width() < 991) { 2809 var direction = 'horizontal' 2810 } else { 2811 var direction = 'vertical' 2812 $(".gallery-thumbs").height($("#ProductPhotoImg").height()) 2813 } 2814 var swiper = new Swiper('.gallery-thumbs', { 2815 2816 // loop: true, 2817 2818 direction, 2819 slidesPerView: 4.5, 2820 spaceBetween: 12, 2821 navigation: { 2822 nextEl: '.swiper-button-next', 2823 prevEl: '.swiper-button-prev', 2824 } 2825 }); 2826 2827 var swiper = new Swiper('.gallery-mobile', { 2828 //loop: true, 2829 lazy: true, 2830 speed: 300, 2831 resistance : true, 2832 resistanceRatio : 0, 2833 freeModeMomentumRatio : 0.45, 2834 freeModeMomentumVelocityRatio : 1.5, 2835 navigation: { 2836 nextEl: '.swiper-button-next', 2837 prevEl: '.swiper-button-prev', 2838 }, 2839 pagination: { 2840 el: '.swiper-pagination' 2841 }, 2842 useCSS3Transforms: false, 2843 loop: false, 2844 on: { 2845 init: function () { 2846 console.log('swiper initialized'); 2847 var currentVideo = $("[data-swiper-slide-index=" + this.realIndex + "]").find("video"); 2848 currentVideo.trigger('play'); 2849 }, 2850 }, 2851 }); 2852 var sliderVideos = $(".swiper-slide video"); 2853 2854 /* SWIPER API - Event will be fired after animation to other slide (next or previous) */ 2855 swiper.on('slideChange', function () { 2856 console.log('slide changed'); 2857 sliderVideos.each(function( index ) { 2858 this.currentTime = 0; 2859 }); 2860 var prevVideo = $(`[data-swiper-slide-index="${this.previousIndex}]"`).find("video"); 2861 var currentVideo = $(`[data-swiper-slide-index="${this.realIndex}"]`).find("video"); 2862 prevVideo.trigger('stop'); 2863 currentVideo.trigger('play'); 2864 }); 2865 2866 2867 $("[data-video]").click(function(){ 2868 const file = $(this).data("video") 2869 $(".product-single__video").show() 2870 $(".product-single__image").hide() 2871 $(".product-single__video").find("video").attr("src", file) 2872 $(".product-single__video").find("video")[0].play(); 2873 }) 2874 $("[data-image]").click(function(){ 2875 $(".product-single__video").hide() 2876 $(".product-single__image").show() 2877 $(".product-single__video").find("video")[0].pause(); 2878 }) 2879 2880 $("#product-image .swiper-slide").each(function(){ 2881 let width = $(this).width() 2882 $(this).height(width) 2883 }) 2884 2885 $(window).resize(function() { 2886 $("#product-image .swiper-slide").each(function(){ 2887 let width = $(this).width() 2888 $(this).height(width) 2889 }) 2890 }) 2891</script>
2891 2892 2893 </div> 2894 2895 </div> 2896 <div id="product-meta" class="col-lg-5 p-0"> 2897 <div class="product-meta"> 2898 <style> 2899 .product-meta--review {margin-top:10px} 2900 .freeship * {font-size: 14px !important;font-style: normal;} 2901</style> 2902<h1 itemprop="name" class="mb-2">HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman</h1> 2903 2904<div itemprop="offers" itemscope itemtype="http://schema.org/Offer"> 2905 <meta itemprop="priceCurrency" content="IDR"> 2906 2907 <link itemprop="availability" href="https://schema.org/InStock"> 2908
2908<script 2909 type="text/javascript" 2910 src="//platform-api.sharethis.com/js/sharethis.js#property=5acdc0aa3ef3c0001396fd50&product=custom-share-buttons" 2911 async="async" 2912 ></script>
2912 2913 2914 2915 2916 2917 <span class="visually-hidden">Translation missing: en.products.general.regular_price</span> 2918 2919 <span class="visually-hidden">Translation missing: en.products.general.sale_price</span> 2920 2921 <div class="row no-gutters mb-3"> 2922 <span 2923 id="ProductPrice" 2924 class="h2 ProductPrice" 2925 itemprop="price" 2926 content="1.386.737" 2927 > 2928 Rp 1.386.737 2929 </span> 2930 <div class="discount-product-detail"> 2931 <p id="ComparePrice" class="ComparePrice mt-2 mt-lg-0"> 2932 Rp 8.008.008 2933 </p> 2934 <span class=" tag-discount"> 2935 2936 2937 <span id="newDiscount" class="product-tag persentase-discount hide"> 2938 (20%) 2939 </span><br> 2940 2941 </span> 2942 </div> 2943 </div> 2944 2945 <div class="row no-gutters meta-sds"> 2946 <div class="col-12 mb-2 mb-lg-0 stock-info"> 2947 2948 2949 <span 2950 id="ProductStock-Product" 2951 class="product-single__stock mb-2 hide" 2952 > 2953 2954 2955 2956 2957 Barang dikirim pada 2958 2959 2960 2961 </span> 2962 2963 <style> 2964 .short-desc-desktop { 2965 margin-bottom: 2rem; 2966 } 2967 .short-desc ul li:nth-child(n + 4) { 2968 display: none; 2969 } 2970 .short-desc ul li.showList:nth-child(n + 4) { 2971 display: list-item; 2972 } 2973 label.more { 2974 display: none; 2975 } 2976 label.more.showMe { 2977 display: block; 2978 font-size: 12px; 2979 text-transform: uppercase; 2980 font-weight: 700; 2981 cursor: pointer; 2982 } 2983</style> 2984 2985 <div class="short-desc-desktop d-none d-lg-block"> 2986 <div class="short-desc"> 2987 <ul> 2988<li> 2989<a href="https://hotelverta.com/"><strong>HANTUSLOT</strong></a><br><strong></strong><strong></strong> 2990</li> 2991<li> 2992<a href="https://hotelverta.com/"><strong>HANTUSLOT LOGIN</strong></a><br> 2993</li> 2994<li><a href="https://hotelverta.com/"><strong>GAME HANTUSLOT</strong></a></li> 2995 2996 </div> 2997 <label class="more">Show More â</label> 2998 </div> 2999 3000
3001<script> 3002 var liCount; 3003 $(document).ready(function () { 3004 $(".short-desc ul").each(function() { 3005 liCount = $(this).children("li").length; 3006 if (liCount > 3) { 3007 $(this).parent(".short-desc").next(".more").addClass("showMe"); 3008 } 3009 }); 3010 3011 $(".more").click(function () { 3012 //$(".short-desc").find("li").addClass("showList"); 3013 // $(this).hide(); 3014 $("#product-desc").find("ul").show() 3015 $('html, body').animate({ 3016 scrollTop: $("#product-desc").offset().top - 250 3017 }, 2000); 3018 $("#product-desc").css("height","auto"); 3019 $("#more_content").remove(); 3020 $(".product-spec").append("<div id='less_content' class='readmore'><span class='less_content'>Less</span></div>") 3021 }); 3022 }); 3023</script>
3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054<style> 3055 .c-pdp-product-info__service--active { 3056 font-size: 12px; 3057 padding-left: 10px; 3058 text-align: left; 3059 max-width: 550px; 3060 margin: auto; 3061 } 3062 .c-pdp-product-info__service--active li { 3063 list-style: disc; 3064 } 3065 .c-pdp-product-info { 3066 background-color: #f5f5f5; 3067 padding: 12px; 3068 margin: 0; 3069 } 3070 .freeship em { 3071 font-style: italic; 3072 font-size: 12px !important; 3073 } 3074</style> 3075
3076<script> 3077 $(document).ready(function(){ 3078 if ( $(".c-pdp-product-info__service li").length == 1 ) { 3079 $(".c-pdp-product-info__service").addClass("no-bullet"); 3080 $(".c-pdp-product-info__service li").addClass("no-bullets"); 3081 } 3082 }); 3083</script>
3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 </div> 3096 </div> 3097 3098 <div id="purchaseProduct"> 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 <style> 3114 label[for="product-select-option-0"] { display: none; } 3115 #product-select-option-0 { display: none; } 3116 #product-select-option-0 + .custom-style-select-box { display: none !important; } 3117 </style> 3118
3118<script> 3119 $(window).load(function() { $('.selector-wrapper:eq(0)').hide(); }); 3120 </script>
3120 3121 3122 3123 3124 3125 3126 <div 3127 id="variantVariants" 3128 class="swatch swatch-Variants clearfix" 3129 data-option-index="0" 3130 > 3131 <div class="header header-swatch bold"> 3132 <strong>Variants</strong> 3133 </div> 3134 3135 3136 3137 3138 3139 3140 3141 3142 <div 3143 data-label="swatch-0-standard" 3144 data-value="GAME SLOT" 3145 class="p-0 swatch-element standard available" 3146 > 3147 3148 <input 3149 data-text="" 3150 id="swatch-0-standard" 3151 class="variant-swatch" 3152 type="radio" 3153 name="option-0" 3154 value="GAME ONLINE TERBARU" 3155 3156 checked 3157 3158 3159 > 3160 3161 <label 3162 for="swatch-0-standard" 3163 data-src="https://outerbloom.com/cdn/shopifycloud/storefront/assets/no-image-2048-a2addb12_800x.gif" 3164 data-index="1" 3165 > 3166 3167 3168 <span class="d-block">GAME ONLINE TERBARU</span> 3169 3170 <img class="crossed-out" src="https://outerbloom.com/cdn/shop/t/138/assets/soldout.png?v=169392025580765019841752652421"> 3171 </label> 3172 3173 </div> 3174 3175 3176
3176<script> 3177 jQuery('.swatch[data-option-index="0"] .standard').removeClass('soldout').addClass('available').find(':radio').removeAttr('disabled'); 3178 </script>
3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 <div 3188 data-label="swatch-0-custom-logo-photo-for-frame" 3189 data-value="Custom logo & photo for frame" 3190 class="p-0 swatch-element custom-logo-photo-for-frame available" 3191 > 3192 3193 <input 3194 data-text="" 3195 id="swatch-0-custom-logo-photo-for-frame" 3196 class="variant-swatch swatch-custom" 3197 type="radio" 3198 name="option-0" 3199 value="Custom logo & photo for frame" 3200 3201 3202 > 3203 3204 <label 3205 for="swatch-0-custom-logo-photo-for-frame" 3206 data-src="https://outerbloom.com/cdn/shopifycloud/storefront/assets/no-image-2048-a2addb12_800x.gif" 3207 data-index="2" 3208 > 3209 3210 3211 <span class="d-block">GAME SLOT</span> 3212 3213 <img class="crossed-out" src="https://outerbloom.com/cdn/shop/t/138/assets/soldout.png?v=169392025580765019841752652421"> 3214 </label> 3215 3216 </div> 3217 3218 3219
3219<script> 3220 jQuery('.swatch[data-option-index="0"] .custom-logo-photo-for-frame').removeClass('soldout').addClass('available').find(':radio').removeAttr('disabled'); 3221 </script>
3221 3222 3223 3224 3225 <!-- Add swatch change handler for hash URL update --> 3226
3226<script> 3227 jQuery(document).ready(function($) { 3228 // Store product data for variant availability checking 3229 var productData = {"id":7881418965207,"title":"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman","handle":"outerbloom-mulan-bag-hampers","description":"\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eHANTUSLOT\u003c\/strong\u003e\u003cbr\u003e\u003cstrong\u003e\u003c\/strong\u003e\u003cstrong\u003e\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eGAME\u003c\/strong\u003e\u003cbr\u003e\n\u003c\/li\u003e\n\u003cli\u003e\u003cstrong\u003eSLOT\u003c\/strong\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003eHANTUSLOT menghadirkan beragam game online modern dengan dukungan fitur berbahasa Indonesia, sehingga pengguna dapat memahami setiap menu dan fitur dengan lebih mudah serta menikmati pengalaman bermain yang praktis dan nyaman.\u003c\/p\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1589\/6833\/files\/Ruby-Mulan-Bag.jpg?v=1734513286\" alt=\"\"\u003e\u003c\/p\u003e\n\u003ctable style=\"width: 100.091%;\" width=\"100%\"\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"width: 33.7327%;\"\u003eSKU\u003c\/td\u003e\n\u003ctd style=\"width: 65.9908%;\"\u003e[C]HANTUSLOT\u003cbr\u003e[C]OBIPCL1004-CNY2026\u003cbr\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"width: 33.7327%;\"\u003eIsi\u003c\/td\u003e\n\u003ctd style=\"width: 65.9908%;\"\u003efitur inovatif game online\u003cbr\u003ebahasa indonesia di Game HANTUSLOT\u003cbr\u003eGAME REKOMENDASI\u003cbr\u003egame bahasa indonesia\u003cbr\u003egame online wtgl\u003cbr\u003eagen game online\u003cbr\u003egame terbaik 2026\u003cbr\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e","published_at":"2025-12-23T16:52:21+07:00","created_at":"2023-01-06T14:53:52+07:00","vendor":"Outerbloom Hampers","type":"Parcel Inhouse","tags":["Brand_Outerbloom Hampers","card","CNY","CNY 2026","Collection_Heritage","custom-hampers","formdate","icon-card","icon-gift","Inhouse","MonSatParcel","MonSatSiang","no-deliverytime","Parcel","Parcel CNY","Parcel Inhouse","Parcel Nusantara","Pengiriman_Bekasi","Pengiriman_Bogor","Pengiriman_Depok","Pengiriman_Jakarta","Pengiriman_Kota Lainnya","Pengiriman_Tangerang","POO Parcel","ship-paketkecil","takeoutselfpickup","Untuk_Hari Raya","uploadfotocard","upsell-inhouse"],"price":1.386.73700,"price_min":1.386.73700,"price_max":63500000,"available":true,"price_varies":true,"compare_at_price":73500000,"compare_at_price_min":73500000,"compare_at_price_max":78500000,"compare_at_price_varies":true,"variants":[{"id":45873023910103,"title":"Standard","option1":"Standard","option2":null,"option3":null,"sku":"[C]HANTUSLOT","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman - Standard","public_title":"Standard","options":["Standard"],"price":1.386.73700,"weight":5000,"compare_at_price":73500000,"inventory_quantity":0,"inventory_management":"shopify","inventory_policy":"continue","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":45873024008407,"title":"Custom logo \u0026 photo for frame","option1":"Custom logo \u0026 photo for frame","option2":null,"option3":null,"sku":"[C]OBIPCL1004-CNY2026","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman - Custom logo \u0026 photo for frame","public_title":"Custom logo \u0026 photo for frame","options":["Custom logo \u0026 photo for frame"],"price":63500000,"weight":5000,"compare_at_price":78500000,"inventory_quantity":0,"inventory_management":"shopify","inventory_policy":"continue","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]}],"images":["\/\/outerbloom.com\/cdn\/shop\/files\/CNY-Ruby-Mulan-Bag.jpg?v=1766041636","\/\/outerbloom.com\/cdn\/shop\/files\/nibble-box-crunchy-jam.jpg?v=1767855108","\/\/outerbloom.com\/cdn\/shop\/files\/nibble-box-berry-affair.jpg?v=1767855108","\/\/outerbloom.com\/cdn\/shop\/files\/madu_c5806a73-3334-4300-bbe4-c59939ac5270.jpg?v=1768357765","\/\/outerbloom.com\/cdn\/shop\/files\/serenitea_ab87e31e-f6d7-4ee1-97ee-9709a9b861f5.jpg?v=1768357765","\/\/outerbloom.com\/cdn\/shop\/files\/diffuser-woody-breeze.jpg?v=1767855083","\/\/outerbloom.com\/cdn\/shop\/files\/frame_b97b5afe-8c12-44e0-a70b-628c49f1c7ac.jpg?v=1767855108"],"featured_image":"\/\/outerbloom.com\/cdn\/shop\/files\/CNY-Ruby-Mulan-Bag.jpg?v=1766041636","options":["Variants"],"media":[{"alt":null,"id":36696952045783,"position":1,"preview_image":{"aspect_ratio":1.0,"height":850,"width":850,"src":"\/\/outerbloom.com\/cdn\/shop\/files\/CNY-Ruby-Mulan-Bag.jpg?v=1766041636"},"aspect_ratio":1.0,"height":850,"media_type":"image","src":"\/\/outerbloom.com\/cdn\/shop\/files\/CNY-Ruby-Mulan-Bag.jpg?v=1766041636","width":850},{"alt":null,"id":36806926401751,"position":2,"preview_image":{"aspect_ratio":1.0,"height":1080,"width":1080,"src":"\/\/outerbloom.com\/cdn\/shop\/files\/preview_images\/c89f6e0ce8a04dc1842e9dc31bb3de3e.thumbnail.0000000000.jpg?v=1767854932"},"aspect_ratio":1.0,"duration":16730,"media_type":"video","sources":[{"format":"mp4","height":480,"mime_type":"video\/mp4","url":"\/\/outerbloom.com\/cdn\/shop\/videos\/c\/vp\/c89f6e0ce8a04dc1842e9dc31bb3de3e\/c89f6e0ce8a04dc1842e9dc31bb3de3e.SD-480p-1.5Mbps-66570824.mp4?v=0","width":480},{"format":"mp4","height":1080,"mime_type":"video\/mp4","url":"\/\/outerbloom.com\/cdn\/shop\/videos\/c\/vp\/c89f6e0ce8a04dc1842e9dc31bb3de3e\/c89f6e0ce8a04dc1842e9dc31bb3de3e.HD-1080p-7.2Mbps-66570824.mp4?v=0","width":1080},{"format":"mp4","height":720,"mime_type":"video\/mp4","url":"\/\/outerbloom.com\/cdn\/shop\/videos\/c\/vp\/c89f6e0ce8a04dc1842e9dc31bb3de3e\/c89f6e0ce8a04dc1842e9dc31bb3de3e.HD-720p-4.5Mbps-66570824.mp4?v=0","width":720},{"format":"m3u8","height":1080,"mime_type":"application\/x-mpegURL","url":"\/\/outerbloom.com\/cdn\/shop\/videos\/c\/vp\/c89f6e0ce8a04dc1842e9dc31bb3de3e\/c89f6e0ce8a04dc1842e9dc31bb3de3e.m3u8?v=0","width":1080}]},{"alt":null,"id":36727314612439,"position":3,"preview_image":{"aspect_ratio":1.0,"height":850,"width":850,"src":"\/\/outerbloom.com\/cdn\/shop\/files\/nibble-box-crunchy-jam.jpg?v=1767855108"},"aspect_ratio":1.0,"height":850,"media_type":"image","src":"\/\/outerbloom.com\/cdn\/shop\/files\/nibble-box-crunchy-jam.jpg?v=1767855108","width":850},{"alt":null,"id":36727314350295,"position":4,"preview_image":{"aspect_ratio":1.0,"height":850,"width":850,"src":"\/\/outerbloom.com\/cdn\/shop\/files\/nibble-box-berry-affair.jpg?v=1767855108"},"aspect_ratio":1.0,"height":850,"media_type":"image","src":"\/\/outerbloom.com\/cdn\/shop\/files\/nibble-box-berry-affair.jpg?v=1767855108","width":850},{"alt":null,"id":36727369236695,"position":5,"preview_image":{"aspect_ratio":1.0,"height":850,"width":850,"src":"\/\/outerbloom.com\/cdn\/shop\/files\/madu_c5806a73-3334-4300-bbe4-c59939ac5270.jpg?v=1768357765"},"aspect_ratio":1.0,"height":850,"media_type":"image","src":"\/\/outerbloom.com\/cdn\/shop\/files\/madu_c5806a73-3334-4300-bbe4-c59939ac5270.jpg?v=1768357765","width":850},{"alt":null,"id":36727136878807,"position":6,"preview_image":{"aspect_ratio":1.0,"height":850,"width":850,"src":"\/\/outerbloom.com\/cdn\/shop\/files\/serenitea_ab87e31e-f6d7-4ee1-97ee-9709a9b861f5.jpg?v=1768357765"},"aspect_ratio":1.0,"height":850,"media_type":"image","src":"\/\/outerbloom.com\/cdn\/shop\/files\/serenitea_ab87e31e-f6d7-4ee1-97ee-9709a9b861f5.jpg?v=1768357765","width":850},{"alt":null,"id":36727264116951,"position":7,"preview_image":{"aspect_ratio":1.0,"height":850,"width":850,"src":"\/\/outerbloom.com\/cdn\/shop\/files\/diffuser-woody-breeze.jpg?v=1767855083"},"aspect_ratio":1.0,"height":850,"media_type":"image","src":"\/\/outerbloom.com\/cdn\/shop\/files\/diffuser-woody-breeze.jpg?v=1767855083","width":850},{"alt":null,"id":36727117086935,"position":8,"preview_image":{"aspect_ratio":1.0,"height":850,"width":850,"src":"\/\/outerbloom.com\/cdn\/shop\/files\/frame_b97b5afe-8c12-44e0-a70b-628c49f1c7ac.jpg?v=1767855108"},"aspect_ratio":1.0,"height":850,"media_type":"image","src":"\/\/outerbloom.com\/cdn\/shop\/files\/frame_b97b5afe-8c12-44e0-a70b-628c49f1c7ac.jpg?v=1767855108","width":850}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eHANTUSLOT\u003c\/strong\u003e\u003cbr\u003e\u003cstrong\u003e\u003c\/strong\u003e\u003cstrong\u003e\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eGAME\u003c\/strong\u003e\u003cbr\u003e\n\u003c\/li\u003e\n\u003cli\u003e\u003cstrong\u003eSLOT\u003c\/strong\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003eHANTUSLOT menghadirkan beragam game online modern dengan dukungan fitur berbahasa Indonesia, sehingga pengguna dapat memahami setiap menu dan fitur dengan lebih mudah serta menikmati pengalaman bermain yang praktis dan nyaman.\u003c\/p\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1589\/6833\/files\/Ruby-Mulan-Bag.jpg?v=1734513286\" alt=\"\"\u003e\u003c\/p\u003e\n\u003ctable style=\"width: 100.091%;\" width=\"100%\"\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"width: 33.7327%;\"\u003eSKU\u003c\/td\u003e\n\u003ctd style=\"width: 65.9908%;\"\u003e[C]HANTUSLOT\u003cbr\u003e[C]OBIPCL1004-CNY2026\u003cbr\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"width: 33.7327%;\"\u003eIsi\u003c\/td\u003e\n\u003ctd style=\"width: 65.9908%;\"\u003elink apk game online\u003cbr\u003ehantuslot punya cerita\u003cbr\u003erekomendasi game terbaik\u003cbr\u003egame online Situs HANTUSLOT\u003cbr\u003epersatuan game online paling rekomendasi\u003cbr\feffc52game online bahasa indonesia\u003cbr\u003egame online gampang di akses\u003cbr\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e"}; 3230 3231 3232 // Handle first option changes to update available second options 3233 $('.swatch[data-option-index="0"] input[type="radio"]').on('change', function() { 3234 // Update single-option-selector first 3235 var optionValue = $(this).val(); 3236 var $selector = $('.single-option-selector').eq(0); 3237 if ($selector.length > 0) { 3238 $selector.val(optionValue).trigger('change'); 3239 } 3240 3241 // Then update available variant options 3242 updateAvailableVariantOptions(); 3243 }); 3244 3245 // Function to update available vase options based on selected variant 3246 function updateAvailableVariantOptions() { 3247 var selectedVariant = $('.swatch[data-option-index="0"] input[type="radio"]:checked').val(); 3248 3249 if (!selectedVariant) return; 3250 3251 // Get available vase options for the selected variant 3252 var availableVases = getAvailableVasesForVariant(selectedVariant); 3253 3254 // Update vase swatch visibility and availability 3255 $('.swatch[data-option-index="1"] .swatch-element').each(function() { 3256 var vaseValue = $(this).data('value'); 3257 var $input = $(this).find('input[type="radio"]'); 3258 var $label = $(this).find('label'); 3259 3260 if (availableVases.includes(vaseValue)) { 3261 // Show and enable this vase option 3262 $(this).show().removeClass('soldout unavailable').addClass('available'); 3263 $input.prop('disabled', false); 3264 $label.removeClass('disabled'); 3265 } else { 3266 // Hide or disable this vase option 3267 $(this).hide().removeClass('available').addClass('unavailable'); 3268 $input.prop('disabled', true).prop('checked', false); 3269 $label.addClass('disabled'); 3270 } 3271 }); 3272 3273 // Auto-select first available vase if none is selected 3274 var $checkedVase = $('.swatch[data-option-index="1"] input[type="radio"]:checked:enabled'); 3275 if ($checkedVase.length === 0) { 3276 var $firstAvailable = $('.swatch[data-option-index="1"] input[type="radio"]:enabled').first(); 3277 if ($firstAvailable.length > 0) { 3278 $firstAvailable.prop('checked', true).trigger('change'); 3279 } 3280 } 3281 } 3282 3283 // Function to get available vases for a specific variant 3284 function getAvailableVasesForVariant(variantValue) { 3285 var availableVases = []; 3286 3287 // Loop through all product variants to find matching vases 3288 if (productData && productData.variants) {
3289 productData.variants.forEach(function(variant) { 3290 if (variant.available && variant.option1 === variantValue) { 3291 var vaseOption = variant.option2; 3292 if (vaseOption && !availableVases.includes(vaseOption)) { 3293 availableVases.push(vaseOption); 3294 } 3295 } 3296 }); 3297 } 3298 3299 return availableVases; 3300 } 3301 3302 // Initialize vase options on page load 3303 setTimeout(function() { 3304 updateAvailableVariantOptions(); 3305 }, 100); 3306 3307 }); 3308 </script>
3308 3309 </div> 3310 3311 3312 3313 3314 3315 3316 3317<style> 3318 .select2-results__option[aria-disabled] { 3319 display: none; 3320 } 3321 3322 .towel-bordir { 3323 width: 100%; 3324 display: flex; 3325 align-items: center; 3326 justify-content: space-around; 3327 } 3328 @media screen and (max-width: 768px) { 3329 .ios .form-group-variant .variant-metafield { 3330 display: block !important; 3331 width: 100% !important; 3332 padding: 12px 16px !important; 3333 border: 1px solid #212121 !important; 3334 background: #fff !important; 3335 font-size: 16px !important; 3336 -webkit-appearance: none !important; 3337 -moz-appearance: none !important; 3338 appearance: none !important; 3339 background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6,9 12,15 18,9'%3e%3c/polyline%3e%3c/svg%3e") !important; 3340 background-repeat: no-repeat !important; 3341 background-position: right 12px center !important; 3342 background-size: 16px !important; 3343 color: #333 !important; 3344 min-height: 44px !important; 3345 } 3346 3347 .ios .form-group-variant .variant-metafield:focus { 3348 outline: none !important; 3349 border-color: #007AFF !important; 3350 box-shadow: 0 0 0 3px rgba(0, 122, 255, 0.1) !important; 3351 } 3352 3353 .ios .form-group-variant .variant-metafield option { 3354 padding: 12px 16px !important; 3355 font-size: 16px !important; 3356 color: #333 !important; 3357 background: #fff !important; 3358 } 3359 3360 .ios .form-group-variant .variant-metafield option:checked { 3361 background: #007AFF !important; 3362 color: #fff !important; 3363 } 3364 3365 .ios .form-group-variant .variant-metafield option:disabled { 3366 color: #999 !important; 3367 background: #f5f5f5 !important; 3368 } 3369 3370 .ios .form-group-variant .select2-container { 3371 display: none !important; 3372 } 3373 .ios .form-group-variant label { 3374 font-size: 14px !important; 3375 font-weight: 600 !important; 3376 color: #333 !important; 3377 margin-bottom: 8px !important; 3378 } 3379 } 3380 @media screen and (max-width: 768px) { 3381 body:not(.ios) .form-group-variant .variant-metafield { 3382 display: block !important; 3383 width: 1px !important; 3384 padding: 0 !important; 3385 border-color: #fff !important; 3386 } 3387 } 3388</style> 3389 3390 3391 3392
3393<script> 3394 // Detect iOS and add class to body 3395 function detectIOS() { 3396 const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; 3397 if (isIOS) { 3398 document.body.classList.add('ios'); 3399 3400 // Initialize native select for iOS on variant metafields 3401 setTimeout(function() { 3402 initIOSVariantMetafields(); 3403 }, 100); 3404 } 3405 return isIOS; 3406 } 3407 3408 function initIOSVariantMetafields() { 3409 const isIOS = document.body.classList.contains('ios'); 3410 if (!isIOS) return; 3411 3412 // Find all variant metafield selects 3413 const variantSelects = document.querySelectorAll('.form-group-variant .variant-metafield'); 3414 3415 variantSelects.forEach(function(select) { 3416 // Destroy Select2 if it exists 3417 if ($(select).hasClass('select2-hidden-accessible')) { 3418 $(select).select2('destroy'); 3419 } 3420 3421 // Remove Select2 classes 3422 select.classList.remove('select2-hidden-accessible'); 3423 3424 // Show the native select 3425 select.style.display = 'block'; 3426 select.style.width = '100%'; 3427 3428 // Add iOS specific event listeners 3429 select.addEventListener('focus', function() { 3430 this.style.borderColor = '#007AFF'; 3431 this.style.boxShadow = '0 0 0 3px rgba(0, 122, 255, 0.1)'; 3432 }); 3433 3434 select.addEventListener('blur', function() { 3435 this.style.borderColor = '#ddd'; 3436 this.style.boxShadow = 'none'; 3437 3438 // Clear error styling when field loses focus (if it has value) 3439 if (this.value && this.value !== '') { 3440 const fieldContainer = this.closest('.form-group-variant'); 3441 if (fieldContainer) { 3442 fieldContainer.classList.remove('field-error'); 3443 const existingError = fieldContainer.querySelector('.error-message'); 3444 if (existingError) { 3445 existingError.remove(); 3446 } 3447 } 3448 } 3449 }); 3450 3451 select.addEventListener('change', function() { 3452 // Trigger any existing change handlers 3453 $(this).trigger('change'); 3454 3455 // Clear error styling when value changes (if it has value) 3456 if (this.value && this.value !== '') { 3457 const fieldContainer = this.closest('.form-group-variant'); 3458 if (fieldContainer) { 3459 fieldContainer.classList.remove('field-error'); 3460 const existingError = fieldContainer.querySelector('.error-message'); 3461 if (existingError) { 3462 existingError.remove(); 3463 } 3464 } 3465 } 3466 }); 3467 }); 3468 } 3469 3470 // Run detection on page load 3471 document.addEventListener('DOMContentLoaded', function() { 3472 detectIOS(); 3473 }); 3474 3475 // Also run immediately in case DOM is already loaded 3476 if (document.readyState === 'loading') { 3477 document.addEventListener('DOMContentLoaded', detectIOS); 3478 } else { 3479 detectIOS(); 3480 } 3481 3482 3483 3484 3485</script>
3485 3486 3487 3488 3489 3490 3491 3492<select 3493 name="id[]" 3494 id="productSelect" 3495 class="product-single__variants ignore hide" 3496> 3497 3498 3499 3500 <option 3501 3502 selected="selected" 3503 3504 data-sku="[C]HANTUSLOT" 3505 value="45873023910103" 3506 > 3507 GAME BAHASA INDONESIA 3508 </option> 3509 3510 3511 3512 3513 3514 <option 3515 3516 data-sku="[C]OBIPCL1004-CNY2026" 3517 value="45873024008407" 3518 > 3519 SITUS GAME SLOT 3520 </option> 3521 3522 3523 3524</select> 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623
3624<script src="https://outerbloom.com/cdn/shop/t/138/assets/jquery.magnific-popup.min.js?v=184369421263510081681752652422" type="text/javascript"></script>
3624 3625
3626<script> 3627 $('.size-chart-open-popup').magnificPopup({ 3628 type:'inline', 3629 midClick: true 3630 }); 3631</script>
3631 3632 3633 3634 3635 3636 <div class="upload-image-preview"> 3637 3638 3639 3640 3641 3642 <style> 3643 .file-dnd * { 3644 margin: 0; 3645 padding: 0; 3646 box-sizing: border-box; 3647 } 3648 .file-dnd { 3649 width: 100%; 3650 height: 250px; 3651 border: 1px solid #ddd; 3652 border-radius: 10px; 3653 padding: 15px; 3654 display: flex; 3655 flex-direction: column; 3656 gap: 10px; 3657 margin: auto; 3658 } 3659 .file-dnd input { 3660 display: none; 3661 } 3662 .file-dnd .before-upload { 3663 border: 1px dashed #888; 3664 flex: 1; 3665 border-radius: 5px; 3666 display: flex; 3667 justify-content: center; 3668 align-items: center; 3669 text-align: center; 3670 cursor: pointer; 3671 } 3672 .file-dnd .before-upload > div { 3673 display: flex; 3674 flex-direction: column; 3675 align-items: center; 3676 gap: 8px; 3677 } 3678 .file-dnd .before-upload > div h4 { 3679 width: 150px; 3680 } 3681 .file-dnd .before-upload > div p { 3682 font-size: 12px !important; 3683 color: #555; 3684 } 3685 .file-dnd.active .before-upload { 3686 border: 1px solid #5750d9; 3687 background-color: #f5f5ff; 3688 } 3689 .file-dnd .after-upload { 3690 position: relative; 3691 display: none; 3692 } 3693 .file-dnd .after-upload img { 3694 width: 100%; 3695 border-radius: 5px; 3696 max-height: 180px; 3697 object-fit: contain; 3698 display: block; 3699 } 3700 .file-dnd .after-upload .clear-btn { 3701 position: absolute; 3702 top: 10px; 3703 right: 10px; 3704 background: rgba(0, 0, 0, 0.5); 3705 width: 15px; 3706 height: 15px; 3707 text-align: center; 3708 line-height: 15px; 3709 border-radius: 50%; 3710 color: #fff; 3711 cursor: pointer; 3712 font-size: 14px; 3713 } 3714</style> 3715<div 3716 class="file-dnd mb-3" 3717 3718 style="display: none" 3719 3720> 3721 <label for="upload-photo">Upload your Photo:</label> 3722 <input type="file" id="upload-photo" accept="image/*"> 3723 <input type="hidden" data-properties="Photo"> 3724 <div class="before-upload"> 3725 <div> 3726 <svg id="surface1" xmlns="http://www.w3.org/2000/svg" width="33.053" height="41.719" viewBox="0 0 33.053 41.719"> 3727 <path id="Path_2149" data-name="Path 2149" d="M22.982.322A1.009,1.009,0,0,0,22.257,0H5.982A5.505,5.505,0,0,0,.5,5.472V36.247a5.505,5.505,0,0,0,5.482,5.472H28.071a5.505,5.505,0,0,0,5.482-5.472V11.81a1.085,1.085,0,0,0-.292-.705Zm.292,3.235,6.883,7.225H25.683a2.4,2.4,0,0,1-2.409-2.4Zm4.8,36.147H5.982a3.49,3.49,0,0,1-3.467-3.457V5.472A3.49,3.49,0,0,1,5.982,2.015H21.259V8.384A4.409,4.409,0,0,0,25.683,12.8h5.855V36.247A3.484,3.484,0,0,1,28.071,39.7Zm0,0" transform="translate(-0.5)" fill="#ababab"></path> 3728 <path id="Path_2150" data-name="Path 2150" d="M106.767,401.934H90.18a1.008,1.008,0,1,0,0,2.015h16.6a1.008,1.008,0,1,0-.01-2.015Zm0,0" transform="translate(-81.947 -369.183)" fill="#ababab"></path> 3729 <path id="Path_2151" data-name="Path 2151" d="M120.143,178.328l4.152-4.464v11a1.008,1.008,0,0,0,2.015,0v-11l4.152,4.464a1.005,1.005,0,0,0,1.471-1.371l-5.905-6.339a1,1,0,0,0-1.471,0l-5.905,6.339a1,1,0,0,0,.05,1.421A1.028,1.028,0,0,0,120.143,178.328Zm0,0" transform="translate(-108.776 -156.421)" fill="#ababab"></path> 3730</svg> 3731 3732 <h4>Drag & Drop Photo file or Browse</h4> 3733 <p>Supports: JPEG, PNG, GIF, TIFF</p> 3734 </div> 3735 </div> 3736 <div class="after-upload"> 3737 <div class="clear-btn">×</div> 3738 <img src="" width="" height=""> 3739 </div> 3740</div>
3741<script> 3742 3743 function applyDndFile(el) { 3744 const parent = document.querySelector(".file-dnd") 3745 const beforeUploadEl = el.querySelector(".before-upload") 3746 const afterUploadEl = el.querySelector(".after-upload") 3747 const inputFile = el.querySelector("input[type=file]") 3748 const imagePreview = el.querySelector(".after-upload img") 3749 const clearBtn = el.querySelector(".after-upload .clear-btn") 3750 const inputProps = parent.querySelector("[data-properties]"); 3751 3752 async function upload(name, uri, type) { 3753 try { 3754 const filename = name.split('.')[0] 3755 let formData = new FormData(); 3756 formData.append("file", uri); 3757 const response = await fetch(`https://app.asmaraku.com/api/upload?name=${filename}&dir=gift&type=${type}&shop=outerbloom1.myshopify.com`, { 3758 method: "POST", 3759 body: formData 3760 }) 3761 if(response) { 3762 const res = await response.json() 3763 return res 3764 } 3765 } catch(err){ 3766 console.log(err) 3767 } 3768 } 3769 3770 function showImagePreview(img) { 3771 if(img){ 3772 const blobUrl = URL.createObjectURL(img) 3773 imagePreview.src = blobUrl 3774 afterUploadEl.style.display = "block" 3775 beforeUploadEl.style.display = "none" 3776 } 3777 } 3778 3779 beforeUploadEl.addEventListener("click", (e) => { 3780 e.preventDefault() 3781 inputFile.click() 3782 }) 3783 3784 inputFile.addEventListener("change", async (e) => { 3785 e.preventDefault() 3786 showImagePreview(e.target.files[0]) 3787 var uploadData = await upload(e.target.files[0].name, e.target.files[0], e.target.files[0].type) 3788 inputProps.value = uploadData?.url 3789 }) 3790 3791 clearBtn.addEventListener("click", (e) => { 3792 afterUploadEl.style.display = "none" 3793 beforeUploadEl.style.display = "flex" 3794 inputProps.value = "" 3795 }) 3796 3797 beforeUploadEl.addEventListener("dragover", (e) => { 3798 e.preventDefault() 3799 el.classList.add("active") 3800 }) 3801 3802 beforeUploadEl.addEventListener("dragleave", (e) => { 3803 e.preventDefault() 3804 el.classList.remove("active") 3805 }) 3806 3807 beforeUploadEl.addEventListener("drop", async (e) => { 3808 e.preventDefault() 3809 el.classList.remove("active") 3810 showImagePreview(e.dataTransfer.files[0]) 3811 var uploadData = await upload(e.dataTransfer.files[0].name, e.dataTransfer.files[0], e.dataTransfer.files[0].type) 3812 console.log(uploadData) 3813 inputProps.value = uploadData?.url 3814 }) 3815 } 3816 3817 applyDndFile(document.querySelector(".file-dnd")) 3818 3819 $(document).ready(function(){ 3820 $(".variant-swatch").change(function(){ 3821 const v = $(this).val().toLowerCase() 3822 const list = ["photo", "custom one side", "custom two side"] 3823 if(list.some(item => v.includes(item))) return $(".file-dnd").show() 3824 $(".file-dnd").hide() 3825 $(".file-dnd").find("[data-properties]").val("") 3826 $(".after-upload").hide() 3827 $(".before-upload").css("display", "flex") 3828 }) 3829 }) 3830</script>
3830 3831 3832 </div> 3833 3834 3835 <div class="delivery-city mb-4"> 3836 <h4 class="fw-600 text-uppercase mb-15">Delivery City</h4> 3837 <div class="row justify-content-between m-0"> 3838 <select id="cities" class="form-control" required> 3839 <option value="">Choose Delivery City</option> 3840 </select> 3841 </div> 3842</div> 3843 3844<style> 3845 #cities { 3846 width: 100%; 3847 padding: 10px 35px 10px 12px; 3848 font-size: 14px; 3849 border: 1px solid #ccc; 3850 background-color: #fff; 3851 background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e") !important; 3852 background-repeat: no-repeat !important; 3853 background-position: right 10px center !important; 3854 background-size: 12px !important; 3855 appearance: none; 3856 -webkit-appearance: none; 3857 -moz-appearance: none; 3858 cursor: pointer; 3859 } 3860 3861 #cities { 3862 -webkit-appearance: none; 3863 -moz-appearance: none; 3864 appearance: none; 3865 } 3866 3867 #cities:-ms-expand { 3868 display: none; 3869 } 3870 3871 #cities:focus { 3872 border-color: #212121; 3873 outline: none; 3874 box-shadow: 0 0 0 2px rgba(33, 33, 33, 0.1); 3875 } 3876 3877 #cities:hover { 3878 border-color: #999; 3879 } 3880 3881 #cities option { 3882 padding: 10px; 3883 } 3884</style> 3885
3886<script> 3887 // Cities dropdown uses native HTML select 3888</script>
3888 3889 3890 3891 <div id="row-delivery-date" class="row m-0 mb-3"> 3892 <h4 class="fw-600 text-uppercase col-12 p-0 mb-15">Delivery Date</h4> 3893 <div id="deliveryDate" class="m-0"></div> 3894 <div id="deliveryDateFull"> 3895 <div class=""> 3896 <input 3897 type="text" 3898 id="full-date" 3899 class="date-full calendarbutton btn steps-btn btn-date-time mb-0" 3900 value="Full Calendar" 3901 > 3902 <label for="full-date"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 3903<title>icon-arrow-right</title> 3904<path d="M25.057 15.333l-6.862-6.862c-0.26-0.26-0.26-0.682 0-0.943s0.682-0.26 0.943 0l8 8c0.26 0.26 0.26 0.682 0 0.943l-8 8c-0.26 0.26-0.682 0.26-0.943 0s-0.26-0.682 0-0.943l6.862-6.862h-19.724c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h19.724z"></path> 3905</svg></label> 3906 </div> 3907 <button class="btnChangeDeliveryDate hide">Change Delivery Date</button> 3908 </div> 3909 <div class="form-group p-0"> 3910 <input type="text" id="propDeliveryDate" required class="hide"> 3911 </div> 3912 </div> 3913 3914 <p id="noteDeliveryDate" class="mb-3"></p> 3915 3916 3917 <input type="hidden" id="propDeliveryTime" value="-" disabled> 3918 3919 3920 3921 3922 3923 <div id="personalizeBtn"> 3924 3925 3926 3927 3928 <button id="btnPurchase" 3929 class="btn text-uppercase w-100 fw-400" 3930 3931 3932 > 3933 3934 MAKE IT PERSONAL â 3935 3936 </button> 3937 <div class="button-share-wishlist d-flex justify-content-around mt-3"> 3938 <div class="button-share text-center"> 3939 <p id="shareButton" class="d-flex gap-2"><span>SHARE</span><svg xmlns="http://www.w3.org/2000/svg" width="15" height="13" viewBox="0 0 15 13" fill="none"> 3940 <path d="M13.825 5.85006L10 2.02506V4.07506L9.28333 4.18339C5.69167 4.69172 3.25833 6.57506 1.86667 9.45839C3.8 8.09172 6.2 7.43339 9.16667 7.43339H10V9.67506M8.33333 8.28339C4.60833 8.45839 1.94167 9.80006 0 12.5167C0.833333 8.35006 3.33333 4.18339 9.16667 3.35006V0.0167236L15 5.85006L9.16667 11.6834V8.26672C8.89167 8.26672 8.61667 8.27506 8.33333 8.28339Z" fill="#212121"/> 3941</svg> 3942</p> 3943 </div> 3944 <div class="button-wishlist text-center"> 3945 <button type="button" id="wishButton" class="d-flex gap-2 wishlist-toggle" data-wishlist-button data-product-handle="outerbloom-mulan-bag-hampers" style="background: none; border: none; cursor: pointer; padding: 0; color: inherit; align-items: center; justify-content: center;"> 3946 <span>WISHLIST</span> 3947 <div class="wishlist-icon-wrapper" style="display: flex; align-items: center; justify-content: center; width: 16px; height: 22px;"> 3948 <svg class="wishlist-icon-outline" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:block;"> 3949 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125ZM12 19.9991C10.4688 19.1241 1.0625 13.5077 1.0625 7.15625C1.06424 5.70638 1.64096 4.31639 2.66618 3.29118C3.69139 2.26596 5.08138 1.68924 6.53125 1.6875C8.84016 1.6875 10.7805 2.92453 11.5953 4.91516C11.6283 4.9954 11.6843 5.06403 11.7564 5.
394911233C11.8285 5.16063 11.9133 5.18642 12 5.18642C12.0867 5.18642 12.1715 5.16063 12.2436 5.11233C12.3157 5.06403 12.3717 4.9954 12.4047 4.91516C13.2195 2.92453 15.1598 1.6875 17.4688 1.6875C18.9186 1.68924 20.3086 2.26596 21.3338 3.29118C22.359 4.31639 22.9358 5.70638 22.9375 7.15625C22.9375 13.5 13.5312 19.1284 12 19.9991Z" fill="#212121"/> 3950 </svg> 3951 <svg class="wishlist-icon-filled" xmlns="http://www.w3.org/2000/svg" width="24" height="21" viewBox="0 0 24 21" fill="none" style="display:none;"> 3952 <path d="M17.4688 0.8125C15.1237 0.8125 13.1025 1.92703 12 3.77328C10.8975 1.92703 8.87625 0.8125 6.53125 0.8125C4.8494 0.814526 3.23702 1.48353 2.04778 2.67278C0.858534 3.86202 0.189526 5.47441 0.1875 7.15625C0.1875 10.2833 2.15625 13.5514 6.02813 16.8677C7.81594 18.3889 9.74622 19.7342 11.7922 20.885C11.856 20.9195 11.9274 20.9375 12 20.9375C12.0726 20.9375 12.144 20.9195 12.2078 20.885C14.2538 19.7342 16.1841 18.3889 17.9719 16.8677C21.8438 13.5514 23.8125 10.2833 23.8125 7.15625C23.8105 5.47441 23.1415 3.86202 21.9522 2.67278C20.763 1.48353 19.1506 0.814526 17.4688 0.8125Z" fill="#640000"/> 3953 </svg> 3954 </div> 3955 </button> 3956 </div> 3957 </div> 3958 </div> 3959</div> 3960<div class="purchasePopup purchasePopupSpotify" style="display: none;"> 3961 <div class="purchaseArea"> 3962 <div class="sectionPurchase sectionPurchaseSpotify"> 3963 <div class="wrapperPurchase"> 3964 <div class="headerPurchase"> 3965 <h3>personalize spotify photo print</h3> 3966 <a class="close-purchase-popup"> 3967 <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none"> 3968 <path d="M1.53287 17.4107L0.588867 16.4667L8.05553 9.00002L0.588867 1.53336L1.53287 0.589355L8.99953 8.05602L16.4662 0.589355L17.4102 1.53336L9.94353 9.00002L17.4102 16.4667L16.4662 17.4107L8.99953 9.94402L1.53287 17.4107Z" fill="black"></path> 3969 </svg> 3970 </a> 3971 </div> 3972 <div class="contentPurchase"> 3973 <div class="spotifyAddons"></div> 3974 </div> 3975 3976 <div class="purchase-button btn-addon row m-0" style="display: none;"> 3977 <div class="col-12 col-lg-2 text-left mb-2 p-0"> 3978 <button class="back-purchase-button back-addon text-uppercase"> 3979 <svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 3980 <path d="M14.5799 7.41992L2.32992 7.41992L7.57992 12.6699L6.91992 13.4199L0.419922 6.91992L6.91992 0.419922L7.57992 1.16992L2.32992 6.41992L14.5799 6.41992V7.41992Z" fill="black"></path> 3981 </svg> 3982 <span>Back</span> 3983 </button> 3984 </div> 3985 <div class="col-12 col-lg-10 text-right" style="display: flex;justify-content: end;gap: 20px;"> 3986 <button class="btn next-purchase-button next-addon text-uppercase"> 3987 <span>continue without add-ons</span> 3988 </button> 3989 </div> 3990 </div> 3991 </div> 3992 </div> 3993 </div> 3994</div> 3995 3996<style> 3997 #PBarNextFrameWrapper { 3998 display: none; 3999 } 4000 #backgroundPopup { 4001 display: none; 4002 position: fixed; 4003 _position: absolute; 4004 height: 100%; 4005 width: 100%; 4006 top: 0; 4007 left: 0; 4008 background: rgb(117 117 117 / 24%); 4009 z-index: 1; 4010 } 4011 .sectionPurchase { 4012 height: 100%; 4013 position: relative; 4014 max-width: 1344px; 4015 background-color: #fff; 4016 padding: 0; 4017 overflow: hidden; 4018 display: flex; 4019 flex-direction: column; 4020 } 4021 .sectionPurchase.purchaseAddonSpotify { 4022 max-width: 1070px!important; 4023 max-height: 765px!important; 4024 } 4025 .sectionPurchaseBoard { 4026 max-width: 872px!important; 4027 max-height: 821px!important; 4028 } 4029 .purchaseAddonSpotify .btn-action { 4030 position: absolute; 4031 bottom: 0; 4032 left: 0; 4033 width: 100%; 4034 display: flex; 4035 gap: 10px; 4036 } 4037 .wrapperPurchase { 4038 position: relative; 4039 height: 100%; 4040 display: flex; 4041 flex-direction: column; 4042 } 4043 .purchase-content { 4044 flex: 1; 4045 overflow-y: auto; 4046 overflow-x: hidden; 4047 padding: 20px; 4048 } 4049 4050 .purchase-button-wrapper { 4051 position: sticky; 4052 bottom: 0; 4053 background-color: #fff; 4054 border-top: 1px solid #e0e0e0; 4055 padding: 15px 0; 4056 margin-top: auto; 4057 z-index: 10; 4058 } 4059 4060 .purchasePopup { 4061 display: none; 4062 position: fixed; 4063 background: rgb(117 117 117 / 24%); 4064 z-index: 999; 4065 padding: 40px; 4066 font-size: 13px; 4067 top: 0; 4068 left: 0; 4069 width: 100%; 4070 height: 100%; 4071 } 4072 .popupPurchaseClose{ 4073 font-size:14px; 4074 line-height:14px; 4075 right:45px; 4076 top:45px; 4077 position:absolute; 4078 color:#6fa5fd; 4079 font-weight:700; 4080 display:block; 4081 cursor: pointer; 4082 } 4083 4084 .headerPurchase { 4085 margin-bottom: 30px; 4086 display: flex; 4087 justify-content: space-between; 4088 } 4089 4090 .headerPurchase h3 { 4091 font-size: 16px; 4092 text-transform: uppercase; 4093 } 4094 4095 .sectionPurchaseBoard .headerPurchase { 4096 margin-bottom: 15px; 4097 } 4098 4099 .sectionPurchaseBoard .formAddressPurchase { 4100 padding-top: 0;
4101 } 4102 4103 .purchaseArea { 4104 position: relative; 4105 height: 100%; 4106 } 4107 4108 .purchaseArea h4 { 4109 width: 100%; 4110 font-size: 12px; 4111 font-weight: 600; 4112 margin-bottom: 10px; 4113 text-transform: uppercase; 4114 } 4115 4116 .menuPurchase { 4117 margin-bottom: 30px; 4118 } 4119 4120 .menuPurchase ul { 4121 list-style-type: none; 4122 margin: 0; 4123 } 4124 4125 .menuPurchase ul li { 4126 display: inline-block; 4127 border: 1px solid #212121; 4128 padding: 5px 20px; 4129 margin-right: 5px; 4130 margin-bottom: 10px; 4131 font-size: 12px; 4132 font-weight: 400; 4133 } 4134 4135 .menuPurchase ul li:hover, .menuPurchase ul li.selected { 4136 background-color: #212121; 4137 color: #ffffff; 4138 } 4139 4140 .contentPurchase h5 { 4141 font-size: 12px; 4142 margin-bottom: 10px; 4143 font-weight: 400; 4144 overflow: hidden; 4145 } 4146 4147 #itemCards { 4148 max-height: 430px; 4149 overflow: auto; 4150 } 4151 4152 .item-cards { 4153 width: 100%; 4154 } 4155 .item-card.selected { 4156 border: 1px solid #212121; 4157 } 4158 .item-card:hover { 4159 border: 1px solid #C4C4C4; 4160 } 4161 .item-cards .item-card { 4162 position: relative; 4163 width: calc(33% - 10px); 4164 max-width: calc(33% - 10px); 4165 flex: 0 0 calc(33% - 10px); 4166 margin-bottom: 20px; 4167 } 4168 .item-cards .item-card label, 4169 .item-addons .item-addon label { 4170 position: absolute; 4171 left: 0; 4172 width: 100%; 4173 height: 100%; 4174 } 4175 .item-cards .item-card .card-image img, 4176 .item-addons .item-addon .card-image img { 4177 display: block; 4178 width: 100%; 4179 } 4180 .item-card .card-meta, 4181 .item-addon .card-meta { 4182 padding: 10px 5px 5px; 4183 } 4184 .item-card.selected .card-meta, 4185 .item-addon.selected .card-meta, 4186 .item-card.selected .card-qty { 4187 background-color: #212121; 4188 color: #fff; 4189 visibility: visible!important; 4190 } 4191 .item-card:hover .card-meta, 4192 .item-addon:hover .card-meta, 4193 .item-card:hover .card-qty { 4194 background-color: #C4C4C4; 4195 color: #fff; 4196 visibility: visible!important; 4197 } 4198 .item-cards .item-card p, 4199 .item-addons .item-addon p { 4200 font-size: 12px !important; 4201 margin: 0; 4202 font-weight: 600; 4203 } 4204 .item-card .card-meta input, 4205 .item-addon .card-meta input { 4206 display: none; 4207 } 4208 .item-cards .item-card h5, 4209 .item-addons .item-addon h5 { 4210 font-size: 14px; 4211 } 4212 4213 @media (max-width: 768px) { 4214 .item-cards .item-card { 4215 width: calc(50% - 10px); 4216 max-width: calc(50% - 10px); 4217 flex: 0 0 calc(50% - 10px); 4218 margin-bottom: 0; 4219 } 4220 } 4221 4222 .card-qty { 4223 display: flex; 4224 padding: 5px; 4225 visibility: hidden; 4226 background-color: #fff !important; 4227 z-index: 999; 4228 } 4229 .card-qty a { 4230 border-width: 1px; 4231 width: 30%; 4232 cursor: pointer; 4233 text-align: center; 4234 align-self: center; 4235 height: 28px; 4236 display: block; 4237 position: relative; 4238 } 4239 .card-qty a svg { 4240 position: absolute; 4241 top: 50%; 4242 left: 50%; 4243 transform: translate(-50%, -50%); 4244 text-align: center; 4245 } 4246 input.btn-qty { 4247 border-width: 0px; 4248 border-radius: 0; 4249 background-color: #fff; 4250 -webkit-appearance: none; 4251 box-shadow: none !important; 4252 -webkit-box-shadow: none !important; 4253 -moz-box-shadow: none!important; 4254 width: 40%; 4255 border-left: 1px solid #c4c4c4; 4256 border-right: 1px solid #c4c4c4; 4257 padding: 0; 4258 } 4259 4260 .sectionPurchaseBoard #itemAddons .item-card { 4261 width: calc(20% - 15px); 4262 max-width: calc(20% - 15px); 4263 flex: 0 0 calc(20% - 15px); 4264 } 4265 4266 .purchase-button { 4267 width: 100%; 4268 padding: 0; 4269 margin: 0; 4270 } 4271 4272 .sectionPurchaseBoard .purchase-button { 4273 margin-top: 0 !important; 4274 } 4275 4276 .back-purchase-button, .back-spotify { 4277 width: 139px; 4278 border: 1px solid; 4279 height: 43px; 4280 } 4281 .purchase-button .btn { 4282 width: 297px; 4283 height: 43px; 4284 background-color: #212121; 4285 color: #ffffff; 4286 } 4287 .purchase-button .btn[disabled] { 4288 background-color: #EEEEEE; 4289 } 4290 .back-purchase-button svg, .back-spotify svg { 4291 align-self: center; 4292 vertical-align: middle; 4293 margin-right: 10px; 4294 } 4295 4296 #purchaseProduct .row .error { 4297 font-size: 12px !important; 4298 color: rgb(231, 76, 60); 4299 margin-top: 5px; 4300 } 4301 4302 .reviewCardPurchase { 4303 max-width: 448px; 4304 float: right; 4305 } 4306 4307 .addonsPurchase .addon-item {display: flex;justify-content: space-between;} 4308 .addon-item * {align-self: center;font-size: 12px;} 4309 .addon-itm-title {width: 360px;} 4310 .addon-itm-line-price {color: #757575;width: 80px;justify-content: space-between;display: flex;} 4311 4312 .propsAddonSpotify p { 4313 margin: 0; 4314 display: flex; 4315 font-size: 12px !important; 4316 margin-bottom: 5px; 4317 } 4318 .propsAddonSpotify p span:first-child { 4319 text-transform: uppercase; 4320 font-weight: 600; 4321 -ms-flex: 0 0 150px; 4322 flex: 0 0 150px; 4323 max-width: 150px; 4324 } 4325 4326 .addonsPurchase .addons { 4327 max-height: 250px; 4328 overflow: auto; 4329 } 4330 4331 .btn .loading:after { 4332 content: ""; 4333 display: inline-block;
4334 width: 20px; 4335 height: 20px; 4336 padding: 3px; 4337 aspect-ratio: 1; 4338 border-radius: 50%; 4339 background: #FFFFFF; 4340 --_m: conic-gradient(#0000 10%, #212121), linear-gradient(#212121 0 0) content-box; 4341 -webkit-mask: var(--_m); 4342 mask: var(--_m); 4343 -webkit-mask-composite: source-out; 4344 mask-composite: subtract; 4345 animation: l3 1s infinite linear; 4346 margin: auto; 4347 vertical-align: middle; 4348 margin-left: 10px; 4349 } 4350 4351 #qrcode img, #qrcode canvas { 4352 width: 50px; 4353 position: absolute; 4354 top: 12px; 4355 left: 16px; 4356 } 4357 4358 .t-preview { 4359 position: absolute; 4360 top: 17px; 4361 left: 75px; 4362 } 4363 .t-preview p { 4364 margin: 0; 4365 font-size: 12px !important; 4366 } 4367 .t-preview .h3 { 4368 font-size: 16px !important; 4369 margin-bottom: 5px; 4370 font-weight: 600; 4371 } 4372 .scanCard { 4373 width: 100%; 4374 border: 1px solid; 4375 height: 76px; 4376 background-color: #fff; 4377 } 4378 .scanCard > div > img { 4379 position: absolute; 4380 right: 0; 4381 width: 55px; 4382 } 4383 4384 @keyframes l3 { 4385 100% { 4386 transform: rotate(1turn); 4387 } 4388 } 4389 4390 @media (min-width: 991px) { 4391 .sectionPurchase { 4392 height: 100%; 4393 position: relative; 4394 max-width: 1344px; 4395 background-color: #fff; 4396 top: 50%; 4397 left: 50%; 4398 transform: translate(-50%, -50%); 4399 } 4400 .headerPurchase h3 { 4401 font-size: 20px; 4402 } 4403 .purchaseArea h4 { 4404 font-size: 16px; 4405 } 4406 4407 .menuPurchase ul li { 4408 font-size: 16px; 4409 } 4410 4411 .contentPurchase { 4412 margin-bottom: 30px; 4413 } 4414 .contentPurchase h5 { 4415 font-size: 16px; 4416 } 4417 4418 .item-cards .item-card p, 4419 .item-addons .item-addon p { 4420 font-size: 16px !important; 4421 } 4422 4423 .cards { 4424 float: right; 4425 width: 400px; 4426 } 4427 4428 .item-cards .item-card { 4429 width: calc(25% - 30px); 4430 max-width: calc(25% - 30px); 4431 flex: 0 0 calc(25% - 30px); 4432 margin-right: 30px; 4433 } 4434 4435 #itemAddons .item-card { 4436 position: relative; 4437 width: calc(16% - 40px); 4438 max-width: calc(16% - 40px); 4439 flex: 0 0 calc(16% - 40px); 4440 } 4441 4442 .purchase-button-wrapper { 4443 padding: 10px 20px; 4444 } 4445 } 4446 4447 @media (max-width: 1200px) { 4448 .item-cards .item-card { 4449 width: calc(33% - 30px); 4450 max-width: calc(33% - 30px); 4451 flex: 0 0 calc(33% - 30px); 4452 } 4453 } 4454 4455 @media (max-width: 992px) { 4456 .purchasePopup { 4457 padding: 0; 4458 } 4459 .item-cards .item-card h5, 4460 .item-addons .item-addon h5 { 4461 max-height: 30px; 4462 } 4463 4464 .back-purchase-button, .back-spotify, .next-purchase-button { 4465 width: 100%; 4466 } 4467 .addon-itm-title { 4468 width: 300px; 4469 } 4470 .addon-itm-line-price { 4471 margin-right: 10px; 4472 } 4473 .t-preview { 4474 top: 10px; 4475 } 4476 4477 .card-qty a { 4478 height: 15px; 4479 } 4480 4481 .purchase-button-wrapper { 4482 padding: 15px; 4483 } 4484 } 4485 4486 @media (max-width: 576px) { 4487 .purchase-button .btn { 4488 width: 100%!important; 4489 } 4490 .purchase-button > .col-12 { 4491 padding-left: 0; 4492 padding-right: 0; 4493 } 4494 } 4495</style> 4496 4497 4498<div class="purchasePopup"> 4499 <div class="purchaseArea"> 4500 4501 <div class="sectionPurchase purchasePersonalize"> 4502 <div class="wrapperPurchase"> 4503 <div class="purchase-content"> 4504 <div class="headerPurchase"> 4505 <h3 class="text-uppercase"> 4506 4507 MAKE IT PERSONAL â 4508 4509 </h3> 4510 <a class="close-purchase-popup"> 4511 <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none"> 4512 <path d="M1.53287 17.4107L0.588867 16.4667L8.05553 9.00002L0.588867 1.53336L1.53287 0.589355L8.99953 8.05602L16.4662 0.589355L17.4102 1.53336L9.94353 9.00002L17.4102 16.4667L16.4662 17.4107L8.99953 9.94402L1.53287 17.4107Z" fill="black"/> 4513 </svg> 4514</a> 4515 4516</div> 4517<div class="contentPurchase"> 4518 <div class="row"> 4519 4520 <div class="col-12 col-lg-7"> 4521 <div class="menuPurchase"> 4522 <h4 class="text-uppercase">choose your occasion</h4> 4523 <ul> 4524 4525 <li 4526 class="item-occassion selected" 4527 data-occassion="greeting-card-all" 4528 4529 > 4530 General 4531 </li> 4532 4533 <li 4534 class="item-occassion" 4535 data-occassion="greeting-card-birthday" 4536 4537 > 4538 Birthday 4539 </li> 4540 4541 <li 4542 class="item-occassion" 4543 data-occassion="greeting-card-anniversary" 4544 4545 > 4546 Anniversary 4547 </li> 4548 4549 <li 4550 class="item-occassion" 4551 data-occassion="greeting-card-newborn" 4552 4553 > 4554 Newborn 4555 </li> 4556 4557 <li 4558 class="item-occassion" 4559 data-occassion="greeting-card-wedding"
4560 4561 > 4562 Wedding 4563 </li> 4564 4565 <li 4566 class="item-occassion" 4567 data-occassion="greeting-card-graduation" 4568 4569 > 4570 Graduation 4571 </li> 4572 4573 <li 4574 class="item-occassion" 4575 data-occassion="greeting-card-mothers-day" 4576 4577 > 4578 Mother's Day 4579 </li> 4580 4581 <li 4582 class="item-occassion" 4583 data-occassion="greeting-card-valentine" 4584 4585 > 4586 Valentine 4587 </li> 4588 4589 <li 4590 class="item-occassion" 4591 data-occassion="greeting-card-others" 4592 4593 style="display: none" 4594 4595 > 4596 Others 4597 </li> 4598 4599 </ul> 4600 </div> 4601 <div id="chooseCard"> 4602 <h4 class="text-uppercase">choose your card design</h4> 4603 <div 4604 id="itemCards" 4605 class="item-cards d-flex mb-4" 4606 > 4607 <div class="row m-0 items-card w-100"> 4608 <p style="margin: 50px auto;text-align: center;font-size: 13px !important;"> 4609 There are no card items available.<br> 4610 Please choose an occasion above 4611 </p> 4612 </div> 4613 </div> 4614 </div> 4615 </div> 4616 <div class="col-12 col-lg-5"> 4617 <div class="cards"> 4618 <h4 class="mb-2">Personalize your Message</h4> 4619 4620 <label class="font-weight-bold label-attach-foto" 4621 >Create a lasting memory. Attach a special photo or a video to cherish forever.</label 4622 > 4623 4624 4625 4626<style> 4627 #greetingCard label {display: inline-block;color: #212121;margin-bottom: .5rem;font-size: 14px;font-weight: 400!Important;} 4628 4629 .form-group.has-counter { 4630 position: relative; 4631 } 4632 4633 .limit { 4634 position: absolute; 4635 top: 4px; 4636 right: -30px; 4637 font-size: 11px; 4638 color: #999; 4639 background: rgba(255, 255, 255, 0.9); 4640 padding: 2px 6px; 4641 border-radius: 3px; 4642 z-index: 10; 4643 pointer-events: none; 4644 } 4645 4646 .form-group.has-counter input, 4647 .form-group.has-counter textarea { 4648 padding-right: 0px; 4649 } 4650 4651 .prefix-selector-wrapper { 4652 margin: 5px 0; 4653 } 4654 4655 .prefix-selector-wrapper label { 4656 display: inline-block; 4657 margin-right: 10px; 4658 vertical-align: middle; 4659 } 4660 4661 .prefix-selector { 4662 border: none; 4663 font-size: 12px; 4664 background: white; 4665 cursor: pointer; 4666 width: auto; 4667 max-width: 200px; 4668 padding: 5px; 4669 padding-right: 25px; 4670 appearance: none; 4671 -webkit-appearance: none; 4672 -moz-appearance: none; 4673 background-image: url('data:image/svg+xml;charset=UTF-8,%3Csvg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"%3E%3Cpath fill="%23333" d="M6 9L1 4h10z"/%3E%3C/svg%3E'); 4674 background-repeat: no-repeat; 4675 background-position: right 5px center; 4676 background-size: 12px; 4677 vertical-align: middle; 4678 } 4679 4680 .label-prefix { 4681 cursor: pointer; 4682 user-select: none; 4683 -webkit-user-select: none; 4684 } 4685 4686 .label-prefix.hidden { 4687 display: none!important; 4688 } 4689</style> 4690<div id="greetingCard"> 4691 4692 <div class="greetingCard"> 4693 <div class="steps-card-preview d-flex align-items-center justify-content-center"> 4694 4695 <div class="case-img-preview"> 4696 <div class="remove-image" style="display: none"> 4697 <svg class="icon icon-close" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 4698<title>icon-close</title> 4699<path d="M16.943 16l8.862 8.862c0.26 0.26 0.26 0.682 0 0.943s-0.682 0.26-0.943 0l-8.862-8.862-8.862 8.862c-0.26 0.26-0.682 0.26-0.943 0s-0.26-0.682 0-0.943l8.862-8.862-8.862-8.862c-0.26-0.26-0.26-0.682 0-0.943s0.682-0.26 0.943 0l8.862 8.862 8.862-8.862c0.26-0.26 0.682-0.26 0.943 0s0.26 0.682 0 0.943l-8.862 8.862z"></path> 4700</svg> 4701 </div> 4702 <div class="btn-upload"> 4703 <div> 4704 <img class="preview-image" src="" alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" class="img" style="display: none"> 4705 </div> 4706 <div class="icon-upload"> 4707 <button type="button"> 4708 <img class="ajax-loader" src="https://outerbloom.com/cdn/shop/t/138/assets/ajax-loader.gif?v=41356863302472015721752652421" style="display: none"> 4709 <div class="placeholder-image" onclick=""> 4710 <label for="input-foto" onclick="" 4711 ><img src="https://outerbloom.com/cdn/shop/t/138/assets/icon-media_60x.png?v=142273593979200676731752652420" width="" height="" alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 4712 ></label> 4713 <div class="button-empty-state" onclick=""> 4714 <label for="input-foto" onclick="" class="btn btn-upload-image"> 4715 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="17" viewBox="0 0 16 17" fill="none"> 4716 <path d="M0.75 16.75H15.25C15.6635 16.75 16 16.4135 16 16V1.5C16 1.0865 15.6635 0.75 15.25 0.75H0.75C0.3365 0.75 0 1.0865 0 1.5V16C0 16.4135 0.3365 16.75 0.75 16.75ZM0.5 1.5C0.5 1.4337 0.526339 1.37011 0.573223 1.32322C0.620107 1.27634 0.683696 1.25 0.75 1.25H15.25C15.3163 1.25 15.3799 1.27634 15.4268 1.32322C15.4737 1.37011 15.5 1.4337 15.5 1.5V16C15.5 16.0663 15.4737 16.1299 15.4268 16.1768C15.3799 16.2237 15.3163 16.25 15.25 16.25H0.75C0.683696 16.25 0.620107 16.2237 0.573223 16.1768C0.526339 16.1299 0.5 16.0663 0.5 16V1.5Z" fill="black"/> 4717 <path d="M10.25 7C10.8015 7 11.25 6.5515 11.25 6C11.25 5.4485 10.8015 5 10.25 5C9.6985 5 9.25 5.4485 9.25 6C9.25 6.5515 9.6985 7 10.25 7ZM10.25 5.5C10.349 5.4999 10.4459 5.52918 10.5283 5.58414C10.6106 5.
47176391 10.6749 5.71726 10.7128 5.80874C10.7507 5.90021 10.7607 6.00089 10.7414 6.09802C10.7221 6.19515 10.6744 6.28438 10.6044 6.35441C10.5344 6.42443 10.4452 6.47211 10.348 6.49141C10.2509 6.5107 10.1502 6.50075 10.0587 6.46281C9.96726 6.42486 9.8891 6.36063 9.83414 6.27825C9.77918 6.19587 9.7499 6.09903 9.75 6C9.75 5.7245 9.974 5.5 10.25 5.5Z" fill="black"/> 4718 <path d="M2.25 13.25H13.75C13.8163 13.25 13.8799 13.2237 13.9268 13.1768C13.9737 13.1299 14 13.0663 14 13V3C14 2.9337 13.9737 2.87011 13.9268 2.82322C13.8799 2.77634 13.8163 2.75 13.75 2.75H2.25C2.1837 2.75 2.12011 2.77634 2.07322 2.82322C2.02634 2.87011 2 2.9337 2 3V13C2 13.0663 2.02634 13.1299 2.07322 13.1768C2.12011 13.2237 2.1837 13.25 2.25 13.25ZM2.5 12.75V9.931C2.511 9.923 2.5235 9.9185 2.5335 9.9085L5.0915 7.3505C5.15698 7.28802 5.244 7.25317 5.3345 7.25317C5.425 7.25317 5.51202 7.28802 5.5775 7.3505L9.338 11.111C9.38419 11.1572 9.44662 11.1835 9.51194 11.1842C9.57725 11.185 9.64027 11.1601 9.6875 11.115L11.6205 9.279C11.6834 9.21542 11.7688 9.17902 11.8582 9.17762C11.9477 9.17622 12.0341 9.20992 12.099 9.2715L13.5 10.7975L13.5005 10.798V12.75H2.5ZM13.5 3.25V10.059L12.4595 8.926C12.3816 8.84733 12.2888 8.78493 12.1866 8.74244C12.0844 8.69995 11.9747 8.67822 11.864 8.6785H11.8635C11.7536 8.67802 11.6447 8.69924 11.543 8.74094C11.4414 8.78264 11.3489 8.844 11.271 8.9215L9.519 10.5855L5.931 6.997C5.6115 6.678 5.0565 6.6785 4.738 6.997L2.5 9.2355V3.25H13.5Z" fill="black"/> 4719 </svg> 4720 <span>Upload Image</span> 4721 </label> 4722 <label for="input-video" onclick="" class="btn btn-upload-video"> 4723 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="17" viewBox="0 0 20 17" fill="none"> 4724 <path d="M4.5 0.75H1.5C1.0655 0.75 0.75 1.0655 0.75 1.5V16C0.75 16.4345 1.0655 16.75 1.5 16.75H18.5C18.9345 16.75 19.25 16.4345 19.25 16V1.5C19.25 1.0655 18.9345 0.75 18.5 0.75H4.5ZM1.25 16V1.5C1.25 1.3435 1.3435 1.25 1.5 1.25H4.25V16.25H1.5C1.3435 16.25 1.25 16.1565 1.25 16ZM4.75 16.25V1.25H15.25V16.25H4.75ZM18.75 1.5V16C18.75 16.1565 18.6565 16.25 18.5 16.25H15.75V1.25H18.5C18.6565 1.25 18.75 1.3435 18.75 1.5Z" fill="black"/> 4725 <path d="M8.1385 5.792C8.10082 5.76682 8.057 5.75235 8.01173 5.75015C7.96646 5.74795 7.92145 5.75809 7.8815 5.7795C7.84169 5.80093 7.80844 5.83275 7.78528 5.87158C7.76213 5.91041 7.74993 5.95479 7.75 6V12C7.75002 12.0452 7.76231 12.0896 7.78556 12.1284C7.8088 12.1672 7.84213 12.1989 7.882 12.2203C7.92187 12.2416 7.96678 12.2517 8.01195 12.2496C8.05712 12.2474 8.10085 12.2331 8.1385 12.208L12.6385 9.208C12.6727 9.18517 12.7008 9.15424 12.7202 9.11795C12.7396 9.08167 12.7498 9.04115 12.7498 9C12.7498 8.95885 12.7396 8.91833 12.7202 8.88205C12.7008 8.84576 12.6727 8.81483 12.6385 8.792L8.1385 5.792ZM8.25 11.533V6.467L12.0495 9L8.25 11.533ZM3.25 4.75H2.25C2.1837 4.75 2.12011 4.77634 2.07322 4.82322C2.02634 4.87011 2 4.9337 2 5C2 5.0663 2.02634 5.12989 2.07322 5.17678C2.12011 5.22366 2.1837 5.25 2.25 5.25H3.25C3.3163 5.25 3.37989 5.22366 3.42678 5.17678C3.47366 5.12989 3.5 5.0663 3.5 5C3.5 4.9337 3.47366 4.87011 3.42678 4.82322C3.37989 4.77634 3.3163 4.75 3.25 4.75ZM2.25 3.25H3.25C3.3163 3.25 3.37989 3.22366 3.42678 3.17678C3.47366 3.12989 3.5 3.0663 3.5 3C3.5 2.9337 3.47366 2.87011 3.42678 2.82322C3.37989 2.77634 3.3163 2.75 3.25 2.75H2.25C2.1837 2.75 2.12011 2.77634 2.07322 2.82322C2.02634 2.87011 2 2.9337 2 3C2 3.0663 2.02634 3.12989 2.07322 3.17678C2.12011 3.22366 2.1837 3.25 2.25 3.25ZM3.25 6.75H2.25C2.1837 6.75 2.12011 6.77634 2.07322 6.82322C2.02634 6.87011 2 6.9337 2 7C2 7.0663 2.02634 7.12989 2.07322 7.17678C2.12011 7.22366 2.1837 7.25 2.25 7.25H3.25C3.3163 7.25 3.37989 7.22366 3.42678 7.17678C3.47366 7.12989 3.5 7.0663 3.5 7C3.5 6.9337 3.47366 6.87011 3.42678 6.82322C3.37989 6.77634 3.3163 6.75 3.25 6.75ZM3.25 8.75H2.25C2.1837 8.75 2.12011 8.77634 2.07322 8.82322C2.02634 8.87011 2 8.9337 2 9C2 9.0663 2.02634 9.12989 2.07322 9.17678C2.12011 9.22366 2.1837 9.25 2.25 9.25H3.25C3.3163 9.25 3.37989 9.22366 3.42678 9.17678C3.47366 9.12989 3.5 9.0663 3.5 9C3.5 8.9337 3.47366 8.87011 3.42678 8.82322C3.37989 8.77634 3.3163 8.75 3.25 8.75ZM3.25 10.75H2.25C2.1837 10.75 2.12011 10.7763 2.07322 10.8232C2.02634 10.8701 2 10.9337 2 11C2 11.0663 2.02634 11.1299 2.07322 11.1768C2.12011 11.2237 2.1837 11.25 2.25 11.25H3.25C3.3163 11.25 3.37989 11.2237 3.42678 11.1768C3.47366 11.1299 3.5 11.0663 3.5 11C3.5 10.9337 3.47366 10.8701 3.42678 10.8232C3.37989 10.7763 3.3163 10.75 3.25 10.75ZM3.25 12.75H2.25C2.1837 12.75 2.12011 12.7763 2.07322 12.8232C2.02634 12.8701 2 12.9337 2 13C2 13.0663 2.02634 13.1299 2.07322 13.1768C2.12011 13.2237 2.1837 13.25 2.25 13.25H3.25C3.3163 13.25 3.37989 13.2237 3.42678 13.1768C3.47366 13.1299 3.5 13.0663 3.5 13C3.5 12.9337 3.47366 12.8701 3.42678 12.8232C3.37989 12.7763 3.3163 12.75 3.25 12.75ZM3.25 14.75H2.25C2.1837 14.75 2.12011 14.7763 2.07322 14.8232C2.02634 14.8701 2 14.9337 2 15C2 15.0663 2.02634 15.1299 2.07322 15.1768C2.12011 15.2237 2.1837 15.25 2.25 15.25H3.25C3.3163 15.25 3.37989 15.2237 3.42678 15.1768C3.47366 15.1299 3.5 15.0663 3.5 15C3.5 14.9337 3.47366 14.8701 3.42678 14.8232C3.37989 14.7763 3.3163 14.75 3.25 14.75ZM16.75 5.25H17.75C17.8163 5.25 17.8799 5.22366 17.9268 5.17678C17.9737 5.12989 18 5.0663 18 5C18 4.9337 17.9737 4.87011 17.9268 4.82322C17.8799 4.77634 17.8163 4.75 17.75 4.75H16.75C16.6837 4.75 16.6201 4.77634 16.5
4725732 4.82322C16.5263 4.87011 16.5 4.9337 16.5 5C16.5 5.0663 16.5263 5.12989 16.5732 5.17678C16.6201 5.22366 16.6837 5.25 16.75 5.25ZM16.75 3.25H17.75C17.8163 3.25 17.8799 3.22366 17.9268 3.17678C17.9737 3.12989 18 3.0663 18 3C18 2.9337 17.9737 2.87011 17.9268 2.82322C17.8799 2.77634 17.8163 2.75 17.75 2.75H16.75C16.6837 2.75 16.6201 2.77634 16.5732 2.82322C16.5263 2.87011 16.5 2.9337 16.5 3C16.5 3.0663 16.5263 3.12989 16.5732 3.17678C16.6201 3.22366 16.6837 3.25 16.75 3.25ZM16.75 7.25H17.75C17.8163 7.25 17.8799 7.22366 17.9268 7.17678C17.9737 7.12989 18 7.0663 18 7C18 6.9337 17.9737 6.87011 17.9268 6.82322C17.8799 6.77634 17.8163 6.75 17.75 6.75H16.75C16.6837 6.75 16.6201 6.77634 16.5732 6.82322C16.5263 6.87011 16.5 6.9337 16.5 7C16.5 7.0663 16.5263 7.12989 16.5732 7.17678C16.6201 7.22366 16.6837 7.25 16.75 7.25ZM16.75 9.25H17.75C17.8163 9.25 17.8799 9.22366 17.9268 9.17678C17.9737 9.12989 18 9.0663 18 9C18 8.9337 17.9737 8.87011 17.9268 8.82322C17.8799 8.77634 17.8163 8.75 17.75 8.75H16.75C16.6837 8.75 16.6201 8.77634 16.5732 8.82322C16.5263 8.87011 16.5 8.9337 16.5 9C16.5 9.0663 16.5263 9.12989 16.5732 9.17678C16.6201 9.22366 16.6837 9.25 16.75 9.25ZM16.75 11.25H17.75C17.8163 11.25 17.8799 11.2237 17.9268 11.1768C17.9737 11.1299 18 11.0663 18 11C18 10.9337 17.9737 10.8701 17.9268 10.8232C17.8799 10.7763 17.8163 10.75 17.75 10.75H16.75C16.6837 10.75 16.6201 10.7763 16.5732 10.8232C16.5263 10.8701 16.5 10.9337 16.5 11C16.5 11.0663 16.5263 11.1299 16.5732 11.1768C16.6201 11.2237 16.6837 11.25 16.75 11.25ZM16.75 13.25H17.75C17.8163 13.25 17.8799 13.2237 17.9268 13.1768C17.9737 13.1299 18 13.0663 18 13C18 12.9337 17.9737 12.8701 17.9268 12.8232C17.8799 12.7763 17.8163 12.75 17.75 12.75H16.75C16.6837 12.75 16.6201 12.7763 16.5732 12.8232C16.5263 12.8701 16.5 12.9337 16.5 13C16.5 13.0663 16.5263 13.1299 16.5732 13.1768C16.6201 13.2237 16.6837 13.25 16.75 13.25ZM17.75 14.75H16.75C16.6837 14.75 16.6201 14.7763 16.5732 14.8232C16.5263 14.8701 16.5 14.9337 16.5 15C16.5 15.0663 16.5263 15.1299 16.5732 15.1768C16.6201 15.2237 16.6837 15.25 16.75 15.25H17.75C17.8163 15.25 17.8799 15.2237 17.9268 15.1768C17.9737 15.1299 18 15.0663 18 15C18 14.9337 17.9737 14.8701 17.9268 14.8232C17.8799 14.7763 17.8163 14.75 17.75 14.75Z" fill="black"/> 4726 </svg> 4727 <span>Upload Video</span> 4728 </label> 4729 </div> 4730 </div> 4731 </button> 4732 </div> 4733 </div> 4734</div> 4735 4736 4737<div class="case-video-preview"> 4738 <div class="d-flex justify-content-between"> 4739 <p>Add video to make it more special (optional)</p> 4740 <button class="remove-media" style="display: none"> 4741 <svg class="icon icon-close" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 4742<title>icon-close</title> 4743<path d="M16.943 16l8.862 8.862c0.26 0.26 0.26 0.682 0 0.943s-0.682 0.26-0.943 0l-8.862-8.862-8.862 8.862c-0.26 0.26-0.682 0.26-0.943 0s-0.26-0.682 0-0.943l8.862-8.862-8.862-8.862c-0.26-0.26-0.26-0.682 0-0.943s0.682-0.26 0.943 0l8.862 8.862 8.862-8.862c0.26-0.26 0.682-0.26 0.943 0s0.26 0.682 0 0.943l-8.862 8.862z"></path> 4744</svg> 4745 </button> 4746 <label id="label-input-video" for="input-video" onclick style=""> 4747 <img class="ajax-loader" src="https://outerbloom.com/cdn/shop/t/138/assets/ajax-loader.gif?v=41356863302472015721752652421" style="display: none;vertical-align: middle;"/>
4748 <span><img src="https://outerbloom.com/cdn/shop/t/138/assets/icon-upload-video_icon.png?v=10584829661837769631752652419"/><span>Upload Video</span></span> 4749 </label> 4750 </div> 4751</div> 4752 4753 4754 </div> 4755 <div class="steps-card-input"> 4756 4757 <div class="prefix-selector-wrapper"> 4758 <label for="prefixSelector" class="font-weight-bold m-0">Prefix:</label> 4759 <select id="prefixSelector" class="prefix-selector"> 4760 <option value="">None</option> 4761 <option value="Dear" selected>Dear</option> 4762 <option value="To">To</option> 4763 <option value="Hi">Hi</option> 4764 </select> 4765 </div> 4766 <div class="form-group mr-auto form-group-half form-recipient has-counter d-flex"> 4767 <label for="" class="font-weight-bold m-0 pr-1 label-prefix" style="border-bottom: 1px solid #212121;">Dear</label> 4768 <input 4769 type="text" 4770 id="recipientNameInput" 4771 class="form-control has-limit" 4772 data-properties="penerima" 4773 placeholder="RECIPIENT NAME" 4774 maxlength="30" 4775 4776 > 4777 <small class="limit text-muted">(30)</small> 4778 </div> 4779 <div class="form-group custom-card mb-2 has-counter"> 4780 <textarea 4781 data-properties="ucapan" 4782 class="form-control has-limit" 4783 rows="6" 4784 placeholder="Write your special message here.." 4785 maxlength="300" 4786 ></textarea> 4787 <small class="limit text-muted">(300)</small> 4788 4789 <!-- 4790 <a href="#" data-card-occassion="all"> 4791 <div class="rectangle-promo-code"> 4792 <span class="promo-code-link">Get ideas</span> 4793 </div> 4794 </a> 4795 --> 4796 4797 4798 <button id="msgCard">Template Message</button> 4799 </div> 4800 4801 <div class="hide"> 4802 <input type="hidden" value="" id="note_id" name="note_id" style="top: 0px;"> 4803 <input type="hidden" value="" id="note_btn_id" name="note_btn_id"> 4804 </div> 4805 4806 <div class="form-group ml-auto mt-3 text-right form-group-half position-relative has-counter"> 4807 <label for="" class="font-weight-bold d-none">Yours Sincerely,</label> 4808 <input 4809 id="senderCard" 4810 type="text" 4811 class="form-control text-right has-limit" 4812 data-properties="pengirim" 4813 placeholder="SENDER NAME" 4814 maxlength="30" 4815 > 4816 <small class="limit text-muted">(30)</small> 4817 </div> 4818 4819 </div> 4820 </div> 4821 4822</div>
4823<script> 4824 async function getFetch(url) { 4825 const response = await fetch(url); 4826 const result = await response.json(); 4827 return result; 4828 } 4829 $(document).ready(function(){ 4830 // Prefix selector functionality 4831 var prefixOptions = ['Dear', 'To', 'Hi']; 4832 var isUpdatingPrefix = false; 4833 4834 function getNameWithoutPrefix(value) { 4835 var trimmed = value.trim(); 4836 for (var i = 0; i < prefixOptions.length; i++) { 4837 var prefix = prefixOptions[i]; 4838 if (trimmed.toLowerCase().indexOf(prefix.toLowerCase() + ' ') === 0) { 4839 return trimmed.substring(prefix.length); 4840 } 4841 } 4842 return trimmed; 4843 } 4844 4845 function detectPrefix(value) { 4846 var trimmed = value.trim(); 4847 for (var i = 0; i < prefixOptions.length; i++) { 4848 var prefix = prefixOptions[i]; 4849 if (trimmed.toLowerCase().indexOf(prefix.toLowerCase() + ' ') === 0) { 4850 return prefix; 4851 } 4852 } 4853 return ''; 4854 } 4855 4856 function applyPrefixToInput(prefix) { 4857 var recipientInput = $('#recipientNameInput'); 4858 var nameOnly = getNameWithoutPrefix(recipientInput.val()); 4859 4860 if (!nameOnly) { 4861 recipientInput.val(''); 4862 return; 4863 } 4864 4865 if (prefix === '') { 4866 recipientInput.val(nameOnly); 4867 } else { 4868 recipientInput.val(prefix + ' ' + nameOnly); 4869 } 4870 } 4871 4872 $('#prefixSelector').on('change', function() { 4873 var selectedPrefix = $(this).val(); 4874 var recipientInput = $('#recipientNameInput'); 4875 var labelPrefix = $('.label-prefix'); 4876 4877 isUpdatingPrefix = true; 4878 applyPrefixToInput(selectedPrefix); 4879 isUpdatingPrefix = false; 4880 4881 // Update label-prefix text and visibility 4882 if (selectedPrefix === '') { 4883 labelPrefix.addClass('hidden'); 4884 labelPrefix.text(''); 4885 } else { 4886 labelPrefix.text(selectedPrefix).removeClass('hidden'); 4887 } 4888 4889 recipientInput.focus(); 4890 }); 4891 4892 // Click label-prefix to open selector 4893 $('.label-prefix').on('click', function() { 4894 $('#prefixSelector').focus().click(); 4895 }); 4896 4897 // Initialize label-prefix based on current selector value 4898 var initialPrefix = $('#prefixSelector').val(); 4899 if (initialPrefix === '') { 4900 $('.label-prefix').addClass('hidden'); 4901 } else { 4902 $('.label-prefix').text(initialPrefix); 4903 } 4904 4905 $('#recipientNameInput').on('input', function() { 4906 if (isUpdatingPrefix) { 4907 return; 4908 } 4909 4910 var currentValue = $(this).val(); 4911 4912 // If input is cleared, reset prefix to None 4913 if (!currentValue) { 4914 isUpdatingPrefix = true; 4915 $('#prefixSelector').val(''); 4916 isUpdatingPrefix = false; 4917 return; 4918 } 4919 }); 4920 4921 // Initialize prefix selector based on current value 4922 $('#prefixSelector').val('Dear'); 4923 4924 $('textarea.has-limit, input.has-limit').keyup(function () { 4925 max = this.getAttribute("maxlength"); 4926 var len = $(this).val().length; 4927 var limit = $(this).siblings(".limit"); 4928 if (len >= max) { 4929 alert('you have reached the limit'); 4930 } else { 4931 var char = max - len; 4932 limit.text('('+char+')'); 4933 } 4934 }); 4935 4936 // Limit textarea to maximum 6 lines 4937 $('[data-properties=ucapan]').on('input keydown paste', function(e) { 4938 var textarea = $(this); 4939 var lines = textarea.val().split('\n'); 4940 4941 // Check if trying to add more than 6 lines 4942 if (lines.length > 6) { 4943 // Prevent adding new line if already at 6 lines 4944 if (e.type === 'keydown' && e.keyCode === 13) { 4945 e.preventDefault(); 4946 return false; 4947 } 4948 // Trim to 6 lines if pasting content 4949 if (e.type === 'paste' || e.type === 'input') { 4950 var limitedText = lines.slice(0, 6).join('\n'); 4951 textarea.val(limitedText); 4952 } 4953 } 4954 4955 // Update character counter after line limit check 4956 var max = this.getAttribute("maxlength"); 4957 var len = $(this).val().length; 4958 var limit = $(this).siblings(".limit"); 4959 var char = max - len; 4960 limit.text('('+char+')'); 4961 });
4962 4963 var text_max=150; 4964 var msg_text=""; 4965 $('#previewMsg').html(msg_text); 4966 $('[data-properties=ucapan]').keyup(function(){ 4967 var text_length=$(this).val().length; 4968 var msg_text=$(this).val(); 4969 $('#previewMsg').html(msg_text); 4970 }); 4971 4972 var note_btn_text = [ 4973 [0,'Try Another'], 4974 [1,'One More Time'], 4975 [2,'Almost There'], 4976 [3,'Next'] 4977 ]; 4978 $("#greetingCard").delegate("#show_note", "click", async function(event){ 4979 event.preventDefault(); 4980 4981 const source = await getFetch(`https://outerbloom.com/cdn/shop/t/87/assets/greeting_card.json?v=${new Date()}`) 4982 4983 const occassion = $("#show_note").attr("data-card-occassion") 4984 4985 let {data} = source.find((el) => el.name === occassion); 4986 4987 var notes = data; 4988 4989 const getRandomIntegerInclusive = (min, max) => { 4990 min = Math.ceil(min) 4991 max = Math.floor(max) 4992 4993 return Math.floor(Math.random() * (max - min + 1)) + min 4994 } 4995 4996 const idx = getRandomIntegerInclusive(0, data.length - 1) 4997 4998 var note=notes[idx]; 4999 5000 $('#note_id').val(idx); 5001 $('[data-properties], #msgDelivery').val(note); 5002 var text_length=$(this).val().length; 5003 $('#previewMsg').html(note); 5004 var idx_2=parseInt($('#note_btn_id').val()); 5005 if(isNaN(idx_2)){ 5006 idx_2=0; 5007 }else{ 5008 idx_2++; 5009 idx_2=idx_2%note_btn_text.length; 5010 } 5011 $('#note_btn_id').val(idx_2); 5012 var note_btn=note_btn_text[idx_2][1]; 5013 $('#note_btn').text(note_btn); 5014 }); 5015 }); 5016</script>
5016 5017 5018 </div> 5019 </div> 5020 5021 </div> 5022</div> 5023 5024 </div> 5025 <div class="purchase-button-wrapper"> 5026 <div class="purchase-button btn-card row m-0"> 5027 <div class="col-12 col-lg-2 text-left mb-2 p-0"> 5028 5029 </div> 5030 <div class="btn-next-card col-12 col-lg-10 text-right"> 5031 5032 5033 5034 <button id="skip-card" style="align-self: center;text-decoration: underline"> 5035 <span> USE BLANK CARD </span> 5036 </button> 5037 5038 5039 <button 5040 5041 5042 id="save-card" 5043 5044 5045 class="btn next-purchase-button text-uppercase" 5046 5047 disabled 5048 5049 > 5050 <span>SAVE & PERSONALIZE GIFT</span> 5051 </button> 5052 </div> 5053</div> 5054 5055 </div> 5056 </div> 5057 </div> 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 <div 5122 class="sectionPurchase purchaseAddon hide" 5123 data-section="addon" 5124 > 5125 <div class="wrapperPurchase"> 5126 <div class="purchase-content"> 5127 <style> 5128 .item-card[data-qty="0"] { display: none; } 5129 .item-card[data-id="8835692069079"] { 5130 display: none; 5131 } 5132 5133 @media (max-width: 768px) { 5134 #itemAddons { 5135 overflow-x: auto; 5136 overflow-y: hidden; 5137 -webkit-overflow-scrolling: touch; 5138 scrollbar-width: none; 5139 -ms-overflow-style: none; 5140 } 5141 5142 #itemAddons::-webkit-scrollbar { 5143 display: none; 5144 } 5145 5146 #itemAddons .row { 5147 flex-wrap: nowrap !important; 5148 width: max-content !important; 5149 gap: 15px !important; 5150 margin: 0 !important; 5151 padding: 0 15px; 5152 } 5153 5154 #itemAddons .item-card { 5155 flex: 0 0 auto; 5156 min-width: 120px; 5157 max-width: 120px; 5158 } 5159 } 5160 @media (min-width: 769px) { 5161 #itemAddons .row { 5162 flex-wrap: wrap; 5163 } 5164 } 5165</style> 5166<div class="headerPurchase"> 5167 <h3>Make It More Special with Add-Ons!</h3> 5168 <a class="close-purchase-popup"> 5169 <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none"> 5170 <path d="M1.53287 17.4107L0.588867 16.4667L8.05553 9.00002L0.588867 1.53336L1.53287 0.589355L8.99953 8.05602L16.4662 0.589355L17.4102 1.53336L9.94353 9.00002L17.4102 16.4667L16.4662 17.4107L8.99953 9.94402L1.53287 17.4107Z" fill="black"/> 5171 </svg> 5172</a> 5173 5174</div> 5175<div class="contentPurchase"> 5176 <div class="regulerAddons"> 5177 <div class="menuPurchase"> 5178 <ul> 5179 5180 5181 5182 5183 <li class="item-addon selected" data-count="" data-addon="upsell-inhouse"> 5184 All 5185 </li> 5186 5187 5188 5189 5190 5191 <li class="item-addon" data-count="18" data-addon="upsell-jewelry"> 5192 Jewelry 5193 </li> 5194 5195 5196 5197 5198 5199 <li class="item-addon" data-count="2" data-addon="upsell-cuddlemate"> 5200 Cuddlemate 5201 </li> 5202 5203 5204 5205 5206 5207 <li class="item-addon" data-count="1" data-addon="upsell-diffuser"> 5208 Diffuser 5209 </li> 5210 5211 5212 5213 5214 5215 <li class="item-addon" data-count="1" data-addon="upsell-candle"> 5216 Candle 5217 </li> 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 <li class="item-addon" data-count="1" data-addon="upsell-beverage"> 5228 Beverage 5229 </li> 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 <li class="item-addon" data-count="8" data-addon="upsell-cookies"> 5240 Cookies 5241 </li> 5242 5243 5244 5245 </ul> 5246 </div> 5247 <div id="chooseCard"> 5248 <h4 class="text-uppercase">choose your add-ons you like to include</h4> 5249 <div 5250 id="itemAddons" 5251 class="item-cards d-flex mb-4" 5252 > 5253 <div class="row m-0 gap-20 w-100"> 5254 <p>No Item available</p> 5255 </div> 5256 </div> 5257 </div> 5258 </div> 5259 <!-- <div class="spotifyAddons"></div> --> 5260</div> 5261 5262 </div> 5263 <div class="purchase-button-wrapper"> 5264 <div class="purchase-button btn-addon row m-0"> 5265 <div class="col-12 col-lg-2 text-left mb-2 p-0"> 5266 5267 <button class="back-purchase-button back-addon text-uppercase"> 5268 <svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 5269 <path d="M14.5799 7.41992L2.32992 7.41992L7.57992 12.6699L6.91992 13.4199L0.419922 6.91992L6.91992 0.419922L7.57992 1.16992L2.32992 6.41992L14.5799 6.41992V7.41992Z" fill="black"/> 5270 </svg>
5271 <span>Back</span> 5272 </button> 5273 5274 </div> 5275 <div class="btn-next-card col-12 col-lg-10 text-right"> 5276 5277 5278 5279 5280 <button 5281 5282 class="btn next-purchase-button next-addon text-uppercase" 5283 5284 > 5285 <span>continue without add-ons</span> 5286 </button> 5287 </div> 5288</div> 5289 5290 </div> 5291 </div> 5292 </div> 5293 5294 5295 <div 5296 class="sectionPurchase purchaseAddress hide" 5297 data-section="address" 5298 > 5299 <div class="wrapperPurchase"> 5300 <div class="purchase-content"> 5301 <div class="headerPurchase"> 5302 <h3> 5303 Complete Your Order 5304 </h3> 5305 <a class="close-purchase-popup"> 5306 <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none"> 5307 <path d="M1.53287 17.4107L0.588867 16.4667L8.05553 9.00002L0.588867 1.53336L1.53287 0.589355L8.99953 8.05602L16.4662 0.589355L17.4102 1.53336L9.94353 9.00002L17.4102 16.4667L16.4662 17.4107L8.99953 9.94402L1.53287 17.4107Z" fill="black"/> 5308 </svg> 5309</a> 5310 5311</div> 5312 5313<!-- Select2 CSS --> 5314<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/select2.min.css" rel="stylesheet" /> 5315 5316<style> 5317 .select2-container--default .select2-selection--single { 5318 height: 43px !important; 5319 border-radius: 0 !important; 5320 padding: 0 !important; 5321 background-color: #fff !important; 5322 border-color: #212121 !important; 5323 } 5324 5325 .select2-container--default .select2-selection--single .select2-selection__rendered { 5326 line-height: 43px !important; 5327 padding-left: 16px !important; 5328 padding-right: 40px !important; 5329 color: #212121 !important; 5330 font-size: 14px !important; 5331 } 5332 5333 .select2-container--default .select2-selection--single .select2-selection__placeholder { 5334 color: #212121 !important; 5335 font-style: normal; 5336 } 5337 5338 .select2-container--default .select2-selection--single .select2-selection__arrow { 5339 display: none; 5340 height: 48px !important; 5341 right: 10px !important; 5342 } 5343 5344 .select2-container--default.select2-container--open .select2-selection--single { 5345 border-color: #212121 !important; 5346 } 5347 5348 .select2-dropdown { 5349 border: 1px solid #E5E5E5 !important; 5350 border-radius: 0 !important; 5351 border-top: none !important; 5352 overflow: hidden; 5353 padding-bottom: 70px; 5354 } 5355 5356 .select2-container--default .select2-results__option { 5357 padding: 12px 16px !important; 5358 font-size: 14px !important; 5359 } 5360 5361 .select2-container--default .select2-results__option--highlighted[aria-selected] { 5362 background-color: #f5f5f5 !important; 5363 color: #212121 !important; 5364 } 5365 5366 .select2-container--default .select2-results__option[aria-selected=true] { 5367 background-color: #212121 !important; 5368 color: #fff !important; 5369 } 5370 5371 .select2-search--dropdown .select2-search__field { 5372 border: 1px solid #E5E5E5 !important; 5373 border-radius: 0 !important; 5374 padding: 10px 16px !important; 5375 font-size: 14px !important; 5376 } 5377 5378 .select2-search--dropdown .select2-search__field:focus { 5379 border-color: #212121 !important; 5380 outline: none !important; 5381 } 5382 .select2-container { 5383 width: 100% !important; 5384 } 5385 5386 .select2-container--default .select2-selection--single:focus { 5387 outline: none !important; 5388 } 5389 5390 #zipSelectPopup { 5391 display: none; 5392 } 5393 5394 @media (max-width: 991px) { 5395 #zipSelectPopup { 5396 position: fixed; 5397 top: 0; 5398 left: 0; 5399 width: 100%; 5400 height: 100%; 5401 background: #fff; 5402 z-index: 10000; 5403 overflow: hidden; 5404 } 5405 5406 .zip-popup-header { 5407 padding: 16px 20px; 5408 border-bottom: 1px solid #E5E5E5; 5409 display: flex; 5410 justify-content: space-between; 5411 align-items: center; 5412 background: #fff; 5413 position: sticky; 5414 top: 0; 5415 z-index: 10001; 5416 } 5417 5418 .zip-popup-header h4 { 5419 margin: 0; 5420 font-size: 16px; 5421 font-weight: 600; 5422 color: #212121; 5423 } 5424 5425 .zip-popup-close { 5426 background: none; 5427 border: none; 5428 font-size: 28px; 5429 color: #666; 5430 cursor: pointer; 5431 padding: 0; 5432 width: 40px; 5433 height: 40px; 5434 display: flex; 5435 align-items: center; 5436 justify-content: center; 5437 line-height: 1; 5438 } 5439 5440 .zip-popup-search { 5441 padding: 16px 20px; 5442 border-bottom: 1px solid #E5E5E5; 5443 background: #fff; 5444 position: sticky; 5445 top: 57px; 5446 z-index: 10001; 5447 } 5448 5449 .zip-popup-search input { 5450 width: 100%; 5451 padding: 12px 16px; 5452 border: 1px solid #E5E5E5; 5453 border-radius: 4px; 5454 font-size: 14px; 5455 } 5456 5457 .zip-popup-search input:focus { 5458 outline: none; 5459 border-color: #212121; 5460 } 5461 5462 .zip-popup-list { 5463 height: calc(100% - 130px); 5464 overflow-y: auto; 5465 padding: 0; 5466 -webkit-overflow-scrolling: touch; 5467 } 5468 5469 .zip-popup-list-item { 5470 padding: 16px 20px; 5471 border-bottom: 1px solid #f5f5f5; 5472 cursor: pointer; 5473 font-size: 14px; 5474 color: #212121; 5475 background: #fff; 5476 transition: background-color 0.2s; 5477 } 5478 5479 .zip-popup-list-item:active { 5480 background-color: #f5f5f5; 5481 } 5482 5483 .zip-popup-list-item.selected { 5484 background-color: #212121; 5485 color: #fff; 5486 } 5487 5488 .zip-popup-list-item:last-child { 5489 border-bottom: none; 5490 } 5491 #zip { 5492 -webkit-appearance: none; 5493 -moz-appearance: none; 5494 appearance: none; 5495 background-image: none; 5496 cursor: pointer; 5497 font-size: 14px; 5498 padding-right: 16px; 5499 } 5500 } 5501</style> 5502 5503<!-- Mobile Zip Popup --> 5504<div id="zipSelectPopup"> 5505 <div class="zip-popup-header"> 5506 <h4>Select Postal Code / Area</h4> 5507 <button type="button" class="zip-popup-close">×</button> 5508 </div> 5509 <div class="zip-popup-search"> 5510 <input type="text" id="zipPopupSearch" placeholder="Search by postal code or area..."> 5511 </div> 5512 <div class="zip-popup-list" id="zipPopupList"></div> 5513</div> 5514 5515<div class="contentPurchase"> 5516 <div class="row"> 5517 <div class="col-12 col-lg-7 position-relative"> 5518 <div class="addressPurchase"> 5519 5520 <h4 class="text-uppercase">recipient delivery address</h4> 5521 <p>Share the delivery address to send your heartfelt blooms straight to their door.</p> 5522 5523 5524 <!-- Pickup Location Details (hidden by default, shown when pickup is selected) -->
5525 <div id="pickupLocationDetails" class="pickup-location-details" style="display: none; padding: 20px; background-color: #f8f8f8; border: 1px solid #e0e0e0; margin-bottom: 20px;"> 5526 <h5 style="font-size: 16px; font-weight: 600; margin-bottom: 16px; text-transform: uppercase; color: #212121;">Pickup Location</h5> 5527 <div style="font-size: 14px; line-height: 1.8; color: #212121;"> 5528 <p style="margin: 0 0 12px 0;"><strong>ITC Kuningan Mall</strong></p> 5529 <p style="margin: 0 0 12px 0;">Lantai 9 unit 4B<br/>Jl. Prof. DR. Satrio No.18, RT.11/RW.4, Kuningan, Karet Kuningan, Kecamatan Setiabudi, Kota Jakarta Selatan, Daerah Khusus Ibukota Jakarta 12940</p> 5530 <p style="margin: 0 0 12px 0;"><strong>Pickup Hours:</strong> 10:00 - 16:00</p> 5531 <p style="margin: 0; padding: 12px; background-color: #fff3cd; border-left: 4px solid #ffc107; font-size: 13px;"> 5532 <strong>Note:</strong> Please bring your order confirmation when picking up your items. 5533 </p> 5534 </div> 5535 </div> 5536 5537 <div class="formAddressPurchase row"> 5538 <div class="col-12"> 5539 <form> 5540 <div class="form-group row mb-2 mb-lg-4"> 5541 <div class="col-6 position-relative"> 5542 <input id="first_name" type="text" class="form-control input__field" placeholder="" required> 5543 <label for="first_name" class="input__label">First Name<span>*</span></label> 5544 </div> 5545 <div class="col-6 position-relative"> 5546 <input id="last_name" type="text" class="form-control input__field" placeholder="" required> 5547 <label for="last_name" class="input__label">Last Name<span>*</span></label> 5548 </div> 5549 <input type="hidden" data-properties="nama-penerima"> 5550 </div> 5551 5552 <div class="form-group row mb-2 mb-lg-4 form-address"> 5553 <div class="col-6 position-relative"> 5554 <input 5555 id="recipient_number" 5556 type="text" 5557 data-properties="telepon-penerima" 5558 class="form-control input__field" 5559 placeholder="" 5560 required 5561 > 5562 <label for="recipient_number" class="input__label">Recipient number<span>*</span></label> 5563 </div> 5564 <div class="col-6 position-relative"> 5565 <input 5566 id="company" 5567 type="text" 5568 data-properties="company" 5569 class="form-control input__field" 5570 placeholder="" 5571 > 5572 <label for="company" class="input__label">Company (Optional)</label> 5573 </div> 5574 </div> 5575 <div class="form-group row mb-2 mb-lg-4 form-address"> 5576 <div class="col-6 position-relative"> 5577 <input 5578 id="province" 5579 type="text" 5580 class="form-control input__field" 5581 placeholder="" 5582 value="Jakarta" 5583 data-properties="province" 5584 readonly 5585 > 5586 <label for="province" class="input__label">Province</label> 5587 </div> 5588 <div class="col-6 position-relative"> 5589 <select id="zip" class="form-control select-search" required></select> 5590 </div> 5591 </div> 5592 <div class="form-group row mb-2 mb-lg-4 form-address"> 5593 <div class="col-12 position-relative"> 5594 <input 5595 id="streetAddress" 5596 type="text" 5597 class="form-control input__field" 5598 placeholder="Jl. Example No.123 RT.01 RW.02" 5599 required 5600 > 5601 <label for="streetAddress" class="input__label" style="top: 12px;left: 16px;font-size: 12px;color: #212121;transform: translateY(-7px);padding: 0 5px;">Street Address<span>*</span></label> 5602 5603 5604 </div> 5605 </div> 5606 <div class="form-group row position-relative mb-2 mb-lg-4 form-address hide"> 5607 <div class="col-12"> 5608 <textarea 5609 id="delivery_address" 5610 data-properties="alamat-penerima" 5611 class="form-control input__field col-12" 5612 placeholder="" 5613 required 5614 readonly 5615 ></textarea> 5616 <label for="delivery_address" class="input__label">Delivery Address<span>*</span></label> 5617 </div> 5618 </div> 5619 </form> 5620 </div> 5621 </div> 5622 </div> 5623 <div class="addonsPurchase"> 5624 <h4 class="text-uppercase">add-ons</h4> 5625 <div class="addons"> 5626 <p>No Add-Ons</p> 5627 <!-- 5628 <button class="add-addon"> 5629 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none"> 5630 <path d="M5.5 6.5H0V5.5H5.5V0H6.5V5.5H12V6.5H6.5V12H5.5V6.5Z" fill="black"/> 5631 </svg>
5632 <span>Enhance my moment with Add-ons</span> 5633 </button> 5634 --> 5635 </div> 5636 </div> 5637 </div> 5638 5639 <div class="col-12 col-lg-5 row m-0 justify-content-end"> 5640 <div class="reviewCardPurchase"> 5641 <h4 class="text-uppercase">review your greeting card</h4> 5642 <p>You can edit the greeting card to ensure your words perfectly express your love.</p> 5643 <div class="cardPreview"> 5644 <!-- Card preview structure --> 5645 <div class="card-preview-container" style="display: none;"> 5646 <!-- Card design preview (with or without photo) --> 5647 <div class="card-preview-wrapper"> 5648 <!-- Top Section (50% height) --> 5649 <div class="card-top-section"> 5650 <!-- Layout for when NO photo is uploaded --> 5651 <div class="no-photo-layout"> 5652 <div class="qr-text"> 5653 <p class="qr-title">A<br/>special message</p> 5654 <p class="qr-subtitle">for <span class="recipient-qr-text">Munying</span>!</p> 5655 </div> 5656 <div class="qr-code-container"> 5657 <div class="qr-placeholder">QR</div> 5658 </div> 5659 <div class="qr-scan-text"> 5660 <p>Scan for the surprise</p> 5661 </div> 5662 </div> 5663 5664 <!-- Layout for when photo IS uploaded --> 5665 <div class="with-photo-layout" style="display: none;"> 5666 <div class="photo-container"> 5667 <img class="card-preview-photo" src="" alt="Card photo" width="300" height="200"> 5668 <div class="photo-qr-overlay hide hidden"> 5669 <div class="qr-code-small"> 5670 <div class="qr-placeholder-small">QR</div> 5671 </div> 5672 <div class="photo-qr-text"> 5673 <p>Scan for a special message for you</p> 5674 </div> 5675 </div> 5676 </div> 5677 </div> 5678 </div> 5679 5680 <!-- Divider Line --> 5681 <div class="card-divider"></div> 5682 5683 <!-- Bottom Section (50% height) --> 5684 <div class="card-bottom-section"> 5685 <!-- Recipient name --> 5686 <div class="card-recipient-name"> 5687 <span class="recipient-text"></span> 5688 </div> 5689 5690 <!-- Card message --> 5691 <div class="card-message-section"> 5692 <div class="card-message-text"></div> 5693 </div> 5694 5695 <!-- Sender name --> 5696 <div class="card-sender-name"> 5697 <span class="sender-text"></span> 5698 </div> 5699 </div> 5700 </div> 5701 </div> 5702 5703 <!-- Empty state --> 5704 <div class="card-empty-state"> 5705 <div style="text-align: center; padding: 40px 20px; color: #999; border: 1px dashed #ddd; border-radius: 8px;"> 5706 <p style="margin: 0; font-size: 14px;">Your greeting card preview will appear here</p> 5707 <p style="margin: 5px 0 0 0; font-size: 12px;">Complete the greeting card section to see the preview</p> 5708 </div> 5709 </div> 5710 </div> 5711 </div> 5712 <div class="scanCard mt-3 hide"> 5713 <div class="position-relative"> 5714 <div id="qrcode"></div> 5715 <div class="t-preview"> 5716 <p class="h3">preview your moment</p> 5717 <p>Scan this barcode on OUTERBLOOMâs mobile application</p> 5718 </div> 5719 </div> 5720 </div> 5721 </div> 5722 5723 </div> 5724</div> 5725
5726<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
vendor: 2 bytes, line 5726
5726
5727<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/select2.min.js"></script>
5727 5728
5729<script> 5730document.addEventListener('DOMContentLoaded', function() { 5731 // Detect iOS 5732 var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; 5733 5734 if (isIOS) { 5735 document.querySelector('.formAddressPurchase').classList.add('ios'); 5736 5737 // iOS specific fixes 5738 var inputs = document.querySelectorAll('.formAddressPurchase .input__field'); 5739 5740 inputs.forEach(function(input) { 5741 // Force enable touch events on iOS 5742 input.style.webkitUserSelect = 'text'; 5743 input.style.webkitTouchCallout = 'default'; 5744 input.style.pointerEvents = 'auto'; 5745 input.style.touchAction = 'manipulation'; 5746 5747 // Add explicit touch event listeners for iOS 5748 input.addEventListener('touchstart', function(e) { 5749 e.stopPropagation(); 5750 this.focus(); 5751 }, { passive: false }); 5752 5753 input.addEventListener('touchend', function(e) { 5754 e.preventDefault(); 5755 e.stopPropagation(); 5756 this.focus(); 5757 this.click(); 5758 }, { passive: false }); 5759 5760 // Force focus on tap for iOS 5761 input.addEventListener('click', function(e) { 5762 e.stopPropagation(); 5763 if (document.activeElement !== this) { 5764 this.focus(); 5765 } 5766 }); 5767 }); 5768 5769 // Fix for label overlapping on iOS 5770 var labels = document.querySelectorAll('.formAddressPurchase .input__label'); 5771 labels.forEach(function(label) { 5772 label.style.pointerEvents = 'none'; 5773 label.addEventListener('touchstart', function(e) { 5774 e.preventDefault(); 5775 var input = this.parentNode.querySelector('.input__field'); 5776 if (input) { 5777 input.focus(); 5778 } 5779 }); 5780 }); 5781 } 5782 5783 // Handle input state for all browsers, especially iOS 5784 var inputs = document.querySelectorAll('.input__field'); 5785 5786 inputs.forEach(function(input) { 5787 // Handle input events 5788 input.addEventListener('input', function() { 5789 if (this.value.trim() !== '') { 5790 this.classList.add('has-value'); 5791 } else { 5792 this.classList.remove('has-value'); 5793 } 5794 }); 5795 5796 // Handle focus 5797 input.addEventListener('focus', function() { 5798 this.classList.add('focused'); 5799 // iOS specific: ensure input is visible 5800 if (isIOS) { 5801 setTimeout(function() { 5802 input.scrollIntoView({ behavior: 'smooth', block: 'center' }); 5803 }, 300); 5804 } 5805 }); 5806 5807 // Handle blur 5808 input.addEventListener('blur', function() { 5809 this.classList.remove('focused'); 5810 if (this.value.trim() !== '') { 5811 this.classList.add('has-value'); 5812 } else { 5813 this.classList.remove('has-value'); 5814 } 5815 }); 5816 5817 // Initial check for pre-filled values 5818 if (input.value.trim() !== '') { 5819 input.classList.add('has-value'); 5820 } 5821 }); 5822 5823 // Additional iOS fixes 5824 if (isIOS) { 5825 // Prevent iOS Safari from adding default styling 5826 document.addEventListener('touchstart', function() {}, { passive: true }); 5827 5828 // Fix viewport issues on iOS 5829 var viewport = document.querySelector('meta[name=viewport]'); 5830 if (viewport) { 5831 viewport.setAttribute('content', 5832 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' 5833 ); 5834 } 5835 } 5836 5837 // Card Preview functionality 5838 function updateCardPreview() { 5839 // Get data from greeting card inputs ONLY from #greetingCard or .greetingCard area 5840 const greetingCardArea = $('#greetingCard, .greetingCard'); 5841 5842 const recipientName = greetingCardArea.find('[data-properties="penerima"]').val() || ''; 5843 const senderName = greetingCardArea.find('[data-properties="pengirim"]').val() || 5844 greetingCardArea.find('[data-properties="kartu-nama-pengirim"]').val() || 5845 greetingCardArea.find('#senderCard').val() || '-'; 5846 const cardMessage = greetingCardArea.find('[data-properties="ucapan"]').val() || 5847 greetingCardArea.find('#kartu-ucapan').val() || '-'; 5848 const photoUrl = $('#properties-photo').val(); 5849 const videoUrl = greetingCardArea.find('#properties-video').val() || ''; 5850 const qrId = greetingCardArea.find('#properties-qrId').val() || ''; 5851 5852 // Get preview elements 5853 const cardContainer = $('.card-preview-container'); 5854 const emptyState = $('.card-empty-state'); 5855 const recipientText = $('.recipient-text'); 5856 const recipientQrText = $('.recipient-qr-text'); 5857 const senderText = $('.sender-text'); 5858 const messageText = $('.card-message-text'); 5859 const noPhotoLayout = $('.no-photo-layout'); 5860 const withPhotoLayout = $('.with-photo-layout'); 5861 const previewPhoto = $('.card-preview-photo'); 5862 const qrContainer = $('.qr-code-container'); 5863 const qrContainerSmall = $('.qr-code-small'); 5864 5865 // Check if we have any card content 5866 const hasContent = (recipientName && recipientName.trim() !== '' && recipientName.trim() !== ' ') || 5867 (senderName !== '' && senderName !== '-') || 5868 (cardMessage !== '' && cardMessage !== '-') || 5869 (photoUrl && photoUrl !== '' && photoUrl !== '-') || 5870 (videoUrl && videoUrl !== '' && videoUrl !== '-'); 5871 5872 if (hasContent) { 5873 // Show card preview, hide empty state 5874 cardContainer.show(); 5875 emptyState.hide(); 5876 5877 // Update recipient name in bottom section with prefix 5878 let recipientDisplay = ''; 5879 if (recipientName && recipientName.trim() !== '' && recipientName.trim() !== ' ' && recipientName.trim() !== '-') { 5880 const prefix = $('.label-prefix').text().trim() || ''; 5881 const trimmedName = recipientName.trim(); 5882 recipientDisplay = prefix + (trimmedName ? ' ' + trimmedName : ''); 5883 } 5884 recipientText.text(recipientDisplay); 5885 5886 // Update recipient name in QR section (for no-photo layout) - use first name only or full name 5887 let recipientQrDisplay = ''; 5888 if (recipientName && recipientName.trim() !== '' && recipientName.trim() !== ' ' && recipientName.trim() !== '-') { 5889 recipientQrDisplay = recipientName.trim().split(' ')[0]; 5890 } 5891 recipientQrText.text(recipientQrDisplay); 5892 5893 // Update sender name 5894 const senderDisplay = (senderName !== '' && senderName !== '-') ? senderName : ''; 5895 senderText.text(senderDisplay); 5896 5897 // Update message 5898 const messageDisplay = (cardMessage !== '' && cardMessage !== '-') ? 5899 cardMessage : ''; 5900 messageText.text(messageDisplay); 5901 5902 // Handle photo display and layout switching 5903 if (photoUrl && photoUrl !== '' && photoUrl !== '-') { 5904 // Show photo layout, hide no-photo layout 5905 noPhotoLayout.hide(); 5906 withPhotoLayout.show(); 5907 previewPhoto.attr('src', photoUrl); 5908 5909 // Generate QR code for photo layout 5910 if (qrId && qrId !== '' && qrId !== '-') { 5911 qrContainerSmall.html(''); 5912 try { 5913 var qrCode = new QRCode(qrContainerSmall[0], { 5914 text: `https://moment.outerbloom.com/${qrId}`, 5915 width: 40, 5916 height: 40, 5917 colorDark: "#333333", 5918 colorLight: "#ffffff", 5919 correctLevel: QRCode.CorrectLevel.L, 5920 }); 5921 } catch(e) { 5922 qrContainerSmall.html('<div class="qr-placeholder-small">QR</div>'); 5923 } 5924 } else { 5925 qrContainerSmall.html('<div class="qr-placeholder-small">QR</div>'); 5926 } 5927 } else { 5928 // Show no-photo layout, hide photo layout 5929 withPhotoLayout.hide(); 5930 noPhotoLayout.show(); 5931 5932 // Generate QR code for no-photo layout 5933 if (qrId && qrId !== '' && qrId !== '-') { 5934 qrContainer.html(''); 5935 try { 5936 var qrCode = new QRCode(qrContainer[0], { 5937 text: `https://moment.outerbloom.com/${qrId}`, 5938 width: 80, 5939 height: 80, 5940 colorDark: "#333333", 5941 colorLight: "#ffffff", 5942 correctLevel: QRCode.CorrectLevel.L, 5943 }); 5944 } catch(e) { 5945 qrContainer.html('<div class="qr-placeholder">QR</div>'); 5946 } 5947 } else { 5948 qrContainer.html('<div class="qr-placeholder">QR</div>'); 5949 } 5950 } 5951 } else { 5952 // Show empty state, hide card preview 5953 cardContainer.hide(); 5954 emptyState.show(); 5955 } 5956 } 5957 5958 // Listen for changes in greeting card fields ONLY from #greetingCard or .greetingCard area 5959 $(document).on('input change keyup', '#greetingCard [data-properties="penerima"], #greetingCard [data-properties="ucapan"], #greetingCard [data-properties="pengirim"], #greetingCard [data-properties="kartu-nama-pengirim"], #greetingCard #senderCard, #greetingCard #kartu-ucapan, #greetingCard #properties-photo, #greetingCard #properties-video, #greetingCard #properties-qrId, .greetingCard [data-properties="penerima"], .greetingCard [data-properties="ucapan"], .greetingCard [data-properties="pengirim"], .greetingCard [data-properties="kartu-nama-pengirim"], .greetingCard #senderCard, .greetingCard #kartu-ucapan, .greetingCard #properties-photo, .greetingCard #properties-video, .greetingCard #properties-qrId', function() { 5960 setTimeout(updateCardPreview, 100); // Small delay to allow value updates 5961 }); 5962 5963 // Listen for custom events from greeting card section 5964 $(document).on('cardDataUpdated', function() { 5965 updateCardPreview(); 5966 }); 5967 5968 // Listen for btn-next-card click using delegate 5969 $(document).on('click', '.btn-next-card .btn', function() { 5970 console.log('btn-next-card clicked, updating card preview...'); 5971 updateCardPreview(); 5972 }); 5973 5974 // Initial card preview update 5975 $(document).ready(function() { 5976 setTimeout(updateCardPreview, 1000); // Delay to ensure all fields are initialized 5977 5978 // Update preview when moving to purchase address step 5979 if ($('.purchaseAddress').length && !$('.purchaseAddress').hasClass('hide')) { 5980 updateCardPreview(); 5981 } 5982 }); 5983 5984 // Auto-fill delivery address from input fields 5985 window.updateDeliveryAddress = function() { 5986 const selectedMethod = $('#selectedShippingMethod').val(); 5987 if (selectedMethod === 'Pickup') { 5988 const pickupAddress = "ITC Kuningan, Mall, Lantai 9 unit 4B, Jl. Prof. DR. Satrio No.18"; 5989 const pickupZipCode = "12940 - Karet Kuningan"; 5990 5991 const deliveryAddressTextarea = $('#delivery_address'); 5992 5993 // Set delivery address 5994 if (deliveryAddressTextarea.val() !== pickupAddress) { 5995 deliveryAddressTextarea.val(pickupAddress); 5996 deliveryAddressTextarea.addClass('has-value'); 5997 deliveryAddressTextarea.trigger('change'); 5998 $('#properties-kodepos').val(pickupZipCode); 5999 } 6000 6001 return; 6002 } 6003 6004 const streetAddress = $('#streetAddress').val().trim(); 6005 const zipValue = $('#zip').val() || ''; // Format: "12345-Kelurahan-Kecamatan" 6006 const province = $('#province').val().trim(); 6007 6008 // Parse zip value 6009 let postalCode = ''; 6010 let kelurahan = ''; 6011 let kecamatan = ''; 6012 6013 if (zipValue) { 6014 const zipParts = zipValue.split('-'); 6015 postalCode = zipParts[0] || ''; // zip.split('-')[0] 6016 kelurahan = zipParts[1] || ''; // zip.split('-')[1] 6017 kecamatan = zipParts[2] || ''; // zip.split('-')[2] 6018 } 6019 6020 // Build address string with format: [streetAddress], [kelurahan], [kecamatan], [province], [postalCode], Indonesia 6021 let addressParts = []; 6022 6023 if (streetAddress) addressParts.push(streetAddress); 6024 if (kelurahan) addressParts.push(kelurahan); 6025 if (kecamatan) addressParts.push(kecamatan); 6026 if (province) addressParts.push(province); 6027 if (postalCode) addressParts.push(postalCode); 6028 addressParts.push('Indonesia'); 6029 6030 const fullAddress = addressParts.join(', '); 6031 6032 // Update delivery address textarea 6033 const deliveryAddressTextarea = $('#delivery_address'); 6034 deliveryAddressTextarea.val(fullAddress); 6035 6036 // Update has-value class for label animation 6037 if (fullAddress && fullAddress !== 'Indonesia') { 6038 deliveryAddressTextarea.addClass('has-value'); 6039 } else { 6040 deliveryAddressTextarea.removeClass('has-value'); 6041 } 6042 6043 // Trigger change event 6044 deliveryAddressTextarea.trigger('change'); 6045 } 6046 6047 // Initialize Select2 for postal code select 6048 function initZipSearch() { 6049 // Only initialize Select2 on desktop (screen width > 992px) 6050 if ($(window).width() > 992) { 6051 $('#zip').select2({ 6052 placeholder: 'Search by postal code or area', 6053 allowClear: false, 6054 width: '100%', 6055 matcher: function(params, data) { 6056 // If there are no search terms, return all of the data 6057 if ($.trim(params.term) === '') { 6058 return data; 6059 } 6060
6061 // Do not display the item if there is no 'text' property 6062 if (typeof data.text === 'undefined') { 6063 return null; 6064 } 6065 6066 // `params.term` should be the term that is used for searching 6067 // `data.text` is the text that is displayed for the data object 6068 if (data.text.toLowerCase().indexOf(params.term.toLowerCase()) > -1 || 6069 data.id.toLowerCase().indexOf(params.term.toLowerCase()) > -1) { 6070 var modifiedData = $.extend({}, data, true); 6071 return modifiedData; 6072 } 6073 6074 // Return `null` if the term does not match the data 6075 return null; 6076 } 6077 }); 6078 6079 // Handle select change to update delivery address 6080 $('#zip').on('change', function() { 6081 updateDeliveryAddress(); 6082 }); 6083 } else { 6084 // On mobile (<991px), use custom popup instead of native select 6085 var $zipSelect = $('#zip'); 6086 var $popup = $('#zipSelectPopup'); 6087 var $popupList = $('#zipPopupList'); 6088 var $popupSearch = $('#zipPopupSearch'); 6089 var isPopupOpen = false; 6090 var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; 6091 6092 // Populate popup list with options from select 6093 function populatePopupList(filterText = '') { 6094 $popupList.empty(); 6095 6096 $zipSelect.find('option').each(function() { 6097 var $option = $(this); 6098 var value = $option.val(); 6099 var text = $option.text(); 6100 6101 // Skip empty/placeholder options 6102 if (!value || value === '') return; 6103 6104 // Filter based on search text 6105 if (filterText && 6106 text.toLowerCase().indexOf(filterText.toLowerCase()) === -1 && 6107 value.toLowerCase().indexOf(filterText.toLowerCase()) === -1) { 6108 return; 6109 } 6110 6111 var $item = $('<div class="zip-popup-list-item"></div>') 6112 .attr('data-value', value) 6113 .text(text); 6114 6115 // Mark selected item 6116 if (value === $zipSelect.val()) { 6117 $item.addClass('selected'); 6118 } 6119 6120 $popupList.append($item); 6121 }); 6122 } 6123 6124 // Function to open popup 6125 function openPopup() { 6126 if (isPopupOpen) return; 6127 6128 isPopupOpen = true; 6129 populatePopupList(); 6130 $popup.css('display', 'block').hide().fadeIn(200); 6131 $('body').css('overflow', 'hidden'); 6132 6133 // iOS needs more delay for focus 6134 var focusDelay = isIOS ? 500 : 250; 6135 setTimeout(function() { 6136 $popupSearch.focus(); 6137 }, focusDelay); 6138 } 6139 6140 // Function to close popup 6141 function closePopup() { 6142 if (!isPopupOpen) return; 6143 6144 isPopupOpen = false; 6145 $popup.fadeOut(200); 6146 $('body').css('overflow', ''); 6147 $popupSearch.val(''); 6148 } 6149 6150 // iOS specific handling 6151 if (isIOS) { 6152 // For iOS, use only touchstart with proper event handling 6153 $zipSelect.on('touchstart', function(e) { 6154 e.preventDefault(); 6155 e.stopPropagation(); 6156 e.stopImmediatePropagation(); 6157 6158 if (!isPopupOpen) { 6159 openPopup(); 6160 } 6161 6162 return false; 6163 }); 6164 6165 // Prevent other events on iOS to avoid double triggering 6166 $zipSelect.on('click focus mousedown', function(e) { 6167 e.preventDefault(); 6168 e.stopPropagation(); 6169 e.stopImmediatePropagation(); 6170 return false; 6171 }); 6172 } else { 6173 // For Android and other mobile devices 6174 // Use touchstart as primary event to prevent native dropdown 6175 $zipSelect.on('touchstart', function(e) { 6176 e.preventDefault(); 6177 e.stopPropagation(); 6178 e.stopImmediatePropagation(); 6179 6180 if (!isPopupOpen) { 6181 openPopup(); 6182 } 6183 6184 return false; 6185 }); 6186 6187 // Also prevent click and other events to ensure native dropdown doesn't show 6188 $zipSelect.on('click focus mousedown touchend', function(e) { 6189 e.preventDefault(); 6190 e.stopPropagation(); 6191 e.stopImmediatePropagation(); 6192 return false; 6193 }); 6194 } 6195 6196 // Search functionality 6197 $popupSearch.on('input', function() { 6198 populatePopupList($(this).val()); 6199 }); 6200 6201 // Track touch movement to differentiate scroll from tap 6202 var touchStartY = 0; 6203 var touchMoved = false; 6204 6205 // Track touch start 6206 $popupList.on('touchstart', '.zip-popup-list-item', function(e) { 6207 touchStartY = e.originalEvent.touches[0].clientY; 6208 touchMoved = false; 6209 }); 6210 6211 // Track touch movement 6212 $popupList.on('touchmove', '.zip-popup-list-item', function(e) { 6213 var touchY = e.originalEvent.touches[0].clientY; 6214 if (Math.abs(touchY - touchStartY) > 10) { 6215 touchMoved = true; 6216 } 6217 }); 6218 6219 // Handle option selection - only if not scrolling 6220 $popupList.on('touchend', '.zip-popup-list-item', function(e) { 6221 e.preventDefault(); 6222 e.stopPropagation(); 6223 6224 // Only select if user didn't scroll 6225 if (!touchMoved) { 6226 var selectedValue = $(this).attr('data-value'); 6227 $zipSelect.val(selectedValue).trigger('change'); 6228 closePopup(); 6229 updateDeliveryAddress(); 6230 } 6231 }); 6232 6233 // Also handle click for desktop testing 6234 $popupList.on('click', '.zip-popup-list-item', function(e) { 6235 e.preventDefault(); 6236 e.stopPropagation(); 6237 6238 var selectedValue = $(this).attr('data-value'); 6239 $zipSelect.val(selectedValue).trigger('change'); 6240 closePopup(); 6241 updateDeliveryAddress(); 6242 }); 6243 6244 // Prevent scroll from closing popup - apply to all touch events 6245 $popupList.on('touchstart touchmove touchend scroll', function(e) { 6246 e.stopPropagation(); 6247 }); 6248 6249 // Prevent search input touch from closing popup 6250 $popupSearch.on('touchstart touchmove touchend click', function(e) { 6251 e.stopPropagation(); 6252 }); 6253 6254 // Prevent header touch from closing popup (except close button) 6255 $('.zip-popup-header').on('touchstart touchmove touchend click', function(e) { 6256 if (!$(e.target).hasClass('zip-popup-close')) { 6257 e.stopPropagation(); 6258 } 6259 }); 6260 6261 // Close popup handlers 6262 $('.zip-popup-close').on('click touchend', function(e) { 6263 e.preventDefault(); 6264 e.stopPropagation(); 6265 closePopup(); 6266 }); 6267 6268 // Prevent touchmove on popup content from bubbling up 6269 $('.zip-popup-content').on('touchstart touchmove touchend', function(e) { 6270 e.stopPropagation(); 6271 }); 6272 6273 // Close on background tap only - but not on any touch inside content 6274 $popup.on('touchend', function(e) { 6275 // Only close if touching popup background directly, not content 6276 if ($(e.target).is('#zipSelectPopup')) { 6277 e.preventDefault(); 6278 closePopup(); 6279 } 6280 }); 6281 } 6282 } 6283 6284 // Listen for changes in address fields 6285 $(document).on('input change', '#streetAddress, #zip, #province', function() { 6286 updateDeliveryAddress(); 6287 }); 6288 6289 // Initial update on page load 6290 $(document).ready(function() { 6291 setTimeout(updateDeliveryAddress, 500); 6292 6293 // Initialize zip search after select is populated 6294 setTimeout(initZipSearch, 600); 6295 }); 6296}); 6297</script>
6297 6298 </div> 6299 <div class="purchase-button-wrapper"> 6300 <div class="purchase-button btn-address row m-0"> 6301 <div class="col-12 col-lg-2 text-left mb-2 p-0"> 6302 6303 <button class="back-purchase-button back-address text-uppercase"> 6304 <svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 6305 <path d="M14.5799 7.41992L2.32992 7.41992L7.57992 12.6699L6.91992 13.4199L0.419922 6.91992L6.91992 0.419922L7.57992 1.16992L2.32992 6.41992L14.5799 6.41992V7.41992Z" fill="black"/> 6306 </svg> 6307 <span>Back</span> 6308 </button> 6309 6310 </div> 6311 <div class="btn-next-card col-12 col-lg-10 text-right"> 6312 6313 <!-- 6314 <button class="back-purchase-button back-address text-uppercase mr-lg-2 mb-2 mb-lg-0"> 6315 <svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 6316 <path d="M14.5799 7.41992L2.32992 7.41992L7.57992 12.6699L6.91992 13.4199L0.419922 6.91992L6.91992 0.419922L7.57992 1.16992L2.32992 6.41992L14.5799 6.41992V7.41992Z" fill="black"/> 6317 </svg> 6318 <span>Back</span> 6319 </button> 6320 --> 6321 6322 6323 6324 6325 <button 6326 6327 id="addtocart-card" 6328 6329 class="btn next-address text-uppercase" 6330 6331 > 6332 <span>add to cart</span> 6333 </button> 6334 </div> 6335</div> 6336 6337 </div> 6338 </div> 6339 </div> 6340 6341 </div> 6342</div> 6343<div id="backgroundPopup"></div> 6344 6345 6346 6347<input 6348 data-index="1" 6349 type="hidden" 6350 id="properties-delivery-date" 6351 name="properties[Delivery Date]" 6352 value="-" 6353> 6354<input 6355 data-index="2" 6356 type="hidden" 6357 id="properties-delivery-time" 6358 name="properties[Delivery Time]" 6359 value="-" 6360> 6361<input 6362 data-index="4" 6363 type="hidden" 6364 id="properties-nama-penerima" 6365 name="properties[Nama Penerima]" 6366 value="-" 6367> 6368<input 6369 data-index="5" 6370 type="hidden" 6371 id="properties-alamat-penerima" 6372 name="properties[Alamat Penerima]" 6373 value="-" 6374> 6375<input 6376 data-index="6" 6377 type="hidden" 6378 id="properties-kodepos" 6379 name="properties[Kodepos]" 6380 value="-" 6381> 6382<input data-index="7" type="hidden" id="properties-telepon-penerima" name="properties[Telepon Penerima]"> 6383 6384 <input 6385 data-index="8" 6386 type="hidden" 6387 id="properties-kartu-nama-penerima" 6388 name="properties[Kartu Nama Penerima]" 6389 value="-" 6390 > 6391 <input 6392 data-index="9" 6393 type="hidden" 6394 id="properties-kartu-ucapan" 6395 name="properties[Kartu Ucapan]" 6396 value="-" 6397 > 6398 6399 6400 6401 <input 6402 data-index="10" 6403 type="hidden" 6404 id="properties-kartu-nama-pengirim" 6405 name="properties[Kartu Nama Pengirim]" 6406 value="-" 6407 > 6408 6409 6410 6411 <input 6412 data-index="11" 6413 type="hidden" 6414 id="properties-photo" 6415 name="properties[Foto]" 6416 value="-" 6417 > 6418 <input 6419 id="input-foto" 6420 type="file" 6421 class="customFile" 6422 accept="image/*" 6423 style="position: absolute;top:40%;display:none;" 6424 > 6425 <input 6426 data-index="12" 6427 type="hidden" 6428 id="properties-video" 6429 name="properties[Video]" 6430 value="-" 6431 > 6432 <input 6433 id="input-video" 6434 type="file" 6435 class="customFileVideo" 6436 accept="video/*" 6437 style="position: absolute;top:40%;display:none;" 6438 > 6439 <input data-index="13" type="hidden" id="properties-qrId" name="properties[QR Code]" value=""> 6440 6441 6442 <div style="visiblity: hidden;opacity: 0;position: absolute;top:0;z-index:-999"> 6443 <textarea id="noteHampers" name="properties[Note Hampers]" placeholder="Notes:"> </textarea> 6444 <input 6445 id="logo-hampers" 6446 class="dropzonex" 6447 type="file" 6448 name="properties[Logo Hampers]" 6449 class="customFile" 6450 accept="image/*" 6451 > 6452 </div> 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465<!-- Additional Shipping --> 6466<input type="hidden" id="properties-kota-pengiriman-province" name="properties[Province]"> 6467<input 6468 type="hidden" 6469 id="properties-kota-pengiriman-country" 6470 name="properties[Country]" 6471 value="Indonesia" 6472> 6473<input type="hidden" id="properties-shipping" name="properties[Shipping]"> 6474 6475<input type="hidden" id="properties-time" name="properties[Time]"> 6476<input type="hidden" id="properties-card" name="properties[Card]"> 6477<input type="hidden" id="properties-addons" name="properties[Addons]"> 6478 6479<input 6480 type="hidden" 6481 id="properties-company" 6482 name="properties[Company]" 6483 value="" 6484>
6485<script> 6486 6487 $(document).ready(function(){ 6488 6489 var text_max_papan1=150; 6490 var msg_text_papan1=""; 6491 $('#kartu-ucapan-ucapan').keyup(function(){ 6492 var text_length_papan1=$('#kartu-ucapan-ucapan').val().length; 6493 var msg_text_papan1=$('#kartu-ucapan-ucapan').val(); 6494 }); 6495 6496 var notes_papan1 = [ 6497 6498 [0,"Happy Wedding (nama & nama)."],[1,"Congratulations lovebirds (nama & nama)."],[2,"Selamat berbahagia (nama & nama)."],[3,"Selamat menempuh hidup baru (nama & nama)."] 6499 6500 ]; 6501 $('#show_note_papan1').click(function(event){ 6502 event.preventDefault(); 6503 var idx_papan1=parseInt($('#note_id_papan1').val()); 6504 if(isNaN(idx_papan1)){ 6505 idx_papan1=0; 6506 }else{ 6507 idx_papan1++; 6508 idx_papan1=idx_papan1%notes_papan1.length; 6509 } 6510 var note_papan1=notes_papan1[idx_papan1][1]; 6511 $('#note_id_papan1').val(idx_papan1); 6512 $('#kartu-ucapan-papan, #properties-kartu-pesan, #properties-kartu-ucapan').val(note_papan1); 6513 $('#msgDelivery').val(note_papan1); 6514 6515 var text_length_papan1=$('#kartu-ucapan-papan').val().length; 6516 var idx_2_papan1=parseInt($('#note_btn_id_papan1').val()); 6517 if(isNaN(idx_2_papan1)){ 6518 idx_2_papan1=0; 6519 }else{ 6520 idx_2_papan1++; 6521 //idx_2_papan1=idx_2_papan1%note_btn_text_papan1.length; 6522 } 6523 $('#note_btn_id_papan1').val(idx_2_papan1); 6524 //var note_btn=note_btn_text[idx_2][1]; 6525 //$('#note_btn').text(note_btn); 6526 $(this).parents(".sectionPurchase").find(".next-purchase-button").attr("disabled", false) 6527 }); 6528 6529 var text_max_papan2=150; 6530 var msg_text_papan2=""; 6531 $('#kartu-ucapan-ucapan').keyup(function(){ 6532 var text_length_papan2=$('#kartu-ucapan-ucapan').val().length; 6533 var msg_text_papan2=$('#kartu-ucapan-ucapan').val(); 6534 }); 6535 6536 var notes_papan2 = [ 6537 6538 [0,"Congratulations (ucapan)."], [1,"Selamat dan sukses atas dibukanya (ucapan personal)."],[2,"Congratulations for the grand opening of (nama toko/bisnis)."],[3,"Happy Graduation (nama)."] 6539 6540 ]; 6541 $('#show_note_papan2').click(function(event){ 6542 event.preventDefault(); 6543 var idx_papan2=parseInt($('#note_id_papan2').val()); 6544 if(isNaN(idx_papan2)){ 6545 idx_papan2=0; 6546 }else{ 6547 idx_papan2++; 6548 idx_papan2=idx_papan2%notes_papan2.length; 6549 } 6550 var note_papan2=notes_papan2[idx_papan2][1]; 6551 $('#note_id_papan2').val(idx_papan2); 6552 $('#kartu-ucapan-papan, #properties-kartu-pesan, #properties-kartu-ucapan').val(note_papan2); 6553 $('#msgDelivery').val(note_papan2); 6554 var text_length_papan2=$('#kartu-ucapan-papan').val().length; 6555 var idx_2_papan2=parseInt($('#note_btn_id_papan2').val()); 6556 if(isNaN(idx_2_papan2)){ 6557 idx_2_papan2=0; 6558 }else{ 6559 idx_2_papan2++; 6560 //idx_2_papan1=idx_2_papan1%note_btn_text_papan1.length; 6561 } 6562 $('#note_btn_id_papan2').val(idx_2_papan2); 6563 //var note_btn=note_btn_text[idx_2][1]; 6564 //$('#note_btn').text(note_btn); 6565 $(this).parents(".sectionPurchase").find(".next-purchase-button").attr("disabled", false) 6566 }); 6567 6568 var text_max_papan3=150; 6569 var msg_text_papan3=""; 6570 $('#kartu-ucapan-ucapan').keyup(function(){ 6571 var text_length_papan3=$('#kartu-ucapan-ucapan').val().length; 6572 var msg_text_papan3=$('#kartu-ucapan-ucapan').val(); 6573 }); 6574 6575 var notes_papan3 = [ 6576 6577 [0,"Turut Berduka Cita atas meninggalnya almarhum / almarhumah (Nama)."], [1,"Our Deepest Condolences for the lost of your beloved Father/ Mother/ Husband/ Wife/ Children."], [2,"Our Deepest Sympathy for the lost of your beloved Father/ Mother/ Husband/ Wife/ Children."], [3,"Innalillahi wa innailaihi rojiun, Turut berduka cita atas meninggalnya (nama)."] 6578 6579 ]; 6580 $('#show_note_papan3').click(function(event){ 6581 event.preventDefault(); 6582 var idx_papan3=parseInt($('#note_id_papan3').val()); 6583 if(isNaN(idx_papan3)){ 6584 idx_papan3=0; 6585 }else{ 6586 idx_papan3++; 6587 idx_papan3=idx_papan3%notes_papan3.length; 6588 } 6589 var note_papan3=notes_papan3[idx_papan3][1]; 6590 $('#note_id_papan3').val(idx_papan3);
6591 $('#kartu-ucapan-papan, #properties-kartu-pesan, #properties-kartu-ucapan').val(note_papan3); 6592 $('#msgDelivery').val(note_papan3); 6593 var text_length_papan3=$('#kartu-ucapan-papan').val().length; 6594 var idx_2_papan3=parseInt($('#note_btn_id_papan3').val()); 6595 if(isNaN(idx_2_papan3)){ 6596 idx_2_papan3=0; 6597 }else{ 6598 idx_2_papan3++; 6599 //idx_2_papan1=idx_2_papan1%note_btn_text_papan1.length; 6600 } 6601 $('#note_btn_id_papan3').val(idx_2_papan3); 6602 //var note_btn=note_btn_text[idx_2][1]; 6603 //$('#note_btn').text(note_btn); 6604 $(this).parents(".sectionPurchase").find(".next-purchase-button").attr("disabled", false) 6605 }); 6606 6607 var text_max_papan4=150; 6608 var msg_text_papan4=""; 6609 $('#kartu-ucapan-ucapan').keyup(function(){ 6610 var text_length_papan4=$('#kartu-ucapan-ucapan').val().length; 6611 var msg_text_papan4=$('#kartu-ucapan-ucapan').val(); 6612 }); 6613 6614 $('#show_note_papan4').click(function(event){ 6615 var notes_papan4 = [ 6616 [0,"Hereâs to youâsteadier, stronger and better every day."], 6617 [1,"Warmest wishes for a speedy recovery!"], 6618 [2,"Dengan ucapan terhangat, semoga lekas membaik dan semakin pulih setiap harinya ya."], 6619 [3,"Semoga lekas sembuh untuk kembali beraktivitas dan berkarya."] 6620 ]; 6621 event.preventDefault(); 6622 var idx_papan4=parseInt($('#note_id_papan4').val()); 6623 console.log(idx_papan4, 'idx_papan4') 6624 if(isNaN(idx_papan4)){ 6625 idx_papan4=0; 6626 }else{ 6627 idx_papan4++; 6628 idx_papan4=idx_papan4%notes_papan4.length; 6629 } 6630 var note_papan4=notes_papan4[idx_papan4][1]; 6631 $('#note_id_papan4').val(idx_papan4); 6632 $('#kartu-ucapan-papan, #properties-kartu-ucapan, #properties-kartu-pesan').val(note_papan4); 6633 console.log(note_papan4, 'note_papan4') 6634 var text_length_papan4=$('#kartu-ucapan-papan').val().length; 6635 var idx_2_papan4=parseInt($('#note_btn_id_papan4').val()); 6636 if(isNaN(idx_2_papan4)){ 6637 idx_2_papan4=0; 6638 }else{ 6639 idx_2_papan4++; 6640 //idx_2_papan1=idx_2_papan1%note_btn_text_papan1.length; 6641 } 6642 $('#note_btn_id_papan4').val(idx_2_papan4); 6643 6644 $(this).parents(".sectionPurchase").find(".next-purchase-button").attr("disabled", false) 6645 }); 6646 6647 6648 6649 6650 6651 $(".variant-metafield").each(function(){ 6652 const t = $(this) 6653 const id = t.attr("id") 6654 const target = $(`[data-select=${id}]`) 6655 t.on('select2:selecting', function(e) { 6656 const data = e.params.args.data 6657 target.val(data.text) 6658 }); 6659 }) 6660 }) 6661</script>
6661 6662 6663<div id="popupCart"> 6664 <div class="container"> 6665 <div class="wrapperPopupCart"> 6666 <div class="headerPopupCart"> 6667 <div class="d-flex pl-5 pr-5 p-4"> 6668 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="12" viewBox="0 0 16 12" fill="none"> 6669 <path d="M5.55008 11.3076L0.580078 6.33761L1.29408 5.62461L5.55008 9.88061L14.7061 0.724609L15.4191 1.43861L5.55008 11.3076Z" fill="black"/> 6670 </svg> 6671 <span>item added to your cart</span> 6672 </div> 6673 <a class="close-purchase-popup"> 6674 <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none"> 6675 <path d="M1.53287 17.4107L0.588867 16.4667L8.05553 9.00002L0.588867 1.53336L1.53287 0.589355L8.99953 8.05602L16.4662 0.589355L17.4102 1.53336L9.94353 9.00002L17.4102 16.4667L16.4662 17.4107L8.99953 9.94402L1.53287 17.4107Z" fill="black"/> 6676 </svg> 6677</a> 6678 6679 </div> 6680 <div class="contentPopupCart"> 6681 <div class="pl-5 pr-5 p-4"> 6682 <div class="itemContent row m-0 justify-content-between"> 6683 <div class="col-2 align-self-center"> 6684 6685 <img 6686 class="d-block" 6687 width="80" 6688 src="https://outerbloom.com/cdn/shop/files/CNY-Ruby-Mulan-Bag_80x.jpg?v=1766041636" 6689 > 6690 </div> 6691 <div class="col-10 align-self-center"> 6692 <div class="row pl-3"> 6693 <div class="col-12 col-lg-7"> 6694 <span class="titleCartPopup text-uppercase">HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman</span> 6695 <div class="cart-popup-quantity mt-2"> 6696 <div class="quantity-selector" data-popup-item="true"> 6697 <button type="button" class="qty-minus" data-action="minus"> 6698 â 6699 </button> 6700 <input 6701 type="text" 6702 class="qty-input" 6703 value="1" 6704 min="1" 6705 readonly 6706 > 6707 <button type="button" class="qty-plus" data-action="plus"> 6708 + 6709 </button> 6710 </div> 6711 </div> 6712 </div> 6713 <div class="d-flex justify-content-end col-12 col-lg-5"> 6714 <span class="deleteCartPopup hide">Delete</span> 6715 <span class="lineCartPrice align-self-center">Rp 1.386.737</span> 6716 </div> 6717 </div> 6718 </div> 6719 </div> 6720 <div class="itemProperties"> 6721 6722 <div class="propDeliver"> 6723 <h4>delivery option detail</h4> 6724 <p> 6725 <span>delivery city</span> 6726 <span class="propDeliveryCity">jakarta</span> 6727 </p> 6728 <p> 6729 <span>delivery date</span> 6730 <span class="propDeliveryDate">24/03/2025</span> 6731 </p> 6732 <p> 6733 <span>delivery time</span> 6734 <span class="propDeliveryTime">Afternoon | 13:00 - 18:00</span> 6735 </p> 6736 </div> 6737 <div class="propAddress"> 6738 <h4>delivery option detail</h4> 6739 <p> 6740 <span>RECIPIENT NAME</span> 6741 <span class="propDeliveryName">jane doe</span> 6742 </p> 6743 <p> 6744 <span>delivery address</span> 6745 <span class="propDeliveryAddress" 6746 >Jl. Gatot Subroto No. 25, RT.2/RW.4, Kuningan Barat, Kecamatan Mampang Prapatan, Kota Jakarta 6747 Selatan, Daerah Khusus Ibukota Jakarta 12710, Indonesia</span 6748 > 6749 </p> 6750 <p> 6751 <span>recipient phone number</span> 6752 <span class="propDeliveryPhone">(+62) 812-3456-7890</span> 6753 </p> 6754 <p>
6755 <span>PROVINCE</span> 6756 <span class="propDeliveryProv">Jakarta</span> 6757 </p> 6758 <p> 6759 <span>postal code</span> 6760 <span class="propDeliveryZip">12710</span> 6761 </p> 6762 6763 6764 </div> 6765 6766 </div> 6767 <div class="itemAddonCart"> 6768 <div class="toggleAddonCart d-flex justify-content-between"> 6769 <h4>add-ons (0)</h4> 6770 <svg xmlns="http://www.w3.org/2000/svg" width="5" height="9" viewBox="0 0 5 9" fill="none"> 6771 <path d="M1.0128 0.84668L4.78613 4.62001L1.0128 8.39335L0.546133 7.92001L3.84613 4.62001L0.546133 1.32001L1.0128 0.84668Z" fill="black"/> 6772 </svg> 6773 </div> 6774 <div class="wrapperItemAddonCart"></div> 6775 </div> 6776 6777 </div> 6778 </div> 6779 <div class="footerPopupCart"> 6780 <div class="row m-0 pl-5 pr-5 p-4"> 6781 <a class="btn btnViewCart w-100 text-uppercase text-center" href="/cart">View Cart</a> 6782 <a class="btn btnViewCheckout w-100 text-uppercase text-center" href="/checkout"><span>Checkout</span></a> 6783 <a class="btnContinueShopping w-100 text-center" href="/">Continue shopping</a> 6784 </div> 6785 </div> 6786 </div> 6787 </div> 6788</div> 6789 6790<style> 6791 .cart-popup-quantity .quantity-selector { 6792 display: inline-flex;
6793 align-items: center; 6794 border: 1px solid #D1D1D1; 6795 border-radius: 2px; 6796 overflow: hidden; 6797 background: white; 6798 max-width: 140px; 6799 } 6800 6801 .cart-popup-quantity .quantity-selector button { 6802 width: 32px; 6803 height: 32px; 6804 border: none; 6805 background: white; 6806 cursor: pointer; 6807 font-size: 16px; 6808 font-weight: 400; 6809 color: #424242; 6810 transition: all 0.2s ease; 6811 padding: 0; 6812 display: flex; 6813 align-items: center; 6814 justify-content: center; 6815 line-height: 1; 6816 } 6817 6818 .cart-popup-quantity .quantity-selector button:hover { 6819 background: #F5F5F5; 6820 color: #212121; 6821 } 6822 6823 .cart-popup-quantity .quantity-selector button:active { 6824 background: #E0E0E0; 6825 } 6826 6827 .cart-popup-quantity .quantity-selector button:disabled { 6828 opacity: 0.4; 6829 cursor: not-allowed; 6830 background: white; 6831 } 6832 6833 .cart-popup-quantity .quantity-selector input { 6834 width: 50px; 6835 height: 32px; 6836 border: none; 6837 border-left: 1px solid #D1D1D1; 6838 border-right: 1px solid #D1D1D1; 6839 text-align: center; 6840 font-size: 13px; 6841 font-weight: 500; 6842 color: #212121; 6843 -moz-appearance: textfield; 6844 background: white; 6845 padding: 0; 6846 } 6847 6848 .cart-popup-quantity .quantity-selector input::-webkit-outer-spin-button, 6849 .cart-popup-quantity .quantity-selector input::-webkit-inner-spin-button { 6850 -webkit-appearance: none; 6851 margin: 0; 6852 } 6853 6854 .cart-popup-quantity .quantity-selector input:focus { 6855 outline: none; 6856 } 6857</style> 6858
6859<script> 6860 // Function to update popup cart quantity 6861 window.updatePopupCartQuantity = function() { 6862 let itemKey = ''; 6863 let currentProductId = 45873023910103; 6864 6865 // Get current cart and update popup display 6866 fetch(window.Shopify.routes.root + 'cart.js') 6867 .then(response => response.json()) 6868 .then(cart => { 6869 if(cart.items && cart.items.length > 0) { 6870 // Find the item that matches current product variant 6871 const matchingItem = cart.items.find(item => 6872 item.product_id === 7881418965207 || 6873 item.variant_id === currentProductId 6874 ); 6875 6876 if(matchingItem) { 6877 itemKey = matchingItem.key; 6878 6879 // Display current total quantity in popup (including what was already in cart) 6880 const totalQty = matchingItem.quantity; 6881 $("#popupCart .qty-input").val(totalQty); 6882 6883 // Store itemKey for later use 6884 $("#popupCart .quantity-selector").attr("data-item-key", itemKey); 6885 6886 // Update the price display to reflect total quantity 6887 const basePrice = 1.386.73700; 6888 const newPrice = basePrice * totalQty; 6889 const formattedPrice = new Intl.NumberFormat('id-ID', { 6890 style: 'currency', 6891 currency: 'IDR', 6892 minimumFractionDigits: 0 6893 }).format(newPrice / 100); 6894 $(".lineCartPrice").text(formattedPrice); 6895 } 6896 } 6897 }) 6898 .catch(error => { 6899 console.error('Error fetching cart:', error); 6900 }); 6901 }; 6902 6903 $(document).ready(function(){ 6904 // Initialize on page load 6905 updatePopupCartQuantity(); 6906 6907 // Quantity Selector Handler for Cart Popup 6908 $("#popupCart .quantity-selector button").on("click", function(e){ 6909 e.preventDefault(); 6910 const $button = $(this); 6911 const $selector = $button.closest(".quantity-selector"); 6912 const $input = $selector.find(".qty-input"); 6913 const action = $button.data("action"); 6914 const itemKey = $selector.attr("data-item-key"); 6915 let currentQty = parseInt($input.val()); 6916 6917 if(action === "minus" && currentQty > 1) { 6918 currentQty--; 6919 } else if(action === "plus") { 6920 currentQty++; 6921 } 6922 6923 // Update the input value 6924 $input.val(currentQty); 6925 6926 // Update the line price display 6927 const basePrice = 1.386.73700; 6928 const newPrice = basePrice * currentQty; 6929 const formattedPrice = new Intl.NumberFormat('id-ID', { 6930 style: 'currency', 6931 currency: 'IDR', 6932 minimumFractionDigits: 0 6933 }).format(newPrice / 100); 6934 $(".lineCartPrice").text(formattedPrice); 6935 6936 // Disable buttons while updating 6937 $selector.find("button").prop("disabled", true); 6938 6939 // Update cart directly with the new total quantity 6940 fetch(window.Shopify.routes.root + 'cart/change.js', { 6941 method: 'POST', 6942 headers: { 6943 'Content-Type': 'application/json', 6944 }, 6945 body: JSON.stringify({ 6946 id: itemKey, 6947 quantity: currentQty 6948 }) 6949 }) 6950 .then(response => response.json()) 6951 .then(data => { 6952 // Re-enable buttons 6953 $selector.find("button").prop("disabled", false); 6954 6955 // Update CartJS if available 6956 if(typeof CartJS !== 'undefined') { 6957 CartJS.init(data); 6958 } 6959 6960 console.log('Cart updated successfully', data); 6961 }) 6962 .catch(error => { 6963 console.error('Error updating cart:', error); 6964 $selector.find("button").prop("disabled", false); 6965 }); 6966 }); 6967 }); 6968</script>
6968 6969 6970 6971<style> 6972 .field-error .variant-metafield { 6973 border-color: #e74c3c !important; 6974 box-shadow: 0 0 0 0.2rem rgba(231, 76, 60, 0.25) !important; 6975 } 6976 6977 .field-error .form-control { 6978 border-color: #e74c3c !important; 6979 box-shadow: 0 0 0 0.2rem rgba(231, 76, 60, 0.25) !important; 6980 } 6981 6982 .field-error select { 6983 border-color: #e74c3c !important; 6984 box-shadow: 0 0 0 0.2rem rgba(231, 76, 60, 0.25) !important; 6985 } 6986 6987 .error-message { 6988 display: block; 6989 width: 100%; 6990 margin-top: 0.25rem; 6991 font-size: 0.875em; 6992 color: #e74c3c; 6993 } 6994 6995 #btnPurchase:disabled { 6996 opacity: 0.7; 6997 pointer-events: none; 6998 } 6999 #wishButton { 7000 font-size: 14px; 7001 font-weight: 400; 7002 text-transform: uppercase; 7003 letter-spacing: 0.5px; 7004 transition: opacity 0.2s ease; 7005 } 7006 7007 #wishButton:hover { 7008 opacity: 0.8; 7009 } 7010 7011 #wishButton:disabled { 7012 opacity: 0.5; 7013 pointer-events: none; 7014 } 7015 7016 .wishlist-icon-wrapper svg { 7017 flex-shrink: 0; 7018 width: 16px; 7019 } 7020 7021 @media screen and (max-width: 768px) { 7022 .ios .field-error .variant-metafield { 7023 border-color: #e74c3c !important; 7024 box-shadow: 0 0 0 3px rgba(231, 76, 60, 0.1) !important; 7025 } 7026 } 7027 7028 .delivery-method-section h4 { 7029 font-size: 16px; 7030 font-weight: 500; 7031 margin-bottom: 12px; 7032 color: #212121; 7033 } 7034 7035 .delivery-method-buttons { 7036 display: flex; 7037 gap: 8px; 7038 } 7039 7040 .delivery-method-btn { 7041 flex: 1; 7042 padding: 12px 24px; 7043 border: 1px solid #212121; 7044 font-weight: 400; 7045 text-transform: uppercase; 7046 transition: all 0.3s ease; 7047 cursor: pointer; 7048 font-size: 14px; 7049 letter-spacing: 0.5px; 7050 } 7051 7052 .delivery-method-btn:not(.active) { 7053 background-color: #ffffff; 7054 color: #212121; 7055 font-weight: 400; 7056 } 7057 7058 .delivery-method-btn:not(.active):hover { 7059 opacity: 0.8; 7060 } 7061 7062 .delivery-method-btn.active { 7063 background-color: #EEEEEE; 7064 color: #212121; 7065 font-weight: 700; 7066 } 7067 7068 @media screen and (max-width: 576px) { 7069 .delivery-method-buttons { 7070 flex-direction: column; 7071 } 7072 7073 .delivery-method-btn { 7074 width: 100%; 7075 } 7076 } 7077</style> 7078
7079<script> 7080 const shareButton = document.getElementById('shareButton'); 7081 7082 shareButton.addEventListener('click', () => { 7083 if (navigator.share) { 7084 navigator.share({ 7085 title: "HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman", 7086 url: "/products/outerbloom-mulan-bag-hampers", 7087 text: 'Check out this page!' 7088 }) 7089 .then(() => console.log('Successful share')) 7090 .catch((error) => console.log('Error sharing', error)); 7091 } else { 7092 alert('Web Share API is not supported in this browser.'); 7093 } 7094 }); 7095 7096 // Inventory validation function 7097 function checkInventoryStatus() { 7098 const productSelect = document.getElementById('productSelect'); 7099 const purchaseButton = document.querySelector('#personalizeBtn button'); 7100 7101 if (!productSelect || !purchaseButton) return; 7102 7103 const selectedVariantId = productSelect.value; 7104 7105 // Get variant data from Shopify 7106 fetch(`/products/outerbloom-mulan-bag-hampers.js`) 7107 .then(response => response.json()) 7108 .then(product => { 7109 const selectedVariant = product.variants.find(variant => variant.id == selectedVariantId); 7110 7111 if (selectedVariant) { 7112 const isOutOfStock = selectedVariant.inventory_quantity <= 0 && 7113 selectedVariant.inventory_management === 'shopify' && 7114 selectedVariant.inventory_policy !== 'continue'; 7115 7116 if (isOutOfStock) { 7117 purchaseButton.disabled = true; 7118 purchaseButton.textContent = 'Out of Stock'; 7119 purchaseButton.setAttribute('data-out-of-stock', 'true'); 7120 purchaseButton.style.backgroundColor = '#cccccc'; 7121 purchaseButton.style.cursor = 'not-allowed'; 7122 } else { 7123 // Check if button was disabled due to other conditions 7124 7125 7126 7127 7128 7129 7130 7131 7132 const isOtherDisabled = false || false || false; 7133 7134 if (!isOtherDisabled) { 7135 purchaseButton.disabled = false; 7136 purchaseButton.textContent = 'MAKE IT PERSONAL â'; 7137 purchaseButton.removeAttribute('data-out-of-stock'); 7138 purchaseButton.style.backgroundColor = ''; 7139 purchaseButton.style.cursor = ''; 7140 } 7141 } 7142 } 7143 }) 7144 .catch(error => { 7145 console.error('Error checking inventory:', error); 7146 }); 7147 } 7148 7149 // Validate variant metafields function - make it globally accessible 7150 window.validateVariantMetafields = function(showErrors = false) { 7151 const purchaseButton = document.querySelector('#personalizeBtn button'); 7152 const variantMetafields = document.querySelectorAll('.variant-metafield[required]'); 7153 7154 if (!purchaseButton) return true; 7155 7156 let allFieldsValid = true; 7157 let hasEmptyFields = false; 7158 let firstErrorField = null; 7159 7160 // Check all required variant metafields 7161 variantMetafields.forEach(function(field) { 7162 const fieldValue = field.value ? field.value.trim() : ''; 7163 const fieldContainer = field.closest('.form-group-variant'); 7164 7165 // Remove existing error styling 7166 if (fieldContainer) { 7167 fieldContainer.classList.remove('field-error'); 7168 const existingError = fieldContainer.querySelector('.error-message'); 7169 if (existingError) { 7170 existingError.remove(); 7171 } 7172 } 7173 7174 if (!fieldValue || fieldValue === '' || fieldValue === 'Choose ' + field.getAttribute('data-properties')) { 7175 allFieldsValid = false; 7176 hasEmptyFields = true; 7177 7178 // Store the first error field for scrolling - ensure it's a valid DOM element 7179 if (!firstErrorField && field && field.nodeType === 1) { 7180 firstErrorField = field; 7181 console.log('First error field stored:', field, 'Type:', field.tagName, 'Value:', field.value); 7182 } 7183 7184 // Only add error styling if showErrors is true (when button is clicked) 7185 if (showErrors && fieldContainer) { 7186 fieldContainer.classList.add('field-error'); 7187 7188 // Add error message 7189 const errorMessage = document.createElement('div'); 7190 errorMessage.className = 'error-message'; 7191 errorMessage.style.color = '#e74c3c'; 7192 errorMessage.style.fontSize = '12px'; 7193 errorMessage.style.marginTop = '4px'; 7194 errorMessage.textContent = 'This field is required'; 7195 fieldContainer.appendChild(errorMessage); 7196 } 7197 } 7198 });
7199 7200 // Auto scroll to first error field if showing errors 7201 if (showErrors && !allFieldsValid) { 7202 console.log('Scrolling to purchaseProduct section due to validation errors'); 7203 setTimeout(function() { 7204 // Primary method: scroll to purchaseProduct container 7205 try { 7206 const purchaseProductSection = document.getElementById('purchaseProduct'); 7207 if (purchaseProductSection && typeof purchaseProductSection.scrollIntoView === 'function') { 7208 console.log('Scrolling to purchaseProduct section'); 7209 purchaseProductSection.scrollIntoView({ 7210 behavior: 'smooth', 7211 block: 'start', 7212 inline: 'nearest' 7213 }); 7214 7215 // Focus the first error field after scroll 7216 setTimeout(function() { 7217 if (firstErrorField) { 7218 try { 7219 console.log('Focusing first error field:', firstErrorField.tagName, firstErrorField.id || firstErrorField.className); 7220 if (typeof firstErrorField.focus === 'function') { 7221 firstErrorField.focus(); 7222 7223 // For select elements, try to trigger the dropdown 7224 if (firstErrorField.tagName && firstErrorField.tagName.toLowerCase() === 'select') { 7225 setTimeout(function() { 7226 if (typeof firstErrorField.click === 'function') { 7227 firstErrorField.click(); 7228 } 7229 }, 100); 7230 } 7231 } 7232 } catch (focusError) { 7233 console.warn('Error during field focus:', focusError); 7234 } 7235 } 7236 }, 300); // Wait for scroll to complete 7237 } else { 7238 // Fallback: try alternative selectors 7239 const fallbackSelectors = ['#purchaseProduct', '.product-meta', 'main', '.form-group-variant']; 7240 let scrolled = false; 7241 7242 for (let selector of fallbackSelectors) { 7243 if (!scrolled) { 7244 const element = document.querySelector(selector); 7245 if (element && typeof element.scrollIntoView === 'function') { 7246 console.log('Fallback scroll to:', selector); 7247 element.scrollIntoView({ 7248 behavior: 'smooth', 7249 block: 'start' 7250 }); 7251 scrolled = true; 7252 break; 7253 } 7254 } 7255 } 7256 } 7257 } catch (error) { 7258 console.warn('Auto scroll failed, trying alternative method:', error); 7259 // Ultimate fallback: manual scroll to top of page 7260 try { 7261 window.scrollTo({ 7262 top: 0, 7263 behavior: 'smooth' 7264 }); 7265 } catch (finalError) { 7266 console.warn('All scroll methods failed:', finalError); 7267 } 7268 } 7269 }, 150); // Delay to ensure DOM is stable 7270 } 7271 7272 // Check inventory status as well 7273 const isOutOfStock = purchaseButton.getAttribute('data-out-of-stock') === 'true'; 7274 7275 // Check other disabled conditions 7276 7277 7278 7279 7280 7281 7282 7283 7284 const isOtherDisabled = false || false || false; 7285 7286 // Update button state only for inventory and other conditions, not for variant metafields 7287 if (isOutOfStock || isOtherDisabled) { 7288 purchaseButton.disabled = true; 7289 7290 if (isOutOfStock) { 7291 purchaseButton.textContent = 'Out of Stock'; 7292 purchaseButton.style.backgroundColor = '#cccccc'; 7293 } 7294 7295 purchaseButton.style.cursor = 'not-allowed'; 7296 } else { 7297 purchaseButton.disabled = false; 7298 purchaseButton.textContent = 'MAKE IT PERSONAL â'; 7299 purchaseButton.style.backgroundColor = ''; 7300 purchaseButton.style.color = ''; 7301 purchaseButton.style.cursor = ''; 7302 } 7303 7304 return allFieldsValid; 7305 } 7306 7307 // Check inventory on page load and setup event listeners 7308 document.addEventListener('DOMContentLoaded', function() { 7309 checkInventoryStatus();
7310 window.validateVariantMetafields(false); // Don't show errors on page load 7311 7312 // Shipping Method Toggle Functionality 7313 const shippingMethodButtons = document.querySelectorAll('.delivery-method-btn'); 7314 const selectedMethodInput = document.getElementById('selectedShippingMethod'); 7315 7316 shippingMethodButtons.forEach(function(button) { 7317 button.addEventListener('click', function() { 7318 const isCurrentlyActive = this.classList.contains('active'); 7319 const method = this.getAttribute('data-method'); 7320 7321 // Remove active class from all buttons 7322 shippingMethodButtons.forEach(function(btn) { 7323 btn.classList.remove('active'); 7324 btn.style.backgroundColor = '#ffffff'; 7325 btn.style.color = '#212121'; 7326 btn.style.fontWeight = '400'; 7327 }); 7328 7329 // If button was not active, make it active (select) 7330 if (!isCurrentlyActive) { 7331 this.classList.add('active'); 7332 this.style.backgroundColor = '#EEEEEE'; 7333 this.style.color = '#212121'; 7334 this.style.fontWeight = '700'; 7335 7336 // Update hidden input value 7337 if (selectedMethodInput) { 7338 selectedMethodInput.value = method; 7339 } 7340 7341 // Handle pickup-specific functionality 7342 if (method === 'Pickup') { 7343 handlePickupMode(); 7344 } else { 7345 handleDeliveryMode(); 7346 } 7347 7348 console.log('Delivery method selected:', method); 7349 } else { 7350 // Unselect - clear hidden input value and revert to delivery mode 7351 if (selectedMethodInput) { 7352 selectedMethodInput.value = ''; 7353 } 7354 handleDeliveryMode(); 7355 console.log('Delivery method unselected'); 7356 } 7357 }); 7358 }); 7359 7360 // Function to handle pickup mode 7361 function handlePickupMode() { 7362 // 1. Auto-select Jakarta and disable city dropdown 7363 const citySelect = document.getElementById('cities'); 7364 if (citySelect) { 7365 // Set value to Jakarta 7366 citySelect.value = 'Jakarta'; 7367 citySelect.disabled = true; 7368 citySelect.style.backgroundColor = '#f5f5f5'; 7369 citySelect.style.cursor = 'not-allowed'; 7370 citySelect.style.opacity = '0.6'; 7371 7372 // Trigger change event to update any dependent fields 7373 const event = new Event('change', { bubbles: true }); 7374 citySelect.dispatchEvent(event); 7375 } 7376 7377 // 2. Show pickup location info (in delivery method section) 7378 const pickupLocationInfo = document.getElementById('pickupLocationInfo'); 7379 if (pickupLocationInfo) { 7380 pickupLocationInfo.style.display = 'block'; 7381 } 7382 7383 // 2b. Show pickup location details (in address section) 7384 const pickupLocationDetails = document.getElementById('pickupLocationDetails'); 7385 if (pickupLocationDetails) { 7386 pickupLocationDetails.style.display = 'block'; 7387 } 7388 7389 // 3. Hide address form and remove required attributes 7390 const formAddressPurchase = document.querySelector('.formAddressPurchase'); 7391 if (formAddressPurchase) { 7392 formAddressPurchase.style.display = 'none'; 7393 7394 // Remove required from all inputs in the form 7395 const requiredInputs = formAddressPurchase.querySelectorAll('[required]'); 7396 requiredInputs.forEach(function(input) { 7397 input.removeAttribute('required'); 7398 input.setAttribute('data-was-required', 'true'); // Mark for restoration 7399 }); 7400 } 7401 7402 // 4. Trigger date restrictions based on product tags 7403 window.applyPickupDateRestrictions = true; 7404 7405 // Apply restrictions to existing date buttons immediately 7406 const deliveryDateElement = document.getElementById('deliveryDate'); 7407 if (deliveryDateElement) { 7408 console.log('Applying pickup date restrictions immediately to existing buttons'); 7409 applyPickupDateRestrictionsLocal(deliveryDateElement); 7410 } 7411 7412 // 5. Hide full calendar (except for pickup-itcinhouse) 7413 const isPickupInhouse = false; 7414 const deliveryDateFull = document.getElementById('deliveryDateFull'); 7415 if (deliveryDateFull && !isPickupInhouse) { 7416 deliveryDateFull.style.display = 'none'; 7417 } 7418 7419 // 5b. Hide row-delivery-time (except for pickup-itcinhouse) 7420 const rowDeliveryTime = document.getElementById('row-delivery-time'); 7421 if (rowDeliveryTime) { 7422 rowDeliveryTime.style.display = 'none'; 7423 7424 // 5c. Make delivery time not required (except for pickup-itcinhouse) 7425 if (propDeliveryTime) { 7426 propDeliveryTime.removeAttribute('required'); 7427 propDeliveryTime.value = '-'; 7428 } 7429 const propertiesDeliveryTime = document.getElementById('properties-delivery-time'); 7430 if (propertiesDeliveryTime) { 7431 propertiesDeliveryTime.removeAttribute('required'); 7432 propertiesDeliveryTime.value = '-'; 7433 } 7434 } 7435 7436 // 6. Update address for pickup 7437 if (typeof window.updateDeliveryAddress === 'function') { 7438 window.updateDeliveryAddress(); 7439 } 7440 } 7441 7442 // Local function to apply pickup date restrictions 7443 function applyPickupDateRestrictionsLocal(deliveryDateElement) { 7444 if (!deliveryDateElement) return; 7445 7446 // Get current time in Jakarta timezone
7447 const now = new Date(new Date().toLocaleString("en-US", {timeZone: "Asia/Jakarta"})); 7448 const currentHour = now.getHours(); 7449 const currentMinute = now.getMinutes(); 7450 const currentTime = currentHour + (currentMinute / 60); 7451 const currentDate = now.getDate(); 7452 7453 const isAfter3PM = currentTime >= 15.0; 7454 7455 // Check product tags 7456 const isPickupInhouse = false; 7457 const isPickupVendor = false; 7458 7459 console.log('Applying pickup date restrictions:', { 7460 isPickupInhouse, 7461 isPickupVendor, 7462 currentDate, 7463 currentTime: currentTime.toFixed(2), 7464 isAfter3PM 7465 }); 7466 7467 const dateButtons = deliveryDateElement.querySelectorAll('button.date-single'); 7468 console.log('Found date buttons:', dateButtons.length); 7469 7470 dateButtons.forEach((button, index) => { 7471 const buttonDate = parseInt(button.dataset.date, 10); 7472 console.log(`Checking button ${index}: date=${buttonDate}, currentDate=${currentDate}`); 7473 7474 if (isPickupInhouse) { 7475 // Check if this button is today 7476 if (buttonDate === currentDate) { 7477 button.disabled = true; 7478 button.classList.add('stop'); 7479 button.title = 'Pickup not available for today'; 7480 console.log(`â Disabled button ${index} (date ${buttonDate} = today) for pickup-itcinhouse`); 7481 } 7482 // Check if this button is tomorrow AND it's after 3 PM 7483 else if (buttonDate === currentDate + 1 && isAfter3PM) { 7484 button.disabled = true; 7485 button.classList.add('stop'); 7486 button.title = 'Pickup not available (after 3 PM cutoff)'; 7487 console.log(`â Disabled button ${index} (date ${buttonDate} = tomorrow) for pickup-itcinhouse (after 3 PM)`); 7488 } 7489 } else if (isPickupVendor) { 7490 // For pickup-itcvendor: Allow ONLY date 14. 7491 // Disable 14 if today is 13th > 3 PM or today is > 13th. 7492 7493 if (buttonDate !== 14) { 7494 button.disabled = true; 7495 button.classList.add('stop'); 7496 button.title = 'Pickup only available on the 14th'; 7497 // Do NOT hide, just disable. 7498 console.log(`â Disabled button ${index} (date ${buttonDate}) for pickup-itcvendor (not 14th)`); 7499 } else { 7500 // Date is 14. Check cutoff. 7501 if (currentDate > 13 || (currentDate === 13 && isAfter3PM)) { 7502 button.disabled = true; 7503 button.classList.add('stop'); 7504 button.title = 'Pickup closed for 14th (Cutoff: 13th 15:00)'; 7505 console.log(`â Disabled button ${index} (date ${buttonDate}) for pickup-itcvendor (Cutoff missed)`); 7506 } 7507 } 7508 } 7509 }); 7510 } 7511 7512 // Function to handle delivery mode (normal mode) 7513 function handleDeliveryMode() { 7514 // 1. Re-enable city dropdown 7515 const citySelect = document.getElementById('cities'); 7516 if (citySelect) { 7517 citySelect.disabled = false; 7518 citySelect.style.backgroundColor = '#fff'; 7519 citySelect.style.cursor = 'pointer'; 7520 citySelect.style.opacity = '1'; 7521 } 7522 7523 // 2. Hide pickup location info (in delivery method section) 7524 const pickupLocationInfo = document.getElementById('pickupLocationInfo'); 7525 if (pickupLocationInfo) { 7526 pickupLocationInfo.style.display = 'none'; 7527 } 7528 7529 // 2b. Hide pickup location details (in address section) 7530 const pickupLocationDetails = document.getElementById('pickupLocationDetails'); 7531 if (pickupLocationDetails) { 7532 pickupLocationDetails.style.display = 'none'; 7533 } 7534 7535 // 3. Show address form and restore required attributes 7536 const formAddressPurchase = document.querySelector('.formAddressPurchase'); 7537 if (formAddressPurchase) { 7538 formAddressPurchase.style.display = 'block'; 7539 7540 // Restore required attributes 7541 const wasRequiredInputs = formAddressPurchase.querySelectorAll('[data-was-required="true"]');
7542 wasRequiredInputs.forEach(function(input) { 7543 input.setAttribute('required', 'required'); 7544 input.removeAttribute('data-was-required'); 7545 }); 7546 } 7547 7548 // 4. Remove date restrictions 7549 window.applyPickupDateRestrictions = false; 7550 7551 // Trigger date re-render to remove restrictions 7552 if (citySelect && citySelect.value) { 7553 setTimeout(function() { 7554 const changeEvent = new Event('change', { bubbles: true }); 7555 citySelect.dispatchEvent(changeEvent); 7556 }, 100); 7557 } 7558 7559 // 5. Show full calendar 7560 const deliveryDateFull = document.getElementById('deliveryDateFull'); 7561 if (deliveryDateFull) { 7562 deliveryDateFull.style.display = 'block'; 7563 } 7564 7565 // 5b. Show row-delivery-time 7566 const rowDeliveryTime = document.getElementById('row-delivery-time'); 7567 if (rowDeliveryTime) { 7568 rowDeliveryTime.style.display = 'block'; 7569 } 7570 7571 // 5c. Make delivery time required again 7572 const propDeliveryTime = document.getElementById('propDeliveryTime'); 7573 if (propDeliveryTime) { 7574 propDeliveryTime.setAttribute('required', 'required'); 7575 } 7576 const propertiesDeliveryTime = document.getElementById('properties-delivery-time'); 7577 if (propertiesDeliveryTime) { 7578 propertiesDeliveryTime.setAttribute('required', 'required'); 7579 } 7580 7581 // 6. Update address for delivery 7582 if (typeof window.updateDeliveryAddress === 'function') { 7583 window.updateDeliveryAddress(); 7584 } 7585 } 7586 7587 // Listen for variant changes 7588 const productSelect = document.getElementById('productSelect'); 7589 if (productSelect) { 7590 productSelect.addEventListener('change', function() { 7591 checkInventoryStatus();
7592 setTimeout(function() { 7593 window.validateVariantMetafields(false); // Don't show errors on variant change 7594 }, 100); 7595 }); 7596 } 7597 7598 // Listen for changes on variant metafield inputs - only to clear existing errors 7599 const variantMetafields = document.querySelectorAll('.variant-metafield'); 7600 variantMetafields.forEach(function(field) { 7601 field.addEventListener('input', function() { 7602 clearFieldError(this); 7603 }); 7604 field.addEventListener('change', function() { 7605 clearFieldError(this); 7606 }); 7607 field.addEventListener('blur', function() { 7608 clearFieldError(this); 7609 }); 7610 }); 7611 7612 // Listen for changes on select elements within variant metafields 7613 const variantSelects = document.querySelectorAll('.variant-metafield-select'); 7614 variantSelects.forEach(function(select) { 7615 select.addEventListener('change', function() { 7616 clearFieldError(this); 7617 }); 7618 }); 7619 }); 7620 7621 // Function to clear error styling from a specific field 7622 function clearFieldError(field) { 7623 const fieldContainer = field.closest('.form-group-variant'); 7624 if (fieldContainer) { 7625 fieldContainer.classList.remove('field-error'); 7626 const existingError = fieldContainer.querySelector('.error-message'); 7627 if (existingError) { 7628 existingError.remove(); 7629 } 7630 } 7631 } 7632 7633 // Prevent form submission if out of stock or required fields are empty 7634 document.addEventListener('click', function(e) { 7635 if (e.target.matches('button[data-out-of-stock="true"]')) { 7636 e.preventDefault(); 7637 e.stopPropagation(); 7638 alert('This product is currently out of stock and cannot be purchased.'); 7639 return false; 7640 } 7641 7642 // Check if this is the purchase button 7643 if (e.target.id === 'btnPurchase' || e.target.closest('#btnPurchase')) { 7644 const isValid = window.validateVariantMetafields(true); // Show errors when button is clicked 7645 7646 if (!isValid) { 7647 e.preventDefault(); 7648 e.stopPropagation(); 7649 7650 // The validateVariantMetafields function already handles scrolling and focusing 7651 // No need for additional scroll here as it's handled in the validation function 7652 7653 return false; 7654 } 7655 } 7656 }); 7657</script>
7657 7658 7659 7660 7661 <div class="product-description rte bg-card col-12 py-3 px-0 m-0" itemprop="description"> 7662 7663 7664 7665 7666 7667 <div class="short-desc-mobile d-block d-lg-none mb-3"> 7668 <div class="short-desc"> 7669 <ul> 7670<li> 7671<strong>HANTUSLOT</strong><br><strong></strong><strong></strong> 7672</li> 7673<li> 7674<strong>GAME ONLINE</strong><br> 7675</li> 7676<li><strong>FITUR INOVATIF GAME ONLINE</strong></li> 7677 7678 </div> 7679 <label class="more-mobile">Show More â</label> 7680 </div> 7681 7682 7683<div class="short-content short-spec position-relative open"> 7684 <h3 class="heading-toggle">Descriptions</h3> 7685 <div 7686 id="product-desc" 7687 class="content-toggle product-spec pb-3" 7688 style="display: block; height: 200px; overflow: hidden; transition: height 0.3s ease;" 7689 > 7690 <ul> 7691<li> 7692<strong>HANTUSLOT</strong><br><strong></strong><strong></strong> 7693</li> 7694<li> 7695<strong>GAME ONLINE</strong><br> 7696</li> 7697<li><strong>GAME INOVATIF 2026</strong></li> 7698</ul> 7699<p>HANTUSLOT menghadirkan beragam game online modern dengan dukungan fitur berbahasa Indonesia, sehingga pengguna dapat memahami setiap menu dan fitur dengan lebih mudah serta menikmati pengalaman bermain yang praktis dan nyaman.</p> 7700<p><img src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman"></p> 7701<table style="width: 100.091%;" width="100%"> 7702<tbody> 7703<tr> 7704<td style="width: 33.7327%;">SKU</td> 7705<td style="width: 65.9908%;">[C]HANTUSLOT<br>[C]OBIPCL1004-CNY2026<br> 7706</td> 7707</tr> 7708<tr> 7709<td style="width: 33.7327%;">Isi</td> 7710<td style="width: 65.9908%;"> 7711Link Login HANTUSLOT<br> 7712Situs Game Online<br> 7713Fitur Inovatif<br> 7714GAME REKOMENDASI<br> 7715Game Gampang Menang<br> 7716Situs Game Modern<br> 7717Fitur Berbahasa Indonesia<br> 7718Game Paling Rekomendasi<br> 7719Akses Game Gampang<br> 7720Nyaman Saat Dimainkan<br> 7721HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman 7722</td> 7723</td> 7724</tr> 7725</tbody> 7726</table> 7727 </div> 7728 <button id="readMoreBtn" class="read-more-toggle mt-2" style="background: none; border: none; padding: 0; cursor: pointer; color: #212121; text-decoration: underline; font-size: 14px;width: 100%;position: absolute;height: 70px;bottom: 0;background-color: rgba(255, 255, 255, 0.8); 7729 font-weight: 600;"> 7730 Read More 7731 </button> 7732</div> 7733 7734
7735<script> 7736 var liCountMobile; 7737 $(document).ready(function () { 7738 // Handle mobile short description - same logic as desktop 7739 $(".short-desc-mobile .short-desc ul").each(function() { 7740 liCountMobile = $(this).children("li").length; 7741 if (liCountMobile > 3) { 7742 $(this).closest(".short-desc-mobile").find(".more-mobile").addClass("showMe"); 7743 } 7744 }); 7745 7746 $(".more-mobile").click(function () { 7747 $("#product-desc").find("ul").show(); 7748 $('html, body').animate({ 7749 scrollTop: $("#product-desc").offset().top - 150 7750 }, 1000); 7751 $("#product-desc").css("height","auto"); 7752 7753 // Open the descriptions accordion 7754 var $descriptions = $("#product-desc").closest(".short-content"); 7755 if (!$descriptions.hasClass("open")) { 7756 $descriptions.addClass("open"); 7757 $("#product-desc").show(); 7758 } 7759 }); 7760 7761 // Handle Read More / Read Less toggle 7762 var isExpanded = false; 7763 var descElement = $("#product-desc"); 7764 var readMoreBtn = $("#readMoreBtn"); 7765 7766 readMoreBtn.click(function(e) { 7767 e.preventDefault(); 7768 isExpanded = !isExpanded; 7769 7770 if (isExpanded) { 7771 // Expand to full height 7772 descElement.css("height", "auto"); 7773 readMoreBtn.text("Read Less"); 7774 readMoreBtn.css({ 7775 "position": "relative", 7776 "height": "auto", 7777 "bottom": "auto", 7778 "background-color": "transparent" 7779 }); 7780 } else { 7781 // Collapse to 200px 7782 descElement.css("height", "200px"); 7783 readMoreBtn.text("Read More"); 7784 readMoreBtn.css({ 7785 "position": "absolute", 7786 "height": "70px", 7787 "bottom": "0", 7788 "background-color": "rgba(255, 255, 255, 0.8)" 7789 }); 7790 } 7791 }); 7792 }); 7793</script>
7793 7794 7795 </div> 7796 7797</div> 7798 7799 </div> 7800 </div> 7801 </div> 7802 </div> 7803 <div id="product-bottom"> 7804 7805 <div class="row"> 7806 <div class="col-12 product-fixed"> 7807 <div class="container"> 7808 <div class="row justify-content-between"> 7809 <div class="d-flex col-12 col-lg-7"> 7810 <div class="pfImage"> 7811 <img 7812 width="300" 7813 height="170" 7814 src="https://imagesme.b-cdn.net/icon/logo-hotelverta.gif" 7815 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 7816 > 7817 </div> 7818 <div class="pfMeta"> 7819 <h4 class="pTitle">HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman</h4> 7820 <div class="pPrice"> 7821 <p> 7822 <span class="price">Rp 1.386.737</span><span class="priceCompare">Rp 8.008.008</span> 7823 </p> 7824 </div> 7825 </div> 7826 </div> 7827 <div class="col-12 col-lg-5 self-align-center row justify-content-between" style="align-self: center;"> 7828 <div class="pfBtn col-12 align-self-center"> 7829 <div id="personalizeBtn"> 7830 <button class="btn text-uppercase w-100 fw-400" > 7831 MAKE IT PERSONAL â 7832 </button> 7833 </div> 7834 </div> 7835 </div> 7836 </div> 7837 </div> 7838 </div> 7839 <div id="product-bottom-left" class="product-bottom-left col-lg-12"> 7840 <div class="container"> 7841 7842 <!-- HEADER --> 7843<div class="review-header"> 7844 <div class="rating-summary"> 7845 <div class="rating-score">4.9</div> 7846 <div class="stars">â â â â â </div> 7847 <p>Based on 103 Reviews</p> 7848 7849 <div class="progress-bar">5 â 7850 <div class="progress"><div class="progress-fill" style="width:92%"></div></div> (96) 7851 </div> 7852 <div class="progress-bar">4 â 7853 <div class="progress"><div class="progress-fill" style="width:6%"></div></div> (6) 7854 </div> 7855 <div class="progress-bar">3 â 7856 <div class="progress"><div class="progress-fill" style="width:1%"></div></div> (1) 7857 </div> 7858 <div class="progress-bar">2 â 7859 <div class="progress"><div class="progress-fill" style="width:0%"></div></div> (0) 7860 </div> 7861 <div class="progress-bar">1 â 7862 <div class="progress"><div class="progress-fill" style="width:0%"></div></div> (0) 7863 </div> 7864 </div> 7865 7866 <div style="flex:1"> 7867 <div class="tabs"> 7868 <div class="tab active" onclick="showTab('reviews')">REVIEWS (14)</div> 7869 <div class="tab" onclick="showTab('faq')">QUESTIONS (14)</div> 7870 </div> 7871 7872 <!-- FILTER --> 7873 <div class="filter-bar"> 7874 <input type="text" id="searchInput" placeholder="Search Reviews..."> 7875 <select id="sortSelect"> 7876 <option value="recent">Most Recent</option> 7877 <option value="oldest">Oldest</option> 7878 <option value="highest">Highest Rating</option> 7879 </select> 7880 </div> 7881 7882 <!-- REVIEWS --> 7883 <div id="reviewsSection"></div> 7884 7885 <!-- FAQ --> 7886 <div id="faqSection" style="display:none"></div> 7887 7888 </div> 7889</div> 7890 7891</div> 7892 </div></div> 7893
7894<script> 7895 7896const reviews = [ 7897 { 7898 name: "Dimas Ardiansyah", 7899 date: "2026-07-28", 7900 rating: 5, 7901 text: "HANTUSLOT memiliki tampilan yang modern dan mudah dipahami. Menu berbahasa Indonesia membuat saya lebih cepat menemukan berbagai fitur yang tersedia." 7902 }, 7903 { 7904 name: "Raka Pratama", 7905 date: "2026-07-21", 7906 rating: 5, 7907 text: "Saya suka dengan desain HANTUSLOT yang rapi dan responsif. Akses melalui smartphone terasa ringan dan navigasinya juga cukup praktis." 7908 }, 7909 { 7910 name: "Andika Saputro", 7911 date: "2026-07-15", 7912 rating: 5, 7913 text: "Fitur yang tersedia cukup lengkap dan semuanya tersusun dengan jelas. HANTUSLOT memberikan pengalaman menggunakan platform game online yang terasa modern." 7914 }, 7915 { 7916 name: "Bima Kurniawan", 7917 date: "2026-07-09", 7918 rating: 5, 7919 text: "Hal yang paling saya sukai dari HANTUSLOT adalah antarmukanya yang sederhana. Pengguna baru juga bisa memahami fungsi setiap menu dengan mudah." 7920 }, 7921 { 7922 name: "Rendy Firmansyah", 7923 date: "2026-07-02", 7924 rating: 5, 7925 text: "Performa HANTUSLOT terasa cepat ketika diakses melalui perangkat mobile maupun desktop. Tampilan juga tetap nyaman meskipun berpindah perangkat." 7926 }, 7927 { 7928 name: "Fikri Ramadhan", 7929 date: "2026-06-25", 7930 rating: 5, 7931 text: "HANTUSLOT menghadirkan konsep platform game online yang menarik dengan desain futuristik dan fitur-fitur yang mudah digunakan." 7932 }, 7933 { 7934 name: "Yoga Prasetya", 7935 date: "2026-06-18", 7936 rating: 5, 7937 text: "Saya cukup menyukai pelayanan HANTUSLOT yang informatif. Customer service memberikan penjelasan dengan bahasa yang mudah dimengerti ketika saya membutuhkan bantuan." 7938 }, 7939 { 7940 name: "Ardi Maulana", 7941 date: "2026-06-11", 7942 rating: 5, 7943 text: "Navigasi di HANTUSLOT terasa sederhana dan tidak membingungkan. Berbagai informasi dapat ditemukan dengan cepat dari halaman utama." 7944 }, 7945 { 7946 name: "Rizal Hidayat", 7947 date: "2026-06-04", 7948 rating: 5, 7949 text: "Desain modern menjadi salah satu hal yang membuat saya nyaman menggunakan HANTUSLOT. Tampilan berbahasa Indonesia juga sangat membantu." 7950 }, 7951 { 7952 name: "Galang Wijaya", 7953 date: "2026-05-28", 7954 rating: 5, 7955 text: "HANTUSLOT memiliki tampilan yang responsif dan mudah digunakan. Saya bisa mengakses berbagai bagian platform dengan cepat melalui ponsel." 7956 }, 7957 { 7958 name: "Fauzan Akbar", 7959 date: "2026-05-21", 7960 rating: 5, 7961 text: "Menurut saya HANTUSLOT cukup menarik karena menggabungkan desain modern dengan fitur yang tersusun secara rapi. Informasinya juga mudah dipahami." 7962 }, 7963 { 7964 name: "Rafi Nugraha", 7965 date: "2026-05-14", 7966 rating: 5, 7967 text: "Pengalaman menggunakan HANTUSLOT terasa praktis. Menu yang tersedia jelas dan tampilan keseluruhan terlihat profesional." 7968 }, 7969 { 7970 name: "Kevin Setiawan", 7971 date: "2026-05-07", 7972 rating: 5, 7973 text: "Saya menyukai konsep HANTUSLOT yang mengutamakan kemudahan akses. Semua fitur utama dapat ditemukan tanpa harus berpindah halaman terlalu banyak." 7974 }, 7975 { 7976 name: "Doni Prakoso", 7977 date: "2026-04-30", 7978 rating: 5, 7979 text: "HANTUSLOT memiliki tampilan yang nyaman dilihat dengan kombinasi desain futuristik dan navigasi sederhana. Cocok untuk pengguna yang menyukai platform modern." 7980 } 7981]; 7982 7983const faq = [ 7984 "Apa itu HANTUSLOT?|HANTUSLOT merupakan platform game online dengan antarmuka berbahasa Indonesia yang dirancang dengan tampilan modern, navigasi praktis, dan akses yang nyaman di berbagai perangkat.", 7985 7986 "Apa yang membuat HANTUSLOT menarik untuk digunakan?|HANTUSLOT menghadirkan desain futuristik, navigasi sederhana, fitur yang mudah dipahami, serta tampilan responsif untuk memberikan pengalaman penggunaan yang lebih praktis.", 7987 7988 "Apakah HANTUSLOT menyediakan tampilan dalam bahasa Indonesia?|Ya, HANTUSLOT menyediakan menu dan informasi berbahasa Indonesia sehingga pengguna dapat memahami berbagai fitur dan navigasi dengan lebih mudah.", 7989 7990 "Apakah HANTUSLOT mendukung perangkat mobile?|Ya. HANTUSLOT dirancang agar dapat digunakan melalui smartphone, tablet, maupun desktop dengan tampilan yang menyesuaikan ukuran layar perangkat.", 7991 7992 "Apa saja fitur unggulan HANTUSLOT?|Beberapa fitur unggulan HANTUSLOT meliputi antarmuka responsif, navigasi intuitif, akses multi-perangkat, sistem keamanan modern, serta dukungan customer service.", 7993 7994 "Apakah HANTUSLOT mudah digunakan oleh pemula?|Tentu. Struktur menu HANTUSLOT dibuat sederhana dan informatif sehingga pengguna baru dapat mempelajari berbagai fitur tanpa harus melalui proses yang rumit.", 7995 7996 "Bagaimana HANTUSLOT membantu menjaga keamanan pengguna?|HANTUSLOT menggunakan berbagai langkah keamanan digital untuk membantu menjaga informasi akun dan memberikan lingkungan penggunaan yang lebih aman.",
7997 7998 "Apakah HANTUSLOT memiliki performa akses yang ringan?|HANTUSLOT dirancang dengan fokus pada kecepatan dan responsivitas sehingga pengguna dapat berpindah antarhalaman dengan lebih lancar pada perangkat yang kompatibel.", 7999 8000 "Apakah HANTUSLOT menyediakan customer service?|Ya, HANTUSLOT menyediakan layanan customer service untuk membantu pengguna mendapatkan informasi serta menangani pertanyaan terkait penggunaan platform.", 8001 8002 "Bagaimana cara membuat akun HANTUSLOT?|Pengguna dapat mengikuti petunjuk pendaftaran yang tersedia pada platform dengan melengkapi informasi yang diperlukan dan mengikuti proses verifikasi sesuai ketentuan yang berlaku.", 8003 8004 "Apa keunggulan desain HANTUSLOT?|HANTUSLOT menggabungkan elemen visual modern dengan struktur navigasi yang sederhana sehingga tampilan tetap menarik sekaligus mudah digunakan.", 8005 8006 "Apakah HANTUSLOT melakukan pembaruan secara berkala?|HANTUSLOT dapat melakukan pengembangan dan pembaruan pada fitur maupun tampilan untuk meningkatkan kualitas serta kenyamanan penggunaan platform.", 8007 8008 "Perangkat apa saja yang dapat digunakan untuk mengakses HANTUSLOT?|HANTUSLOT dapat diakses melalui perangkat yang memiliki koneksi internet dan browser yang kompatibel, termasuk smartphone, tablet, laptop, dan komputer desktop.", 8009 8010 "Mengapa fitur inovatif menjadi salah satu keunggulan HANTUSLOT?|Fitur inovatif membantu membuat navigasi lebih praktis, informasi lebih mudah ditemukan, serta memberikan pengalaman menggunakan platform game online yang lebih modern dan efisien." 8011]; 8012 8013function renderReviews(data){ 8014 const container = document.getElementById("reviewsSection"); 8015 container.innerHTML=""; 8016 data.forEach((r,i)=>{ 8017 container.innerHTML += ` 8018 <div class="review-card"> 8019 <div class="review-top"> 8020 <div> 8021 <div class="review-name">${r.name} <span class="verified">â Verified Buyer</span></div> 8022 <div class="review-stars">${"â ".repeat(r.rating)}</div> 8023 </div> 8024 <div>${r.date}</div> 8025 </div> 8026 <p>${r.text}</p> 8027 <div class="helpful" onclick="increaseHelpful(${i})"> 8028 ð Helpful <span id="help-${i}">0</span> 8029 </div> 8030 </div> 8031 `; 8032 }); 8033} 8034 8035function increaseHelpful(i){ 8036 let el = document.getElementById("help-"+i); 8037 el.innerText = parseInt(el.innerText) + 1; 8038} 8039 8040function renderFAQ(){ 8041 const container = document.getElementById("faqSection"); 8042 faq.forEach((item)=>{ 8043 let parts = item.split("|"); 8044 container.innerHTML += ` 8045 <div class="faq-item"> 8046 <div class="faq-question" onclick="toggleFAQ(this)"> 8047 ${parts[0]} <span>â¼</span> 8048 </div> 8049 <div class="faq-answer">${parts[1]}</div> 8050 </div> 8051 `; 8052 }); 8053} 8054 8055function toggleFAQ(el){ 8056 let answer = el.nextElementSibling; 8057 answer.style.display = answer.style.display === "block" ? "none":"block"; 8058} 8059 8060function showTab(tab){ 8061 document.querySelectorAll(".tab").forEach(t=>t.classList.remove("active")); 8062 event.target.classList.add("active"); 8063 if(tab==="reviews"){ 8064 document.getElementById("reviewsSection").style.display="block"; 8065 document.getElementById("faqSection").style.display="none"; 8066 }else{ 8067 document.getElementById("reviewsSection").style.display="none"; 8068 document.getElementById("faqSection").style.display="block"; 8069 } 8070} 8071 8072document.getElementById("searchInput").addEventListener("input", function(){ 8073 let value = this.value.toLowerCase(); 8074 let filtered = reviews.filter(r => r.text.toLowerCase().includes(value)); 8075 renderReviews(filtered); 8076}); 8077 8078document.getElementById("sortSelect").addEventListener("change", function(){ 8079 let sorted = [...reviews]; 8080 if(this.value==="recent"){ 8081 sorted.sort((a,b)=> new Date(b.date)-new Date(a.date)); 8082 } 8083 if(this.value==="oldest"){ 8084 sorted.sort((a,b)=> new Date(a.date)-new Date(b.date)); 8085 } 8086 renderReviews(sorted); 8087}); 8088 8089renderReviews(reviews); 8090renderFAQ(); 8091 8092</script>
vendor: 2 bytes, line 8092
8092
8093<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/shopify-cartjs/1.1.0/cart.min.js"></script>
8093 8094 8095<style> 8096.review-header{ 8097 display:flex; 8098 gap:40px; 8099} 8100 8101.rating-summary{ 8102 width:300px; 8103} 8104 8105.rating-score{ 8106 font-size:42px; 8107 font-weight:bold; 8108} 8109 8110.stars{ 8111 color:#f5a623; 8112 font-size:20px; 8113} 8114 8115.progress-bar{ 8116 display:flex; 8117 align-items:center; 8118 gap:10px; 8119 margin:6px 0; 8120} 8121 8122.progress{ 8123 background:#eee; 8124 height:8px; 8125 flex:1; 8126 border-radius:10px; 8127 overflow:hidden; 8128} 8129 8130.progress-fill{ 8131 background:#333; 8132 height:100%; 8133} 8134 8135.tabs{ 8136 display:flex; 8137 gap:30px; 8138 margin-top:30px; 8139 border-bottom:1px solid #ddd; 8140} 8141 8142.tab{ 8143 padding-bottom:10px; 8144 cursor:pointer; 8145 font-weight:bold; 8146} 8147 8148.tab.active{ 8149 border-bottom:3px solid black; 8150} 8151.filter-bar{ 8152 display:flex; 8153 justify-content:space-between; 8154 margin:20px 0; 8155} 8156 8157input[type="text"], select{ 8158 padding:8px 10px; 8159 border:1px solid #ddd; 8160 border-radius:6px; 8161} 8162 8163.review-card{ 8164 border-top:1px solid #eee; 8165 padding:20px 0; 8166} 8167 8168.review-top{ 8169 display:flex; 8170 justify-content:space-between; 8171} 8172 8173.review-name{ 8174 font-weight:bold; 8175} 8176 8177.verified{ 8178 color:green; 8179 font-size:12px; 8180} 8181 8182.review-stars{ 8183 color:#f5a623; 8184 margin:5px 0; 8185} 8186 8187.helpful{ 8188 font-size:13px; 8189 color:#666; 8190 cursor:pointer; 8191} 8192 8193.helpful span{ 8194 margin-left:5px; 8195} 8196.faq-item{ 8197 border-top:1px solid #eee; 8198 padding:15px 0; 8199} 8200 8201.faq-question{ 8202 font-weight:bold; 8203 cursor:pointer; 8204 display:flex; 8205 justify-content:space-between; 8206} 8207 8208.faq-answer{ 8209 display:none; 8210 margin-top:10px; 8211 color:#555; 8212} 8213 8214.rotate{ 8215 transform:rotate(180deg); 8216} 8217 .image-editor-popup { 8218 position: fixed; 8219 top: 0; 8220 left: 0; 8221 width: 100vw; 8222 height: 100vh; 8223 z-index: 9999; 8224 display: flex;
8225 align-items: center; 8226 justify-content: center; 8227 padding: 20px; 8228 box-sizing: border-box; 8229 } 8230 8231 .image-editor-overlay { 8232 position: absolute; 8233 top: 0; 8234 left: 0; 8235 width: 100%; 8236 height: 100%; 8237 background: rgba(0, 0, 0, 0.7); 8238 backdrop-filter: blur(2px); 8239 } 8240 8241 .image-editor-modal { 8242 position: relative; 8243 background: white; 8244 border-radius: 12px; 8245 box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); 8246 max-width: min(900px, calc(100vw - 40px)); 8247 max-height: min(700px, calc(100vh - 40px)); 8248 width: 100%; 8249 display: flex; 8250 flex-direction: column; 8251 overflow: auto; 8252 margin: auto; 8253 transform: translateZ(0); 8254 } 8255 8256 .image-editor-header { 8257 display: flex; 8258 justify-content: space-between; 8259 align-items: center; 8260 padding: 20px 24px; 8261 border-bottom: 1px solid #e5e7eb; 8262 background: #f9fafb; 8263 } 8264 8265 .image-editor-header h3 { 8266 margin: 0; 8267 font-size: 18px; 8268 font-weight: 600; 8269 color: #111827; 8270 } 8271 8272 .close-editor { 8273 background: none; 8274 border: none; 8275 font-size: 24px; 8276 color: #6b7280; 8277 cursor: pointer; 8278 padding: 0; 8279 width: 32px; 8280 height: 32px; 8281 display: flex;
8282 align-items: center; 8283 justify-content: center; 8284 border-radius: 6px; 8285 transition: all 0.2s; 8286 } 8287 8288 .close-editor:hover { 8289 background: #f3f4f6; 8290 color: #374151; 8291 } 8292 8293 .image-editor-content { 8294 display: flex; 8295 flex: 1; 8296 min-height: 500px; 8297 } 8298 8299 .image-editor-canvas { 8300 flex: 1; 8301 padding: 20px; 8302 background: #f8fafc; 8303 display: flex; 8304 align-items: center; 8305 justify-content: center; 8306 min-height: 400px; 8307 } 8308 8309 .image-editor-canvas img { 8310 max-width: 100%; 8311 max-height: 100%; 8312 display: block; 8313 } 8314 8315 .image-editor-controls { 8316 width: 280px; 8317 padding: 20px; 8318 background: white; 8319 border-left: 1px solid #e5e7eb; 8320 overflow-y: auto; 8321 } 8322 8323 .control-group { 8324 margin-bottom: 20px; 8325 padding-bottom: 16px; 8326 border-bottom: 1px solid #f3f4f6; 8327 } 8328 8329 .control-group:last-child { 8330 border-bottom: none; 8331 margin-bottom: 0; 8332 } 8333 8334 .control-group label { 8335 display: block; 8336 font-size: 14px; 8337 font-weight: 500; 8338 color: #374151; 8339 margin-bottom: 8px; 8340 } 8341 8342 .control-group select, 8343 .control-group input[type="range"] { 8344 width: 100%; 8345 padding: 8px 12px; 8346 border: 1px solid #d1d5db; 8347 border-radius: 6px; 8348 font-size: 14px; 8349 background: white; 8350 } 8351 8352 .control-group input[type="range"] { 8353 -webkit-appearance: none; 8354 appearance: none; 8355 height: 6px; 8356 background: #e5e7eb; 8357 border-radius: 3px; 8358 padding: 0; 8359 } 8360 8361 .control-group input[type="range"]::-webkit-slider-thumb { 8362 -webkit-appearance: none; 8363 appearance: none; 8364 width: 18px; 8365 height: 18px; 8366 background: #3b82f6; 8367 border-radius: 50%; 8368 cursor: pointer; 8369 } 8370 8371 .control-group button { 8372 background: #f3f4f6; 8373 border: 1px solid #d1d5db; 8374 border-radius: 6px; 8375 padding: 8px 12px; 8376 font-size: 13px; 8377 color: #374151; 8378 cursor: pointer; 8379 margin-right: 8px; 8380 margin-bottom: 8px; 8381 transition: all 0.2s; 8382 } 8383 8384 .control-group button:hover { 8385 background: #e5e7eb; 8386 border-color: #9ca3af; 8387 } 8388 8389 .control-group button:active { 8390 transform: translateY(1px); 8391 } 8392 8393 #imageSizeInfo { 8394 font-size: 12px; 8395 color: #6b7280; 8396 margin-top: 8px; 8397 display: flex; 8398 flex-direction: column; 8399 gap: 4px; 8400 } 8401 8402 #imageSizeInfo span { 8403 display: block; 8404 padding: 4px 8px; 8405 background: #f9fafb; 8406 border-radius: 4px; 8407 border: 1px solid #e5e7eb; 8408 } 8409 8410 #originalSize { 8411 color: #374151; 8412 } 8413 8414 #newSize { 8415 color: #059669; 8416 font-weight: 500; 8417 } 8418 8419 .image-editor-footer { 8420 display: flex; 8421 justify-content: flex-end; 8422 gap: 12px; 8423 padding: 20px 24px; 8424 border-top: 1px solid #e5e7eb; 8425 background: #f9fafb; 8426 } 8427 8428 .btn-cancel { 8429 background: white; 8430 border: 1px solid #d1d5db; 8431 border-radius: 6px; 8432 padding: 10px 20px; 8433 font-size: 14px; 8434 color: #374151; 8435 cursor: pointer; 8436 transition: all 0.2s; 8437 } 8438 8439 .btn-cancel:hover { 8440 background: #f9fafb; 8441 border-color: #9ca3af; 8442 } 8443 8444 .btn-save { 8445 background: #3b82f6; 8446 border: 1px solid #3b82f6; 8447 border-radius: 6px; 8448 padding: 10px 20px; 8449 font-size: 14px; 8450 color: white; 8451 cursor: pointer; 8452 transition: all 0.2s; 8453 } 8454 8455 .btn-save:hover { 8456 background: #2563eb; 8457 border-color: #2563eb; 8458 } 8459 8460 @media (max-width: 768px) { 8461 .image-editor-popup { 8462 padding: 10px; 8463 } 8464 8465 .image-editor-modal { 8466 max-width: calc(100vw - 20px); 8467 max-height: calc(100vh - 20px); 8468 width: 100%; 8469 height: auto; 8470 min-height: 80vh; 8471 } 8472 8473 .image-editor-content { 8474 flex-direction: column; 8475 } 8476 8477 .image-editor-controls { 8478 width: 100%; 8479 border-left: none; 8480 border-top: 1px solid #e5e7eb; 8481 max-height: 200px; 8482 } 8483 8484 .image-editor-canvas { 8485 min-height: 300px; 8486 } 8487 } 8488 8489 .steps-card-preview.loading-upload { 8490 position: relative; 8491 pointer-events: none; 8492 opacity: 0.7; 8493 } 8494 8495 .steps-card-preview.loading-upload::after { 8496 content: ''; 8497 position: absolute; 8498 top: 0; 8499 left: 0; 8500 right: 0; 8501 bottom: 0; 8502 background: rgba(255, 255, 255, 0.8); 8503 border-radius: inherit; 8504 z-index: 1; 8505 } 8506 8507 .ajax-loader { 8508 position: absolute; 8509 top: 50%; 8510 left: 50%; 8511 transform: translate(-50%, -50%); 8512 z-index: 2; 8513 width: 40px; 8514 height: 40px; 8515 border: 4px solid #f3f3f3;
8516 border-top: 4px solid #3498db; 8517 border-radius: 50%; 8518 animation: spin 1s linear infinite; 8519 display: none; 8520 } 8521 8522 .image-editor-popup { 8523 opacity: 0; 8524 visibility: hidden; 8525 transition: opacity 0.3s ease, visibility 0.3s ease; 8526 display: flex !important; 8527 } 8528 8529 .image-editor-popup.show { 8530 opacity: 1; 8531 visibility: visible; 8532 } 8533 8534 .image-editor-modal { 8535 transform: translateY(-20px) scale(0.9); 8536 transition: transform 0.3s ease; 8537 } 8538 8539 .image-editor-popup.show .image-editor-modal { 8540 transform: translateY(0) scale(1); 8541 } 8542 8543 @keyframes spin { 8544 0% { transform: translate(-50%, -50%) rotate(0deg); } 8545 100% { transform: translate(-50%, -50%) rotate(360deg); } 8546 } 8547 8548 .skeleton-date-loader { 8549 display: flex; 8550 gap: 8px; 8551 flex-wrap: wrap; 8552 } 8553 8554 .skeleton-date-button { 8555 width: calc(14.285% - 7px); 8556 min-width: 40px; 8557 height: 40px; 8558 background: #f5f5f5; 8559 border: 1px solid #e0e0e0; 8560 border-radius: 50%; 8561 position: relative; 8562 overflow: hidden; 8563 display: flex; 8564 flex-direction: column; 8565 align-items: center; 8566 justify-content: center; 8567 gap: 4px; 8568 } 8569 8570 .skeleton-date-button::before { 8571 content: ''; 8572 position: absolute; 8573 top: 0; 8574 left: -100%; 8575 width: 100%; 8576 height: 100%; 8577 background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.6), transparent); 8578 animation: skeleton-shimmer 1.5s ease-in-out infinite; 8579 } 8580 8581 .skeleton-date-text { 8582 width: 30px; 8583 height: 10px; 8584 background: #e0e0e0; 8585 border-radius: 4px; 8586 } 8587 8588 .skeleton-date-number { 8589 width: 20px; 8590 height: 14px; 8591 background: #d0d0d0; 8592 border-radius: 4px; 8593 } 8594 8595 @keyframes skeleton-shimmer { 8596 0% { 8597 left: -100%; 8598 } 8599 100% { 8600 left: 100%; 8601 } 8602 } 8603 8604 @media (max-width: 768px) { 8605 .skeleton-date-button { 8606 width: calc(16.666% - 7px); 8607 min-width: 40px; 8608 height: 40px; 8609 } 8610 } 8611 8612 @media (max-width: 480px) { 8613 .skeleton-date-button { 8614 width: calc(20% - 7px); 8615 min-width: 40px; 8616 height: 40px; 8617 } 8618 8619 .skeleton-date-text { 8620 width: 25px; 8621 height: 8px; 8622 } 8623 8624 .skeleton-date-number { 8625 width: 18px; 8626 height: 12px; 8627 } 8628 } 8629 8630 .ocr-address-popup { 8631 position: fixed; 8632 top: 0; 8633 left: 0; 8634 width: 100vw; 8635 height: 100vh; 8636 z-index: 9998; 8637 display: none; 8638 align-items: center; 8639 justify-content: center; 8640 padding: 20px; 8641 box-sizing: border-box; 8642 } 8643 8644 .ocr-address-popup.show { 8645 display: flex; 8646 } 8647 8648 .ocr-popup-overlay { 8649 position: absolute; 8650 top: 0; 8651 left: 0; 8652 width: 100%; 8653 height: 100%; 8654 background: rgba(0, 0, 0, 0.6); 8655 backdrop-filter: blur(2px); 8656 cursor: pointer; 8657 } 8658 8659 .ocr-popup-content { 8660 position: relative; 8661 background: white; 8662 border-radius: 12px; 8663 box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); 8664 max-width: 600px; 8665 max-height: 80vh; 8666 width: 100%; 8667 overflow: hidden; 8668 display: flex; 8669 flex-direction: column; 8670 } 8671 8672 .ocr-popup-header { 8673 display: flex; 8674 justify-content: space-between; 8675 align-items: center; 8676 padding: 20px 24px; 8677 border-bottom: 1px solid #e5e7eb; 8678 background: #f9fafb; 8679 } 8680 8681 .ocr-popup-header h3 { 8682 margin: 0; 8683 font-size: 18px; 8684 font-weight: 600; 8685 color: #1f2937; 8686 } 8687 8688 .close-ocr-popup { 8689 background: none; 8690 border: none; 8691 font-size: 28px; 8692 color: #6b7280; 8693 cursor: pointer; 8694 padding: 0; 8695 width: 32px; 8696 height: 32px; 8697 display: flex;
8698 align-items: center; 8699 justify-content: center; 8700 transition: color 0.2s; 8701 } 8702 8703 .close-ocr-popup:hover { 8704 color: #1f2937; 8705 } 8706 8707 .ocr-popup-body { 8708 overflow-y: auto; 8709 padding: 20px; 8710 flex: 1; 8711 } 8712 8713 .ocr-address-options { 8714 display: flex; 8715 flex-direction: column; 8716 gap: 12px; 8717 } 8718 8719 .ocr-address-option { 8720 padding: 16px; 8721 border: 2px solid #e5e7eb; 8722 border-radius: 8px; 8723 cursor: pointer; 8724 transition: all 0.2s; 8725 background: white; 8726 } 8727 8728 .ocr-address-option:hover { 8729 border-color: #3b82f6; 8730 background: #f0f4ff; 8731 box-shadow: 0 2px 8px rgba(59, 130, 246, 0.1); 8732 } 8733 8734 .ocr-address-option.selected { 8735 border-color: #3b82f6; 8736 background: #eff6ff; 8737 } 8738 8739 .address-content { 8740 display: flex; 8741 flex-direction: column; 8742 gap: 4px; 8743 } 8744 8745 .address-text { 8746 margin: 0; 8747 font-size: 15px; 8748 font-weight: 500; 8749 color: #1f2937; 8750 line-height: 1.4; 8751 } 8752 8753 .address-details { 8754 margin: 0; 8755 font-size: 13px; 8756 color: #6b7280; 8757 } 8758 8759 body.ocr-popup-open { 8760 overflow: hidden; 8761 } 8762 8763 @media (max-width: 768px) { 8764 .ocr-popup-content { 8765 max-width: calc(100vw - 40px); 8766 max-height: 85vh; 8767 } 8768 8769 .ocr-popup-header h3 { 8770 font-size: 16px; 8771 } 8772 8773 .address-text { 8774 font-size: 14px; 8775 } 8776 } 8777</style> 8778
8779<script> 8780 CartJS.init({"note":null,"attributes":{},"original_total_price":0,"total_price":0,"total_discount":0,"total_weight":0.0,"item_count":0,"items":[],"requires_shipping":false,"currency":"IDR","items_subtotal_price":0,"cart_level_discount_applications":[],"checkout_charge_amount":0}); 8781 8782 const productType = $("[data-product-type]").data("product-type") 8783 const productDate = Date.parse(new Date()) 8784 8785 const shop = 'outerbloom1.myshopify.com' 8786 const host = 'https://app.asmaraku.com' 8787 // const host = 'https://d8fe-103-3-220-56.ngrok-free.app' 8788 8789 const gsheet = "https://script.google.com/macros/s/AKfycbyqa6mPD6lVjU6hiHr12J8URZ2aJBGyxBsGQ0QtEIDari-rBk_9vSOITjSSmUXL1NwxEg/exec" 8790 8791 const qrID = "230226" + randomString(4, 'aAbCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ') 8792 8793 $("#properties-time").val(new Date().getTime()) 8794 8795 const isIOS = /iPhone|iPad|iPod/i.test(navigator.userAgent); 8796 8797 if(!isIOS) { 8798 $("#full-date").attr("type", "button") 8799 } 8800 8801 // Shipping Analytics Tracker 8802 class ShippingAnalytics { 8803 constructor() { 8804 this.endpoint = host + '/api/track-shipping'; 8805 this.userId = ''; 8806 this.userIp = document.body.getAttribute('data-ip') || 'unknown'; 8807 this.shop = ''; 8808 } 8809 8810 async track(action, metadata = {}) { 8811 try { 8812 const payload = { 8813 endpoint: action, 8814 metadata: { 8815 userIp: this.userIp, 8816 shop: this.shop, 8817 timestamp: new Date().toISOString(), 8818 userAgent: navigator.userAgent, 8819 url: window.location.href, 8820 ...metadata 8821 } 8822 }; 8823 8824 const response = await fetch(this.endpoint, { 8825 method: 'POST', 8826 headers: { 8827 'Content-Type': 'application/json' 8828 }, 8829 body: JSON.stringify(payload) 8830 }); 8831 8832 if (!response.ok) { 8833 console.warn('Analytics tracking failed:', response.status); 8834 } 8835 } catch (error) { 8836 console.error('Analytics error:', error); 8837 // Fail silently, tidak block user flow 8838 } 8839 } 8840 } 8841 8842 // Initialize 8843 const analytics = new ShippingAnalytics(); 8844 8845 let dateTime = new Date(); 8846 let today = dateTime.getDate(); 8847 let day = dateTime.getDay(); 8848 let hour = dateTime.getHours(); 8849 let min = dateTime.getMinutes(); 8850 let timeOfDay = hour + (min / 100); 8851 8852 async function getFetch(url) { 8853 const response = await fetch(url); 8854 let status = false 8855 let result 8856 if(response.ok) { 8857 status = true 8858 result = await response.json(); 8859 } 8860 return { 8861 status, 8862 data: result 8863 } 8864 } 8865 8866 function setCookie(cname, cvalue, exMins) { 8867 var d = new Date(); 8868 d.setTime(d.getTime() + (exMins*60*1000)); 8869 var expires = "expires="+d.toUTCString(); 8870 document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; 8871 } 8872 8873 function getCookie(cname) { 8874 let name = cname + "="; 8875 let decodedCookie = decodeURIComponent(document.cookie); 8876 let ca = decodedCookie.split(';'); 8877 for(let i = 0; i <ca.length; i++) { 8878 let c = ca[i]; 8879 while (c.charAt(0) == ' ') { 8880 c = c.substring(1); 8881 } 8882 if (c.indexOf(name) == 0) { 8883 return c.substring(name.length, c.length); 8884 } 8885 } 8886 return ""; 8887 } 8888 8889 // Initialize rupiah formatter before it's used in renderAddress 8890 let rupiah = new Intl.NumberFormat('id-ID', { 8891 style: 'currency', 8892 currency: 'IDR', 8893 maximumFractionDigits: 0, 8894 minimumFractionDigits: 0 8895 }); 8896 8897 // Helper functions for localStorage (1 day storage) 8898 function getStorageKey(type, city = '') { 8899 const productId = '7881418965207'; 8900 if (type === 'date') { 8901 // For date, only use product ID (no city) 8902 return `delivery_${type}_${productId}`; 8903 } 8904 // For other types (zip), use city 8905 return `delivery_${type}_${productId}_${city}`; 8906 } 8907 8908 function saveToStorage(key, data) { 8909 try { 8910 const item = { 8911 data: data, 8912 savedAt: new Date().getTime() 8913 }; 8914 localStorage.setItem(key, JSON.stringify(item)); 8915 } catch (e) { 8916 console.error('Error saving to localStorage:', e); 8917 } 8918 } 8919
8920 function getFromStorage(key) { 8921 try { 8922 const itemStr = localStorage.getItem(key); 8923 if (!itemStr) { 8924 return null; 8925 } 8926 const item = JSON.parse(itemStr); 8927 const now = new Date().getTime(); 8928 const oneHour = 60 * 60 * 1000; // 1 hour in milliseconds 8929 8930 // Check if data is older than 1 hour 8931 if (now - item.savedAt > oneHour) { 8932 localStorage.removeItem(key); 8933 return null; 8934 } 8935 return item.data; 8936 } catch (e) { 8937 console.error('Error reading from localStorage:', e); 8938 return null; 8939 } 8940 } 8941 8942 async function renderDate(city) { 8943 const storageKey = getStorageKey('date'); 8944 const storedData = getFromStorage(storageKey); 8945 8946 let data; 8947 if (storedData) { 8948 data = storedData; 8949 } else { 8950 let dataDate = await getFetch(`${host}/api/shipping/date?domain=${shop}&productId=7881418965207&source=web`); 8951 data = dataDate?.data; 8952 8953 // Save to localStorage (only once per product) 8954 if (data && data.date && data.time) { 8955 saveToStorage(storageKey, data); 8956 } 8957 } 8958 8959 // Use the helper function to render
8960 if (data && data.date && data.time) { 8961 renderDeliveryDateFromData(data); 8962 8963 if(productType !== '') { 8964 console.log("clarity event " + productType + ' calendaring') 8965 window.clarity("event", `${productType} calendaringSchedule`) 8966 } 8967 } else { 8968 console.error('Invalid delivery date data'); 8969 showDeliveryPlaceholder(); 8970 } 8971 } 8972 8973 // Function to get province from city (called on-demand, not on initial render) 8974 async function getProvince(city) { 8975 if (!city || city === '') { 8976 return; 8977 } 8978 8979 // Check localStorage first 8980 const storageKey = getStorageKey('province', city); 8981 const storedProvince = getFromStorage(storageKey); 8982 8983 if (storedProvince) { 8984 console.log('Using stored province data for:', city); 8985 $("#province").val(storedProvince); 8986 return storedProvince; 8987 } 8988 8989 // Fetch from API if not in localStorage 8990 console.log('Fetching province data from API for:', city); 8991 let { data: { province } } = await getFetch(`${host}/api/shipping/address/province?city=${city}&source=web`); 8992 console.log(province, 'province') 8993 $("#province").val(province) 8994 8995 // Save to localStorage 8996 if (province) { 8997 saveToStorage(storageKey, province); 8998 console.log('Saved province to localStorage for:', city); 8999 } 9000 9001 return province; 9002 } 9003 9004 async function renderAddress() { 9005 let current 9006 if(getCookie("location_delivery")){ 9007 current = getCookie("location_delivery").charAt(0).toUpperCase() + getCookie("location_delivery").slice(1) 9008 } 9009 9010 const deliveryCity = document.getElementById("cities"); 9011 9012 // Check localStorage first 9013 const cityDataKey = `delivery_city_data_7881418965207`; 9014 const storedCityData = getFromStorage(cityDataKey); 9015 9016 if (storedCityData && storedCityData.cities && storedCityData.cities.length > 0) { 9017 const allCities = storedCityData.cities; 9018 const data = storedCityData.fullData; 9019 9020 const htmlAddress = []; 9021 for(let i = 0; i < data?.length; i++) { 9022 if(data[i]){ 9023 const price = rupiah.format(data[i]?.rate) 9024 let promo = '(Promo Free Delivery)' 9025 if(data[i]?.name === 'Jakarta - PickUp ASHTA'){ 9026 promo = '(at SCBD, Ashta)' 9027 } else if(data[i]?.name === 'Jakarta - PickUp ITC'){ 9028 promo = '(at Kuningan, ITC Kuningan)' 9029 } else if(data[i]?.name === 'BSD - PickUp'){ 9030 promo = '(at Goldfinch Gading Serpong)' 9031 } else if(data[i]?.name === 'Kota Lainnya'){ 9032 promo = '' 9033 } 9034 9035 htmlAddress.push(`<option data-province="${data[i]?.province}" data-city="${data[i]?.city}" data-note="${data[i]?.note}" data-price="${data[i]?.rate}" value="${data[i]?.name}">${data[i]?.name === 'Kota Lainnya' ? 'Seluruh Kota Lain di Indonesia' : data[i]?.name} ${data[i]?.rate > 0 ? `(${price})` : promo}</option>`) 9036 } 9037 } 9038 9039 if(deliveryCity) { 9040 deliveryCity.insertAdjacentHTML("beforeend", htmlAddress.join('')) 9041 } 9042 9043 return storedCityData; 9044 } 9045 9046 // If no stored data, show skeleton and fetch from API 9047 if(deliveryCity && deliveryCity.options.length === 1) { // Only default option 9048 const skeletonOptions = ` 9049 <option disabled>Loading cities...</option> 9050 <option disabled>●●●●●●●●●</option> 9051 <option disabled>●●●●●●●●●</option> 9052 <option disabled>●●●●●●●●●</option> 9053 `; 9054 deliveryCity.insertAdjacentHTML("beforeend", skeletonOptions); 9055 } 9056 9057 let address = await getFetch(`${host}/api/shipping/address?domain=${shop}&productId=7881418965207&source=web`); 9058 console.log(address) 9059 const data = address?.data?.city 9060 const htmlAddress = [] 9061 const grouping = [] 9062 const allCities = [] // Store all city names 9063 9064 for(let i = 0;i < data?.length;i++) { 9065 if(data[i]){ 9066 if(data[i]?.group) { 9067 grouping.push(data[i].group) 9068 } 9069 const price = rupiah.format(data[i]?.rate) 9070 let promo = '(Promo Free Delivery)' 9071 if(data[i]?.name === 'Jakarta - PickUp ASHTA'){ 9072 promo = '(at SCBD, Ashta)' 9073 } else if(data[i]?.name === 'Jakarta - PickUp ITC'){ 9074 promo = '(at Kuningan, ITC Kuningan)' 9075 } else if(data[i]?.name === 'BSD - PickUp'){ 9076 promo = '(at Goldfinch Gading Serpong)' 9077 } else if(data[i]?.name === 'Kota Lainnya'){ 9078 promo = '' 9079 } 9080 9081 // Add city name to allCities array 9082 allCities.push(data[i]?.name); 9083 9084 htmlAddress.push(`<option data-province="${data[i]?.province}" data-city="${data[i]?.city}" data-note="${data[i]?.note}" data-price="${data[i]?.rate}" value="${data[i]?.name}">${data[i]?.name === 'Kota Lainnya' ? 'Seluruh Kota Lain di Indonesia' : data[i]?.name} ${data[i]?.rate > 0 ? `(${price})` : promo}</option>`) 9085 } 9086 } 9087 9088 if(deliveryCity) { 9089 // Remove skeleton options before adding real options 9090 const skeletonOpts = deliveryCity.querySelectorAll('option[disabled]');
9091 skeletonOpts.forEach(opt => { 9092 if (opt.textContent.includes('Loading') || opt.textContent.includes('â')) { 9093 opt.remove(); 9094 } 9095 }); 9096 9097 deliveryCity.insertAdjacentHTML("beforeend", htmlAddress.join('')) 9098 } 9099 9100 // Save all cities to localStorage for 1 day 9101 const saveCityDataKey = `delivery_city_data_7881418965207`; 9102 const saveCityData = { 9103 cities: allCities, 9104 fullData: data // Save full data for later use 9105 }; 9106 saveToStorage(saveCityDataKey, saveCityData); 9107 console.log('Saved city data:', saveCityData); 9108 9109 return saveCityData; 9110 } 9111 9112 // Function to get user city from IP address 9113 async function getUserCityFromIP(availableCities) { 9114 try { 9115 // Try to get location from IP 9116 const ipResponse = await fetch('https://ipapi.co/json/'); 9117 const ipData = await ipResponse.json(); 9118 const userCity = ipData.city; 9119 9120 console.log('User city from IP:', userCity); 9121 9122 // Check if user city exists in available cities 9123 const matchedCity = availableCities.find(city => 9124 city.toLowerCase().includes(userCity.toLowerCase()) || 9125 userCity.toLowerCase().includes(city.toLowerCase()) 9126 ); 9127 9128 if (matchedCity) { 9129 console.log('Matched city found:', matchedCity); 9130 return matchedCity; 9131 } 9132 9133 console.log('User city not in available cities'); 9134 return ""; 9135 } catch (error) { 9136 console.error('Error getting user location:', error); 9137 return ""; 9138 } 9139 } 9140 9141 // Function to render zip codes (called on-demand, not on initial render) 9142 async function renderZip(v, v2, v3) { 9143 const deliveryZip = document.getElementById("zip"); 9144 if(v === '') { 9145 return 9146 } 9147 9148 // Check localStorage first 9149 const storageKey = getStorageKey('zip', v); 9150 const storedZip = getFromStorage(storageKey); 9151 9152 let zip; 9153 if (storedZip) { 9154 console.log('Using stored zip code data for:', v); 9155 zip = storedZip; 9156 } else { 9157 console.log('Fetching zip code data from API for:', v); 9158 let dataZip = await getFetch(`${host}/api/shipping/address/zip?city=${v}&city2=${v2}&city3=${v3}&source=web`); 9159 zip = dataZip?.data?.zip; 9160 console.log(zip) 9161 9162 // Save to localStorage 9163 if (zip && zip.length > 0) { 9164 saveToStorage(storageKey, zip); 9165 } 9166 } 9167 9168 let htmlZip = [] 9169 for(let i = 0; i < zip?.length;i++) { 9170 htmlZip.push(`<option value="${zip[i]?.postalCode} - ${zip[i]?.subdistrict}">${zip[i]?.postalCode} - ${zip[i]?.subdistrict} - ${zip[i]?.city}</option>`) 9171 } 9172 deliveryZip.insertAdjacentHTML("beforeend", htmlZip.join('')) 9173 9174 // Initialize Select2 with search for zip code 9175 if(!isIOS) { 9176 setTimeout(() => { 9177 initSelect2('#zip', { 9178 placeholder: 'Postal Code' 9179 }); 9180 }, 100); 9181 } 9182 } 9183 9184 // Add skeleton loader for delivery date 9185 function showDateSkeleton() { 9186 const deliveryDate = document.getElementById("deliveryDate"); 9187 if(deliveryDate && deliveryDate.children.length === 0) { 9188 const skeletonHTML = ` 9189 <div class="skeleton-date-loader"> 9190 <div class="skeleton-date-button"> 9191 </div> 9192 <div class="skeleton-date-button"> 9193 </div> 9194 <div class="skeleton-date-button"> 9195 </div> 9196 <div class="skeleton-date-button"> 9197 </div> 9198 <div class="skeleton-date-button"> 9199 </div> 9200 <div class="skeleton-date-button"> 9201 </div> 9202 <div class="skeleton-date-button"> 9203 </div> 9204 </div> 9205 `; 9206 deliveryDate.insertAdjacentHTML("afterbegin", skeletonHTML); 9207 } 9208 } 9209 9210 // Show static disabled buttons for delivery date and time 9211 function showDeliveryPlaceholder() { 9212 const deliveryDate = document.getElementById("deliveryDate"); 9213 const deliveryTime = document.getElementById("deliveryTime"); 9214 9215 if(deliveryDate) { 9216 const staticDates = ` 9217 <button class="date-single calendarbutton btn steps-btn col col-3 btn-date-time" disabled title="Please select delivery city first"> 9218 Mon<span>--</span> 9219 </button> 9220 <button class="date-single calendarbutton btn steps-btn col col-3 btn-date-time" disabled title="Please select delivery city first"> 9221 Tue<span>--</span> 9222 </button> 9223 <button class="date-single calendarbutton btn steps-btn col col-3 btn-date-time" disabled title="Please select delivery city first"> 9224 Wed<span>--</span> 9225 </button> 9226 <button class="date-single calendarbutton btn steps-btn col col-3 btn-date-time" disabled title="Please select delivery city first"> 9227 Thu<span>--</span> 9228 </button> 9229 <button class="date-single calendarbutton btn steps-btn col col-3 btn-date-time" disabled title="Please select delivery city first"> 9230 Fri<span>--</span> 9231 </button> 9232 <button class="date-single calendarbutton btn steps-btn col col-3 btn-date-time" disabled title="Please select delivery city first"> 9233 Sat<span>--</span> 9234 </button> 9235 `; 9236 deliveryDate.innerHTML = staticDates; 9237 } 9238 9239 if(deliveryTime) { 9240 const staticTimes = ` 9241 <button class="time-single calendarbutton2 btn steps-btn" disabled title="Please select delivery city first"> 9242 Morning<br/>08:00-13:00 9243 </button> 9244 <button class="time-single calendarbutton2 btn steps-btn" disabled title="Please select delivery city first"> 9245 Afternoon<br/>13:00-18:00 9246 </button> 9247 <button class="time-single calendarbutton2 btn steps-btn" disabled title="Please select delivery city first"> 9248 Evening<br/>17:00-22:00 9249 </button> 9250 `;
9251 deliveryTime.innerHTML = staticTimes; 9252 } 9253 } 9254 9255 // Helper function to render delivery date and time from data object 9256 function renderDeliveryDateFromData(data) { 9257 const deliveryDate = document.getElementById("deliveryDate"); 9258 const deliveryTime = document.getElementById("deliveryTime"); 9259 9260 // Check if at least one element exists 9261 if (!deliveryDate && !deliveryTime) { 9262 console.error('Cannot render delivery date: both deliveryDate and deliveryTime elements are missing'); 9263 return false; 9264 } 9265 9266 // Check if data is valid 9267 if (!data || !data.date || !data.time) { 9268 console.error('Cannot render delivery date: invalid or missing data'); 9269 return false; 9270 } 9271 9272 const date = data.date; 9273 const time = data.time; 9274 const weekday = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]; 9275 const monthly = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; 9276 9277 // Get today's date in Jakarta timezone (UTC+7) 9278 const todayJakarta = new Date(new Date().toLocaleString("en-US", {timeZone: "Asia/Jakarta"})); 9279 const today = todayJakarta.getDate(); 9280 9281 const htmlDate = []; 9282 for(let i = 0; i < date.length; i++) { 9283 const full = date[i].date; 9284 9285 // Convert UTC date to Jakarta timezone (UTC+7)
9286 const utcDate = new Date(date[i].date); 9287 const jakartaDateString = utcDate.toLocaleString("en-US", {timeZone: "Asia/Jakarta"}); 9288 const jakartaDate = new Date(jakartaDateString); 9289 9290 const dt = jakartaDate.getDate(); 9291 const monthIndex = jakartaDate.getMonth(); 9292 const yr = jakartaDate.getFullYear(); 9293 const day = weekday[jakartaDate.getDay()]; 9294 const mt = monthly[monthIndex]; 9295 9296 const isDate = Boolean(date[i].isEnabled); 9297 const cutoffpagi = date[i].cutoff?.pagi; 9298 const cutoffsiang = date[i].cutoff?.siang; 9299 const cutoffMalam = date[i].cutoff?.malam; 9300 9301 console.log(cutoffMalam, 'cutoffMalam') 9302 9303 const buttonHTML = ` 9304 <button data-id="7881418965207" class="date-single calendarbutton btn steps-btn col col-3 btn-date-time" data-day="${day}" data-fulldate="${full}" data-date="${dt < 10 ? '0' + dt : dt}" data-month="${mt}" data-year="${yr}" data-offpagi="${cutoffpagi}" data-offsiang="${cutoffsiang}" data-offMalam="${cutoffMalam}" ${isDate === true ? '' : 'disabled'}> 9305 ${dt === today ? `Today<span>${dt < 10 ? '0' + dt : dt}</span>` : `${day}<span>${dt < 10 ? '0' + dt : dt}</span>`} 9306 </button> 9307 `; 9308 9309 htmlDate.push(buttonHTML); 9310 } 9311 9312 const htmlTime = []; 9313 for(let i = 0; i < time.length; i++) { 9314 const timeText = time[i].text; 9315 const timeTime = time[i].time; 9316 const timeEnabled = time[i].isEnabled; 9317 htmlTime.push(` 9318 <button class="time-single calendarbutton2 btn steps-btn" data-time="${timeText}" ${timeEnabled ? '' : 'disabled'}>${timeText}<br/>${timeTime}</button> 9319 `); 9320 } 9321 9322 // Render delivery date if element exists 9323 if (deliveryDate) { 9324 deliveryDate.innerHTML = htmlDate.join(''); 9325 9326 // Log all buttons with their disabled status 9327 const buttons = deliveryDate.querySelectorAll('button'); 9328 buttons.forEach((btn, idx) => { 9329 console.log(`Button ${idx}: date=${btn.dataset.date}, hasDisabled=${btn.hasAttribute('disabled')}, disabled=${btn.disabled}`); 9330 }); 9331 9332 // Apply pickup date restrictions if pickup mode is active 9333 if (window.applyPickupDateRestrictions === true) { 9334 applyPickupDateRestrictions(deliveryDate); 9335 } 9336 } 9337 9338 // Render delivery time if element exists 9339 if (deliveryTime) { 9340 deliveryTime.innerHTML = htmlTime.join(''); 9341 } 9342 9343 return true; 9344 } 9345 9346 // Function to apply pickup date restrictions 9347 function applyPickupDateRestrictions(deliveryDateElement) { 9348 if (!deliveryDateElement) return; 9349 9350 // Get current time in Jakarta timezone 9351 const now = new Date(new Date().toLocaleString("en-US", {timeZone: "Asia/Jakarta"})); 9352 const currentHour = now.getHours(); 9353 const currentMinute = now.getMinutes(); 9354 const currentTime = currentHour + (currentMinute / 60); // e.g., 15.5 for 3:30 PM 9355 const currentDate = now.getDate(); 9356 9357 const isAfter3PM = currentTime >= 15.0; // 3 PM = 15:00 9358 9359 // Check product tags 9360 const isPickupInhouse = false; 9361 const isPickupVendor = false; 9362 9363 console.log('Applying pickup date restrictions:', { 9364 isPickupInhouse, 9365 isPickupVendor, 9366 currentDate, 9367 currentTime: currentTime.toFixed(2), 9368 isAfter3PM 9369 }); 9370 9371 const dateButtons = deliveryDateElement.querySelectorAll('button.date-single'); 9372 9373 dateButtons.forEach((button, index) => { 9374 const buttonDate = parseInt(button.dataset.date, 10); 9375 9376 if (isPickupInhouse) { 9377 // For pickup-itcinhouse: 9378 // - Disable today (compare actual date, not index) 9379 // - If after 3 PM, also disable tomorrow (currentDate + 1) 9380 9381 // Check if this button is today 9382 if (buttonDate === currentDate) { 9383 button.disabled = true; 9384 button.classList.add('stop'); 9385 button.title = 'Pickup not available for today'; 9386 console.log(`Disabled button ${index} (date ${buttonDate} = today) for pickup-itcinhouse`); 9387 } 9388 // Check if this button is tomorrow AND it's after 3 PM 9389 else if (buttonDate === currentDate + 1 && isAfter3PM) { 9390 button.disabled = true; 9391 button.classList.add('stop'); 9392 button.title = 'Pickup not available (after 3 PM cutoff)'; 9393 console.log(`Disabled button ${index} (date ${buttonDate} = tomorrow) for pickup-itcinhouse (after 3 PM)`); 9394 } 9395 } else if (isPickupVendor) { 9396 // For pickup-itcvendor: 9397 // - Disable dates before day 14 9398 // - If today is day 13 and after 3 PM, also disable day 14 9399 if (buttonDate < 14) { 9400 button.disabled = true; 9401 button.classList.add('stop'); 9402 button.title = 'Pickup not available before day 14'; 9403 console.log(`Disabled button ${index} (date ${buttonDate}) for pickup-itcvendor (before day 14)`); 9404 } else if (buttonDate === 14 && currentDate === 13 && isAfter3PM) { 9405 button.disabled = true; 9406 button.classList.add('stop'); 9407 button.title = 'Pickup not available (after 3 PM cutoff on day 13)'; 9408 console.log(`Disabled button ${index} (date ${buttonDate}) for pickup-itcvendor (day 13 after 3 PM)`); 9409 } 9410 } 9411 });
9412 } 9413 9414 // Make function globally accessible 9415 window.applyPickupDateRestrictionsFunction = applyPickupDateRestrictions; 9416 9417 9418 // Render address first, then fetch and display delivery dates immediately 9419 async function initializeDeliveryOptions() { 9420 try { 9421 // Check if delivery date elements exist on this page 9422 const deliveryDate = document.getElementById("deliveryDate"); 9423 const deliveryTime = document.getElementById("deliveryTime"); 9424 9425 // Skip if BOTH elements are missing 9426 if (!deliveryDate && !deliveryTime) { 9427 console.log('Both delivery date and time elements not found, skipping delivery date initialization'); 9428 // Still render address for city selection 9429 await renderAddress(); 9430 return; 9431 } 9432 9433 // Log which elements are available 9434 if (!deliveryDate) console.log('deliveryDate element not found, will only render delivery time'); 9435 if (!deliveryTime) console.log('deliveryTime element not found, will only render delivery date'); 9436 9437 // Check if there's stored delivery date data for this product FIRST 9438 const dateStorageKey = getStorageKey('date'); 9439 const storedDateData = getFromStorage(dateStorageKey); 9440 9441 if (storedDateData && storedDateData.date && storedDateData.time) { 9442 // If we have stored date data, render it immediately 9443 const rendered = renderDeliveryDateFromData(storedDateData); 9444 if (!rendered) { 9445 console.warn('Failed to render stored delivery date, will try fetching from API'); 9446 } 9447 } else { 9448 // No stored data, fetch from API immediately (without waiting for city selection) 9449 console.log('No stored delivery date found, fetching from API immediately...'); 9450 9451 // Show skeleton loader while fetching 9452 showDateSkeleton(); 9453 9454 // Fetch delivery date data from API 9455 try { 9456 const dataDate = await getFetch(`${host}/api/shipping/date?domain=${shop}&productId=7881418965207&source=web`); 9457 console.log('API Response:', dataDate); 9458 9459 if (dataDate?.data?.date && dataDate?.data?.time) { 9460 // Save to localStorage for next time 9461 saveToStorage(dateStorageKey, dataDate.data); 9462 9463 // Render the fetched data 9464 const rendered = renderDeliveryDateFromData(dataDate.data); 9465 if (!rendered) { 9466 console.error('Failed to render delivery date from API response'); 9467 showDeliveryPlaceholder(); 9468 } 9469 } else { 9470 console.error('Invalid delivery date data received from API'); 9471 showDeliveryPlaceholder(); 9472 } 9473 } catch (error) { 9474 console.error('Error fetching delivery date from API:', error); 9475 showDeliveryPlaceholder(); 9476 } 9477 } 9478 9479 // Render address to load cities (after dates are already showing) 9480 await renderAddress(); 9481 9482 // Province and zip code will be loaded when city is selected (not on initial render) 9483 9484 } catch (error) { 9485 console.error('Error initializing delivery options:', error); 9486 9487 // Auto refresh on error after 2 seconds 9488 console.log('Auto refreshing page due to error...'); 9489 setTimeout(() => { 9490 // location.reload(); 9491 }, 2000); 9492 } 9493 } 9494 9495 // Initialize delivery options 9496 initializeDeliveryOptions(); 9497 9498 // Helper function to safely initialize Select2 9499 function initSelect2(selector, options = {}) { 9500 const $element = $(selector); 9501 9502 if ($element.length === 0) { 9503 console.warn('Element not found:', selector); 9504 return; 9505 } 9506 9507 // Check if Select2 is already loaded 9508 if (typeof $.fn.select2 !== 'undefined') { 9509 try { 9510 // Destroy existing select2 instance if any 9511 if ($element.hasClass('select2-hidden-accessible')) { 9512 $element.select2('destroy'); 9513 } 9514 // Initialize select2 with merged options 9515 const defaultOptions = { 9516 minimumResultsForSearch: 0, 9517 width: '100%' 9518 }; 9519 $element.select2(Object.assign({}, defaultOptions, options)); 9520 } catch(e) { 9521 console.error('Error initializing Select2 for', selector, ':', e); 9522 } 9523 } else { 9524 // Wait for Select2 to load 9525 console.log('Waiting for Select2 library to load...'); 9526 let attempts = 0; 9527 const maxAttempts = 50; // 5 seconds max 9528 9529 const checkSelect2 = setInterval(function() { 9530 attempts++; 9531 if (typeof $.fn.select2 !== 'undefined') { 9532 clearInterval(checkSelect2); 9533 try { 9534 // Destroy existing select2 instance if any 9535 if ($element.hasClass('select2-hidden-accessible')) { 9536 $element.select2('destroy'); 9537 } 9538 // Initialize select2 with merged options 9539 const defaultOptions = { 9540 minimumResultsForSearch: 0, 9541 width: '100%' 9542 }; 9543 $element.select2(Object.assign({}, defaultOptions, options)); 9544 } catch(e) { 9545 console.error('Error initializing Select2 for', selector, ':', e); 9546 } 9547 } else if (attempts >= maxAttempts) { 9548 clearInterval(checkSelect2); 9549 console.error('Select2 library failed to load after 5 seconds'); 9550 } 9551 }, 100); // Check every 100ms 9552 } 9553 } 9554 9555 async function insertCard(data) { 9556 const response = await fetch(`${host}/api/card/v2/new`, { 9557 method: "POST", 9558 headers: { 9559 'Content-Type': 'application/json', 9560 }, 9561 body: data 9562 }) 9563 const result = await response.json() 9564 let id = result?.data?.id 9565 $(".greetingCard").attr("data-id", id) 9566 return result 9567 } 9568 9569 async function updateCard(id, data){ 9570 console.log(id, data, 'updateCard') 9571 const response = await fetch(`${host}/api/card/v2/${id}`, { 9572 method: "PUT", 9573 headers: { 9574 'Content-Type': 'application/json', 9575 }, 9576 body: data 9577 }) 9578 console.log(response, 'updateCard') 9579 return response 9580 } 9581 9582 function bytesToSize(bytes) { 9583 var sizes = ['b', 'kb', 'mb', 'gb', 'tb', 'p']; 9584 for (var i = 0; i < sizes.length; i++) { 9585 if (bytes <= 1024) { 9586 return bytes + ' ' + sizes[i]; 9587 } else { 9588 bytes = parseFloat(bytes / 1024).toFixed(2) 9589 } 9590 } 9591 return bytes + ' P'; 9592 } 9593 9594 async function uploadMedia(uri, type) { 9595 nameq = $("#properties-nama-penerima").val() 9596 dear = $("#properties-kartu-nama-penerima").val() 9597 card = $("[data-properties=ucapan]").val() 9598 sender = $("#properties-kartu-nama-pengirim").val() 9599 photo = $("#properties-photo").val() 9600 video = $("#properties-video").val() 9601 status = "Product" 9602 9603 const name = qrID 9604 let formData = new FormData(); 9605 formData.append("file", uri); 9606 const response = await fetch(`${host}/api/upload?name=${name}&type=${type}&r=${randomString(3, '0123456789')}&shop=${shop}`, { 9607 method: "POST", 9608 body: formData 9609 }) 9610 const result = await response.json(); 9611 if(result) { 9612 const url = result.url?.replace('outerbloom/', '') 9613 if(type === 'image/jpeg') { 9614 $("#properties-photo").val(url) 9615 $(".preview-image").show() 9616 $(".remove-image").show() 9617 $(".placeholder-image").hide() 9618 // $(".icon-upload").hide() 9619 photo = url 9620 9621 // Trigger card preview update for photo upload 9622 $(document).trigger('cardDataUpdated') 9623 } else { 9624 $("#properties-video").val(url) 9625 $("#label-input-video span").text("Change File") 9626 $(".case-qrcode-preview p").text("Scan here for a secret message") 9627 $(".remove-media").show() 9628 $("#product-top #product-meta .case-video-preview p").html(`<span class="replace-video" tite="Replace Video">${uri.name} (${bytesToSize(uri.size)})</span><span> is uploaded</span>`) 9629 $("[for=input-video]").hide() 9630 video = url 9631 9632 // Trigger card preview update for video upload 9633 $(document).trigger('cardDataUpdated') 9634 } 9635 $(".case-video-preview").show() 9636 $(".steps-card-preview").removeClass("loading") 9637 // updateCard(nameq, dear, card, sender, photo, video, status) 9638 9639 $(".nextBtn").attr("disabled", false) 9640 } 9641 } 9642 9643 function randomString(length, chars) { 9644 var result = ''; 9645 for (var i = length; i > 0; --i) result += chars[Math.round(Math.random() * (chars.length - 1))]; 9646 return result; 9647 } 9648 9649 function getNoteCity(fulldate) { 9650 const h_1 = new Date(new Date().setDate(new Date().getDate() + 1)) 9651 const weekday = ["Min","Sen","Sel","Rab","Kam","Jum","Sab"]; 9652 const monthly = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; 9653 const d = new Date(h_1); 9654 const day = weekday[d.getDay()]; 9655 const dt = d.getDate(); 9656 const mt = monthly[d.getMonth()];
9657 const yr = d.getFullYear(); 9658 const p = $("#cities").parent(".form-group") 9659 } 9660 9661 function disabledSameDay() { 9662 let btnFirst = $("#deliveryDate").find("button:first-child") 9663 let getDay = new Date().getDay(); 9664 9665 // Check if product has CNY 2026 tag - skip disabling if true 9666 9667 console.log('Product has CNY 2026 tag - skipping same day disable logic'); 9668 return; 9669 9670 9671 9672 9673 if(getDay == 1 || getDay == 2 || getDay == 3 || getDay == 4 || getDay == 5){ 9674 if(hour >= 14.00){ 9675 btnFirst.attr("disabled", true) 9676 } 9677 } else if(getDay == 6){ 9678 if(hour >= 16.00){ 9679 btnFirst.attr("disabled", true) 9680 } 9681 } else if(getDay == 0){ 9682 if(hour >= 16.00){ 9683 btnFirst.attr("disabled", true) 9684 } 9685 } 9686 9687 9688 } 9689 9690 function disabledays(date) { 9691 let ymd = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(); 9692 //if u have to disable a list of day 9693 let removeDays 9694 9695 9696 9697 if ($.inArray(ymd, removeDays) >= 0) { 9698 return [false]; 9699 } else { 9700 let day = date.getDay(); 9701 if(day == 0 && date.getDate() == 13 && date.getMonth() == 1){ 9702 return [(day == 0), '']; 9703 } 9704 9705 9706 return [(day != 0), '']; 9707 } 9708 } 9709 ( function( factory ) { 9710 if ( typeof define === "function" && define.amd ) { 9711 9712 // AMD. Register as an anonymous module. 9713 define( [ "../widgets/datepicker" ], factory ); 9714 } else { 9715 9716 // Browser globals 9717 factory( jQuery.datepicker ); 9718 } 9719 }( function( datepicker ) { 9720 9721 // Check if datepicker object exists before accessing regional property 9722 if (typeof datepicker === 'undefined' || !datepicker) { 9723 return; 9724 } 9725 9726 datepicker.regional.id = { 9727 closeText: "Tutup", 9728 prevText: "<mundur", 9729 nextText: "maju>", 9730 currentText: "Today", 9731 monthNames: [ "January","February","March","April","May","Juny", 9732 "July","August","September","October","November","December" ], 9733 monthNamesShort: [ "Jan","Feb","Mar","Apr","May","Jun", 9734 "Jul","Agu","Sep","Oct","Nov","Dec" ], 9735 dayNames: [ "Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu" ], 9736 dayNamesShort: [ "Sun","Mon","Tue","Wed","Thu","Fri","Sat" ], 9737 dayNamesMin: [ "Mg","Sn","Sl","Rb","Km","jm","Sb" ], 9738 weekHeader: "Mg", 9739 dateFormat: "D, dd M", 9740 firstDay: 0, 9741 isRTL: false, 9742 showMonthAfterYear: false, 9743 yearSuffix: "" }; 9744 datepicker.setDefaults( datepicker.regional.id ); 9745 9746 return datepicker.regional.id; 9747 9748} ) ); 9749 9750 function loadPopup() { 9751 $("#backgroundPopup").fadeIn("slow"); 9752 $(".purchasePopup:not(.purchasePopupSpotify)").fadeIn("slow"); 9753 const firstSection = $(".purchasePopup:not(.purchasePopupSpotify) .sectionPurchase").first() 9754 if(firstSection.hasClass("purchasePersonalize")) { 9755 if(productType !== '') { 9756 console.log("clarity event " + productType + ' personalize') 9757 window.clarity("event", `${productType} cardPersonalization`) 9758 // window.clarity("set", productType, `cardPersonalization - ${productDate}`) 9759 } 9760 } else if (firstSection.hasClass("sectionPurchaseBoard")) { 9761 console.log("clarity event " + productType + ' personalizeBoard') 9762 window.clarity("event", `${productType} personalizeBoard`) 9763 // window.clarity("set", productType, `personalizeBoard - ${productDate}`) 9764 } 9765 firstSection.removeClass("hide") 9766 9767 // Load province and zip code when popup opens 9768 const selectedCity = $("#cities").val(); 9769 const v2 = $('#cities option:selected').attr('data-city'); 9770 const v3 = $('#cities option:selected').attr('data-province'); 9771 9772 if (selectedCity && selectedCity !== '' && selectedCity !== 'Kota Lainnya') { 9773 // Get province 9774 getProvince(selectedCity); 9775 9776 // Load zip codes 9777 console.log('Loading zip codes for:', selectedCity); 9778 $("#zip").html(`<option value="">Postal Code</option>`); 9779 renderZip(selectedCity, v2, v3); 9780 } 9781 9782 // Auto-trigger addon loading when addon section becomes visible 9783 setTimeout(function() { 9784 const addonSection = $(".purchaseAddon") 9785 if(addonSection.length > 0 && !addonSection.hasClass("hide")) { 9786 if($("#itemAddons .row").children().length === 0 || $("#itemAddons .row").text().includes("No Item available")) { 9787 $("[data-addon]").eq(0).trigger("click") 9788 } 9789 } 9790 }, 200) 9791 } 9792 9793 function disablePopup() { 9794 $("#backgroundPopup").fadeOut("slow"); 9795 $(".purchasePopup").fadeOut("slow"); 9796 $("#popupCart").fadeOut("slow"); 9797 } 9798
9799 function scrollTo(parent, div, dur) { 9800 $(parent).animate({ 9801 scrollTop: $(div).offset().top 9802 }, dur); 9803 } 9804 9805 function loadPopupPersonalize() { 9806 // First validate variant metafields 9807 if (typeof validateVariantMetafields === 'function') { 9808 const isValid = validateVariantMetafields(true); 9809 if (!isValid) { 9810 // The validateVariantMetafields function already handles scrolling and focusing 9811 // alert('Please select all required variant options before proceeding.'); 9812 return; // Stop execution if validation fails 9813 } 9814 } 9815 9816 const div = "#purchaseProduct" 9817 const p = "html, body, .product-meta" 9818 $("p.error").remove() 9819 loadItemOccasion($("[data-occassion]").eq(0), "greeting-card-all") 9820 const isCity = $("#cities[required]") 9821 const isDate = $("#propDeliveryDate[required]") 9822 const isTime = $("#propDeliveryTime[required]") 9823 const isTimeDisabled = $("#propDeliveryTime[disabled]") 9824 // loadPopup() 9825 // Check if all required fields are filled, or if time is disabled (for no-deliverytime products) 9826 if(isCity.val() !== '' && isDate.val() !== '' && (isTime.val() !== '' || isTimeDisabled.length > 0)) { 9827 loadPopup() 9828 } 9829 if(isCity.val() == '') { 9830 isCity.parent(".row").append("<p class='error'>Choose delivery city</p>") 9831 scrollTo(p, div, 500) 9832 } 9833 if(isDate.val() == '') { 9834 isDate.parents(".row").append("<p class='error'>Choose delivery date</p>") 9835 scrollTo(p, div, 500) 9836 } 9837 if(isTime.val() == '' && isTimeDisabled.length === 0) { 9838 isTime.parents(".row").append("<p class='error'>Choose delivery time</p>") 9839 scrollTo(p, div, 500) 9840 } 9841 } 9842 9843 function quantityCounter() { 9844 $(document).on("click", ".item-card.selected .q_up", function () { 9845 var C = $(this).attr("data-id"), 9846 S = 9847 parseInt( 9848 $(this) 9849 .siblings(".quantity-cart-" + C) 9850 .val() 9851 ) + 1; 9852 $(this).attr("data-quantity", S), 9853 $(this) 9854 .siblings(".quantity-cart-" + C) 9855 .val(S); 9856 }), 9857 $(document).on("click", ".item-card.selected .q_down", function () { 9858 var C = $(this).attr("data-id"), 9859 S = parseInt( 9860 $(this) 9861 .siblings(".quantity-cart-" + C) 9862 .val() 9863 ); 9864 0 < S && $(this).attr("data-quantity", S - 1), 9865 0 < S && 9866 $(this) 9867 .siblings(".quantity-cart-" + C) 9868 .val(S - 1); 9869 }); 9870 } 9871 9872 quantityCounter() 9873 9874 const itemAddon = $(".item-card").length 9875 const nofree = $(".nofree").length 9876 9877 const upsell = '' 9878 9879 if(nofree === itemAddon) { 9880 // $("#itemAddons").html("<p>No Items available</p>") 9881 } 9882 9883 $("#itemAddons .item-card").each(function(e){ 9884 $("#itemAddons").attr("data-length", e) 9885 }) 9886 9887 // Function to fetch products from collection with fallback 9888 async function fetchAddonProducts(collectionHandle) { 9889 try { 9890 const response = await fetch(`https://outerbloom.com/collections/${collectionHandle}/products.json`); 9891 9892 if (!response.ok) { 9893 throw new Error(`Collection ${collectionHandle} not found`); 9894 } 9895 9896 const data = await response.json(); 9897 9898 // Check if products exist and have items 9899 if (!data.products || data.products.length === 0) { 9900 throw new Error(`No products in collection ${collectionHandle}`); 9901 } 9902 9903 return data.products; 9904 } catch (error) { 9905 console.warn(`Error fetching ${collectionHandle}:`, error.message); 9906 9907 // Fallback to "upsell-all" collection if primary collection fails 9908 if (collectionHandle !== 'upsell-all') { 9909 console.log('Falling back to upsell-all collection...'); 9910 try { 9911 const fallbackResponse = await fetch('https://outerbloom.com/collections/upsell-all/products.json'); 9912 if (fallbackResponse.ok) { 9913 const fallbackData = await fallbackResponse.json(); 9914 return fallbackData.products || []; 9915 } 9916 } catch (fallbackError) { 9917 console.error('Fallback also failed:', fallbackError); 9918 } 9919 } 9920 9921 return []; 9922 } 9923 } 9924 9925 // Function to determine upsell type from product tags 9926 function getUpsellType() { 9927 const productTags = ["Brand_Outerbloom Hampers","card","CNY","CNY 2026","Collection_Heritage","custom-hampers","formdate","icon-card","icon-gift","Inhouse","MonSatParcel","MonSatSiang","no-deliverytime","Parcel","Parcel CNY","Parcel Inhouse","Parcel Nusantara","Pengiriman_Bekasi","Pengiriman_Bogor","Pengiriman_Depok","Pengiriman_Jakarta","Pengiriman_Kota Lainnya","Pengiriman_Tangerang","POO Parcel","ship-paketkecil","takeoutselfpickup","Untuk_Hari Raya","uploadfotocard","upsell-inhouse"]; 9928 const hasBuketUang = productTags.includes('Buket Uang'); 9929 9930 if (hasBuketUang) { 9931 return 'upsell-giftcard'; 9932 } 9933 9934 // Find upsell tag 9935 for (const tag of productTags) { 9936 if (tag.startsWith('upsell-')) { 9937 return tag; 9938 } else if (tag === 'upsell') { 9939 return 'upsell-all'; 9940 } 9941 } 9942 9943 return 'upsell-giftcard'; // Default fallback 9944 } 9945 9946 // Function to render addon products 9947 function renderAddonProducts(products, filterTag) { 9948 const html = []; 9949 9950 for (const product of products) { 9951 const id = product.id; 9952 const variant = product.variants[0]; 9953 const variantId = variant.id; 9954 const img = product.images[0]?.src || ''; 9955 const imgBase = img.split('.jpg')[0]; 9956 const title = product.title; 9957 const price = variant.price; 9958 const tags = product.tags; 9959 const isAvailable = variant.available !== false; 9960 const productType = product.product_type?.toLowerCase()?.replace(/\s+/g, '_') || ''; 9961 9962 // Filter products based on tag 9963 const shouldInclude = filterTag === 'all' || 9964 tags.includes(`upsell-item-${filterTag}`) || 9965 tags.includes('upsell-item-all') || 9966 tags.includes('upsell-item-inhouse'); 9967 9968 if (!shouldInclude) continue; 9969 9970 const priceDisplay = price < 1 ? 'FREE' : rupiah.format(price); 9971 const cardClass = `item-card${price < 1 ? ' free' : ' nofree'} type-${productType}`; 9972 9973 const body = ` 9974 <div class="${cardClass}" data-variant="${variantId}" data-id="${id}" data-qty="${isAvailable ? '' : 0}" data-upsell="${filterTag}" data-tags="${tags}"> 9975 <div class="card-image"> 9976 <img src="${imgBase}_150x.jpg" alt="${title}" width="" height="" /> 9977 </div> 9978 <div class="card-meta"> 9979 <h5>${title}</h5> 9980 <p>${priceDisplay}</p> 9981 <input id="card-${variantId}" type="hidden" name="" value="${variantId}"> 9982 </div> 9983 <div class="card-qty"> 9984 <a data-quantity="1" type="submit" id="q_down-${variantId}" class="btn-qty-min q_down drawer-cart" data-id="${variantId}"> 9985 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="2" viewBox="0 0 12 2" fill="none"> 9986 <path d="M0 1.90869V0.908691H12V1.90869H0Z" fill="black"/> 9987 </svg> 9988 </a> 9989 <input maxlength="3" min="0" class="btn-qty text-center quantity-cart-${variantId}
9989" value="0" data-price="${price}" name="quantity"> 9990 <a data-quantity="1" type="submit" class="btn-qty-plus q_up text-green drawer-cart" data-id="${variantId}"> 9991 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="13" viewBox="0 0 12 13" fill="none"> 9992 <path d="M0 6.87023V5.94715H5.53846V0.408691H6.46154V5.94715H12V6.87023H6.46154V12.4087H5.53846V6.87023H0Z" fill="black"/> 9993 </svg> 9994 </a> 9995 </div> 9996 </div>`; 9997 9998 html.push(body); 9999 } 10000 10001 return html; 10002 } 10003 10004 // Event handler for addon selection 10005 $("[data-addon]").click(async function() { 10006 const $button = $(this); 10007 const addonType = $button.data("addon") || getUpsellType(); 10008 10009 // Update UI 10010 $("[data-addon]").removeClass("selected"); 10011 $button.addClass("selected"); 10012 10013 // Show loading state 10014 $("#itemAddons .row").html('<p>Loading products...</p>'); 10015 10016 try { 10017 // Fetch products 10018 const products = await fetchAddonProducts(addonType); 10019 10020 if (products.length === 0) { 10021 $("#itemAddons .row").html('<p>No Item available</p>'); 10022 $("#itemAddons").attr("data-length", 0); 10023 return; 10024 } 10025 10026 // Extract filter tag from addon type 10027 const filterTag = addonType.replace('upsell-', ''); 10028 10029 // Render products 10030 const html = renderAddonProducts(products, filterTag); 10031 10032 if (html.length === 0) { 10033 $("#itemAddons .row").html('<p>No Item available</p>'); 10034 } else { 10035 $("#itemAddons .row").html(html.join('')); 10036 } 10037 10038 $("#itemAddons").attr("data-length", html.length); 10039 10040 } catch (error) { 10041 console.error('Error loading addon products:', error); 10042 $("#itemAddons .row").html('<p>Error loading products. Please try again.</p>'); 10043 } 10044 }) 10045 10046 async function isAddon(){ 10047 let ids = [] 10048 $("#itemAddons .item-card.selected").each(function(i, e){ 10049 const id = $(this).data("id") 10050 ids.push(id) 10051 }) 10052 console.log(ids) 10053 return ids 10054 } 10055 10056 $("#itemAddons").delegate(".item-card > div:not(.card-qty)", "click", async function(){ 10057 const t = $(this).parent() 10058 const id = t.data("id") 10059 const btn = t.parents(".purchaseAddon").find(".next-purchase-button") 10060 t.toggleClass("selected"); 10061 //$(this).next("input").toggleAttr('name', 'id[]'); 10062 if (t.hasClass('selected')) { 10063 t.find("input").val(1) 10064 t.find("input").attr('name', 'id[]'); 10065 } else { 10066 t.find("input").val(0) 10067 t.find("input").removeAttr('name'); 10068 } 10069 $("#properties-addons").val(addons) 10070 const is = await isAddon() 10071 if(is.length === 0) { 10072 btn.text("continue without add-ons") 10073 return 10074 } 10075 if(is.includes(8835692069079)) { 10076 btn.text("personalize acrylic frame") 10077 } else { 10078 btn.text("Continue") 10079 } 10080 10081 }) 10082 10083 async function myAddon(data) { 10084 const c = $(".addonsPurchase .addons") 10085 let items = [] 10086 10087 const spotifyAddons = $(".spotifyAddons").find("[data-index]") 10088 // if(spotifyAddons.length > 0) { 10089 // $(spotifyAddons).each(function(i, e){ 10090 // const spotifyLink = $(this).find(".spotifyLink").val() 10091 // const spotifySong = $(this).find(".spotifySong").val() 10092 // const spotifyArtist = $(this).find(".spotifyArtist").val() 10093 // const spotifyFotoAddon = $(this).find(".resultPhotoSpotify").val() 10094 // if(spotifyLink !== '') { 10095 // spotifyAddon = `<div class="addon-item" data-id="46067682607319" data-qty="1"> 10096 // <div class="addon-itm-img"> 10097 // <img src="https://cdn.shopify.com/s/files/1/1589/6833/files/Acrylic-Frame_8c71027d-43b7-4322-a98f-d34ab0456397_100x.jpg?v=1739160467" alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" width="70"/> 10098 // </div> 10099 // <div class="addon-itm-title"> 10100 // <span>[US] Outerbloom Acrylic Frame 4R</span> 10101 // </div> 10102 // <div class="addon-itm-line-total">
10103 // <span>Rp 99.000</span> 10104 // </div> 10105 // </div> 10106 // <div class="propsAddonSpotify row m-0"> 10107 // <div class="col-12 col-lg-2"></div> 10108 // <div class="col-12 col-lg-10"> 10109 // <p> 10110 // <span>spotify link</span> 10111 // <span class="spotifyLinkAddon">${spotifyLink}</span> 10112 // </p> 10113 // <p> 10114 // <span>uploaded photo</span> 10115 // <span class="spotifyFotoAddon">${spotifyFotoAddon}</span> 10116 // </p> 10117 // <p> 10118 // <span>song / playlist name</span> 10119 // <span class="spotifySongAddon">${spotifySong}</span> 10120 // </p> 10121 // <p> 10122 // <span>artist name</span> 10123 // <span class="spotifyArtistAddon">${spotifyArtist}</span> 10124 // </p> 10125 // </div> 10126 // </div>` 10127 // items.push(spotifyAddon) 10128 // } 10129 // }) 10130 // } 10131 for(let i = 0; i < data.length; i++) { 10132 if(data[i].title !== '[US] Outerbloom Acrylic Frame 4R' ) { 10133 const img = data[i].image 10134 const title = data[i].title 10135 const qty = data[i].qty 10136 const price = data[i].price 10137 const total = Number(qty) * Number(price) 10138 let addons = `<div class="addon-item" data-id="${data[i].id}" data-qty="${qty}"> 10139 <div class="addon-itm-img"> 10140 <img src="${img}" alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" width="70"/> 10141 </div> 10142 <div class="addon-itm-title"> 10143 <span>${title}</span> 10144 </div> 10145 <div class="addon-itm-line-price"> 10146 <span>${rupiah.format(price)}</span> 10147 ${data[i].title == '[US] Outerbloom Acrylic Frame 4R' ? '' : `<span>x${qty}</span>`} 10148 </div> 10149 <div class="addon-itm-line-total"> 10150 <span>${rupiah.format(total)}</span> 10151 </div> 10152 </div>` 10153 items.push(addons) 10154 } 10155 } 10156 c.html(items) 10157 const parent = $(".purchaseAddon") 10158 const next = parent.next(".sectionPurchase") 10159 parent.addClass("hide") 10160 next.removeClass("hide") 10161 // if(items2.length === 0) return $("#popupCart").addClass("no-addon-cart") 10162 // $(".itemAddonCart").find("h4").text(`add-ons (${items2.length})`) 10163 } 10164 10165 async function listAddon() { 10166 const data = $("#itemAddons").find(".selected") 10167 let ids = [] 10168 $(data).each(function(){ 10169 const id = $(this).data("variant") 10170 const image = $(this).find(".card-image img").attr("src") 10171 const title = $(this).find(".card-meta h5").text() 10172 const qty = $(this).find(".card-qty input").val() 10173 const price = $(this).find(".card-qty input").data("price") 10174 ids.push({ 10175 id: Number(id), 10176 image, 10177 title, 10178 qty, 10179 price 10180 }) 10181 }) 10182 myAddon(ids) 10183 } 10184 10185 async function customSpotify(idx, length, type){ 10186 let isCard = false 10187 10188 isCard = true 10189 10190 let p = $(".purchasePopupSpotify") 10191 const preLink = $(".spotifyLinkFirst").val() 10192 $("[data-index]").hide() 10193 p.find(".headerPurchase h3").text(`personalize spotify photo print${length > 1 ? ` - ${idx}` : ''}`) 10194 p.find(".regulerAddons, .purchase-button").hide() 10195 p.find(".spotifyAddons").show() 10196 10197 const data = await trackUrl(preLink) 10198 10199 const html = `<div class="row" data-index=${idx} data-length=${length}><div class="col-12 col-lg-6"><div class="form-vertical position-relative"><div class="form-group mb-4"><h4>upload photo</h4><div class=uploadResult><label class=btn for=uploadPhotoSpotify><svg xmlns="http://www.w3.org/2000/svg" width="13" height="11" viewB
10199ox="0 0 13 11" fill="none"> 10200<path d="M0.875 10.6378H12.375C12.4413 10.6378 12.5049 10.6115 12.5518 10.5646C12.5987 10.5177 12.625 10.4541 12.625 10.3878V0.387817C12.625 0.321513 12.5987 0.257925 12.5518 0.211041C12.5049 0.164157 12.4413 0.137817 12.375 0.137817H0.875C0.808696 0.137817 0.745107 0.164157 0.698223 0.211041C0.651339 0.257925 0.625 0.321513 0.625 0.387817V10.3878C0.625 10.4541 0.651339 10.5177 0.698223 10.5646C0.745107 10.6115 0.808696 10.6378 0.875 10.6378ZM1.125 10.1378V7.31882C1.136 7.31082 1.1485 7.30632 1.1585 7.29632L3.7165 4.73832C3.78198 4.67584 3.869 4.64098 3.9595 4.64098C4.05 4.64098 4.13702 4.67584 4.2025 4.73832L7.963 8.49882C8.00919 8.54501 8.07162 8.5713 8.13694 8.57204C8.20225 8.57279 8.26527 8.54794 8.3125 8.50282L10.2455 6.66682C10.3084 6.60323 10.3938 6.56684 10.4832 6.56543C10.5727 6.56403 10.6591 6.59774 10.724 6.65932L12.125 8.18532L12.1255 8.18582V10.1378H1.125ZM12.125 0.637817V7.44682L11.0845 6.31382C11.0066 6.23514 10.9138 6.17275 10.8116 6.13026C10.7094 6.08777 10.5997 6.06603 10.489 6.06632H10.4885C10.3786 6.06584 10.2697 6.08706 10.168 6.12876C10.0664 6.17046 9.97391 6.23182 9.896 6.30932L8.144 7.97332L4.556 4.38482C4.2365 4.06582 3.6815 4.06632 3.363 4.38482L1.125 6.62332V0.637817H12.125Z" fill="black"/> 10201</svg><span>Upload your file</span></label></div><input class="uploadPhotoSpotify form-control d-none" accept=image/* type=file><input class="resultPhotoSpotify" type="hidden"></div><div class="form-group mb-5"><h4>Add your Spotify link here</h4> <input class="spotifyLink2 form-control spotifyLink" value="${preLink}" placeholder=https://open.spotify.com/ ></div><div class="form-group mb-4 text-left"><label class=checkbox for=isCustomMessage><span>Personalized Message</span><span class=checkmark></span></label></div><div class="form-group mb-4 form-personalize"><label class="text-left d-block mb-2 text-uppercase"for=spotifySong>Song / playlist name</label> ${data?.song ? `<input class="form-control spotifySong" value="${data?.song}">` : '<input class="form-control spotifySong" value="">'}</div><div class="form-group form-personalize"><label class="text-left d-block mb-2 text-uppercase"for=spotifyArtist>Artist name</label> ${data?.artist ? `<input class="form-control spotifyArtist" value="${data?.artist}">` : '<input class="form-control spotifyArtist" value="">'}</div><div class=btn-action><button class="back-spotify"><svg fill=none height=14 viewBox="0 0 15 14"width=15 xmlns=http://www.w3.org/2000/svg><path d="M14.5799 7.41992L2.32992 7.41992L7.57992 12.6699L6.91992 13.4199L0.419922 6.91992L6.91992 0.419922L7.57992 1.16992L2.32992 6.41992L14.5799 6.41992V7.41992Z"fill=black /></svg> <span>Back</span></button><button data-type="${isCard ? 'card' : ''}" ${isCard ? '' : 'id=addtocart-card'} class="text-uppercase btn w-100${type == 'addon' && idx == length ? ' finished' : ' no-addon'}" disabled>${isCard ? 'Continue Personalizing' : 'add to cart'}</button></div></div></div><div class="col-12 col-lg-6 columnRight"><div class=frame-spotify><div class=frameImage><div class=frameImageUploaded><svg xmlns="http://www.w3.org/2000/svg" width="13" height="11" viewB
10201ox="0 0 13 11" fill="none"> 10202<path d="M0.875 10.6378H12.375C12.4413 10.6378 12.5049 10.6115 12.5518 10.5646C12.5987 10.5177 12.625 10.4541 12.625 10.3878V0.387817C12.625 0.321513 12.5987 0.257925 12.5518 0.211041C12.5049 0.164157 12.4413 0.137817 12.375 0.137817H0.875C0.808696 0.137817 0.745107 0.164157 0.698223 0.211041C0.651339 0.257925 0.625 0.321513 0.625 0.387817V10.3878C0.625 10.4541 0.651339 10.5177 0.698223 10.5646C0.745107 10.6115 0.808696 10.6378 0.875 10.6378ZM1.125 10.1378V7.31882C1.136 7.31082 1.1485 7.30632 1.1585 7.29632L3.7165 4.73832C3.78198 4.67584 3.869 4.64098 3.9595 4.64098C4.05 4.64098 4.13702 4.67584 4.2025 4.73832L7.963 8.49882C8.00919 8.54501 8.07162 8.5713 8.13694 8.57204C8.20225 8.57279 8.26527 8.54794 8.3125 8.50282L10.2455 6.66682C10.3084 6.60323 10.3938 6.56684 10.4832 6.56543C10.5727 6.56403 10.6591 6.59774 10.724 6.65932L12.125 8.18532L12.1255 8.18582V10.1378H1.125ZM12.125 0.637817V7.44682L11.0845 6.31382C11.0066 6.23514 10.9138 6.17275 10.8116 6.13026C10.7094 6.08777 10.5997 6.06603 10.489 6.06632H10.4885C10.3786 6.06584 10.2697 6.08706 10.168 6.12876C10.0664 6.17046 9.97391 6.23182 9.896 6.30932L8.144 7.97332L4.556 4.38482C4.2365 4.06582 3.6815 4.06632 3.363 4.38482L1.125 6.62332V0.637817H12.125Z" fill="black"/> 10203</svg> <img src="" class=previewImage style=display:none></div></div><div class=frameControl><div class=spotifyData>${data?.song ? `<h3>${data?.song}</h3>` : '<h3><h3>'}${data?.artist ? `<p>${data?.artist}</p>` : '<p></p>'}</div><img src="https://outerbloom.com/cdn/shop/t/138/assets/frame-spotify.png?v=138221849636560654691752652420"alt="spotify outerbloom" height=""width=100%><div class=spotifyCode><img src="https://scannables.scdn.co/uri/plain/png/FFFFFF/black/640/spotify:${data?.type.slice(0, -1)}:${data?.trackId}"alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman"></div></div></div></div></div>` 10204 // console.log(html) 10205 10206 $(".spotifyAddons").append(html) 10207 10208 $(`[data-index=${idx}]`).show() 10209 10210 if (preLink !== '') { 10211 $(".btn-action .btn").attr("disabled", false) 10212 } else { 10213 $(".btn-action .btn").attr("disabled", true) 10214 } 10215 10216 return html 10217 10218 } 10219 10220 $(".spotifyLinkFirst").keyup(async function(){ 10221 const v = $(this).val() 10222 if(v.includes('spotify:user:spotify')) { 10223 const correct = v.split('user:spotify:')[1] 10224 console.log(correct, 'BNER') 10225 $(this).val(correct) 10226 return 10227 } 10228 if(v.includes("spotify:") || v.includes("https://open.spotify.com/")){ 10229 const data = await trackUrl(v) 10230 if(!data || !data.status) { 10231 $(this).parent().addClass("error") 10232 // $(this).parent().append(`<p class="txt-error">Make sure you copy the complete and correct link from Spotify. Ex: https://open.spotify.com/track/0C3xZJueyBvvMSsl0cETA6</p>`) 10233 $("#personalizeBtnSpotify .btn").attr("disabled", true) 10234 return 10235 } 10236 $(this).parent().removeClass("error") 10237 // $(this).parent().remove("txt-error") 10238 $("#personalizeBtnSpotify .btn").attr("disabled", false) 10239 } else { 10240 $("#personalizeBtnSpotify .btn").attr("disabled", true) 10241 } 10242 }) 10243 10244 $(".purchaseAddon").delegate(".next-addon", "click", async function(){ 10245 const parent = $(this).parents(".purchaseAddon") 10246 const next = parent.next(".sectionPurchase") 10247 10248 // Check if there's no next section, proceed directly to addToCart 10249 if(next.length === 0 || !next.hasClass("sectionPurchase")) { 10250 await addToCart() 10251 return 10252 } 10253 10254 if(next.hasClass("purchaseAddress")) { 10255 if(productType !== '') { 10256 console.log("clarity event " + productType + ' purchaseDelivery') 10257 window.clarity("event", `${productType} purchaseDelivery`) 10258 // window.clarity("set", productType, `purchaseDelivery - ${productDate}`) 10259 } 10260 10261 // Check if Kota Pengiriman is "Kota Lainnya" 10262 const kotaPengiriman = $("#cities").val() 10263 if(kotaPengiriman === 'Kota Lainnya') { 10264 // Skip address form and go directly to addToCart 10265 await addToCart() 10266 return 10267 } 10268 } 10269 const data = $("#itemAddons").find(".selected") 10270 const length = $(".quantity-cart-46067682607319").val() 10271 const checked = data.length; 10272 if(checked > 0) { 10273 if(length > 0) { 10274 $(".purchaseAddon").addClass("purchaseAddonSpotify") 10275 customSpotify(1, length, 'addon') 10276 } else { 10277 listAddon() 10278 } 10279 } else { 10280 parent.addClass("hide") 10281 next.removeClass("hide") 10282 } 10283 }) 10284 10285 $("#personalizeBtnSpotify .btn").click(async function(){ 10286 // First validate variant metafields 10287 if (typeof validateVariantMetafields === 'function') { 10288 const isValid = validateVariantMetafields(true); 10289 if (!isValid) { 10290 // The validateVariantMetafields function already handles scrolling and focusing 10291 alert('Please select all required variant options before proceeding.'); 10292 return; // Stop execution if validation fails 10293 } 10294 } 10295 10296 const isCity = $("#cities[required]") 10297 const isDate = $("#propDeliveryDate[required]") 10298 if((isDate.length > 0 && isCity.length > 0) && (isCity.val() === '' || isDate.val() === '')) { 10299 alert('Please choose Delivery City & Delivery Date') 10300 return 10301 } 10302 const data = await customSpotify(1, 1, 'product') 10303 if(data) { 10304 $("#backgroundPopup").fadeIn("slow"); 10305 $(".purchasePopupSpotify").fadeIn("slow"); 10306 10307 if(productType !== '') { 10308 console.log("clarity event " + productType + ' spotify') 10309 window.clarity("event", `${productType} spotify`) 10310 // window.clarity("set", productType, `purchaseDelivery - ${productDate}`) 10311 } 10312 } 10313 }) 10314 10315 function formatBytes(bytes, decimals = 2) { 10316 if (!+bytes) return '0 Bytes' 10317
10318 const k = 1024 10319 const dm = decimals < 0 ? 0 : decimals 10320 const sizes = ['B', 'KB', 'MB'] 10321 10322 const i = Math.floor(Math.log(bytes) / Math.log(k)) 10323 10324 return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}` 10325 } 10326 10327 async function trackUrl(link){ 10328 try { 10329 let trackId = link.split('/').pop().split('?')[0]; 10330 let type = '' 10331 if(link.includes("spotify:")) { 10332 const uri = link.split('spotify:')[1] 10333 trackId = uri.split(':')[1] 10334 type = uri.split(':')[0] + 's' 10335 } else { 10336 if(link.match('track')){ 10337 type = 'tracks' 10338 } else if(link.match('playlist')) { 10339 type = 'playlists' 10340 } else if(link.match('artist')) { 10341 type = 'artists' 10342 } else if(link.match('album')) { 10343 type = 'albums' 10344 } 10345 } 10346 console.log(`${host}/api/spotify/${type}/${trackId}`) 10347 const data = await getFetch(`${host}/api/spotify/${type}/${trackId}`) 10348 console.log(data, 'DATA') 10349 const song = data?.data?.name 10350 const artist = data?.data?.artist 10351 return { 10352 song, artist, type, trackId, status: data.status 10353 } 10354 } catch(err) { 10355 console.log(err) 10356 } 10357 } 10358 10359 $(".spotifyAddons").delegate(".uploadPhotoSpotify", "change", async function(){ 10360 const parent = $(this).parents("[data-index]") 10361 const preview = parent.find(".previewImage") 10362 const file = $(this)[0].files[0]; 10363 if (file) { 10364 const reader = new FileReader(); 10365 reader.onload = async function(e) { 10366 parent.find(".uploadResult label").hide() 10367 parent.find(".uploadedResult").remove() 10368 parent.find(".uploadResult").append(`<div class="uploadedResult d-flex" style="justify-content: space-between"> 10369 <p style="text-align: left;margin: 0;"><span style="color: #34C759;font-style: italic;font-size: 14px;text-overflow: ellipsis;overflow: hidden;max-width: 250px;white-space: nowrap;display: inline-block;vertical-align: middle;">${file.name}</span><span style="font-size: 14px;color: #34C759"> (${formatBytes(file.size)})</span> <span style="font-size: 14px">is uploaded</span></p> 10370 <div style="align-self: center"><span class="changeUpload" style="font-size: 12px;cursor: pointer">Change</span><span class="removeUpload" style="cursor: pointer;border-left: 1px solid;padding-left: 10px;margin-left: 10px;height: 10px;display: inline-flex;vertical-align: middle;">
10370<svg fill="none" height="11" viewBox="0 0 10 11" width="10" xmlns="http://www.w3.org/2000/svg"> 10371 <path d="M2.07799 10.8332C1.78154 10.8332 1.52799 10.7276 1.31732 10.5165C1.10666 10.3054 1.0011 10.0523 1.00066 9.75716V1.49982H0.667322C0.572656 1.49982 0.493545 1.46782 0.429989 1.40382C0.366433 1.33982 0.334433 1.26049 0.333989 1.16582C0.333544 1.07116 0.365545 0.992047 0.429989 0.928491C0.494433 0.864935 0.573545 0.833158 0.667322 0.833158H3.00066C3.00066 0.69538 3.05177 0.57538 3.15399 0.473158C3.25621 0.370935 3.37621 0.319824 3.51399 0.319824H6.48732C6.6251 0.319824 6.7451 0.370935 6.84732 0.473158C6.94954 0.57538 7.00066 0.69538 7.00066 0.833158H9.33399C9.42866 0.833158 9.50777 0.865158 9.57132 0.929158C9.63488 0.993158 9.66688 1.07249 9.66732 1.16716C9.66777 1.26182 9.63577 1.34094 9.57132 1.40449C9.50688 1.46805 9.42777 1.49982 9.33399 1.49982H9.00066V9.75649C9.00066 10.0525 8.8951 10.3058 8.68399 10.5165C8.47288 10.7272 8.21954 10.8327 7.92399 10.8332H2.07799ZM8.33399 1.49982H1.66732V9.75649C1.66732 9.87605 1.70577 9.97427 1.78266 10.0512C1.85954 10.128 1.95799 10.1665 2.07799 10.1665H7.92399C8.04354 10.1665 8.14177 10.128 8.21866 10.0512C8.29554 9.97427 8.33399 9.87605 8.33399 9.75649V1.49982ZM3.87266 8.83316C3.96732 8.83316 4.04666 8.80116 4.11066 8.73716C4.17466 8.67316 4.20643 8.59405 4.20599 8.49982V3.16649C4.20599 3.07182 4.17399 2.99271 4.10999 2.92916C4.04599 2.8656 3.96666 2.8336 3.87199 2.83316C3.77732 2.83271 3.69821 2.86471 3.63466 2.92916C3.5711 2.9936 3.53932 3.07271 3.53932 3.16649V8.49982C3.53932 8.59449 3.57132 8.6736 3.63532 8.73716C3.69932 8.80116 3.77843 8.83316 3.87266 8.83316ZM6.12932 8.83316C6.22399 8.83316 6.3031 8.80116 6.36666 8.73716C6.43021 8.67316 6.46199 8.59405 6.46199 8.49982V3.16649C6.46199 3.07182 6.42999 2.99271 6.36599 2.92916C6.30199 2.86516 6.22288 2.83316 6.12866 2.83316C6.03399 2.83316 5.95466 2.86516 5.89066 2.92916C5.82666 2.99316 5.79488 3.07227 5.79532 3.16649V8.49982C5.79532 8.59449 5.82732 8.6736 5.89132 8.73716C5.95532 8.80071 6.03466 8.83271 6.12932 8.83316Z"fill=#757575 /> 10372</svg> 10373</span></div></div>`) 10374 parent.find(".frameImageUploaded svg").hide() 10375 parent.find(".frameImage").addClass("uploaded") 10376 preview.attr("src", e.target.result); 10377 preview.show(); 10378 let formData = new FormData(); 10379 formData.append("file", file); 10380 const response = await fetch(`${host}/api/upload?name=${file.name}&type=image/jpeg&r=${Date.parse(new Date)}&shop=${shop}`, { 10381 method: "POST", 10382 body: formData 10383 }) 10384 const result = await response.json(); 10385 if(result){ 10386 parent.find(".resultPhotoSpotify").val(result.url) 10387 } 10388 } 10389 10390 reader.readAsDataURL(file); 10391 } else { 10392 preview.hide(); 10393 } 10394 }); 10395 10396 $(".spotifyAddons").delegate(".uploadResult", "click", function(){ 10397 $(this).next("input[type=file]").trigger("click") 10398 }) 10399 10400 $(".spotifyAddons").delegate(".changeUpload", "click", function(){ 10401 $(this).parents("input[type=file]").trigger("click") 10402 }) 10403 10404 $(".spotifyAddons").delegate(".removeUpload", "click", function(){ 10405 const parent = $(this).parents("[data-index]") 10406 parent.find(".uploadPhotoSpotify").val("") 10407 parent.find(".uploadResult label").show() 10408 parent.find(".uploadedResult").remove() 10409 parent.find(".frameImageUploaded svg").show() 10410 parent.find(".previewImage").hide() 10411 parent.find(".frameImage").removeClass("uploaded") 10412 }) 10413 10414 $(".spotifyAddons").delegate("label.checkbox", "click", function(){ 10415 const parent = $(this).parents("[data-index]") 10416 parent.toggleClass("checked") 10417 }) 10418 10419 $(".spotifyAddons").delegate(".spotifyLink", "change", async function(){ 10420 const parent = $(this).parents("[data-index]") 10421 const link = $(this).val() 10422 const data = await trackUrl(link) 10423 10424 console.log(data) 10425 10426 if(data.song) { 10427 parent.find(".spotifySong").val(data.song) 10428 parent.find(".spotifyData").find("h3").text(data.song) 10429 } 10430 if(data.artist) { 10431 parent.find(".spotifyArtist").val(data.artist) 10432 parent.find(".spotifyData").find("p").text(data.artist) 10433 } 10434 parent.find(".spotifyCode img").attr("src", `https://scannables.scdn.co/uri/plain/png/FFFFFF/black/640/spotify:${data.type.slice(0, -1)}:${data.trackId}`) 10435 // https://scannables.scdn.co/uri/plain/png/FFFFFF/black/640/spotify:track:1er51HCEBhIAtoEemKuC3M 10436 if (data.status === true) { 10437 parent.find(".btn-action .btn").attr("disabled", false) 10438 } else { 10439 parent.find(".btn-action .btn").attr("disabled", true) 10440 } 10441 }) 10442
10443 $(".spotifyAddons").delegate(".spotifySong", "keyup", async function(){ 10444 const parent = $(this).parents("[data-index]") 10445 const v = $(this).val() 10446 parent.find(".spotifyData h3").text(v) 10447 }) 10448 10449 $(".spotifyAddons").delegate(".spotifyArtist", "keyup", async function(){ 10450 const parent = $(this).parents("[data-index]") 10451 const v = $(this).val() 10452 parent.find(".spotifyData p").text(v) 10453 }) 10454 10455 $(".spotifyAddons").delegate(".btn-action .btn:not(.no-addon)", "click", async function(){ 10456 const parent = $(this).parents("[data-index]") 10457 const length = parent.data("length") 10458 const index = parent.data("index") 10459 const indexNext = Number(index) + 1 10460 customSpotify(indexNext, length, 'addon') 10461 }) 10462 10463 10464 $(".spotifyAddons").delegate(".btn-action .btn.finished", "click", async function(){ 10465 const parent = $(this).parents(".purchaseAddon") 10466 const next = parent.next(".sectionPurchase") 10467 parent.addClass("hide") 10468 next.removeClass("hide") 10469 next.find(".purchase-button").show() 10470 listAddon() 10471 }) 10472 10473 $(".spotifyAddons").delegate(".back-spotify", "click", async function(){ 10474 const t = $(this).parents("[data-index]") 10475 const parent = $(this).parents(".sectionPurchase") 10476 const current = t.data("index") 10477 const prevCurrent = Number(current) - 1 10478 if(current == 1) { 10479 parent.removeClass("purchaseAddonSpotify") 10480 parent.find(".purchase-button").show() 10481 parent.find(".headerPurchase h3").text("Make It More Special with Add-Ons!") 10482 $(".spotifyAddons").empty() 10483 $(".regulerAddons").show() 10484 return 10485 } 10486 t.hide() 10487 t.prev("[data-index]").show() 10488 t.remove() 10489 parent.find(".headerPurchase h3").text(`personalize spotify photo print - ${prevCurrent}`) 10490 }) 10491 10492 $("#personalizeBtn .btn").click(async function() { 10493 loadPopupPersonalize() 10494 }); 10495 10496 $(".sectionPurchaseSpotify").delegate(".btn[data-type=card]", "click", function(){ 10497 $(".sectionPurchaseSpotify").hide() 10498 loadPopupPersonalize() 10499 }) 10500 10501 $(".close-purchase-popup").click(function() { 10502 disablePopup(); 10503 }); 10504 $("#backgroundPopup").click(function() { 10505 // disablePopup(); 10506 }); 10507 10508 $("#popupCart .close-purchase-popup").click(function() { 10509 location.reload() 10510 }); 10511 10512 $('#popupCart').on('hide.bs.modal', function (e) { 10513 location.reload() 10514 }) 10515 10516 $(".next-card").click(function(){ 10517 const parent = $(this).parents(".sectionPurchase") 10518 const next = parent.next(".sectionPurchase") 10519 parent.addClass("hide") 10520 next.removeClass("hide") 10521 }) 10522 10523 $(".back-purchase-button").click(function(){ 10524 const parent = $(this).parents(".sectionPurchase") 10525 const prev = parent.prev(".sectionPurchase") 10526 parent.addClass("hide") 10527 prev.removeClass("hide") 10528 }) 10529 10530 $(document).keypress(function(e) { 10531 if (e.keyCode == 27 && popupStatus == 1) { 10532 disablePopup(); 10533 } 10534 }); 10535 10536 const parentImg = $(".case-img-preview") 10537 const parentVid = $(".case-video-preview") 10538
10539 // Image Editor Variables 10540 let currentImageFile = null; 10541 let cropper = null; 10542 let originalImageSize = { width: 0, height: 0 }; 10543 10544 // Utility function to format file size 10545 function formatImageSize(width, height) { 10546 return `${width} à ${height}px`; 10547 } 10548 10549 // Utility function to estimate file size in bytes 10550 function estimateFileSize(width, height, quality = 0.9) { 10551 // Base calculation: assume ~3 bytes per pixel for JPEG at 90% quality 10552 const baseSize = width * height * 3; 10553 10554 // Apply quality factor (90% quality typically results in ~30-40% compression) 10555 const compressionFactor = quality === 0.9 ? 0.35 : (1 - quality) * 0.5 + 0.2; 10556 10557 const estimatedSize = Math.round(baseSize * compressionFactor); 10558 10559 // Format to human readable 10560 if (estimatedSize < 1024) { 10561 return `${estimatedSize} B`; 10562 } else if (estimatedSize < 1024 * 1024) { 10563 return `${(estimatedSize / 1024).toFixed(1)} KB`; 10564 } else { 10565 return `${(estimatedSize / (1024 * 1024)).toFixed(1)} MB`; 10566 } 10567 } 10568 10569 // Update image size information 10570 function updateImageSizeInfo() { 10571 if (!cropper) return; 10572 10573 const imageData = cropper.getImageData(); 10574 const cropBoxData = cropper.getCropBoxData(); 10575 const canvasData = cropper.getCanvasData(); 10576 10577 // Calculate the scale factor between natural image size and displayed size 10578 const scaleFactorX = originalImageSize.width / imageData.naturalWidth; 10579 const scaleFactorY = originalImageSize.height / imageData.naturalHeight; 10580 10581 // Calculate the actual output size based on crop box and scale factor 10582 const outputWidth = Math.round((cropBoxData.width / canvasData.width) * imageData.naturalWidth); 10583 const outputHeight = Math.round((cropBoxData.height / canvasData.height) * imageData.naturalHeight); 10584 10585 // Update display 10586 document.getElementById('originalSize').textContent = 10587 `Original: ${formatImageSize(originalImageSize.width, originalImageSize.height)}`; 10588 document.getElementById('newSize').textContent = 10589 `New: ${formatImageSize(outputWidth, outputHeight)}`; 10590 } 10591 10592 // Initialize Image Editor Popup 10593 function initImageEditor() { 10594 const editorHTML = ` 10595 <div id="imageEditorPopup" class="image-editor-popup"> 10596 <div class="image-editor-overlay"></div> 10597 <div class="image-editor-modal"> 10598 <div class="image-editor-header"> 10599 <h3>Edit Image</h3> 10600 <button class="close-editor" type="button">×</button> 10601 </div> 10602 <div class="image-editor-content"> 10603 <div class="image-editor-canvas"> 10604 <img id="imageToEdit" src="" alt="Image to edit"> 10605 </div> 10606 <div class="image-editor-controls"> 10607 <div class="control-group"> 10608 <label>Crop Aspect Ratio:</label> 10609 <select id="aspectRatio"> 10610 <option value="free">Free</option> 10611 <option value="1">1:1 (Square)</option> 10612 <option value="1.33">4:3</option> 10613 <option value="1.77">16:9</option> 10614 <option value="0.75">3:4 (Portrait)</option> 10615 </select> 10616 </div> 10617 <div class="control-group"> 10618 <label>Image Size:</label> 10619 <div id="imageSizeInfo"> 10620 <span id="originalSize">Original: -</span> 10621 <span id="newSize">New: -</span> 10622 </div> 10623 </div> 10624 <div class="control-group"> 10625 <button type="button" id="rotateLeft">⺠Rotate Left</button> 10626 <button type="button" id="rotateRight">â» Rotate Right</button> 10627 <button type="button" id="flipH">â· Flip H</button> 10628 <button type="button" id="flipV">â± Flip V</button> 10629 </div> 10630 <div class="control-group"> 10631 <button type="button" id="resetImage">Reset</button> 10632 <button type="button" id="cropImage">Apply Crop</button> 10633 </div> 10634 </div> 10635 </div> 10636 <div class="image-editor-footer"> 10637 <button type="button" class="btn-cancel">Cancel</button> 10638 <button type="button" class="btn-save">Save Changes</button> 10639 </div> 10640 </div> 10641 </div>`; 10642 10643 if (!document.getElementById('imageEditorPopup')) { 10644 document.body.insertAdjacentHTML('beforeend', editorHTML); 10645 initImageEditorEvents(); 10646 } 10647 } 10648 10649 // Initialize Image Editor Events 10650 function initImageEditorEvents() { 10651 const popup = document.getElementById('imageEditorPopup'); 10652 const imageToEdit = document.getElementById('imageToEdit'); 10653 10654 // Close editor events 10655 popup.querySelector('.close-editor').onclick = closeImageEditor; 10656 popup.querySelector('.btn-cancel').onclick = closeImageEditor; 10657 popup.querySelector('.image-editor-overlay').onclick = closeImageEditor; 10658 10659 // Save edited image 10660 popup.querySelector('.btn-save').onclick = saveEditedImage; 10661 10662 // Aspect ratio change 10663 document.getElementById('aspectRatio').onchange = function() { 10664 if (cropper) { 10665 const value = this.value; 10666 cropper.setAspectRatio(value === 'free' ? NaN : parseFloat(value)); 10667 updateImageSizeInfo(); 10668 } 10669 }; 10670 10671 // Rotation and flip controls 10672 document.getElementById('rotateLeft').onclick = () => { 10673 if (cropper) { 10674 cropper.rotate(-90); 10675 updateImageSizeInfo(); 10676 } 10677 }; 10678 document.getElementById('rotateRight').onclick = () => { 10679 if (cropper) { 10680 cropper.rotate(90); 10681 updateImageSizeInfo(); 10682 } 10683 }; 10684 document.getElementById('flipH').onclick = () => { 10685 if (cropper) { 10686 cropper.scaleX(-cropper.getImageData().scaleX); 10687 updateImageSizeInfo(); 10688 } 10689 }; 10690 document.getElementById('flipV').onclick = () => { 10691 if (cropper) { 10692 cropper.scaleY(-cropper.getImageData().scaleY); 10693 updateImageSizeInfo(); 10694 } 10695 }; 10696 10697 // Reset image 10698 document.getElementById('resetImage').onclick = function() { 10699 if (cropper) { 10700 cropper.reset(); 10701 updateImageSizeInfo(); 10702 } 10703 }; 10704 10705 // Apply crop 10706 document.getElementById('cropImage').onclick = function() { 10707 if (cropper) { 10708 const croppedCanvas = cropper.getCroppedCanvas(); 10709 cropper.replace(croppedCanvas.toDataURL()); 10710 updateImageSizeInfo(); 10711 } 10712 }; 10713 } 10714 10715 // Open Image Editor 10716 function openImageEditor(file) { 10717 currentImageFile = file; 10718 const popup = document.getElementById('imageEditorPopup'); 10719 const imageToEdit = document.getElementById('imageToEdit'); 10720 10721 const reader = new FileReader(); 10722 reader.onload = function(e) { 10723 imageToEdit.src = e.target.result; 10724 10725 // Add show class with slight delay for smooth animation 10726 setTimeout(() => { 10727 popup.classList.add('show'); 10728 }, 10); 10729 10730 // Initialize Cropper.js 10731 if (cropper) { 10732 cropper.destroy(); 10733 } 10734 10735 // Load Cropper.js if not already loaded 10736 if (typeof Cropper === 'undefined') { 10737 loadCropperJS().then(() => { 10738 initCropper(); 10739 }); 10740 } else { 10741 initCropper(); 10742 } 10743 };
10744 reader.readAsDataURL(file); 10745 } 10746 10747 // Initialize Cropper 10748 function initCropper() { 10749 const imageToEdit = document.getElementById('imageToEdit'); 10750 10751 cropper = new Cropper(imageToEdit, { 10752 aspectRatio: NaN, 10753 viewMode: 1, 10754 dragMode: 'move', 10755 autoCropArea: 1, 10756 responsive: true, 10757 background: false, 10758 guides: true, 10759 center: true, 10760 highlight: false, 10761 cropBoxMovable: true, 10762 cropBoxResizable: true, 10763 toggleDragModeOnDblclick: false, 10764 ready: function() { 10765 // Store original image size when cropper is ready 10766 const imageData = this.cropper.getImageData(); 10767 originalImageSize.width = imageData.naturalWidth; 10768 originalImageSize.height = imageData.naturalHeight; 10769 10770 // Update size info when cropper is ready 10771 updateImageSizeInfo(); 10772 }, 10773 crop: function() { 10774 // Update size info on crop change 10775 updateImageSizeInfo(); 10776 } 10777 }); 10778 } 10779 10780 // Load Cropper.js library 10781 function loadCropperJS() { 10782 return new Promise((resolve, reject) => { 10783 if (typeof Cropper !== 'undefined') { 10784 resolve(); 10785 return; 10786 } 10787 10788 // Load CSS 10789 const cssLink = document.createElement('link'); 10790 cssLink.rel = 'stylesheet'; 10791 cssLink.href = 'https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.5.12/cropper.min.css'; 10792 document.head.appendChild(cssLink); 10793 10794 // Load JS 10795 const script = document.createElement('script'); 10796 script.src = 'https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.5.12/cropper.min.js'; 10797 script.onload = resolve; 10798 script.onerror = reject; 10799 document.head.appendChild(script); 10800 }); 10801 } 10802 10803 // Close Image Editor 10804 function closeImageEditor() { 10805 const popup = document.getElementById('imageEditorPopup'); 10806 10807 // Remove show class for animation 10808 popup.classList.remove('show'); 10809 10810 if (cropper) { 10811 cropper.destroy(); 10812 cropper = null; 10813 } 10814 10815 // Reset variables 10816 currentImageFile = null; 10817 originalImageSize = { width: 0, height: 0 }; 10818 10819 // Reset size display 10820 document.getElementById('originalSize').textContent = 'Original: -'; 10821 document.getElementById('newSize').textContent = 'New: -'; 10822 } 10823 10824 // Save Edited Image 10825 function saveEditedImage() { 10826 if (!cropper) return; 10827 10828 // Get cropped canvas without any scaling - keep original dimensions 10829 const canvas = cropper.getCroppedCanvas({ 10830 imageSmoothingEnabled: true, 10831 imageSmoothingQuality: 'high', 10832 }); 10833 10834 canvas.toBlob(function(blob) { 10835 // Create new file from edited image 10836 const editedFile = new File([blob], currentImageFile.name, { 10837 type: 'image/jpeg', 10838 lastModified: Date.now() 10839 }); 10840 10841 // Close editor 10842 closeImageEditor(); 10843 10844 // Process the edited image 10845 processEditedImage(editedFile); 10846 }, 'image/jpeg', 0.9); 10847 } 10848 10849 // Process Edited Image 10850 function processEditedImage(file) { 10851 const reader = new FileReader(); 10852 reader.onload = function(e) { 10853 // Show loader on preview area 10854 $('.steps-card-preview').addClass('loading-upload'); 10855 $('.ajax-loader').show(); 10856 10857 $('.placeholder-image').hide(); 10858 $('.icon-upload').hide(); 10859 $('.preview-image').show(); 10860 $('.remove-image').show(); 10861 $('.preview-image').attr('src', e.target.result); 10862 10863 10864 // Start upload process with edited image 10865 uploadMedia(file, 'image/jpeg').then(() => { 10866 $('.ajax-loader').hide(); 10867 $('.steps-card-preview').removeClass('loading-upload loading'); 10868 $(".nextBtn").attr("disabled", false); 10869 }).catch((error) => { 10870 $('.ajax-loader').hide(); 10871 $('.steps-card-preview').removeClass('loading-upload loading'); 10872 console.error('Upload failed:', error); 10873 }); 10874 10875 }; 10876 reader.readAsDataURL(file); 10877 } 10878 10879 function readURL(input) { 10880 if (input.files && input.files[0]) { 10881 const file = input.files[0]; 10882 10883 // Check if it's an image file 10884 if (file.type.startsWith('image/')) { 10885 // Validate image file size 10886 if (file.size > 5242880) { 10887 alert('File size exceeds maximum limit 5 MB'); 10888 return; 10889 } 10890 10891 // Initialize image editor if not already done 10892 initImageEditor(); 10893 10894 // Open image editor for editing 10895 openImageEditor(file); 10896 } else if (file.type.match('video/')) { 10897 // Handle video upload normally 10898 if (file.size > 15728640) { 10899 alert('File size exceeds maximum limit 15 MB'); 10900 return; 10901 } 10902 10903 let reader = new FileReader(); 10904 reader.onload = function (e) { 10905 $(".nextBtn").attr("disabled", true); 10906 $(".steps-card-preview").addClass("loading"); 10907 10908 10909 uploadMedia(file, 'video/mp4').then(() => { 10910 $('.steps-card-preview').removeClass('loading'); 10911 $(".nextBtn").attr("disabled", false); 10912 }).catch((error) => { 10913 $('.steps-card-preview').removeClass('loading'); 10914 console.error('Upload failed:', error); 10915 }); 10916 10917 };
10918 reader.readAsDataURL(file); 10919 } else { 10920 alert('Please select a valid image or video file.'); 10921 } 10922 } 10923 } 10924 10925 async function readURLPapan(input) { 10926 if (input.files && input.files[0]) { 10927 let reader = new FileReader(); 10928 10929 reader.onload = function (e) { 10930 $('.btn-upload-papan').siblings('label').hide(); 10931 $('.btn-upload-papan img').attr('src', e.target.result); 10932 $('.btn-upload-papan img').show(); 10933 $('.svgLogoPapan').hide(); 10934 10935 // Show loader during upload 10936 $('.btn-upload-papan').addClass('loading-upload'); 10937 $('.ajax-loader').show(); 10938 } 10939 10940 const type = 'image/jpeg' 10941 const name = `logo-7881418965207-${Date.parse(new Date())}` 10942 10943 try { 10944 let formData = new FormData(); 10945 formData.append("file", input.files[0]); 10946 const response = await fetch(`${host}/api/upload?name=${name}&type=${type}&r=${randomString(3, '0123456789')}&shop=${shop}`, { 10947 method: "POST", 10948 body: formData 10949 }) 10950 const result = await response.json(); 10951 if(result) { 10952 const url = result.url 10953 $("[data-properties=papan-logo]").val(url) 10954 } 10955 10956 // Hide loader after upload completes 10957 $('.btn-upload-papan').removeClass('loading-upload'); 10958 $('.ajax-loader').hide(); 10959 } catch (error) { 10960 // Hide loader on error 10961 $('.btn-upload-papan').removeClass('loading-upload'); 10962 $('.ajax-loader').hide(); 10963 console.error('Upload failed:', error); 10964 } 10965 10966 reader.readAsDataURL(input.files[0]); 10967 } 10968 } 10969 10970 async function readURLAddress(input) { 10971 console.log(input, 'readURLAddress') 10972 if (input.files && input.files[0]) { 10973 let reader = new FileReader(); 10974 10975 reader.onload = function (e) { 10976 $('.photo-address').attr('src', e.target.result); 10977 $('.photo-address').show(); 10978 10979 // Show loader during upload 10980 $('.photo-address').parent().addClass('loading-upload'); 10981 $('.ajax-loader').show(); 10982 } 10983 10984 const type = 'image/jpeg' 10985 const name = input.files[0].name?.split('.')[0] 10986 10987 try { 10988 let formData = new FormData(); 10989 formData.append("file", input.files[0]); 10990 const response = await fetch(`${host}/api/upload?name=${name}&type=${type}&r=${randomString(3, '0123456789')}&shop=${shop}`, { 10991 method: "POST", 10992 body: formData 10993 }) 10994 const result = await response.json(); 10995 10996 // Hide loader after upload completes 10997 $('.photo-address').parent().removeClass('loading-upload'); 10998 $('.ajax-loader').hide(); 10999 11000 reader.readAsDataURL(input.files[0]); 11001 11002 return result 11003 } catch (error) { 11004 // Hide loader on error 11005 $('.photo-address').parent().removeClass('loading-upload'); 11006 $('.ajax-loader').hide(); 11007 console.error('Upload failed:', error); 11008 11009 reader.readAsDataURL(input.files[0]); 11010 return null; 11011 } 11012 } 11013 } 11014 11015 // Hit OCR endpoint to extract address information 11016 async function hitOCREndpoint(imageUrl) { 11017 try { 11018 console.log('Starting OCR process with image:', imageUrl); 11019 11020 const payload = { 11021 imageUrl: imageUrl 11022 } 11023 11024 const response = await fetch('http://localhost:5001/api/shipping/ocr', { 11025 method: 'POST', 11026 headers: { 11027 'Content-Type': 'application/json' 11028 }, 11029 body: JSON.stringify(payload) 11030 }) 11031 11032 if (!response.ok) { 11033 throw new Error(`OCR API error: ${response.statusText}`); 11034 } 11035 11036 const data = await response.json(); 11037 console.log('OCR response:', data); 11038 11039 if (data.formatted && data.formatted.length > 0) { 11040 showAddressOptionsPopup(data.formatted) 11041 } else { 11042 alert('Tidak ada data alamat yang ditemukan dari foto. Silakan coba lagi.') 11043 } 11044 } catch (error) { 11045 console.error('OCR endpoint error:', error); 11046 alert('Ada error saat memproses foto alamat. Silakan coba lagi.') 11047 } 11048 } 11049 11050 // Display popup with address options 11051 function showAddressOptionsPopup(addresses) { 11052 // Initialize popup HTML if not exists 11053 if (!document.getElementById('ocrAddressPopup')) { 11054 initOCRAddressPopup() 11055 } 11056 11057 const popup = document.getElementById('ocrAddressPopup'); 11058 const optionsContainer = document.getElementById('ocrAddressOptions'); 11059 11060 // Clear previous options 11061 optionsContainer.innerHTML = ''; 11062 11063 // Add address options
11064 addresses.forEach((address, index) => { 11065 const option = document.createElement('div'); 11066 option.className = 'ocr-address-option'; 11067 option.setAttribute('data-index', index); 11068 option.setAttribute('data-county', address.county || ''); 11069 option.setAttribute('data-postcode', address.postcode || ''); 11070 option.setAttribute('data-state', address.state || ''); 11071 option.setAttribute('data-country', address.country || ''); 11072 11073 const addressText = address.full_address || `${address.street || ''} ${address.city || ''} ${address.state || ''}`.trim(); 11074 option.innerHTML = ` 11075 <div class="address-content"> 11076 <p class="address-text">${addressText}</p> 11077 <small class="address-details">${address.postcode || ''}</small> 11078 </div> 11079 `; 11080 11081 option.addEventListener('click', function() { 11082 selectAddressOption(this, address) 11083 }); 11084 11085 optionsContainer.appendChild(option); 11086 }); 11087 11088 // Show popup 11089 popup.classList.add('show'); 11090 document.body.classList.add('ocr-popup-open'); 11091 } 11092 11093 // Initialize OCR address popup if not exists 11094 function initOCRAddressPopup() { 11095 const popupHTML = ` 11096 <div id="ocrAddressPopup" class="ocr-address-popup"> 11097 <div class="ocr-popup-overlay"></div> 11098 <div class="ocr-popup-content"> 11099 <div class="ocr-popup-header"> 11100 <h3>Pilih Alamat dari Foto</h3> 11101 <button class="close-ocr-popup">×</button> 11102 </div> 11103 <div class="ocr-popup-body"> 11104 <div id="ocrAddressOptions" class="ocr-address-options"></div> 11105 </div> 11106 </div> 11107 </div> 11108 `; 11109 11110 document.body.insertAdjacentHTML('beforeend', popupHTML); 11111 11112 // Setup close buttons 11113 const popup = document.getElementById('ocrAddressPopup'); 11114 const closeBtn = popup.querySelector('.close-ocr-popup'); 11115 const overlay = popup.querySelector('.ocr-popup-overlay'); 11116 11117 closeBtn.addEventListener('click', closeOCRAddressPopup); 11118 overlay.addEventListener('click', closeOCRAddressPopup); 11119 } 11120 11121 // Handle address selection 11122 function selectAddressOption(element, address) { 11123 const county = element.getAttribute('data-county'); 11124 const postcode = element.getAttribute('data-postcode'); 11125 const state = element.getAttribute('data-state'); 11126 const country = element.getAttribute('data-country'); 11127 11128 const fullAddress = address.full_address || `${address.street || ''} ${address.city || ''} ${address.state || ''}`.trim(); 11129 11130 console.log('Selected address:', { 11131 fullAddress, 11132 county, 11133 postcode, 11134 state, 11135 country 11136 }); 11137 11138 // Fill in the form fields with selected address 11139 $("[data-properties=alamat-penerima], #streetAddress").val(fullAddress); 11140 11141 if (postcode) { 11142 $("[data-properties=kodepos], #zip").val(postcode); 11143 } 11144 11145 if (state) { 11146 $("#province").val(state).trigger('change'); 11147 } 11148 11149 if (country) { 11150 $("#properties-kota-pengiriman-country").val(country); 11151 } 11152 11153 // Close popup after selection 11154 closeOCRAddressPopup(); 11155 } 11156 11157 // Close OCR address popup 11158 function closeOCRAddressPopup() { 11159 const popup = document.getElementById('ocrAddressPopup'); 11160 if (popup) { 11161 popup.classList.remove('show'); 11162 document.body.classList.remove('ocr-popup-open'); 11163 } 11164 } 11165 11166 11167 11168 11169 async function addToCartUang() { 11170 var productAddOnId1 = 42122101162199; 11171 var productAddOnId2 = 42122101194967; 11172 var product_id = 7881418965207 11173 const data = { 11174 items: [ 11175 { 11176 quantity: $("#Quantity-" + productAddOnId1).val(), 11177 id: productAddOnId1, 11178 "properties": { "Time": $("#properties-time").val() } 11179 }, 11180 { 11181 quantity: $("#Quantity-" + productAddOnId2).val(), 11182 id: productAddOnId2, 11183 "properties": { "Time": $("#properties-time").val() } 11184 } 11185 ] 11186 } 11187 await fetch(window.Shopify.routes.root + 'cart/add.js', { 11188 method: 'POST', 11189 headers: { 11190 'Content-Type': 'application/json' 11191 }, 11192 body: JSON.stringify(data) 11193 }) 11194 .then(response => { 11195 console.error('Sukses Buket Uang:', response); 11196 $(".form-flower").submit() 11197 }) 11198 .catch((error) => { 11199 console.error('Error Buket Uang:', error); 11200 $(".form-flower").submit() 11201 });
11202 } 11203 11204 // Utility function untuk membuat data card yang konsisten dengan default "-" 11205 function createCardData(overrides = {}) { 11206 const defaultData = { 11207 "ID": $("#properties-properties-qrId").val() !== '' ? $("#properties-properties-qrId").val() : '-', 11208 "Kartu Nama Penerima": (() => { 11209 const name = $("[data-properties=penerima]").val().trim(); 11210 if (!name || name === '-') { 11211 return '-'; 11212 } 11213 const prefix = $(".label-prefix").text().trim(); 11214 return (prefix + (name ? ' ' + name : '')).trim() || '-'; 11215 })(), 11216 "Kartu Nama Pengirim": $("#properties-kartu-nama-pengirim").val() !== '' ? $("#properties-kartu-nama-pengirim").val() : '-', 11217 "Kartu Ucapan": $("[data-properties=ucapan]").val() !== '' ? $("[data-properties=ucapan]").val() : '-', 11218 "Nama Penerima": $("#properties-nama-penerima").val() !== '' ? $("#properties-nama-penerima").val() : '-', 11219 "Order Number": "-", 11220 "Status": "Product", 11221 "Foto": $("#properties-photo").val() !== '' ? $("#properties-photo").val() : '-', 11222 "Media": $("#properties-video").val() !== '' ? $("#properties-video").val() : '-', 11223 "Image": "7881418965207" 11224 } 11225 11226 // Merge dengan overrides jika ada 11227 return JSON.stringify({...defaultData, ...overrides}) 11228 } 11229 11230 // Utility function untuk membuat data save card (insertCard/updateCard) 11231 function createSaveCardData(overrides = {}) { 11232 const defaultData = { 11233 "id": qrID || '', 11234 "penerima": $("#properties-nama-penerima").val() !== '' ? $("#properties-nama-penerima").val() : '-', 11235 "kartu_penerima": (() => { 11236 const name = $("[data-properties=penerima]").val().trim(); 11237 if (!name || name === '-') { 11238 return '-'; 11239 } 11240 const prefix = $(".label-prefix").text().trim(); 11241 return (prefix + (name ? ' ' + name : '')).trim() || '-'; 11242 })(), 11243 "kartu_ucapan": $("[data-properties=ucapan]").val() !== '' ? $("[data-properties=ucapan]").val() : '-', 11244 "kartu_pengirim": $("[data-properties=pengirim]").val() !== '' ? $("[data-properties=pengirim]").val() : '-', 11245 "foto": $("#properties-photo").val() !== '' ? $("#properties-photo").val() : '-', 11246 "video": $("#properties-video").val() !== '' ? $("#properties-video").val() : '-', 11247 "productId": "7881418965207", 11248 "order_name": "-", 11249 "status": "Product" 11250 } 11251 11252 // Merge dengan overrides jika ada 11253 const mergedData = {...defaultData, ...overrides} 11254 return { 11255 data: JSON.stringify(mergedData), 11256 parsed: mergedData 11257 } 11258 } 11259 11260 async function saveCard(){ 11261 let isCard = true 11262 const cardData = createSaveCardData() 11263 11264 const id = $(".greetingCard").data("id") 11265 11266 if(!id){ 11267 if((cardData.parsed.kartu_ucapan !== '' && cardData.parsed.kartu_ucapan !== '-') || 11268 (cardData.parsed.foto !== '' && cardData.parsed.foto !== '-') || 11269 (cardData.parsed.video !== '' && cardData.parsed.video !== '-')){ 11270 if($("#qrcode").length){ 11271 var qrCode = new QRCode(document.getElementById("qrcode"), { 11272 text: `https://moment.outerbloom.com/${qrID}`, 11273 width: 200, 11274 height: 200, 11275 colorDark : "#212121", 11276 colorLight : "#ffffff", 11277 correctLevel: QRCode.CorrectLevel.L, 11278 }); 11279 } 11280 $("#properties-qrId").val(qrID) 11281 const insert_card = await insertCard(cardData.data) 11282 console.log(insert_card, 'insert') 11283 11284 // Trigger card preview update 11285 $(document).trigger('cardDataUpdated') 11286 11287 return insert_card 11288 } 11289 } else { 11290 console.log('start update') 11291 const update_card = await updateCard(id, cardData.data) 11292 console.log(update_card, 'update_card') 11293 11294 // Trigger card preview update 11295 $(document).trigger('cardDataUpdated') 11296 11297 return update_card 11298 } 11299 } 11300 11301 async function additem(items){ 11302 try { 11303 let formData = items 11304 if(items?.length) { 11305 formData = { 11306 'items': items 11307 }; 11308 } 11309 11310 const add = await fetch(window.Shopify.routes.root + 'cart/add.js', { 11311 method: 'POST', 11312 headers: { 11313 'Content-Type': 'application/json', 11314 'X-Requested-With':'xmlhttprequest' /* XMLHttpRequest is ok too, it's case insensitive */ 11315 }, 11316 body: JSON.stringify(formData) 11317 }) 11318 11319 const data = await add.json(); 11320 return data 11321 } catch(err){ 11322 console.log('Error additem', err) 11323 } 11324 } 11325 11326 async function addons(){ 11327 let items = [] 11328 11329 // First, try to get addons from the summary section (.addon-item) 11330 if($(".addon-item").length > 0) { 11331 $(".addon-item").each(function(){ 11332 const p = $(this) 11333 const props = p.next(".propsAddonSpotify") 11334 const id = $(this).data("id") 11335 const quantity = $(this).data("qty") 11336 const propId = $("#properties-time").val() 11337 let properties = {} 11338 if(id === 46067682607319) { 11339 const link = props.find(".spotifyLinkAddon").text() 11340 const photo = props.find(".spotifyFotoAddon").text() 11341 const song = props.find(".spotifySongAddon").text() 11342 const artist = props.find(".spotifyArtistAddon").text() 11343 properties = { 11344 id: propId, 11345 "Spotify Link": link !== '' ? link : '-', 11346 "Spotify Photo": photo !== '' ? photo : '-', 11347 "Spotify Song": song !== '' ? song : '-', 11348 "Spotify Artist": artist !== '' ? artist : '-', 11349 type: 'addon' 11350 } 11351 } else { 11352 properties = { 11353 "id": propId, 11354 "type": "addon" 11355 } 11356 } 11357 items.push({ 11358 id, 11359 quantity, 11360 properties 11361 }) 11362 }) 11363 } else { 11364 // If no addon-item found, get directly from #itemAddons .selected 11365 const selectedAddons = $("#itemAddons").find(".selected") 11366 if(selectedAddons.length > 0) { 11367 selectedAddons.each(function(){ 11368 const id = $(this).data("variant") 11369 const quantity = $(this).find(".btn-qty").val() || 1 11370 const propId = $("#properties-time").val() 11371 const properties = { 11372 "id": propId, 11373 "type": "addon" 11374 } 11375 items.push({ 11376 id: Number(id), 11377 quantity: Number(quantity), 11378 properties 11379 }) 11380 }) 11381 } 11382 } 11383 11384 return items 11385 } 11386 11387 async function propItems() { 11388 let props = {} 11389 $("[data-properties]").each(function(e){
11390 let elementType = this.tagName; 11391 const k = $(this).data("properties") 11392 if(k !== 'penerima' && k !== 'ucapan' && k !== 'pengirim' && k !== 'nama-penerima' && k !== 'alamat-penerima' && k !== 'telepon-penerima' && k !== 'company' && k !== 'province' && k !== 'foto-alamat' && k !== 'papan-logo') { 11393 const v = elementType === 'SELECT' ? $(this).find(":selected").val() : $(this).val(); 11394 if(v !== '') { 11395 props[k] = v?.replace(/[\s\n]/g, ''); 11396 } 11397 } 11398 }) 11399 return props 11400 } 11401 11402 async function showPopupCart(items){ 11403 if(productType !== '') { 11404 console.log("clarity event " + productType + ' completeOrder') 11405 window.clarity("event", `${productType} completeOrder`) 11406 // window.clarity("set", productType, `completeOrder - ${productDate}`) 11407 } 11408 $("#popupCart").show() 11409 11410 $(".propDeliveryCity").text($("#cities").val()) 11411 $(".propDeliveryDate").text($("#propDeliveryDate").val()) 11412 $(".propDeliveryTime").text($("#propDeliveryTime").val()) 11413 $(".propDeliveryName").text($("[data-properties=nama-penerima]").val()) 11414 $(".propDeliveryAddress").text($("[data-properties=alamat-penerima]").val()) 11415 $(".propDeliveryPhone").text($("[data-properties=telepon-penerima]").val()) 11416 $(".propDeliveryProv").text($("#province").val()) 11417 $(".propDeliveryZip").text($("#properties-kodepos").val()) 11418 11419 11420 11421 const addons = [] 11422 if(items && items.length > 0) { 11423 for(let i = 1; i < items.length; i++) { 11424 const spotifyLink = items[i].properties['Spotify Link'] 11425 const spotifyPhoto = items[i].properties['Spotify Photo'] 11426 const spotifySong = items[i].properties['Spotify Song'] 11427 const spotifyArtist = items[i].properties['Spotify Artist'] 11428 const price = items[i].price / 100 11429 const props = spotifyLink ? `<div class="propsAddonCart row m-0"> 11430 <div class="col-12 col-lg-2"></div> 11431 <div class="col-12 col-lg-10"> 11432 <p> 11433 <span>spotify link</span> 11434 <span>${spotifyLink}</span> 11435 </p> 11436 <p> 11437 <span>Upload Photo</span> 11438 <span>${spotifyPhoto}</span> 11439 </p> 11440 <p> 11441 <span>song / playlist name</span> 11442 <span>${spotifySong}</span> 11443 </p> 11444 <p> 11445 <span>artist name</span> 11446 <span>${spotifyArtist}</span> 11447 </p> 11448 </div> 11449 </div>` : ''; 11450 addons.push(`<div class="row m-0"> 11451 <div class="imgAddonCart col-2"> 11452 <img 11453 width="43" 11454 src="${items[i].image}" 11455 alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman" 11456 > 11457 </div> 11458 <div class="imgAddonTitlePrice col-10 align-self-center"> 11459 <div class="row justify-content-between m-0"> 11460 <div class="col-12 col-lg-8"> 11461 <h5>${items[i].title}</h5> 11462 </div> 11463 <div class="col-12 col-lg-4 text-lg-right"> 11464 <span>${rupiah.format(price)}</span> 11465 </div> 11466 </div> 11467 </div> 11468 </div>${props}`) 11469 } 11470 } 11471 // console.log(addons) 11472 if(addons.length === 0) { 11473 $(".itemAddonCart").hide() 11474 return 11475 } 11476 $(".toggleAddonCart h4").text(`add-ons (${items.length - 1})`) 11477 $(".wrapperItemAddonCart").html(addons) 11478 } 11479 11480 const money = (money) => { 11481 return new Intl.NumberFormat('id-ID', 11482 { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 } 11483 ).format(money); 11484 } 11485 11486 async function showNoteMoney() { 11487 let qty50k = $("[data-properties='Uang 50k']").val() 11488 let qty100k = $("[data-properties='Uang 100k']").val() 11489 const total50k = Number(qty50k) * 50000 11490 const total100k = Number(qty100k) * 100000 11491 const total_all = total50k + total100k 11492 $(".prop50k").html(`<span>${qty50k} Lembar: <strong class="pl-1">${money(total50k)}</strong></span>`) 11493 $(".prop100k").html(`<span>${qty100k} Lembar: <strong class="pl-1">${money(total100k)}</strong></span>`) 11494 $(".itemMoney").html(`<p>For the money arrangement, please transfer <strong>IDR ${money(total_all)}</strong> to <strong>Bank Mandiri 1020001234522 (PT Modern Mekar Abadi)</strong> and contact our <a href="http://wa.me/6281514234600" target="_blank" style="text-decoration: underline;
11494 color: #8d3f2d">Customer Service</a> to confirm with proof of payment.</p>`) 11495 } 11496 11497 async function removeImage() { 11498 // Reset to initial state of case-img-preview 11499 $(".remove-image").hide() 11500 $("#properties-photo").val("-") 11501 $(".preview-image").hide().attr("src", "") 11502 $(".placeholder-image").show() 11503 $(".icon-upload").show() 11504 $(".ajax-loader").hide() 11505 11506 // Reset the button states 11507 $(".case-video-preview").hide() 11508 $(".case-img-preview .btn-upload button").show() 11509 } 11510 11511 async function removeVideo() { 11512 $("#properties-video").val("-") 11513 $(this).find("img").hide() 11514 $(this).hide() 11515 $(this).prev("p").text("Add video to make it more special (optional)") 11516 $("#label-input-video").show() 11517 $("#label-input-video span").text("Upload Video") 11518 $(".case-video-preview p span").remove() 11519 } 11520 11521 async function loadItemOccasion(t, occasion) { 11522 const name = occasion?.replace('greeting-card-', '') 11523 $("#kartu-ucapan").val("") 11524 $("[data-occassion]").removeClass("selected") 11525 $("[data-properties=ucapan]").val("") 11526 $("#save-card").attr("disabled", true) 11527 t.addClass("selected") 11528 $("#show_note").attr("data-card-occassion", name) 11529 $.get(`https://outerbloom.com/collections/${occasion}/products.json`, function(data, status){ 11530 const products = data.products 11531 const html = [] 11532 for(let i = 0; i < products.length; i++) { 11533 const id = products[i].id 11534 const variantId = products[i].variants[0].id 11535 const img = products[i].images[0].src 11536 const title = products[i].title 11537 const price = products[i].variants[0].price 11538 const qty = products[i].variants[0].inventory_quantity 11539 const body = `<div class="item-card${price < 1 ? ' free' : ' nofree'}${i === 0 ? ' selected' : ''}" data-id=${id}> 11540 <label for="card-${variantId}"></label> 11541 <div class="card-image"> 11542 <img src="${img}" alt="${title}" width="" height="" /> 11543 </div> 11544 <div class="card-meta text-center"> 11545 <h5>${title}</h5> 11546 <p>${price < 1 ? 'FREE' : rupiah.format(price)}</p> 11547 <input id="card-${variantId}" type="radio" name="id" value="${variantId}" data-price="${price}"> 11548 </div> 11549 </div>` 11550 html.push(body) 11551 } 11552 const withoutCard = `<div class="item-card item-without-card"> 11553 <label for="card-0"></label> 11554 <div class="card-image"> 11555 <img src="https://cdn.shopify.com/s/files/1/1589/6833/t/129/assets/without-card.png?v=1747632283" alt="Without card" width="" height="" /> 11556 </div> 11557 <div class="card-meta text-center"> 11558 <h5>
11558Send without a greeting card</h5> 11559 <input id="card-0" type="radio" name="id" value="" data-price=""> 11560 </div> 11561 </div>` 11562 $("#itemCards .items-card").html(html.length === 0 ? '<p>No Item available</p>' : html.join("")) 11563 }); 11564 } 11565 11566 async function setItems() { 11567 let items = [] 11568 const mainProps = { 11569 11570 "Delivery Date": $("#propDeliveryDate").val(), 11571 "Delivery Time": $("#propDeliveryTime").val() !== '' ? $("#propDeliveryTime").val() : '-' , 11572 "Kota Pengiriman": $("#cities").val(), 11573 "Nama Penerima": $("[data-properties=nama-penerima]").val() !== '' ? $("[data-properties=nama-penerima]").val() : '-' , 11574 "Alamat Penerima": $("[data-properties=alamat-penerima]").val() !== '' ? $("[data-properties=alamat-penerima]").val() : '-' , 11575 "Kodepos": $("#properties-kodepos").val() !== '' ? $("#properties-kodepos").val() : '-' , 11576 "Telepon Penerima": $("[data-properties=telepon-penerima").val() !== '' ? $("[data-properties=telepon-penerima").val() : '-' , 11577 11578 11579 11580 "Kartu Nama Penerima": (() => { 11581 const name = $("[data-properties=penerima]").val().trim(); 11582 if (!name || name === '-') { 11583 return '-'; 11584 } 11585 const prefix = $(".label-prefix").text().trim(); 11586 return (prefix + (name ? ' ' + name : '')).trim() || '-'; 11587 })() , 11588 "Kartu Ucapan": $("[data-properties=ucapan]").val() !== '' ? $("[data-properties=ucapan]").val() : '-' , 11589 "Kartu Nama Pengirim": $("[data-properties=pengirim]").val() !== '' ? $("[data-properties=pengirim]").val() : '-' , 11590 "Foto": $("#properties-photo").val() !== '' ? $("#properties-photo").val() : '-' , 11591 "Video": $("#properties-video").val() !== '' ? $("#properties-video").val() : '-' , 11592 "QR Code": $("#properties-qrId").val() !== '' ? $("#properties-qrId").val() : '-' , 11593 11594 11595 11596 "Province": $("#province").val() !== '' ? $("#province").val() : '-' , 11597 "Country": $("#properties-kota-pengiriman-country").val() !== '' ? $("#properties-kota-pengiriman-country").val() : '-' , 11598 "Shipping": $("#properties-shipping").val() !== '' ? $("#properties-shipping").val() : '-' , 11599 "Company": $("[data-properties=company]").val() !== '' ? $("[data-properties=company]").val() : '-' , 11600 11601 "Delivery Method": $("#selectedShippingMethod") && $("#selectedShippingMethod").val() !== '' ? $("#selectedShippingMethod").val() : 'Delivery' , 11602 "id": $("#properties-time").val() !== '' ? $("#properties-time").val() : '-', 11603 "type": 'product' 11604 } 11605 console.log(mainProps, 'mainProps') 11606 const props = await propItems() 11607 properties = {...mainProps, ...props }; 11608 const id = $("#productSelect").find('option:selected').val() 11609 console.log(id, 'main ID') 11610 const mainItem = { 11611 id: Number(id), 11612 quantity: 1, 11613 properties 11614 } 11615 items.push(mainItem) 11616 const cardId = $("#itemCards").find(".selected input").val() 11617 const cardItem = { 11618 id: Number(cardId), 11619 quantity: 1, 11620 properties: { "id": $("#properties-time").val() !== '' ? $("#properties-time").val() : '-', type: 'card' } 11621 } 11622 console.log(cardId, 'cardId') 11623 if(cardId) { 11624 items.push(cardItem) 11625 } 11626 const addon = await addons() 11627 if(addon) { 11628 for(let i = 0; i < addon.length; i++){ 11629 items.push({ 11630 id: addon[i].id, 11631 quantity: addon[i].quantity, 11632 properties: addon[i].properties 11633 }) 11634 } 11635 } 11636 11637 return items 11638 } 11639 11640 async function addToCart() { 11641 const items = await setItems() 11642 const addItems = await additem(items) 11643 11644 // Check if cities is not "Kota Lainnya" and Shipping property is empty or "-" 11645 const citiesValue = $("#cities").val(); 11646 const shippingValue = $("#properties-shipping").val(); 11647 if (citiesValue && citiesValue !== "Kota Lainnya" && (!shippingValue || shippingValue === "" || shippingValue === "-")) { 11648 alert("Shipping city has not been selected, please try again"); 11649 // Close popup and reset fields 11650 disablePopup(); 11651 $("#cities").val("").trigger('change'); 11652 $("#propDeliveryDate").val(""); 11653 $("#propDeliveryTime").val(""); 11654 $("#deliveryDate button").removeClass("selected"); 11655 $("#deliveryTime button").removeClass("selected"); 11656 return; 11657 } 11658 11659 if(addItems) { 11660 $(this).find("span").removeClass("loading") 11661 disablePopup() 11662 showPopupCart(addItems.items) 11663 11664 localStorage.setItem("items", JSON.stringify(addItems.items)) 11665 const rowIndex = $(".greetingCard").data("id") 11666 if(rowIndex && rowIndex !== 0) { 11667 const data = JSON.stringify({ 11668 "Status": "Cart" 11669 }); 11670 const update = await updateCard(rowIndex, data) 11671 console.log(update, 'update card to cart') 11672 } 11673 11674 analytics.track('add_cart', { 11675 productId: '7881418965207', 11676 items: addItems.items 11677 }); 11678 } 11679 } 11680 11681 $(document).ready(function(){ 11682 11683 // Observer to auto-trigger addon loading when addon section becomes visible 11684 const addonObserver = new MutationObserver(function(mutations) { 11685 mutations.forEach(function(mutation) { 11686 const target = $(mutation.target) 11687 if(target.hasClass('purchaseAddon') && mutation.type === 'attributes' && mutation.attributeName === 'class') { 11688 if(!target.hasClass('hide')) { 11689 // Addon section just became visible, ensure items are loaded 11690 setTimeout(function() { 11691 if($("#itemAddons .row").children().length === 0 || $("#itemAddons .row").text().includes("No Item available")) { 11692 console.log("Auto-triggering addon load...") 11693 $("[data-addon]").eq(0).trigger("click") 11694 } 11695 }, 150) 11696 } 11697 } 11698 }) 11699 }) 11700 11701 // Start observing addon section 11702 const addonSection = document.querySelector('.purchaseAddon') 11703 if(addonSection) { 11704 addonObserver.observe(addonSection, { 11705 attributes: true, 11706 attributeFilter: ['class'] 11707 }) 11708 } 11709 11710 $(".purchasePopup").delegate("#addtocart-card", "click", async function(){ 11711 11712 $(this).find("span").addClass("loading") 11713 let isValid = true 11714 $(".formAddressPurchase [required]").each(function(){ 11715 const t = $(this) 11716 const input = t.val() 11717 const p = t.parent() 11718 if(input === '') { 11719 p.addClass("error") 11720 isValid = false 11721 } 11722 }) 11723 11724 if(!isValid) { 11725 $(this).find("span").removeClass("loading") 11726 return 11727 } 11728 11729 await addToCart() 11730 }) 11731 11732 $("#addtocart-cart .btn").click(async function(){ 11733 // First validate variant metafields 11734 if (typeof validateVariantMetafields === 'function') { 11735 const isValid = validateVariantMetafields(true); 11736 if (!isValid) { 11737 // The validateVariantMetafields function already handles scrolling and focusing 11738 alert('Please select all required variant options before proceeding.'); 11739 return; // Stop execution if validation fails 11740 } 11741 } 11742 11743 const id = $("#productSelect").find('option:selected').val() 11744 const mainProps = { 11745 id: $("#properties-time").val() !== '' ? $("#properties-time").val() : '-', 11746 type: 'product' 11747 } 11748 const props = await propItems() 11749 const properties = { ...mainProps, ...props }; 11750 const items = { 11751 id: Number(id), 11752 quantity: 1, 11753 properties 11754 } 11755 const addItems = await additem(items) 11756 if(addItems) { 11757 showPopupCart(addItems.items) 11758 localStorage.setItem("items", JSON.stringify(addItems)) 11759 } 11760 }) 11761 11762 $(".formAddressPurchase [required]").change(function(){ 11763 const t = $(this) 11764 const p = t.parent() 11765 const v = t.val() 11766 if(v !== '') { 11767 p.removeClass("error") 11768 } 11769 }) 11770 11771 $(".purchase-button").delegate("#save-card", "click", async function(){ 11772 const parent = $(this).parents(".sectionPurchase") 11773 const next = parent.next(".sectionPurchase") 11774 $(this).find("span").addClass("loading") 11775 const card = await saveCard() 11776 console.log(card, 'ssaveCCC') 11777 if(card?.status === 200 || card?.status === 201) { 11778 if(next.length === 0) { 11779 $(this).find("span").removeClass("loading") 11780 disablePopup() 11781 await addToCart() 11782 } 11783 $(".scanCard").removeClass("hide") 11784 $(this).find("span").removeClass("loading") 11785 parent.addClass("hide") 11786 next.removeClass("hide") 11787 if(next.hasClass("purchaseAddon")) { 11788 $("[data-addon]").eq(0).click() 11789 console.log("clarity event addons") 11790 window.clarity("event", `${productType} add-ons`) 11791 // Ensure addon items are loaded when entering addon popup 11792 setTimeout(function() { 11793 if($("#itemAddons .row").children().length === 0 || $("#itemAddons .row").text().includes("No Item available")) { 11794 $("[data-addon]").eq(0).trigger("click") 11795 } 11796 }, 100) 11797 } 11798 if(next.hasClass("purchaseAddress")) { 11799 initSelect2('#zip'); 11800 } 11801 } 11802 }) 11803 11804 $("#skip-card").click(async function(){ 11805 $(".greetingCard [data-properties]").val("") 11806 $("#properties-photo").val("") 11807 $("#properties-video").val("") 11808 const parent = $(this).parents(".sectionPurchase") 11809 const next = parent.next(".sectionPurchase") 11810 parent.addClass("hide") 11811 next.removeClass("hide") 11812 // $("#itemCards").html("") 11813 await removeImage() 11814 await removeVideo() 11815 11816 // Trigger card preview update when card data is cleared 11817 $(document).trigger('cardDataUpdated') 11818 11819 if(next.length === 0) { 11820 $(this).find("span").removeClass("loading") 11821 disablePopup() 11822 await addToCart() 11823 return 11824 } 11825 if(next.hasClass("purchaseAddon")) { 11826 $("[data-addon]").eq(0).click() 11827 console.log("clarity event addons") 11828 window.clarity("event", `${productType} add-ons`) 11829 // Ensure addon items are loaded when entering addon popup 11830 setTimeout(function() { 11831 if($("#itemAddons .row").children().length === 0 || $("#itemAddons .row").text().includes("No Item available")) { 11832 $("[data-addon]").eq(0).trigger("click") 11833 } 11834 }, 100) 11835 } 11836 if(next.hasClass("purchaseAddress")) { 11837 initSelect2('#zip'); 11838 } 11839 }) 11840 11841 $("#msgCard").click(async function(){ 11842 $(this).parent().addClass("loading") 11843 let occasion = $(".selected[data-occassion]").data("occassion") 11844 occasion = occasion?.replace("greeting-card-", "") 11845 const { data } = await getFetch(`${host}/api/card/template/occasion?name=${occasion}`); 11846 const d = data?.data 11847 for(let i = 0; i < d.length; i++) { 11848 const num = Math.floor(Math.random() * (d.length - 1 + 1) + 1); 11849 const greeting = d[num]?.Greeting 11850 $(".greetingCard textarea").val(greeting) 11851 $(this).parent().removeClass("loading") 11852 11853 // Trigger card preview update when message template is generated 11854 $(document).trigger('cardDataUpdated') 11855 } 11856 $("#save-card").attr("disabled", false) 11857 }) 11858 11859 $(".sectionPurchaseBoard .next-purchase-button").click(function(){ 11860 const parent = $(this).parents(".sectionPurchase") 11861 const next = parent.next(".sectionPurchase") 11862 parent.addClass("hide") 11863 next.removeClass("hide") 11864 }) 11865 11866 $("#editCard").click(function(){ 11867 $(".custom-card").show() 11868 $(".preview-card").hide() 11869 }) 11870 11871 $("#first_name, #last_name").change(function(){ 11872 const v = $(this).val() 11873 const first_name = $("#first_name").val() 11874 const last_name = $("#last_name").val() !== '' ? ' ' + $("#last_name").val() : '' 11875 $("[data-properties=nama-penerima]").val(first_name+last_name) 11876 11877 // Trigger card preview update when first/last name changes 11878 $(document).trigger('cardDataUpdated') 11879 }) 11880 11881 $("[data-occassion]").click(function(){ 11882 const t = $(this) 11883 const p = t.parents(".sectionPurchase") 11884 // $(".greetingCard").addClass("disabled") 11885 const occasion = t.data("occassion") 11886 loadItemOccasion(t, occasion) 11887 }) 11888 11889 $("#itemCards").delegate(".item-card:not(.item-without-card) label", "click", function(){ 11890 const id = $(this).parent(".item-card").data("id") 11891 const t = $(this).parent(".item-card") 11892 const target = t.find("input") 11893 const v = $('.item-card input[type="radio"]:checked').val(); 11894 $("#itemCards .item-card").removeClass("selected") 11895 t.addClass("selected") 11896 $("#itemCards .item-card").find("input").attr("name", "") 11897 if(target.length > 0) { 11898 target.attr("name", "id[]") 11899 $("#properties-card").val(id) 11900 $(".greetingCard").removeClass("disabled") 11901 $("#skip-card").attr("disabled", false) 11902 } else { 11903 $("#properties-card").val("") 11904 } 11905 }) 11906 11907 $("#itemCards").delegate(".item-without-card label", "click", function(){ 11908 const parent = $(this).parents(".sectionPurchase") 11909 const next = parent.next(".sectionPurchase") 11910 $(".greetingCard").addClass("disabled") 11911 parent.addClass("hide") 11912 next.removeClass("hide") 11913 $("[data-addon]").eq(0).click() 11914 initSelect2('#zip'); 11915 }) 11916 11917 $("[data-properties=ucapan]").keyup(function(){ 11918 const v = $(this).val() 11919 const p = $(this).parents(".sectionPurchase") 11920 $(".purchaseAddress").find(".greetingCard textarea").val(v) 11921 if(v.length > 3) { 11922 p.find(".next-purchase-button").attr("disabled", false) 11923 } else { 11924 p.find(".next-purchase-button").attr("disabled", true) 11925 } 11926 11927 // Trigger card preview update when message changes 11928 $(document).trigger('cardDataUpdated') 11929 }) 11930 11931 $("[data-properties=penerima]").keyup(function(){ 11932 const v = $(this).val() 11933 $(".purchaseAddress").find("[data-properties=penerima]").val(v) 11934 11935 // Trigger card preview update when recipient name changes 11936 $(document).trigger('cardDataUpdated') 11937 }) 11938 11939 $("[data-properties=pengirim]").keyup(function(){ 11940 const v = $(this).val() 11941 $(".purchaseAddress").find("[data-properties=pengirim]").val(v) 11942 11943 // Trigger card preview update when sender name changes 11944 $(document).trigger('cardDataUpdated') 11945 }) 11946 11947 $(document).click(function(e){
11948 11949 if($(e.target).closest('.wrapperPopupCart').length != 0) return false; 11950 // $('#popupCart').fadeOut('slow'); 11951 // location.reload() 11952 }); 11953 11954 $(".toggleAddonCart").click(function(){ 11955 const p = $(this).parent(".itemAddonCart") 11956 p.toggleClass("open") 11957 }) 11958 11959 $(".btnViewCart").click(function(){ 11960 window.location.href = "https://outerbloom.com/cart"; 11961 }) 11962 11963 $(".btnViewCheckout").click(async function(){ 11964 $(this).find("span").addClass("loading") 11965 let zip = $("#properties-kodepos").val() 11966 const first_name = $("#first_name").val() 11967 const last_name = $("#last_name").val() 11968 const company = $("#company").val() !== '' ? $("#company").val() : '' 11969 const address1 = $("#delivery_address").val() 11970 const address2 = zip && zip !== '' ? zip?.split(' - ')[1] : '' 11971 zip = zip && zip !== '' ? zip?.split(' - ')[0] : '' 11972 const phone = $("#recipient_number").val() 11973 const city = $("#cities").val() 11974 const province = $("#province").val() 11975 const country = 'Indonesia' 11976 const ver = Date.parse(new Date()) 11977 11978 const params = `${first_name ? `&checkout[shipping_address][first_name]=${first_name}` : ''}&${last_name ? `&checkout[shipping_address][last_name]=${last_name}` : ''}&${company ? `&checkout[shipping_address][company]=${company}` : ''}&${address1 ? `&checkout[shipping_address][address1]=${address1}` : ''}&${address2 ? `&checkout[shipping_address][address2]=${address2}` : ''}&${city && city !== 'Kota Lainnya' ? `&checkout[shipping_address][city]=${city}` : ''}&${country ? `&checkout[shipping_address][country]=${country}` : ''}&${province ? `&checkout[shipping_address][province]=${province}` : ''}&${zip ? `&checkout[shipping_address][zip]=${zip}` : ''}&${phone ? `&checkout[shipping_address][phone]=${phone}` : ''}&v=${ver}` 11979 11980 const clear = await fetch(`/cart/clear.js`, {method: 'POST'}) 11981 if(clear.status === 200) { 11982 const savedItem = window.localStorage.getItem("items"); 11983 const items = JSON.parse(savedItem) 11984 const addItems = await additem(items) 11985 console.log(addItems, 'new addItems') 11986 if(addItems) { 11987 window.location.href = `https://outerbloom.com/checkout?${params}`; 11988 } 11989 } 11990 }) 11991 11992 $(".btnContinueShopping").click(function(){ 11993 window.location.href = "https://outerbloom.com/"; 11994 }) 11995 11996 if (isIOS) { 11997 $(".empty-state-card").click(function(){ 11998 $("#input-foto").trigger("click") 11999 }) 12000 $(".btn-upload-image").click(function(){ 12001 $("#input-foto").trigger("click") 12002 }) 12003 $("[for=input-video]").click(function(){ 12004 $("#input-video").trigger("click") 12005 }) 12006 $(".btn-upload-papan").click(function(){ 12007 $("#logoPapan").trigger("click") 12008 }) 12009 } 12010 12011 $("[data-properties]").each(function(){ 12012 const select = $(this).parents(".form-group").find("select") 12013 $(this).change(function(){ 12014 const name = $(this).data("properties") 12015 const v = $(this).val() 12016 if (name == 'telepon-penerima') { 12017 let phone = v.replace(/[^0-9]/g, '') 12018 $(this).val(phone); 12019 $("#properties-telepon-penerima").val(phone) 12020 $('.iti__search-input').val('-') 12021 } else { 12022 $("#properties-" + name).val(v) 12023 } 12024 }) 12025 select.on("change", function(){ 12026 const name = $(this).data("properties") 12027 const v = $(this).val() 12028 $("#properties-" + name).val(v) 12029 }) 12030 }) 12031 12032 $("#show_note").click(function(){ 12033 const rowIndex = $(".greetingCard").data("id") 12034 const data = JSON.stringify({ 12035 "Media": "-" 12036 }) 12037 updateCard(rowIndex, data) 12038 }) 12039 12040 $(".greetingCard").delegate(".remove-image", "click", function(e){ 12041 e.preventDefault() 12042 removeImage() 12043 }) 12044 12045 $(".remove-media").click(function(e){ 12046 e.preventDefault() 12047 $(this).find("img").show() 12048 removeVideo() 12049 }) 12050 12051 12052 12053 $("[data-delivery_method]").click(function(e){ 12054 e.preventDefault() 12055 const t = $(this) 12056 const data = t.data("delivery_method") 12057 $("[data-delivery_method]").removeClass("selected") 12058 t.addClass("selected") 12059 $("#cities").val("") 12060 $("#properties-delivery-date").val("-") 12061 $("#deliveryDate button").removeClass("selected") 12062 $("#full-date").val("Full Calendar â") 12063 $("#propDeliveryDate").val("") 12064 const step3 = $("#step-3") 12065 if(data.match('PickUp')) { 12066 $(".selfpickup-point").show() 12067 step3.find("[data-finished=false]").hide() 12068 $("#panel-4").hide() 12069 step3.find("[data-finished=true]").show() 12070 $("#cities").attr("required", false) 12071 $("#form-group-city").hide() 12072 12073 $("#row-delivery-time").hide() 12074 12075 12076 $("#propDeliveryTime, #properties-delivery-time").val("-") 12077 $("#propDeliveryTime").attr("required", false) 12078 12079 $("#properties-nama-penerima, #properties-alamat-penerima, #properties-kodepos, #properties-kodepos, #properties-telepon-penerima").val("-") 12080 // $("#deliveryDate").find("button:first-child").addClass("stop") 12081 $(".form-selfpickup").show() 12082 $(".form-delivery").hide() 12083 $(".form-delivery").find("input, textarea, select").val("") 12084 $(".form-delivery").find("input, textarea, select").attr("required", false) 12085 $("#properties-shipping").val("0") 12086 $("#noteDeliveryDate").hide() 12087 $(".form-delivery .form-control").attr("required", false) 12088 $("#stepNav4").hide() 12089 12090 $("#deliveryDate").find("button:nth-child(1)").addClass("stop") 12091 12092 12093 12094 $(".calendarbutton[data-date=14]").attr("disabled", true) 12095 12096 if(timeOfDay >= 16.01){ 12097 $("#deliveryDate").find("button:nth-child(2)").addClass("stop") 12098 } 12099 } else { 12100 12101 12102 $(".calendarbutton[data-date=14]").attr("disabled", false) 12103 12104 $("#deliveryDate").find("button:nth-child(1)").removeClass("stop") 12105 step3.find("[data-finished=false]").show() 12106 $("#panel-4").show() 12107 step3.find("[data-finished=true]").hide() 12108 $("#cities").attr("required", true) 12109 $(".selfpickup-point").hide() 12110 $("#form-group-city").show() 12111 $("#cities").val('').trigger('change'); 12112 $("#properties-kota-pengiriman").val("-") 12113 12114 $("#row-delivery-date, #row-delivery-time").show() 12115 $("#propDeliveryDate, #propDeliveryTime").attr("required", true) 12116 $("#deliveryDate").find("button").removeClass("stop") 12117 $(".form-selfpickup").hide() 12118 $(".form-delivery").show() 12119 $(".form-delivery").find("input, textarea, select").attr("required", true)
12120 $(".form-delivery [data-properties]").attr("readonly", false) 12121 $("#properties-kodepos").val("-") 12122 $("#properties-alamat-penerima").val("-") 12123 $(".form-delivery .form-control").attr("required", true) 12124 $(this).parents(".setup-content").attr("id", "step-1") 12125 12126 $("#stepNav4").show() 12127 } 12128 }) 12129 12130 $("[name=selfpickup]").click(function(){ 12131 const p = $(this).parents(".row-pickup") 12132 const pickupCity = $("input[name='selfpickup']:checked").val(); 12133 const pickupAddress = $("input[name='selfpickup']:checked").data("address"); 12134 const pickupZip = $("input[name='selfpickup']:checked").data("zip"); 12135 12136 $(".row-pickup").removeClass("selected") 12137 p.addClass("selected") 12138 12139 $("#properties-kota-pengiriman").val(pickupCity) 12140 $("#province").val("Jakarta") 12141 $("#properties-alamat-penerima").val(pickupAddress) 12142 $("#properties-kodepos").val(pickupZip) 12143 }) 12144 12145 $("#cities").change(function(e){ 12146 e.preventDefault() 12147 $(this).parent(".row").find("p.error").remove() 12148 $("#full-date").val("Full Calendar") 12149 $("#deliveryDate, #deliveryDateFull label ").show() 12150 $("#deliveryDateFull").removeClass("filled") 12151 $(".btnChangeDeliveryDate").addClass("hide") 12152 $("#full-date").prop('disabled', false); 12153 $("#stepNav2, #stepNav3, #stepNav4").removeClass("btn-success") 12154 $("#stepNav2, #stepNav3, #stepNav4").find("a").attr("disabled", true) 12155 const step3 = $("#step-3") 12156 $("#cityNote").remove() 12157 $("#noteDeliveryDate").hide() 12158 $("#noteDeliveryDate").empty() 12159 let v = $(this).val() 12160 let v2 = $('option:selected', this).attr('data-city'); 12161 let v3 = $('option:selected', this).attr('data-province'); 12162 let price = $('option:selected', this).attr('data-price'); 12163 12164 $("#country").val(v) 12165 $("#properties-kota-pengiriman").val(v) 12166 $("#properties-shipping").val(price) 12167 $("#deliveryDate button, #deliveryTime button, .calendarseasonal .button").removeClass("selected") 12168 $("#properties-delivery-date, #properties-delivery-time").val("-") 12169 $("#propDeliveryDate, #propDeliveryTime").val("") 12170 let note = $('option:selected', this).attr('data-note'); 12171 if(v === 'Kota Lainnya') { 12172 $("#noteDeliveryDate").show() 12173 $("#noteDeliveryDate").text("Order akan segera dikirim. Estimasi tanggal diterima akan disesuaikan dengan waktu pengiriman oleh pihak ekspedisi ke lokasi Anda.") 12174 $("#zip").attr("required", false) 12175 $("#zip").hide() 12176 $("#propDeliveryDate, #propDeliveryTime").attr("required", false) 12177 $("#propDeliveryDate, #properties-delivery-date, #propDeliveryTime, #properties-delivery-time").val("-") 12178 $("#row-delivery-date, #row-delivery-time").hide() 12179 $("#properties-shipping").val("") 12180 12181 // Hide addressPurchase form and make all fields optional 12182 $(".addressPurchase").hide() 12183 $(".addressPurchase [required]").attr("required", false) 12184 $(".addressPurchase input, .addressPurchase textarea, .addressPurchase select").val("") 12185 $("[data-properties=nama-penerima], [data-properties=alamat-penerima], [data-properties=telepon-penerima]").val("") 12186 $("#properties-nama-penerima, #properties-alamat-penerima, #properties-telepon-penerima").val("") 12187 12188 // $(this).parents(".setup-content").attr("id", "step-2") 12189 12190 } else { 12191 $("#noteDeliveryDate").hide() 12192 $("#zip").attr("required", true) 12193 $("#zip").show() 12194 $("#row-delivery-date, #row-delivery-time").show() 12195 $("#propDeliveryDate, #propDeliveryTime").attr("required", true) 12196 $("#deliveryDate").find("button").removeClass("stop") 12197 12198 // Show addressPurchase form and make fields required 12199 $(".addressPurchase").show() 12200 $(".addressPurchase .form-control").not('[data-properties="company"]').attr("required", true) 12201 $("[data-properties=nama-penerima], [data-properties=alamat-penerima], [data-properties=telepon-penerima]").attr("required", true) 12202 12203 // $(this).parents(".setup-content").attr("id", "step-1") 12204 12205 } 12206 12207 12208 12209 12210 $("#row-delivery-time").hide() 12211 $("#propDeliveryTime").attr("required", false) 12212 12213 12214 // Load delivery dates when city is selected 12215 if(v !== '' && v !== 'Kota Lainnya') { 12216 const deliveryDate = document.getElementById("deliveryDate"); 12217 const deliveryTime = document.getElementById("deliveryTime"); 12218 12219 // Check localStorage first (no city needed, shared across all cities for same product) 12220 const storageKey = getStorageKey('date'); 12221 const storedData = getFromStorage(storageKey); 12222 12223 if (storedData && storedData.date && storedData.time) { 12224 // Render from localStorage immediately using helper function 12225 renderDeliveryDateFromData(storedData); 12226 } else { 12227 // Show skeleton loading state for dates 12228 if(deliveryDate) { 12229 const skeletonDates = ` 12230 <button class="date-single calendarbutton btn steps-btn col col-3 btn-date-time" disabled style="opacity: 0.6;"> 12231 <div style="background: #e0e0e0; width: 30px; height: 5px; margin: 0 auto 4px; border-radius: 0px;"></div>
12232 <span style="background: #d0d0d0; display: inline-block; width: 40px; height: 40px; border-radius: 100%;"></span> 12233 </button> 12234 <button class="date-single calendarbutton btn steps-btn col col-3 btn-date-time" disabled style="opacity: 0.6;"> 12235 <div style="background: #e0e0e0; width: 30px; height: 5px; margin: 0 auto 4px; border-radius: 0px;"></div> 12236 <span style="background: #d0d0d0; display: inline-block; width: 40px; height: 40px; border-radius: 100%;"></span> 12237 </button> 12238 <button class="date-single calendarbutton btn steps-btn col col-3 btn-date-time" disabled style="opacity: 0.6;"> 12239 <div style="background: #e0e0e0; width: 30px; height: 5px; margin: 0 auto 4px; border-radius: 0px;"></div> 12240 <span style="background: #d0d0d0; display: inline-block; width: 40px; height: 40px; border-radius: 100%;"></span> 12241 </button> 12242 <button class="date-single calendarbutton btn steps-btn col col-3 btn-date-time" disabled style="opacity: 0.6;"> 12243 <div style="background: #e0e0e0; width: 30px; height: 5px; margin: 0 auto 4px; border-radius: 0px;"></div> 12244 <span style="background: #d0d0d0; display: inline-block; width: 40px; height: 40px; border-radius: 100%;"></span> 12245 </button> 12246 `; 12247 deliveryDate.innerHTML = skeletonDates; 12248 } 12249 12250 // Show skeleton loading state for times 12251 if(deliveryTime) { 12252 const skeletonTimes = ` 12253 <button class="time-single calendarbutton2 btn steps-btn" disabled style="opacity: 0.6;"> 12254 <div style="background: #e0e0e0; width: 60px; height: 12px; margin: 0 auto 4px; border-radius: 4px;"></div> 12255 <div style="background: #d0d0d0; width: 80px; height: 10px; margin: 0 auto; border-radius: 4px;"></div> 12256 </button> 12257 <button class="time-single calendarbutton2 btn steps-btn" disabled style="opacity: 0.6;"> 12258 <div style="background: #e0e0e0; width: 60px; height: 12px; margin: 0 auto 4px; border-radius: 4px;"></div> 12259 <div style="background: #d0d0d0; width: 80px; height: 10px; margin: 0 auto; border-radius: 4px;"></div> 12260 </button> 12261 <button class="time-single calendarbutton2 btn steps-btn" disabled style="opacity: 0.6;"> 12262 <div style="background: #e0e0e0; width: 60px; height: 12px; margin: 0 auto 4px; border-radius: 4px;"></div> 12263 <div style="background: #d0d0d0; width: 80px; height: 10px; margin: 0 auto; border-radius: 4px;"></div> 12264 </button> 12265 `; 12266 deliveryTime.innerHTML = skeletonTimes; 12267 } 12268 12269 // Load delivery dates (with city parameter) 12270 renderDate(v).then(() => { 12271 console.log('Delivery dates loaded for city:', v); 12272 }).catch(error => { 12273 console.error('Error loading delivery dates:', error); 12274 if(deliveryDate) { 12275 deliveryDate.innerHTML = '<p style="text-align: center; color: #d32f2f; font-size: 14px; padding: 20px 0;">Failed to load dates. Please try again.</p>'; 12276 } 12277 }); 12278 } 12279 } 12280 12281 12282 disabledSameDay() 12283 12284 12285 if(v !== 'Jakarta' && v !== 'Depok' && v !== 'Bekasi' && v !== 'Tangerang') { 12286 12287 $("[data-addon=giftcard]").show() 12288 $("[data-addon=giftcard]").click() 12289 $("#itemAddons").show() 12290 $("#flower-step").addClass("nonjadetabek") 12291 } else { 12292 $("#cardOccasion, #navAddon, .collection-addons").show() 12293 $("[data-addon]").eq(0).click() 12294 $("#flower-step").removeClass("nonjadetabek") 12295 } 12296 12297 }) 12298 12299 $("#zip").change(function(e){ 12300 let v = $(this).val() 12301 var city = $("#cities").find('option:selected'); 12302 $("#properties-kodepos").val(v) 12303 if(city === 'Kota Lainnya') { 12304 $(this).attr("required", true) 12305 $("#recipient-address").val("") 12306 } 12307 }) 12308 12309 12310 var minDate = new Date(2026, 0, 12) 12311 12312 12313 // Initialize datepicker only if jQuery UI is loaded 12314 if (typeof $.fn.datepicker === 'function') { 12315 $("#full-date").datepicker({ 12316 minDate, 12317 dateFormat: 'Mdd_yy', //Nop22_2021, 12318 12319 beforeShowDay: disabledays, 12320 12321 onSelect: function (date) { 12322 $("#deliveryDate, #deliveryDateFull label ").hide() 12323 $("#deliveryDateFull").addClass("filled") 12324 $(".btnChangeDeliveryDate").removeClass("hide") 12325 12326 $("#full-date").prop('disabled', true); 12327 12328 $('#propDeliveryDate, #properties-delivery-date').val('Kirim_'+date); 12329 $(".date-full").addClass("selected") 12330 $(".date-single, .calendar-group").removeClass("selected") 12331 $("#propDeliveryTime").val('') 12332 $("#properties-delivery-time").val('-') 12333 $(".time-single").removeClass("selected") 12334 12335 const select = $('#cities option:selected').val(); 12336 if(select !== 'Jakarta' && select !== 'Depok' && select !== 'Bekasi' && select !== 'Tangerang') { 12337 $("#noteDeliveryDate").show() 12338 $("#noteDeliveryDate").html(`Order akan dikirim pada tanggal ${date} dari Jakarta. Estimasi tanggal diterima akan disesuaikan dengan waktu pengiriman oleh pihak ekspedisi ke lokasi Anda.`) 12339 } else { 12340 $("#noteDeliveryDate").hide() 12341 } 12342 12343 12344 } 12345 }); 12346 } else { 12347 // jQuery UI datepicker not loaded, show console warning 12348 console.warn('jQuery UI datepicker is not available. Make sure jQuery UI library is loaded.'); 12349 } 12350 12351 $(".btnChangeDeliveryDate").click(function(){ 12352 $("#deliveryDate, #deliveryDateFull label ").show() 12353 $("#deliveryDateFull").removeClass("filled") 12354 $(".btnChangeDeliveryDate").addClass("hide") 12355 $("#full-date").prop('disabled', false); 12356 }) 12357 12358 $("#deliveryDate").delegate(".calendarbutton:not(.date-full)", "click", function(e){
12359 e.preventDefault() 12360 $(this).parents("#row-delivery-date").find("p.error").remove() 12361 const fulldate = $(this).data("fulldate") 12362 const day = $(this).data("day") 12363 const date = $(this).data("date") 12364 const month = $(this).data("month") 12365 const year = $(this).data("year") 12366 const off_pagi = $(this).data("offpagi") 12367 const off_siang = $(this).data("offsiang") 12368 const off_Malam = $(this).data("offMalam") 12369 $(".calendarbutton").removeClass("selected") 12370 $(this).addClass("selected") 12371 $("#propDeliveryDate, #properties-delivery-date").val(`Kirim_${month}${date}_${year}`) 12372 $("#propDeliveryTime").val('') 12373 $("#properties-delivery-time").val('-') 12374 $(".calendarbutton2").removeClass("selected") 12375 $("#full-date").val("Full Calendar") 12376 12377 12378 if(off_pagi && timeOfDay > off_pagi) { 12379 $("[data-time=Morning]").attr("disabled", true) 12380 } else { 12381 $("[data-time=Morning]").attr("disabled", false) 12382 } 12383 if(off_siang && timeOfDay > off_siang) { 12384 $("[data-time=Afternoon]").attr("disabled", true) 12385 } else { 12386 $("[data-time=Afternoon]").attr("disabled", false) 12387 } 12388 if(off_malam && timeOfDay > off_malam) { 12389 $("[data-time=Evening]").attr("disabled", true) 12390 } else { 12391 $("[data-time=Evening]").attr("disabled", false) 12392 } 12393 12394 12395 12396 const select = $('#cities option:selected').val(); 12397 if(select !== 'Jakarta' && !select.match('PickUp') && select !== 'Depok' && select !== 'Bekasi' && select !== 'Tangerang' && select !== '') { 12398 $("#noteDeliveryDate").show() 12399 $("#noteDeliveryDate").html(`Order akan dikirim pada tanggal ${day}, ${date} ${month} ${year} dari Jakarta. Estimasi tanggal diterima akan disesuaikan dengan waktu pengiriman oleh pihak ekspedisi ke lokasi Anda.`) 12400 } else { 12401 $("#noteDeliveryDate").hide() 12402 } 12403 12404 }) 12405 12406 if(today === 14 && timeOfDay > 17.00) { 12407 $("#deliveryDate button:first-child").attr("disabled", true) 12408 } 12409 12410 $("#deliveryTime").delegate(".calendarbutton2", "click", function(e){ 12411 e.preventDefault() 12412 const time = $(this).data("time") 12413 const date = $("#propDeliveryDate").val() 12414 if(date == '') { 12415 // return alert('Silakan pilih tanggal terlebih dahulu') 12416 } 12417 $(".calendarbutton2").removeClass("selected") 12418 $(this).addClass("selected") 12419 $("#propDeliveryTime, #properties-delivery-time").val(`KirimJam_${date.replace('Kirim_','')}_${time}`) 12420 }) 12421 12422 $('textarea.has-limit, input.has-limit').keyup(function () { 12423 max = this.getAttribute("maxlength"); 12424 let len = $(this).val().length; 12425 let limit = $(this).siblings(".limit"); 12426 if (len > max) { 12427 alert('you have reached the limit'); 12428 } else { 12429 limit.text(`${len}/${max}`); 12430 } 12431 }); 12432 12433 $("#button-action-step .btn").click(function(){ 12434 $(this).find("span").text("Processing..."); 12435 }); 12436 12437 $(".finishBtn").on('click', function() { 12438 $(this).addClass("is-adding"); 12439 // $(this).click(); 12440 }); 12441 12442 $('.setup-panel .nav-item a.btn-success').trigger('click'); 12443 12444 $("#button-action .btn").click(function(){ 12445 $("#flower-step").addClass("block"); 12446 $("#button-action").hide(); 12447 }); 12448 12449 $(".close-how-order").click(function(){ 12450 $("#flower-step").removeClass("block"); 12451 $("#button-action").show(); 12452 }); 12453 12454 $("#input-foto, #input-video").change(function(e){ 12455 readURL(this); 12456 }); 12457 12458 $("#logoPapan").change(function(){ 12459 readURLPapan(this); 12460 }); 12461 12462 $("#address-upload").change(async function(){ 12463 const upload_address = await readURLAddress(this) 12464 if(upload_address) { 12465 const url = upload_address.url 12466 $(".props-address-upload").val(url) 12467 // $(".form-address").addClass("address-uploaded") 12468 $(".form-address-upload").addClass("uploaded") 12469 12470 // $(this).parents(".form-group").siblings(".form-group").find("[required]").attr("required", false) 12471 12472 // Hit OCR endpoint to get address options 12473 // await hitOCREndpoint(url) 12474 } 12475 }) 12476 12477 $(".address-manualy").click(function(){ 12478 $(".form-address-upload").removeClass("uploaded"); 12479 $(".photo-address").hide(); 12480 // $(".form-address").removeClass("address-uploaded") 12481 $("#formAddressPurchase").find(".form-control").not('[data-properties="company"]').attr("required", true) 12482 });
12483 12484 $(".case-video-preview").delegate(".replace-video", "click", function(){ 12485 $("#input-video").trigger("click") 12486 }) 12487 12488 $('.date-single').click(function(e) { 12489 e.preventDefault(); 12490 $('.date-single').removeClass('selected'); 12491 $('#full-date').removeClass('selected'); 12492 $(this).addClass('selected'); 12493 $('#full-date').html('Full' + '<br/>' + 'Calendar'); 12494 }); 12495 12496 // Function to load jQuery UI if not loaded 12497 function ensureJQueryUI() { 12498 return new Promise((resolve, reject) => { 12499 if (typeof $.fn.datepicker === 'function') { 12500 resolve(); 12501 } else { 12502 // Load CSS first 12503 if (!document.querySelector('link[href*="jquery-ui"]')) { 12504 const css = document.createElement('link'); 12505 css.rel = 'stylesheet'; 12506 css.href = 'https://code.jquery.com/ui/1.13.0/themes/base/jquery-ui.min.css'; 12507 document.head.appendChild(css); 12508 } 12509 12510 // Load JS 12511 const script = document.createElement('script'); 12512 script.src = 'https://code.jquery.com/ui/1.13.0/jquery-ui.min.js'; 12513 script.onload = () => { 12514 resolve(); 12515 }; 12516 script.onerror = () => { 12517 reject(new Error('Failed to load jQuery UI')); 12518 }; 12519 document.head.appendChild(script); 12520 } 12521 }); 12522 } 12523 12524 // Force trigger datepicker on click - initialize if needed 12525 $('#full-date').on('click focus', async function(e){ 12526 $('.date-single').removeClass('selected'); 12527 $(this).addClass('selected'); 12528 12529 // Ensure jQuery UI is loaded 12530 try { 12531 await ensureJQueryUI(); 12532 } catch(err) { 12533 alert('Calendar widget is not available. Please refresh the page.'); 12534 return; 12535 } 12536 12537 // Determine minDate 12538 12539 var minDate = new Date(2026, 0, 12); 12540 12541 12542 // Helper function to initialize datepicker 12543 const initDatepicker = () => { 12544 $(this).datepicker({ 12545 minDate: minDate, 12546 dateFormat: 'Mdd_yy', 12547 12548 beforeShowDay: disabledays, 12549 12550 onSelect: function (date) { 12551 $("#deliveryDate, #deliveryDateFull label ").hide(); 12552 $("#deliveryDateFull").addClass("filled"); 12553 $(".btnChangeDeliveryDate").removeClass("hide"); 12554 12555 $("#full-date").prop('disabled', true); 12556 12557 $('#propDeliveryDate, #properties-delivery-date').val('Kirim_'+date); 12558 $(".date-full").addClass("selected"); 12559 $(".date-single, .calendar-group").removeClass("selected"); 12560 $("#propDeliveryTime").val(''); 12561 $("#properties-delivery-time").val('-'); 12562 $(".time-single").removeClass("selected"); 12563 12564 const select = $('#cities option:selected').val(); 12565 if(select !== 'Jakarta' && select !== 'Depok' && select !== 'Bekasi' && select !== 'Tangerang') { 12566 $("#noteDeliveryDate").show(); 12567 $("#noteDeliveryDate").html(`Order akan dikirim pada tanggal ${date} dari Jakarta. Estimasi tanggal diterima akan disesuaikan dengan waktu pengiriman oleh pihak ekspedisi ke lokasi Anda.`); 12568 } else { 12569 $("#noteDeliveryDate").hide(); 12570 } 12571 12572 12573 } 12574 }); 12575 }; 12576 12577 // If datepicker doesn't exist, initialize it 12578 if (!$(this).hasClass('hasDatepicker')) { 12579 try { 12580 initDatepicker(); 12581 } catch(err) { 12582 console.error('Error initializing datepicker:', err); 12583 return; 12584 } 12585 } 12586 12587 // Try to show datepicker 12588 try { 12589 $(this).datepicker('show'); 12590 } catch(err) { 12591 // If error occurs (corrupted settings), destroy and reinitialize 12592 try { 12593 $(this).datepicker('destroy'); 12594 $(this).removeClass('hasDatepicker'); 12595 initDatepicker(); 12596 $(this).datepicker('show'); 12597 } catch(reinitErr) { 12598 // If still fails, alert user 12599 alert('Unable to open calendar. Please refresh the page.'); 12600 } 12601 } 12602 });
12603 12604 // $("tr").each(function(){ 12605 // if($(this).text().match('SKU')) { 12606 // $(".sku-product").html($(this).parents("table").html()) 12607 // } 12608 // }) 12609 12610 $("#product-image").scroll(function(){ 12611 $(".desc-add").each(function(){ 12612 const img = $(this).find("img") 12613 const src = img.data("src") 12614 img.attr("src", src) 12615 }) 12616 }) 12617 12618 $(".product-fixed").hide() 12619 12620 let target = $("#personalizeBtn") 12621 12622 12623 $(".product-meta").scroll(function() { 12624 if ($(window).scrollTop() >= target.offset().top ) { 12625 $(".product-fixed").addClass("show") 12626 } else { 12627 $(".product-fixed").removeClass("show") 12628 } 12629 }); 12630 12631 $(window).scroll(function() { 12632 if ($(window).scrollTop() >= target.offset().top ) { 12633 $(".product-fixed").addClass("show") 12634 } else { 12635 $(".product-fixed").removeClass("show") 12636 } 12637 }); 12638 12639 // Add event listeners to trigger card preview updates 12640 $(document).on('input change keyup', '#senderCard, #kartu-ucapan, [data-properties="ucapan"], [data-properties="kartu-nama-pengirim"]', function() { 12641 $(document).trigger('cardDataUpdated'); 12642 }); 12643 12644 // Trigger card preview update when photo or video is uploaded 12645 $(document).on('photoUploaded videoUploaded', function() { 12646 $(document).trigger('cardDataUpdated'); 12647 }); 12648 }); 12649</script>
12649 12650 12651
12651<script> 12652 // 12653 </script>
12653 12654
12655<script> 12656 $(document).ready(function(){ 12657 $('table tr td').each(function(){ 12658 var texto = $(this).text(); 12659 var nextto = $(this).next("td"); 12660 var sku = $("#data-sku").val() 12661 if(texto == 'SKU'){ 12662 nextto.text(sku) 12663 } 12664 }); 12665 12666 $(".stamped-summary-actions-newquestion").text("Tulis Pertanyaan"); 12667 $(".stamped-summary-actions-newreview").text("Tulis Review"); 12668 $("#tab-questions").text("Pertanyaan"); 12669 12670 $(".freeship .icon").click(function(){ 12671 $(".fs-content").slideToggle(); 12672 $(this).parents(".freeship").toggleClass("expand"); 12673 }); 12674 12675 var $easyzoom = $('.easyzoom').easyZoom(); 12676 // Setup thumbnails example 12677 var api1 = $easyzoom.filter('.easyzoom--with-thumbnails').data('easyZoom'); 12678 $('.thumbnails').on('click', 'a', function(e) { 12679 var $this = $(this); 12680 e.preventDefault(); 12681 // Use EasyZoom's `swap` method 12682 api1.swap($this.data('standard'), $this.attr('href')); 12683 }); 12684 12685 $('#playerID').click(function(){ 12686 var videoURL = $('#VdoID').attr('src'), 12687 dataplay = $('#VdoID').attr('data-play'); 12688 12689 //for check autoplay 12690 //if not set autoplay=1 12691 if(dataplay == 0 ){ 12692 $('#VdoID').attr('src',videoURL+'?autoplay=1'); 12693 $('#VdoID').attr('data-play',1); 12694 } 12695 else{ 12696 var videoURL = $('#VdoID').attr('src'); 12697 videoURL = videoURL.replace("?autoplay=1", ""); 12698 $('#VdoID').prop('src',''); 12699 $('#VdoID').prop('src',videoURL); 12700 12701 $('#VdoID').attr('data-play',0); 12702 } 12703 12704 }); 12705 12706 $(".product-photo-thumb-video").click(function(e){ 12707 e.preventDefault(); 12708 12709 var newEmbed = $(this).attr('href'); 12710 $("#featured-image-product").addClass("img-video"); 12711 $("#ProductPhotoImg").hide(); 12712 $("#featured-image-product .video").show(); 12713 $("#featured-image-product iframe").attr('src', newEmbed); 12714 $("#VdoID")[0].src += "&autoplay=1"; 12715 }); 12716 $(".product-single__thumbnail").click(function(evt){ 12717 evt.preventDefault(); 12718 $("#featured-image-product").removeClass("img-video"); 12719 $("#ProductPhotoImg").show(); 12720 $("#featured-image-product .video").hide(); 12721 $("#featured-image-product iframe").attr('src', ''); 12722 }); 12723 12724 if($('#product-meta .short-desc > div').length >= 1){ 12725 //console.log('div detected') 12726 var replacer = $('#product-meta .short-desc > div').contents(); 12727 $('#product-meta .short-desc > div').replaceWith(replacer); 12728 12729 var cAssured = $('.c-assured').detach(); 12730 cAssured.insertAfter('.meta-sds .stock-info'); 12731 } 12732 12733 12734 const productMeta = $(".product-meta") 12735 if(productMeta.height() > 600) { 12736 $("#product-image, .product-meta").css("max-height", productMeta) 12737 } 12738 12739 12740 $(".heading-toggle").click(function(){ 12741 $(this).parent().toggleClass("open") 12742 12743 }); 12744 }); 12745</script>
12745 12746 12747 12748
12748<script type="application/json" id="ProductJson-Product"> 12749 12750 { 12751"id":7881418965207, 12752"title":"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman", 12753"handle":"hantu-slot-fitur-inovatif-game-online", 12754"description":"\u003cul\u003e 12755\n\u003cli\u003e 12756\u003cstrong\u003eHANTUSLOT\u003c\/strong\u003e\u003cbr\u003e 12757Platform Game Online Modern Dengan Fitur Inovatif 12758\u003c\/li\u003e 12759\n\u003cli\u003e 12760\u003cstrong\u003eGAME ONLINE\u003c\/strong\u003e\u003cbr\u003e 12761Akses Permainan Digital Berbahasa Indonesia 12762\u003c\/li\u003e 12763\n\u003cli\u003e 12764\u003cstrong\u003eFITUR INOVATIF\u003c\/strong\u003e 12765\u003c\/li\u003e 12766\n\u003c\/ul\u003e 12767 12768\u003cp\u003e 12769HANTUSLOT kini menghadirkan pengalaman game online modern dengan dukungan fitur inovatif berbahasa Indonesia. Tampilan yang mudah dipahami, navigasi sederhana, serta sistem yang dirancang untuk memberikan kenyamanan membuat pengguna dapat menikmati akses permainan digital dengan lebih praktis. 12770\u003c\/p\u003e 12771 12772\u003cp\u003e 12773\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1589\/6833\/files\/Ruby-Mulan-Bag.jpg?v=1734513286\" alt=\"HANTUSLOT Fitur Inovatif Game Online\"\u003e 12774\u003c\/p\u003e 12775 12776\u003ctable style=\"width:100.091%;\" width=\"100%\"\u003e 12777\u003ctbody\u003e 12778 12779\u003ctr\u003e 12780\u003ctd style=\"width:33.7327%;\"\u003eSKU\u003c\/td\u003e 12781 12782\u003ctd style=\"width:65.9908%;\"\u003e 12783[C]HANTUSLOT\u003cbr\u003e 12784[C]GAMEONLINE-ID2026\u003cbr\u003e 12785\u003c\/td\u003e 12786\u003c\/tr\u003e 12787 12788 12789\u003ctr\u003e 12790\u003ctd style=\"width:33.7327%;\"\u003eIsi\u003c\/td\u003e 12791 12792\u003ctd style=\"width:65.9908%;\"\u003e 12793platform game online modern\u003cbr\u003e 12794fitur game online inovatif terbaru\u003cbr\u003e 12795akses game online berbahasa Indonesia\u003cbr\u003e 12796situs game online terpercaya dan nyaman\u003cbr\u003e 12797platform permainan digital masa kini\u003cbr\u003e 12798fitur lengkap dengan tampilan modern\u003cbr\u003e 12799pengalaman bermain online yang praktis\u003cbr\u003e 12800\u003c\/td\u003e 12801 12802\u003c\/tr\u003e 12803 12804\u003c\/tbody\u003e 12805\u003c\/table\u003e" 12806} 12807 </script>
12807 12808 12809
12809<script type="application/json" id="VariantJson-Product"> 12810 [ 12811 12812 { 12813 "incoming": false, 12814 "next_incoming_date": null 12815 }, 12816 12817 { 12818 "incoming": false, 12819 "next_incoming_date": null 12820 } 12821 12822 ] 12823 </script>
12823 12824 12825 12826 12827 12828</div> 12829 12830
12831<script src="https://outerbloom.com/cdn/shopifycloud/storefront/assets/themes_support/option_selection-b017cd28.js" type="text/javascript"></script>
12831 12832<style> 12833 .stamped-review-header-title, 12834 .stamped-review-header .author, 12835 .stamped-review-content-body, 12836 .stamped-sort-select, 12837 .stamped-review-header .verified-badge[data-type=buyer]:after, 12838 .stamped-review-header-byline, 12839 .stamped-review-reply-body {font-size: 14px!important;font-family: 'Barlow',sans-serif!important;} 12840 .stamped-review {margin-bottom: 0;} 12841 .stamped-review-body {padding-left: 65px;} 12842 .stamped-review:first-child {padding-top: 25px;} 12843 .stamped-review-content {clear: none;} 12844 .stamped-review-reply {margin: 15px 0 0 65px;background: #f2f2f2;border-left: none;} 12845 .stamped-review-reply-body {padding-left: 65px;} 12846 .stamped-review-header .author {text-transform: capitalize;} 12847 .stamped-questions .stamped-review-content {padding-left: 65px;} 12848 12849 .stamped-pagination {margin: 20px 0 0;} 12850 .stamped-pagination li {position: initial!important;display: inline-block;position: relative;vertical-align: middle;text-decoration: none;-webkit-tap-highlight-color: transparent;-webkit-box-flex: 0;-moz-box-flex: 0;-ms-flex: 0 0 auto;flex: 0 0 auto;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;background: 0 0;text-transform: none;color: #33373D;font-weight: 400;-webkit-transition: background .1s ease,box-shadow .1s ease,color .1s ease;transition: background .1s ease,box-shadow .1s ease,color .1s ease;border: 1px solid #ccc;border-right: none;margin-bottom: 0;} 12851 .stamped-pagination li a {color: #121212;padding: 13px 18px;vertical-align: middle;display: block;} 12852 .stamped-pagination li.active a {background-color: #ddd;font-weight: 400;} 12853 .stamped-pagination li:hover a {background: #ddd;} 12854 .stamped-pagination .next {border-right: 1px solid #ccc;} 12855 .stamped-pagination li:first-child {border-top-left-radius: 5px;border-bottom-left-radius: 5px;} 12856 .stamped-pagination li:last-child {border-top-right-radius: 5px;border-bottom-right-radius: 5px;} 12857 12858 #stamped-pagination-question span.page {display: inline-block;border: 1px solid #ccc;width: 47px;} 12859 #stamped-pagination-question span {font-size: 14px;} 12860 #stamped-pagination-question .page.active {padding: 12px;font-weight: 400;background: #ddd;} 12861 #stamped-pagination-question a, #stamped-pagination-question .page.active {color: #121212;padding: 13px 18px;vertical-align: middle;display: inline-block;} 12862 .stamped-pagination-deco {color: #121212;padding: 13px 18px;width: 47px;vertical-align: middle;display: inline-block;border: 1px solid #ccc;padding: 12px;} 12863 .stamped-pagination-prev, .stamped-pagination-next {position: inherit;} 12864 .stamped-pagination-prev a, .stamped-pagination-next a {width: auto!important;border: 1px solid #ccc;} 12865 12866 @media (max-width: 480px){ 12867 .stamped-review-reply {margin-left: 0!important;} 12868 select.stamped-sort-select {font-size: 13px!important;} 12869 } 12870 12871 #product-reviews .stamped-summary-ratings, #product-reviews .stamped-summary-actions, .stamped-content { 12872 display: block !important; 12873 } 12874</style>
12875<script> 12876 var selectCallback = function(variant, selector) { 12877 timber.productPage({ 12878 money_format: "Rp {{amount_no_decimals}}", 12879 variant: variant, 12880 selector: selector 12881 }); 12882 }; 12883 12884 jQuery(function($) { 12885 new Shopify.OptionSelectors('productSelect', { 12886 product: 12887 12888 12889 12890 12891 12892{ 12893"id":7881418965207, 12894"title":"HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman", 12895"handle":"hantu-slot-fitur-inovatif-game-online", 12896"description":"\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eHANTUSLOT\u003c\/strong\u003e\u003cbr\u003e\u003cstrong\u003e\u003c\/strong\u003e\u003cstrong\u003e\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eGAME ONLINE\u003c\/strong\u003e\u003cbr\u003e\n\u003c\/li\u003e\n\u003cli\u003e\u003cstrong\u003eFITUR INOVATIF\u003c\/strong\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003eHANTUSLOT menghadirkan platform game online modern dengan dukungan fitur berbahasa Indonesia yang membantu pengguna memahami setiap menu dengan lebih mudah serta menikmati pengalaman digital yang praktis, responsif, dan nyaman.\u003c\/p\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1589\/6833\/files\/Ruby-Mulan-Bag.jpg?v=1734513286\" alt=\"HANTUSLOT Game Online Fitur Inovatif\"\u003e\u003c\/p\u003e\n\u003ctable style=\"width: 100.091%;\" width=\"100%\"\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"width: 33.7327%;\"\u003eSKU\u003c\/td\u003e\n\u003ctd style=\"width: 65.9908%;\"\u003e[C]HANTUSLOT\u003cbr\u003e[C]GAMEONLINE-ID2026\u003cbr\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"width: 33.7327%;\"\u003eIsi\u003c\/td\u003e\n\u003ctd style=\"width: 65.9908%;\"\u003elink akses HANTUSLOT game online modern\u003cbr\u003eplatform game online berbahasa Indonesia\u003cbr\u003efitur inovatif game digital terbaru\u003cbr\u003esitus game online dengan tampilan modern\u003cbr\u003eplatform game online responsif dan nyaman\u003cbr\u003eakses permainan digital melalui berbagai perangkat\u003cbr\u003epengalaman menggunakan game online yang praktis\u003cbr\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e", 12897"vendor":"HANTUSLOT", 12898"type":"Game Online Platform" 12899}, 12900 onVariantSelected: selectCallback, 12901 enableHistoryState: true 12902 }); 12903 12904 // Add label if only one product option and it isn't 'Title'. Could be 'Size'. 12905 12906 $('.selector-wrapper:eq(0)').prepend('<label for="productSelect-option-0">Variants</label>'); 12907 12908 12909 // Hide selectors if we only have 1 variant and its title contains 'Default'. 12910 12911 }); 12912</script>
12912 12913 12914
12915<script type="application/ld+json"> 12916{ 12917 "@context": "https://schema.org", 12918 "@type": "FAQPage", 12919 "mainEntity": [ 12920 { 12921 "@type": "Question", 12922 "name": "Apa itu HANTUSLOT?", 12923 "acceptedAnswer": { 12924 "@type": "Answer", 12925 "text": "HANTUSLOT merupakan platform game online dengan antarmuka berbahasa Indonesia yang dirancang dengan tampilan modern, navigasi praktis, dan akses yang nyaman di berbagai perangkat." 12926 } 12927 }, 12928 { 12929 "@type": "Question", 12930 "name": "Apa yang membuat HANTUSLOT menarik untuk digunakan?", 12931 "acceptedAnswer": { 12932 "@type": "Answer", 12933 "text": "HANTUSLOT menghadirkan desain futuristik, navigasi sederhana, fitur yang mudah dipahami, serta tampilan responsif untuk memberikan pengalaman penggunaan yang lebih praktis." 12934 } 12935 }, 12936 { 12937 "@type": "Question", 12938 "name": "Apakah HANTUSLOT menyediakan tampilan dalam bahasa Indonesia?", 12939 "acceptedAnswer": { 12940 "@type": "Answer", 12941 "text": "Ya, HANTUSLOT menyediakan menu dan informasi berbahasa Indonesia sehingga pengguna dapat memahami berbagai fitur dan navigasi dengan lebih mudah." 12942 } 12943 }, 12944 { 12945 "@type": "Question", 12946 "name": "Apakah HANTUSLOT mendukung perangkat mobile?", 12947 "acceptedAnswer": { 12948 "@type": "Answer", 12949 "text": "Ya. HANTUSLOT dirancang agar dapat digunakan melalui smartphone, tablet, maupun desktop dengan tampilan yang menyesuaikan ukuran layar perangkat." 12950 } 12951 }, 12952 { 12953 "@type": "Question", 12954 "name": "Apa saja fitur unggulan HANTUSLOT?", 12955 "acceptedAnswer": { 12956 "@type": "Answer", 12957 "text": "Beberapa fitur unggulan HANTUSLOT meliputi antarmuka responsif, navigasi intuitif, akses multi-perangkat, sistem keamanan modern, serta dukungan customer service." 12958 } 12959 }, 12960 { 12961 "@type": "Question", 12962 "name": "Apakah HANTUSLOT mudah digunakan oleh pemula?", 12963 "acceptedAnswer": { 12964 "@type": "Answer", 12965 "text": "Tentu. Struktur menu HANTUSLOT dibuat sederhana dan informatif sehingga pengguna baru dapat mempelajari berbagai fitur tanpa harus melalui proses yang rumit." 12966 } 12967 }, 12968 { 12969 "@type": "Question", 12970 "name": "Bagaimana HANTUSLOT membantu menjaga keamanan pengguna?", 12971 "acceptedAnswer": { 12972 "@type": "Answer", 12973 "text": "HANTUSLOT menggunakan berbagai langkah keamanan digital untuk membantu menjaga informasi akun dan memberikan lingkungan penggunaan yang lebih aman." 12974 } 12975 }, 12976 { 12977 "@type": "Question", 12978 "name": "Apakah HANTUSLOT memiliki performa akses yang ringan?", 12979 "acceptedAnswer": { 12980 "@type": "Answer", 12981 "text": "HANTUSLOT dirancang dengan fokus pada kecepatan dan responsivitas sehingga pengguna dapat berpindah antarhalaman dengan lebih lancar pada perangkat yang kompatibel." 12982 } 12983 }, 12984 { 12985 "@type": "Question", 12986 "name": "Apakah HANTUSLOT menyediakan customer service?", 12987 "acceptedAnswer": { 12988 "@type": "Answer", 12989 "text": "Ya, HANTUSLOT menyediakan layanan customer service untuk membantu pengguna mendapatkan informasi serta menangani pertanyaan terkait penggunaan platform." 12990 } 12991 }, 12992 { 12993 "@type": "Question", 12994 "name": "Bagaimana cara membuat akun HANTUSLOT?", 12995 "acceptedAnswer": { 12996 "@type": "Answer", 12997 "text": "Pengguna dapat mengikuti petunjuk pendaftaran yang tersedia pada platform dengan melengkapi informasi yang diperlukan dan mengikuti proses verifikasi sesuai ketentuan yang berlaku." 12998 } 12999 }, 13000 { 13001 "@type": "Question", 13002 "name": "Apa keunggulan desain HANTUSLOT?", 13003 "acceptedAnswer": { 13004 "@type": "Answer", 13005 "text": "HANTUSLOT menggabungkan elemen visual modern dengan struktur navigasi yang sederhana sehingga tampilan tetap menarik sekaligus mudah digunakan." 13006 } 13007 }, 13008 { 13009 "@type": "Question", 13010 "name": "Apakah HANTUSLOT melakukan pembaruan secara berkala?", 13011 "acceptedAnswer": { 13012 "@type": "Answer", 13013 "text": "HANTUSLOT dapat melakukan pengembangan dan pembaruan pada fitur maupun tampilan untuk meningkatkan kualitas serta kenyamanan penggunaan platform." 13014 } 13015 }, 13016 { 13017 "@type": "Question", 13018 "name": "Perangkat apa saja yang dapat digunakan untuk mengakses HANTUSLOT?",
13019 "acceptedAnswer": { 13020 "@type": "Answer", 13021 "text": "HANTUSLOT dapat diakses melalui perangkat yang memiliki koneksi internet dan browser yang kompatibel, termasuk smartphone, tablet, laptop, dan komputer desktop." 13022 } 13023 }, 13024 { 13025 "@type": "Question", 13026 "name": "Mengapa fitur inovatif menjadi salah satu keunggulan HANTUSLOT?", 13027 "acceptedAnswer": { 13028 "@type": "Answer", 13029 "text": "Fitur inovatif membantu membuat navigasi lebih praktis, informasi lebih mudah ditemukan, serta memberikan pengalaman menggunakan platform game online yang lebih modern dan efisien." 13030 } 13031 } 13032 ] 13033} 13034</script>
13034 13035
13036<script type="application/ld+json"> 13037{ 13038 "@context": "https://schema.org", 13039 "@type": "Product", 13040 "name": "HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman", 13041 "description": "HANTUSLOT menghadirkan beragam game online modern dengan dukungan fitur berbahasa Indonesia, sehingga pengguna dapat memahami setiap menu dan fitur dengan lebih mudah serta menikmati pengalaman bermain yang praktis dan nyaman.", 13042 "brand": { 13043 "@type": "Brand", 13044 "name": "HANTUSLOT" 13045 }, 13046 "aggregateRating": { 13047 "@type": "AggregateRating", 13048 "ratingValue": "5.0", 13049 "bestRating": "5", 13050 "worstRating": "1", 13051 "ratingCount": "14", 13052 "reviewCount": "14" 13053 }, 13054 "review": [ 13055 { 13056 "@type": "Review", 13057 "author": { "@type": "Person", "name": "Dimas Ardiansyah" }, 13058 "datePublished": "2026-07-28", 13059 "reviewRating": { "@type": "Rating", "ratingValue": "5", "bestRating": "5" }, 13060 "reviewBody": "HANTUSLOT memiliki tampilan yang modern dan mudah dipahami. Menu berbahasa Indonesia membuat saya lebih cepat menemukan berbagai fitur yang tersedia." 13061 }, 13062 { 13063 "@type": "Review", 13064 "author": { "@type": "Person", "name": "Raka Pratama" }, 13065 "datePublished": "2026-07-21", 13066 "reviewRating": { "@type": "Rating", "ratingValue": "5", "bestRating": "5" }, 13067 "reviewBody": "Saya suka dengan desain HANTUSLOT yang rapi dan responsif. Akses melalui smartphone terasa ringan dan navigasinya juga cukup praktis." 13068 }, 13069 { 13070 "@type": "Review", 13071 "author": { "@type": "Person", "name": "Andika Saputro" }, 13072 "datePublished": "2026-07-15", 13073 "reviewRating": { "@type": "Rating", "ratingValue": "5", "bestRating": "5" }, 13074 "reviewBody": "Fitur yang tersedia cukup lengkap dan semuanya tersusun dengan jelas. HANTUSLOT memberikan pengalaman menggunakan platform game online yang terasa modern." 13075 }, 13076 { 13077 "@type": "Review", 13078 "author": { "@type": "Person", "name": "Bima Kurniawan" }, 13079 "datePublished": "2026-07-09", 13080 "reviewRating": { "@type": "Rating", "ratingValue": "5", "bestRating": "5" }, 13081 "reviewBody": "Hal yang paling saya sukai dari HANTUSLOT adalah antarmukanya yang sederhana. Pengguna baru juga bisa memahami fungsi setiap menu dengan mudah." 13082 }, 13083 { 13084 "@type": "Review", 13085 "author": { "@type": "Person", "name": "Rendy Firmansyah" }, 13086 "datePublished": "2026-07-02", 13087 "reviewRating": { "@type": "Rating", "ratingValue": "5", "bestRating": "5" }, 13088 "reviewBody": "Performa HANTUSLOT terasa cepat ketika diakses melalui perangkat mobile maupun desktop. Tampilan juga tetap nyaman meskipun berpindah perangkat." 13089 } 13090] 13091} 13092</script>
13092 13093
13094<script type="application/ld+json"> 13095{ 13096 "@context": "http://schema.org", 13097 "@type": "Product", 13098 "offers": { 13099 "@type": "Offer", 13100 "availability":"https://schema.org/InStock", 13101 "price": 1885000, 13102 "priceValidUntil": "12-12-2026", 13103 "priceCurrency": "IDR", 13104 "url": "https://hotelverta.com/" 13105 }, 13106 "brand": { 13107 "@type": "Brand", 13108 "name": "HANTUSLOT" 13109 }, 13110 "sku": "7881418965207", 13111 "gtin13": "GAME ONLINE TERBARU", 13112 "name": "HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman", 13113 "description": "\n\nHANTUSLOT menghadirkan beragam game online modern dengan dukungan fitur berbahasa Indonesia, sehingga pengguna dapat memahami setiap menu dan fitur dengan lebih mudah serta menikmati pengalaman bermain yang praktis dan nyaman.\n\n\n\n\nSKU\n[C]HANTUSLOT[C]GAME-ONLINE\n\n\n\nIsi\nHANTUSLOT menjadi destinasi favorit para pemain game online berkat kemudahan akses, sistem keamanan yang baik, dan layanan yang responsif.\n\n\n\n", 13114 "category": "Digital Entertainment Platform", 13115 "url": "https://hotelverta.com/", 13116 "image": { 13117 "@type": "ImageObject", 13118 "url": "https://imagesme.b-cdn.net/landing/banner-hotelverta.png", 13119 "image": "https://imagesme.b-cdn.net/landing/banner-hotelverta.png", 13120 "name": "HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman", 13121 "width": 1024, 13122 "height": 1024 13123 } 13124} 13125</script>
13125 13126 13127 13128 13129 13130
13131<script id="bss-ltap-hide-price" type="text/javascript" > 13132!function(e){var t={};function o(r){if(t[r])return t[r].exports;var c=t[r]={i:r,l:!1,exports:{}};return e[r].call(c.exports,c,c.exports,o),c.l=!0,c.exports}o.m=e,o.c=t,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var c in e)o.d(r,c,function(t){return e[t]}.bind(null,c));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";function r(e){e.ltsp={},function(e){e.ltsp.quickView=function(){document.querySelectorAll(".quickview-button").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementById("add-to-cart-quickview-form");if(e){let t=e.querySelector(".groups-btn");t&&t.remove();let o=e.querySelector(".pieces");o&&o.remove();let r=e.querySelector(".bsscommerce-ltsp-message");r&&r.remove()}if(e=document.querySelector("[data-quickview-modal] .halo-modal-body"),e){let t=e.querySelector(".quantity");t&&t.remove()}}),1e3)}))})),document.querySelectorAll(".shop-now-button").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementById("ShopNowContainer");if(e){let t=e.querySelector("#AddToCart");t&&t.remove()}}),2e3)}))})),document.querySelectorAll(".collection__filter").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest(".product-grid-item");if(o){let e=o.querySelector(".btn--quick-view");e&&e.remove()}}}),1500)}))})),document.querySelectorAll(".btn--icon.quick-product__btn").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest(".product-grid__content");if(o){let e=o.querySelector(".payment-buttons");e&&e.remove()}}}),2e3)}))})),document.querySelectorAll(".product-facet__aside").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest(".product-item");if(o){let e=o.querySelector('form[action="/cart/add"]');e&&e.remove();let t=o.querySelector(".product-item__quick-form");t&&t.remove()}}}),1500)}))})),document.querySelectorAll(".pagination").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest(".product-item");if(o){let e=o.querySelector('form[action="/cart/add"]');e&&e.remove();let t=o.querySelector(".product-item__quick-form");t&&t.remove()}}}),1800)}))})),document.querySelectorAll(".collection-filters__sort").forEach((function(e){e.addEventListener("change",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest(".indiv-product");if(o){let e=o.querySelector('form[action="/cart/add"]');e&&e.remove()}}}),1500)}))}
13132)),document.querySelectorAll(".slideout__drawer-right, .sidebar_leftside_wapper, .filtering__results").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest(".product-index");if(o){let e=o.querySelector(".js-quickview-trigger");e&&e.remove()}}}),1500)}))})),document.querySelectorAll("a.product-loop__quickview").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest(".large--one-half");if(o){let e=o.querySelector(".quick-smart-wrapper");e&&e.remove();let t=o.querySelector("#quantity-container");t&&t.remove();let r=o.querySelector(".js-prod-show-soldout");r&&r.remove()}}}),2e3)}))})),document.querySelectorAll(".quick-product__btn").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest(".product-single__meta");if(o){let e=o.querySelector("div.payment-buttons");e&&e.remove()}}}),1e3)}))})),document.querySelectorAll(".btn--load-more").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest(".grid-view-item");if(o){let e=o.querySelector(".quick-add-button");e&&e.remove()}}}),1e3)}))})),document.querySelectorAll(".quick_shop").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest(".product_section");if(o){let e=o.querySelector(".product_form .shopify-product-form .purchase-details"),t=o.querySelector(".product__details .modal_price .price-ui");e&&e.remove(),t&&t.remove()}}}),1e3)}))})),document.querySelectorAll(".qs-button ").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest(".product-info-main");if(o){let e=o.querySelector(".qty-box");e&&e.remove();let t=o.querySelector(".btn.btn-cart");t&&t.remove();let r=o.querySelector(".product-single__sale-price");r&&r.remove();let c=o.querySelector(".product-addto-links");c&&c.remove()}}}),1e3)}))}));let e=document.querySelector("a[data-js-cart-icon]");if(e&&e.addEventListener("click",(function(){let e=document.querySelector(".quick-cart__control");e&&e.remove();let t=document.querySelector(".quick-cart__item-right");t.childNodes[3]&&(t.childNodes[3].innerHTML="Login to seen price")})),document.querySelectorAll(".quick-add-button-variants").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest("#AddToCartForm");if(o){let e=o.querySelector(".paymentButtonsWrapper");e&&e.remove()}}}),1e3)}))})),document.querySelectorAll(".product-thumbnail__quickshop-button").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest(".product-details");if(o){let e=o.querySelectorAll(".bsscommerce-ltsp-message");e.length>1&&e.forEach((function(e,t){t>0&&e.remove()}));let t=o.querySelector(".product-form__cart-buttons");t&&t.remove();let r=o.querySelector(".product-form__quantity-box-wrapper");r&&r.remove()}}}),800)}))})),"b2b-dbodhi-singapore.myshopify.com"===window.Shopify.shop){let e=0;const t=window.location.pathname.includes("/collections");let o=!0;const r=function(){const e=setInterval((function(){let e=document.querySelectorAll(".thb-product-detail.product .bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t],r=o.closest(".thb-product-detail.product");if(r){let e=r.querySelector(".product-form");e&&e.remove()}r=o.closest("del"),r&&o.remove()}}),500);setTimeout(()=>{clearInterval(e)},6e3)},c=function(){const c=window.pageYOffset||document.documentElement.scrollTop;(c>e||!t||o)&&(document.querySelectorAll(".product-card-quickview").forEach((function(e){e.removeEventListener("click",r),e.addEventListener("click",r)}
13132)),o=!1),e=c<=0?0:c};if(c(),t){const e=function(){const e=c;let t;return()=>{clearTimeout(t),t=setTimeout(()=>{e.apply(this)},3e3)}};window.addEventListener("scroll",e())}}}}(e),function(e){e.ltsp.removeElementByLTSPMessage=function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message"),t=[],o=window.Shopify.shop;for(let r=0;r<e.length;r++){let c=e[r],l=[".grid-product__on-sale",".product-unit-price",".product-price-unit",".grid-link__sale_price","s",".price__compare",".product__compare-price",".price__unit",".card__price--regular",".sale-tag",".compare-price",".old-price",".savings",".was_price",".price--compare",".price-compare",".was"];if("stark-hockey.myshopify.com"===o){const e=c.closest(".product-index");if(e){const t=e.querySelector(".product-modal");t&&t.remove()}continue}let s=c.closest(".product-parent");if(s){let e=s.querySelector("form .tt-btn-addtocart");e&&t.push(e);let o=s.querySelector(".tt-btn-quickview");o&&t.push(o)}if(s=c.closest(".ProductItem"),s){let e=s.querySelector(".quickshop-btn");if(e&&t.push(e),"shrimptoncouture-com.myshopify.com"===o){let e=s.querySelector(".ProductItem__PriceList");e&&e.classList.remove("ProductItem__PriceList")}}if(s=c.closest(".product-item--vertical"),s){if("sparklinbluewholesale.myshopify.com"===o){let e=s.querySelector(".product-item__info .product-item__price-list");e&&t.push(e)}let e=s.querySelector(".product-item__info .product-item__action-button");e&&t.push(e),e=s.querySelector(".product-form__payment-container"),e&&t.push(e)}if(s=c.closest(".card-wrapper.underline-links-hover"),s&&"friends-forever-pets.myshopify.com"===o){let e=s.querySelector(".card__content .quick-add");e&&t.push(e);let o=s.querySelector(".card-information .price__sale .price-item.price-item--regular");o&&t.push(o)}if(s=c.closest(".modal_price"),s&&window.Shopify&&"casa-barba.myshopify.com"!==window.Shopify.shop&&"prideandgroom-wholesale.myshopify.com"!==window.Shopify.shop){let e=s.querySelector(".price-ui");e&&t.push(e)}if(s=c.closest(".info.has-padding-top"),s){let e=s.querySelector(".compare-at-price");e&&t.push(e)}if(s=c.closest(".product-thumbnail__price.price"),s){let e=s.querySelector(".money");e&&t.push(e)}if(s=c.closest(".search-result__description"),s){let e=s.querySelector(".money");e&&t.push(e)}if(s=c.closest(".product__price"),s){let e=s.querySelector("[data-product-price][bss-custom-ltsp-attribute]");e&&t.push(e)}if(s=c.closest("#template-product"),s){let e=s.querySelector(".product-form.cart-bar__form");e&&t.push(e)}if("showroom1-ducanero.myshopify.com"===o){if(s=c.closest(".product-area")||c.closest(".price"),s){let e=s.querySelector(".price-area")||s.querySelector(".theme-money");e&&t.push(e)}}else if(s=c.closest(".product-area__details"),s){let e=s.querySelector(".product-detail__form__action");e&&t.push(e);let o=s.querySelector(".quantity-wrapper");o&&t.push(o)}if("quincaillerie-euroline.myshopify.com"===o&&(s=c.closest(".product-form__info-content"),s)){let e=s.querySelector(".price-list");e&&t.push(e)}if(s=c.closest(".product-form__buttons"),s&&t.push(s),s=c.closest(".product-wrap-2"),s){let e=s.querySelector(".product-action-2");e&&t.push(e)}if(s=c.closest(".span6"),s){let e=s.querySelector(".purchase>input"),o=s.querySelector(".price-container>#price-preview"),r=s.querySelector(".price-container>.vat-price");e&&t.push(e),o&&t.push(o),r&&t.push(r)}if(s=c.closest(".product__page"),s){let e=s.querySelector(".quantity-selector");e&&t.push(e)}if(s=c.closest(".product_details_info"),s){let e=s.querySelector(".pro-detail-button"),o=s.querySelector(".price-box");e&&t.push(e),o&&t.push(o)}if(s=c.closest(".product-content"),s){let e=s.querySelector(".product-action");e&&t.push(e)}if(s=c.closest(".product-view .single-product-wrap"),s){let e=s.querySelector(".add-to-cart");e&&t.push(e)}if(s=c.closest(".collection-category .owl-stage .owl-item"),s){let e=s.querySelector(".add-to-cart");e&&t.push(e)}if(s=c.closest(".product__details"),s){let e=s.querySelector(".product-wrap .thumbnail-overlay .info .price ");e&&t.push(e);let o=s.querySelector(".product-details .price .current_price .money ");o&&t.push(o)}if(s=c.closest(".product_row"),s){let e=s.querySelector(".three-fourths .info .price ");e&&t.push(e)}if(s=c.closest(".thubnail-desc"),s){let e=s.querySelector(".quatity-stock");e&&t.push(e);let o=s.querySelector(".Payment_button");o&&t.push(o)}if(s=c.closest(".single-ponno-product"),s){let e=s.querySelector(".pro-actions-link");e&&t.push(e);let o=s.querySelector(".pro-add-cart");o&&t.push(o)}if(s=c.closest(".product-single__meta"),s){let e=s.querySelector("div.product-form__controls-group.product-form__controls-group--submit");e&&e.setAttribute("style","visibility:hidden")}if("homewarerus.myshopify.com"!=window.Shopify.shop&&(s=c.closest(".product-item__info"),s)){let e=s.querySelector("form.product-item__action-list.button-stack");e&&e.remove()}
13132if("bluebasketb2b.myshopify.com"===window.Shopify.shop){if(s=c.closest(".card-information"),s){let e=s.querySelector(".price__sale .price-item--sale.sale-percentage");e&&t.push(e)}if(s=c.closest("tr.cart-item[id*=Cart]"),s){let e=s.querySelector(".cart-item__quantity");e&&e.remove();let t=s.querySelector(".cart-item__totals");t&&t.remove()}}if(s=c.closest(".product-form"),s){let e=s.querySelector(".quantity-submit-row__submit");e&&e.remove();let o=s.querySelector(".product-form__info-list .product-form__info-item.product-form__info-item--quantity .product-form__info-content .quantity-selector.quantity-selector--product");o&&t.push(o)}if(s=c.closest(".product-grid__detail"),s){let e=s.querySelector(".product-form-block form");e&&e.remove()}if(s=c.closest(".tab-body"),s){if(s.querySelector(".purchase-section button, .btn.add-to-cart")){let e=setInterval((function(){let e=document.querySelector(".tab-body .purchase-section button, .tab-body .btn.add-to-cart"),t=document.querySelector(".swym-button-bar.swym-wishlist-button-bar");e&&e.remove(),t&&t.remove()}),200);setTimeout((function(){clearInterval(e)}),1e4)}}if(s=c.closest(".item.relative.product-id.item-row"),s){let e=s.querySelector(".quantity.form");e&&e.remove()}if(s=c.closest(".product-form"),s){let e=s.querySelector(".buy-buttons-row");e&&t.push(e)}if(s=c.closest(".product-grid-item"),s){let e=s.querySelector(".btn--quick-view");e&&t.push(e)}if(s=c.closest(".featured__collection-product"),s){let e=s.querySelector(".js-quickview-trigger");e&&t.push(e)}if(s=c.closest(".product-index"),s){let e=s.querySelector(".js-quickview-trigger");e&&t.push(e)}if(s=c.closest(".product-bottom"),s){let e=s.querySelector(".quantity-selector, .product-add");e&&t.push(e)}if(s=c.closest(".js-sticky-cart"),s){let e=s.querySelector(".sticky-add");e&&t.push(e)}if(s=c.closest(".product-details"),s){let e=s.querySelector(".shopify-payment-button");e&&t.push(e);let r=s.querySelector(".payment-and-quantity__add");r&&t.push(r);let c=s.querySelector(".price__compare-at.visible");c&&"coventa-demo.myshopify.com"===o&&t.push(c)}if(s=c.closest(".product-block__inner"),s){let e=s.querySelector(".quick-buy");e&&t.push(e)}if(s=c.closest(".content-summary"),s){let e=s.querySelector("form.cart");e&&t.push(e)}if(s=c.closest('div[data-pf-type="Section"]'),s){let e=s.querySelector('div[data-pf-type="ProductQuantity"]');e&&t.push(e);let o=s.querySelector('button[data-pf-type="ProductATC"]');o&&t.push(o)}if(s=c.closest(".pc-inner"),s){let e=s.querySelector('form[action="/cart/add"]');e&&t.push(e);let o=s.querySelector(".quick_shop");o&&t.push(o)}if(s=c.closest(".product-info-inner"),s){let e=s.querySelector('form[action="/cart/add"]');e&&t.push(e)}if(s=c.closest(".product-details-inline"),s){let e=s.querySelector(".product-quantity");e&&t.push(e)}if(s=c.closest(".product-card"),s){let e=s.querySelector(".js-grid-cart");e&&t.push(e);let o=s.querySelector(".card-header .card-button-hover");o&&t.push(o);let r=s.querySelector(".product-card__quick-buy");r&&t.push(r);let c=s.querySelector("compare-at-price");c&&t.push(c);let l=s.querySelector(".product-card__badge-list");l&&t.push(l)}if(s=c.closest(".product__info"),s){let e=s.querySelector(".product-form__buy-buttons button");e&&t.push(e);let o=s.querySelector(".product-form__quantity");o&&t.push(o)}if(s=c.closest(".product-sticky-form__inner"),s){let e=s.querySelector(".product-sticky-form__payment-container");e&&t.push(e)}if("homewarerus.myshopify.com"!=window.Shopify.shop&&(s=c.closest(".product-item"),s)){let e=s.querySelector('form[action="/cart/add"]');e&&t.push(e);let o=s.querySelector(".product-item__quick-form");o&&t.push(o)}if(s=c.closest(".shopify-product-form"),s){let e=s.querySelector("div.quantity");e&&t.push(e)}if(s=c.closest(".product-body"),s){let e=s.querySelector(".product-cta-wrapper");e&&t.push(e)}if(s=c.closest(".tt-product-single-info"),s){let e=s.querySelector("form .btn-addtocart");e&&t.push(e);let o=s.querySelector('form[action*="/cart/add"]');o&&t.push(o)}if(s=c.closest(".product-details-wrapper"),s){let e=s.querySelector(".product-form");e&&t.push(e)}if(s=c.closest(".product-inner"),s){let e=s.querySelector(".product-card-interactions");e&&t.push(e)}if(s=c.closest(".product-single__meta"),s){let e=s.querySelector(".add-to-cart");if(e)if(window.Shopify&&"bundlecomph.myshopify.com"===window.Shopify.shop){e.disabled=!0;let o=s.querySelector(".payment-buttons"),r=s.querySelector(".shopify-payment-button");o&&o.classList.remove("payment-buttons"),r&&t.push(r)}else t.push(e)}if(s=c.closest(".grid-view-item"),s){let e=s.querySelector(".thumbnail-buttons");e&&t.push(e)}if(s=c.closest(".product-single__meta"),s){let e=s.querySelector(".product-form:not(.product-form-product--static):not(.product-form-product-template)");e&&t.push(e)}if(s=c.closest(".pf-product-form"),s){let e=s.querySelector(".sc-lkgURy");e&&t.push(e);let o=s.querySelector(".sc-gzcbmu");o&&t.push(o);let r=s.querySelector(".add-to-cart");r&&t.push(r)}if(s=c.closest(".large--one-half"),s){let e=s.querySelector(".product-smart-wrapper");e&&t.push(e);let o=s.querySelector('div.btn[onmouseup="showProductsDesigner(this)"]');o&&t.push(o);let r=s.querySelector("button.js-prod-show-soldout");r&&t.push(r)}if(s=c.closest("#add-to-cart-form"),s)if("led-signcity.myshopify.com"===o){let e=s.querySelector(".atc-btn");e&&t.push(e);let o=s.querySelector(".price");o&&o.classList.remove("price")}else{let e=s.querySelector(".groups-btn");e&&t.push(e),t.push(c)}
13132if(s=c.closest(".product-shop"),s&&"led-signcity.myshopify.com"!==o){let e=s.querySelector(".groups-btn");e&&t.push(e)}if(s=c.closest(".who-qof-table"),s&&s.classList.add("bsscommerce-hide-price"),s=c.closest(".price-sale"),s){let e=s.querySelector(".old-price");e&&t.push(e);let o=s.querySelector("em");o&&(o.innerHTML="")}if(s=c.closest(".product-details"),s){let e=s.querySelector(".action");e&&t.push(e)}if(s=c.closest(".product_section"),s){let e=s.querySelector("form .add_to_cart, form .b2b-ajax-submit");e&&t.push(e);let o=s.querySelector(".sale.savings");o&&t.push(o);let r=s.querySelector(".purchase-details button.button--add-to-cart");r&&t.push(r);let c=s.querySelector(".purchase-details .purchase-details__quantity.product-quantity-box");c&&t.push(c);let l=s.querySelector(".product__details .modal_price .price-ui");l&&t.push(l)}if(s=c.closest(".quick-shop-style--inline"),s){let e=s.querySelector("form .add_to_cart, form .b2b-ajax-submit");e&&t.push(e)}if(s=c.closest(".product-details"),s){let e=s.querySelector("small em");e&&t.push(e)}if(s=c.closest(".gt_product-body"),s){let e=s.querySelector("form .gt_product-addtocart");e&&t.push(e);let o=s.querySelector(".gt_product-saved");o&&t.push(o);let r=s.querySelector(".gt_product-price--compare");r&&t.push(r)}if(s=c.closest(".gt_product_content"),s){let e=s.querySelector("form .gt_product-addtocart");e&&t.push(e);let o=s.querySelector(".gt_product-price--compare");o&&t.push(o)}if(s=c.closest(".gt-single-product"),s){let e=s.querySelector("div.gt_method_addToCart");e&&t.push(e);let o=s.querySelector(".gt_product-price--compare");o&&t.push(o)}if(s=c.closest("#cont-form"),s){let e=s.querySelector("form .cont-add-btns");e&&t.push(e)}if(s=c.closest(".theiaStickySidebar"),s){let e=s.querySelector(".variations_button");e&&t.push(e)}if(s=c.closest(".product--price-wrapper"),s){let e=s.querySelector(".product--compare-price");e&&t.push(e)}if(s=c.closest(".product-submit"),s){let e=s.querySelector(".payment-buttons-container");e&&t.push(e)}if(s=c.closest(".product-price"),s){let e=s.querySelector(".product-price-compare");e&&t.push(e)}if(s=c.closest(".product-list-item"),s){let e=s.querySelector(".original"),o=s.querySelector(".product-list-item-badge");e&&t.push(e),o&&t.push(o)}if(s=c.closest(".productitem"),s){let e=s.querySelector(".productitem--action");e&&t.push(e);let o=s.querySelectorAll(".bss-ltsp-to-remove");if(o.length)for(let e of o)t.push(e)}if(s=c.closest(".product--outer"),s){let e=s.querySelector(".product-form--atc");e&&t.push(e),e=s.querySelector(".shopify-payment-button"),e&&t.push(e)}if(s=c.closest(".Container"),s)if(window.Shopify&&"mama-shawna.myshopify.com"===window.Shopify.shop){let e=s.querySelector("form.ProductForm");if(window.__st&&e){__st.cid&&t.push(e)}}else{let e=s.querySelector(".ProductForm__BuyButtons");e&&t.push(e)}if(s=c.closest(".product-grouped"),s){let e=s.querySelector(".product_top form#add-to-cart-form");e&&t.push(e)}if(s=c.closest(".product-item"),s){let e=s.querySelector(".product-top .product-des .action"),o=s.querySelector(".slideup");if(e&&t.push(e),o&&t.push(o),o=s.querySelector(".card-quickview"),o&&t.push(o),window.Shopify&&"sitchish.myshopify.com"===window.Shopify.shop){let e=s.querySelector(".product-item-price .money");e&&e.classList.remove("money")}}if(s=c.closest(".modal_price"),s){let e=s.querySelector(".was_price");e&&t.push(e)}if(s=c.closest(".info"),s){let e=s.querySelector(".was_price");e&&t.push(e)}if(s=c.closest(".product-item"),s){let e=s.querySelector('.product-item__action-button[data-action="add-to-cart"]');e&&t.push(e)}if(s=c.closest(".grid__item.grid-product"),s){let e=s.querySelector('form[action="/cart/add"] input[type="submit"]');e&&t.push(e);let r=s.querySelector(".grid-product__tag");r&&t.push(r);let c=s.querySelector(".visually-hidden");c&&t.push(c);let l=s.querySelector(".quick-product__btn");l&&"comphycompany.myshopify.com"===o&&t.push(l)}if(s=c.closest(".product-info"),s){let e=s.querySelector('form[action="/cart/add"] .payment-buttons');e&&t.push(e);let o=s.querySelector(".variant-wrapper.variant-wrapper--button");o&&t.push(o);let r=s.querySelector(".form .product-actions .product-actions-add-to-cart");r&&t.push(r);let c=s.querySelector(".product-price__compare");
13132c&&t.push(c),c=s.querySelector("compare-at-price"),c&&t.push(c);let l=s.querySelector("unit-price");l&&t.push(l),e=s.querySelector(".buy-buttons"),e&&t.push(e);let u=s.querySelector(".product-info__badge-list");u&&t.push(u)}if(s=c.closest(".price"),s){if(s.textContent.includes("From")){let e=s.innerHTML;s.innerHTML=e.replace("From","")}}if(s=c.closest("#product-right"),s){let e=s.querySelector(".was");e&&t.push(e);let o=s.querySelector(".product-add");o&&t.push(o)}if(s=c.closest(".was"),s&&t.push(s),s=c.closest(".product-single__meta"),s){let e=s.querySelector(".pf__actions");e&&t.push(e);let o=s.querySelector("div.product-form__controls-group.product-form__controls-group--submit");o&&o.setAttribute("style","visibility:hidden")}if(s=c.closest(".product-item"),s){let e=s.querySelector(".product-item__add");e&&t.push(e)}if(s=c.closest(".grid-item"),s){let e=s.querySelector("#addToCart-product-template");e&&t.push(e);let o=s.querySelector(".payment-buttons");o&&t.push(o)}if(s=c.closest(".product-single__meta"),s){let e=s.querySelector("div.payment-buttons");e&&e.remove()}if(s=c.closest(".modal--root"),s){let e=s.querySelector(".product-form--button-container");e&&t.push(e)}if(s=c.closest(".product-item__info"),s){let e=s.querySelector("a.product-item__action-button.button.button--small.button--primary");e&&t.push(e)}if(s=c.closest(".product-form__info-list"),s){let e=s.querySelector("div.product-form__info-item.product-form__info-item--quantity");e&&t.push(e)}if(s=c.closest(".large--three-fifths"),s){let e=s.querySelector(".multivariants_setbox_footer");e&&t.push(e)}if(s=c.closest(".product-info-main"),s){let e=s.querySelector(".qty-box");e&&t.push(e);let o=s.querySelector(".btn.btn-cart");o&&t.push(o);let r=s.querySelector(".shopify-payment-button");r&&t.push(r)}if(s=c.closest(".product-miniature"),s){let e=s.querySelector(".qty-box");e&&t.push(e);let o=s.querySelector(".product.actions.product-item-actions");o&&t.push(o)}if(s=c.closest("#AddToCartForm"),s){let e=s.querySelector(".paymentButtonsWrapper");e&&t.push(e)}if(s){let e=s.querySelector("#product-add");e&&e.remove()}if(s){let e=s.querySelector("#product-price>.product-price");e&&e.remove()}if(s=c.closest(".grid-view-item"),s){let e=s.querySelector(".quick-add-button");e&&t.push(e)}if("tinalykkegaard.myshopify.com"===o){if(s=c.closest(".main-product__details>.main-product__details-wrapper"),s){let e=s.querySelector(".main-product__actions .main-product__form-buttons");e&&e.remove()}if(s=c.closest(".product-grid .product-card"),s){let e=s.querySelector('form[action="/cart/add"]');e&&e.remove()}}if(s=c.closest(".product-item-caption"),s){let e=s.querySelector(".product-form__item--submit");e&&t.push(e)}if(s=c.closest(".product-item-caption"),s){let e=s.querySelector(".product-form__item--quantity");e&&t.push(e)}if(s=c.closest(".productgrid--item"),s){let e=s.querySelector(".productitem--actions");e&&t.push(e)}if(s=c.closest(".product-single__info-wrapper"),s){let e=s.querySelector(".product-form__quantity-submit");e&&t.push(e);let o=s.querySelector(".shopify-payment-button");o&&t.push(o)}if(s=c.closest(".qv-content"),s){let e=s.querySelector(".qv-add-button");e&&t.push(e);let o=s.querySelector(".qv-quantity");o&&t.push(o)}if(s=c.closest(".product-card"),s){let e=s.querySelector(".btn-grid-cart");e&&t.push(e)}if(s=c.closest(".product_single_detail_section"),s){let e=s.querySelector("#AddToCart");e&&t.push(e);let o=s.querySelector(".shopify-payment-button__button");o&&t.push(o);let r=s.querySelector(".quantity-label");r&&t.push(r);let c=s.querySelector(".quantity_width");c&&t.push(c)}if(s=c.closest(".product-single__meta"),s){let e=s.querySelector("#AddToCart--product-template");e&&t.push(e);let o=s.querySelector(".shopify-payment-button");o&&t.push(o)}if(s=c.closest('form[action="/cart/add"]'),s){let e=s.querySelector(".product-page-info__field");e&&t.push(e);let o=s.querySelector(".product-page-info__button-add-to-cart");o&&t.push(o);let r=s.querySelector(".js-store-lists-add-wishlist");r&&t.push(r);let c=s.querySelector(".product-collection__control");c&&t.push(c)}if(s=c.closest(".grid-item__content"),s){let e=s.querySelector(".quick-add-btn");if(e&&t.push(e),window.Shopify&&"sparklinbluewholesale.myshopify.com"===window.Shopify.shop){let e=s.querySelector(".grid-product__price--original"),o=s.querySelector(".grid-product__price--savings"),r=s.querySelector(".quick-product__btn");e&&t.push(e),o&&t.push(o),r&&t.push(r)}}if(s=c.closest(".purchase-box"),s){let e=s.querySelector("#AddToCart-product-template");e&&e.remove();let t=s.querySelector(".quantity-product-template");t&&t.remove()}if(s=c.closest(".item-row"),s){let e=s.querySelector(".add-to-cart");e&&t.push(e)}if(s=c.closest(".product-thumbnail__price"),s){let e=s.querySelectorAll(".bsscommerce-ltsp-message");e.length>1&&e.forEach((function(e,o){o>0&&t.push(e)}))}if(s=c.closest(".product-details"),s){let e=s.querySelector(".product__add-to-cart-button");e&&t.push(e);let r=s.querySelector(".product-form__quantity-box-wrapper");if(r&&t.push(r),"sitchish.myshopify.com"===o){let e=s.querySelector("#product-price");e&&(e.id="");let o=s.querySelector("[data-product-price]");o&&o.removeAttribute("data-product-price");let r=s.querySelector(".form-actions");r&&t.push(r)}let c=s.querySelector(".product-quantity");if(c&&t.push(c),"lavabis-hygiene.myshopify.com"===o){let e=s.querySelector(".price-preview.price");e&&(e.id="")}}if(s=c.closest(".product-details"),s){let e=s.querySelector("#add-to-cart-product-template");e&&t.push(e);let o=s.querySelector(".shopify-payment-button__button");o&&o.remove();let r=s.querySelector(".quantity");r&&t.push(r)}if(s=c.closest(".gryffeditor"),s){let e=s.querySelector(".gf_product-quantity");e&&e.parentElement.remove()}if(s=c.closest("#ProductSection-product-template"),s){let e=s.querySelector(".cbb
13132-frequently-bought-add-button");e&&e.remove();let t=s.querySelector(".cbb-frequently-bought-form");t&&t.remove()}if(s=c.closest(".product__info-wrapper"),s){let e=s.querySelector(".product-form__quantity");e&&e.remove();let t=s.querySelector(".product-form__buttons");t&&t.remove()}if(s=c.closest(".product-form"),s){let e=s.querySelector(".product-form__payment-container");e&&e.remove();let o=s.querySelector("#price");if(o&&o.classList.remove("product-price"),window.Shopify&&"wilkens-gmbh.myshopify.com"===window.Shopify.shop){let e=s.querySelector(".unit-price");e&&t.push(e)}}if(s=c.closest(".product-details"),s){let e=s.querySelector(".button-common");e&&e.remove()}if(s=c.closest(".caption"),s){let e=s.querySelector(".button.btn-cart");e&&t.push(e)}if(s=c.closest(".product-info-main"),s){let e=s.querySelectorAll(".form-group")[1];e&&t.push(e);let o=s.querySelector(".price");o&&(o.id="")}if(s=c.closest(".form_buy_sticky"),s){let e=s.querySelector(".form-group .btn.button.button-cart");e&&t.push(e);let o=s.querySelector(".form-group input#Quantity");o&&t.push(o)}if(s=c.closest(".product-template__container"),s){let e=s.querySelector(".store-availability-container");e&&e.remove()}if(s=c.closest(".product-form--container"),s){let e=s.querySelector(".product-form--options");e&&t.push(e);let o=s.querySelector(".product-form--smart-payment-buttons");o&&t.push(o)}if(s=c.closest(".product--price-wrapper"),s){let e=s.querySelector('.product--from[data-item="accent-text"]');e&&t.push(e)}if(s=c.closest("#zpproductselectorfull1-wrapper"),s){let e=s.querySelector(".zpa-button-alignment-center");e&&t.push(e);let o=s.querySelector(".zpa-quantity-block");o&&t.push(o)}if(s=c.closest(".zpa-multi-product-buy-box"),s){let e=s.querySelector(".zpa-button-alignment-center");e&&t.push(e)}if(s=c.closest(".product-block__inner"),s){let e=s.querySelector('form[action="/cart/add"].product-form.product-form--mini');if(e&&t.push(e),window.Shopify&&"wilkens-gmbh.myshopify.com"===window.Shopify.shop){let e=s.querySelector(".unit-price");e&&t.push(e)}}if(s=c.closest(".was-price.theme-money"),s&&t.push(s),s=c.closest(".box_product_page"),s){let e=s.querySelector(".product-options-bottom");e&&t.push(e)}if(s=c.closest(".product-default"),s){let e=s.querySelector(".add-links.clearfix");e&&t.push(e)}if(s=c.closest(".grid__item.medium-up--three-eighths"),s){let e=s.querySelector('form[action="/cart/add"].shopify-product-form');e&&t.push(e)}if(s=c.closest(".indiv-product"),s){let e=s.querySelector('form[action="/cart/add"]');e&&t.push(e)}if(s=c.closest('form.product-form[action="/cart/add"]'),s){let e=s.querySelector(".sf__pcard-image .sf__pcard-quick-add");e&&t.push(e);let o=s.querySelector(".main-product__block-buy_buttons");o&&t.push(o)}if(s=c.closest(".product-grid-item.woodmart-hover-base"),s){let e=s.querySelector(".fade-in-block");e&&t.push(e);let o=s.querySelector(".product-compare-button");o&&t.push(o)}if(s=c.closest(".grid__item"),s){if("www-bonmatch-com.myshopify.com"===o){let e=s.querySelector(".selector-wrapper.bcpo-file"),o=s.querySelector(".uploadkit.uploadkit-injected"),r=s.querySelector(".uploadkit-form");e&&t.push(e),o&&r&&r.appendChild(o)}let e=s.querySelector(".product__submit__buttons");e&&t.push(e);let r=s.querySelector(".products > .product-detail > .product-button"),c=s.querySelector(".products > .product-container > .product-button > .quick-view-text");r&&t.push(r),c&&t.push(c);let l=s.querySelector("button#AddToCart"),u=s.querySelector('[data-shopify="payment-button"].shopify-payment-button');if(l&&t.push(l),u&&t.push(u),"tienda-suca-bikes.myshopify.com"===o){let e=s.querySelector(".product__unit-price.product__unit-price--spacing"),t=s.querySelector(".c_p-quantity-input-parent"),o=s.querySelector(".masIva"),r=s.querySelector(".c_col-sw-btn");e&&e.classList.remove("hide"),t&&t.remove(),o&&o.remove(),r&&r.remove()}if("youchique-4183.myshopify.com"===o){let e=s.querySelector(".card-information__button");e&&t.push(e);let o=s.querySelector(".swym-wishlist-button-bar");o&&t.push(o)}if("stelladetailsb2b.myshopify.com"===o){let e=s.querySelector(".bss-b2b-product-vat");e&&t.push(e);let o=s.querySelector("#bss-b2b-tax-inc-excl");o&&t.push(o);let r=s.querySelector(".bss-b2b-collection-item-vat");r&&t.push(r);let c=s.querySelector(".price__regular");if(c){c.classList.remove("price__regular");let e=s.querySelector(".price-item--regular");e&&e.classList.remove("price-item--regular")}let l=s.querySelector(".price__sale");l&&t.push(l)}let i=s.querySelector("quick-view-drawer");
13132i&&t.push(i);let p=s.querySelector("add-to-cart");p&&t.push(p)}if(s=c.closest(".shop-the-look__product-info"),s){let e=s.querySelector('form[action="/cart/add"]');e&&t.push(e)}if(s=c.closest(".popover.popover--quick-buy"),s){let e=s.querySelector(".product-form__buy-buttons");e&&t.push(e)}if(s=c.closest(".product__section.product-template .product__section-content .product__section-details"),s){let e=s.querySelector('form[action="/cart/add"] input#addToCart');e&&t.push(e)}if(s=c.closest(".product-item__info-inner"),s){let e=s.querySelector(".unit-price-measurement");e&&t.push(e)}if(s=c.closest(".product-form__info-item"),s){let e=s.querySelector(".unit-price-measurement");e&&t.push(e)}if(s=c.closest("div[data-product-blocks]"),s){let e=s.querySelector(".payment-buttons");e&&t.push(e);let o=s.querySelector(".spt-wishlist-button__wrapper");o&&t.push(o)}if(s=c.closest(".sf__pcard-content.text-center"),s){let e=s.querySelector("button.add-to-cart.sf__btn");e&&t.push(e)}if(s=c.closest(".product-details.section"),s){let e=s.querySelector('form#AddToCartForm.product-content-inner[action="/cart/add"]');e&&t.push(e)}if(s=c.closest(".search-item .product-item, .product-grid-row .product-item"),s){let e=s.querySelector(".product-img .action-btn");e&&t.push(e)}if(s=c.closest(".product-collection__content,.product-page-info"),s){let e=s.querySelector(".js-product-button-add-to-cart");e&&t.push(e)}if(s=c.closest(".details-info"),s){let e=s.querySelector(".group-button .add-to-cart");e&&t.push(e)}if(s=c.closest(".product-collection"),s){let e=s.querySelector(".group-button .add-to-cart");e&&t.push(e)}let u=c.closest("[data-js-product-price]");if(u&&u.setAttribute("bss-ltsp-active",""),s=c.closest(".product__info-container"),s){let e=s.querySelector('.form[data-type="add-to-cart-form"] > .shopify-payment-button[data-shopify="payment-button"]');e&&t.push(e)}if(s=c.closest(".products"),s){let e=s.querySelector(".product-container > .product-button > .variants > .add-cart-btn"),o=s.querySelector(".product-container > .product-button > .quick-view-text");e&&t.push(e),o&&t.push(o)}if(s=c.closest(".dt-sc-tabs-container"),s){let e=s.querySelector(".dt-sc-tabs-content > .tab2 > .owl-stage-outer > .owl-stage > .owl-item > .item-row > .products > .product-container > .product-button > .variants > .add-cart-btn");e&&t.push(e)}if(s=c.closest(".wrapper-container"),s){let e=s.querySelector(".recently-viewed-products > .products-grid > .grid__item > .product-item > .products > .product-bottom > .price-box > .regular-product > .special-price"),o=s.querySelector(".recently-viewed-products > .products-grid > .grid__item > .product-item > .products > .product-bottom > .action > .variants > .add-to-cart-btn");e&&t.push(e),o&&t.push(o)}if(s=c.closest(".featured__collection-product.product-index"),s){let e=s.querySelector(".product_listing_options");e&&t.push(e)}if(s=c.closest(".product-index"),s){let e=s.querySelector(".product_listing_options");e&&t.push(e)}if(s=c.closest(".product__section-details"),s){let e=s.querySelector(".product__section-details__inner
13132--product_buttons");e&&t.push(e)}if(s=c.closest(".product-page--cart-form-block"),s){let e=s.querySelector(".add-to-cart");e&&t.push(e)}if(s=c.closest(".price__sale"),s){let e=s.querySelector(".price-item--regular");e&&t.push(e)}if(s=c.closest(".product-item-v1"),s){let e=s.querySelector(".price-old"),o=s.querySelector(".product-icon-action");e&&t.push(e),o&&t.push(o)}if(s=c.closest(".detail-info > .relative"),s){let e=s.querySelector("#AddToCartForm > .btn-action"),o=s.querySelector('div.shopify-payment-button[data-shopify="payment-button"]'),r=s.querySelector(".product-price > del");e&&t.push(e),o&&t.push(o),r&&t.push(r)}if(s=c.closest(".product-details"),s){let e=s.querySelector(".product-block--form>.product-form--regular");e&&"eurosafetysystems.myshopify.com"!==o&&e.remove();let t=s.querySelector(".button-cart");t&&t.remove()}if("annabellenoeldesigns-com.myshopify.com"==o&&(s=c.closest(".product-block-list__item .card__section"),s)){let e=s.querySelector("#MULTIVARIANTS_APP_SECTION_PLACE .multivariants_block_qty_box");e&&e.remove();let t=s.querySelector("#MULTIVARIANTS_APP_SECTION_PLACE .multivariants_block_last_holder .multivariants_block_prc_holder");t&&t.remove();let o=s.querySelector("#MULTIVARIANTS_APP_SECTION_PLACE #multivariants_add_to_cart_button_h");o&&o.remove();let r=s.querySelector("#MULTIVARIANTS_APP_SECTION_PLACE #multivariants_block_subtotal_h");r&&r.remove()}if("fedua-b2b.myshopify.com"==o){if(s=c.closest(".gp-product-detail .container"),s){let e=s.querySelector(".gp-product-main-button button[type='submit']");e&&e.remove();let t=s.querySelector(".cbb-also-bought-add-to-cart-button");t&&t.remove();let o=s.querySelector(".cbb-also-bought-product-price-container");o&&o.remove()}if(s=c.closest(".gp-product-widget .product-card-grid"),s){let e=s.querySelector(".product-buttons .btn-quick-view ");e&&e.remove()}}if(s=c.closest(".product--price-container"),s){let e=s.querySelectorAll(".product--price-wrapper > a");e.length&&e.forEach(e=>e.remove())}if("linis-bites-b2b.myshopify.com"==window.location.host&&c.querySelector("[bss-customize-ltsp-message]")){let e=c.closest(".price .price__container");if(e){let o=e.querySelector(".unit-price.caption");o&&t.push(o)}}if(s=c.closest(".product-price--wrapper"),s){let e=s.querySelector(".product-price--compare");e&&e.remove()}if(s=c.closest(".price__pricing-group"),s){let e=s.querySelector(".price-item.price-item--regular[data-regular-price]");e&&(e.classList.remove("price-item"),e.classList.remove("price-item--regular"))}if(l.forEach((function(e){c.closest(e)&&t.push(c.closest(e))})),s=c.closest(".product-page-info"),s){let e=s.querySelector("[data-js-footbar-product-limit]");e&&t.push(e)}if(s=c.closest(".product-wrap"),s){let e=s.querySelector(".purchase-details button.button--add-to-cart"),o=s.querySelector(".product-action");if(e&&t.push(e),o&&t.push(o),window.Shopify&&"dermafirmusa.myshopify.com"===window.Shopify.shop){let e=s.querySelector(".price.sale");e&&t.push(e)}}if(s=c.closest(".seven.columns.omega"),s){let e=s.querySelector(".purchase-details__buttons button.shopify-payment-button__button ");e&&t.push(e)}if(s=c.closest("#collectionPr"),s){let e=s.querySelectorAll("#PageContainer .collection .btn.add-to-cart");e.length&&e.forEach(e=>{t.push(e)})}if(s=c.closest(".grid.product-single"),s){let e=s.querySelector('#PageContainer .wrap-product-info button[type="submit"].btn.btn1.pr_btn.addtocart_js');e&&t.push(e)}if(s=c.closest(".gryffeditor"),s){let e=s.querySelector(".module-wrap .gf_add-to-cart.product-form-product-template");e&&t.push(e)}if(s=c.closest(".product-single .product-single__meta"),s){let e=s.querySelector('.product-form__item button[name="add"].product-form__cart-submit');e&&t.push(e)}if(s=c.closest(".shopify-product-form"),s){let e=s.querySelector("#product-price");e&&t.push(e)}if(s=c.closest(".product-item-price"),s){let e=s.querySelector(".money");e&&t.push(e)}if(s=c.closest('main#main[role="main"]'),s){let e=s.querySelector("div.atc-bar");e&&t.push(e)}if(s=c.closest("#CartDrawer"),s){let e=s.querySelector("#CartDrawer-CartItems .cart-item .cart-item__details dl .product-option");e&&t.push(e);let o=s.querySelector("#CartDrawer-CartItems .cart-item .cart-item__totals .cart-item__price-wrapper");o&&t.push(o);let r=s.querySelector("#CartDrawer-CartItems .cart-item .cart-item__quantity");r&&t.push(r);let c=s.querySelector(".drawer__footer");c&&t.push(c)}if(s=c.closest("#main-cart-items"),s){let e=s.querySelector(".cart-item .cart-item__details dl .product-option");e&&t.push(e);let o=s.querySelector(".cart-item .cart-item__quantity .cart-item__quantity-wrapper");o&&t.push(o);let r=s.querySelector(".cart-item .cart-item__totals.right.small-hide .cart-item__price-wrapper");r&&t.push(r)}if(s=c.closest("#main-cart-footer"),s){let e=s.querySelector(".cart__footer");e&&t.push(e)}if(s=c.closest(".product-single__meta"),s&&window.Shopify&&("asiadirectfurniture.mysh
13132opify.com"===window.Shopify.shop||"pure-vision-ch.myshopify.com"===window.Shopify.shop)){let e=s.querySelector(".product__price[data-product-price]");e&&t.push(e)}if(s=c.closest(".product-inner.pr"),s){let e=s.querySelector(".pr_atc.pr_qty_atc > a.pr_atc_.js_addtc");e&&t.push(e)}if(s=c.closest("#shopify-section-pr_summary"),s){let e=s.querySelector("p.price_range, .price.price_varies");e&&t.push(e)}if(s=c.closest(".grid__item"),s){let e=s.querySelector(".product__form-container"),o=s.querySelector(".product__description");e&&(t.push(e),o.style.width="100%")}if(s=c.closest(".featured-product__content-wrapper"),s){let e=s.querySelector(".product-form");e&&t.push(e)}if(s=c.closest(".card__price"),s&&"exosomes-inc.myshopify.com"===o&&(s.style.textAlign="center"),s=c.closest(".Product__InfoWrapper > .Product__Info "),s){let e=s.querySelector('.ProductForm__BuyButtons > button[type="submit"].ProductForm__AddToCart');e&&t.push(e);let o=s.querySelector(".ProductForm__AddToCart");o&&t.push(o)}if(s=c.closest(".product-grid__container .product-grid__content"),s){let e=s.querySelector(".product-single__form .product__quantity");e&&t.push(e);let o=s.querySelector(".add-to-cart");o&&t.push(o);let r=s.querySelector(".product__price--compare");if(r&&t.push(r),window.Shopify&&"sparklinbluewholesale.myshopify.com"===window.Shopify.shop){let e=s.querySelector(".product__price-savings");e&&t.push(e)}}if(s=c.closest(".product-grid-item"),s){let e=s.querySelector(".h1.medium--left");e&&"envogueusa.com"==window.location.host&&t.push(e)}if(s=c.closest("#productPrice-product-template"),s){let e=s.querySelector("small");e&&"envogueusa.com"==window.location.host&&t.push(e),s.appendChild(c)}if(s=c.closest(".product-grid-item"),s){let e=s.querySelector(".form-grid-btn");e&&"mamiereglissepro.myshopify.com"===o&&t.push(e)}if(s=c.closest("#cont-form"),s){let e=s.querySelector(".so-price");e&&t.push(e);let r=s.querySelector("#addToCart");r&&"mamiereglissepro.myshopify.com"===o&&t.push(r)}if(s=c.closest(".template-product"),s){let e=s.querySelector('button[name="add"]#addToCartBis, button[name="add"]#addToCart2');e&&t.push(e)}if(s=c.closest(".grid-product__content"),s){let e=s.querySelector(".quick-product__btn");!e||"wood-hill-boards.myshopify.com"!==o&&"wood-hill-boards-usa.myshopify.com"!==o&&"bundlecomph.myshopify.com"!==o||t.push(e)}if(s=c.closest(".product-single__meta"),s){let e=s.querySelector(".product__quantity");!e||"wood-hill-boards.myshopify.com"!==o&&"wood-hill-boards-usa.myshopify.com"!==o||t.push(e)}if(s=c.closest(".product-block-area"),s){let e=s.querySelector("#addToCartButton");e&&"wanderlustvision.myshopify.com"===o&&t.push(e)}if(s=c.closest(".product-single__meta--wrapper .product-single__meta"),s){let e=s.querySelector(".price-container.text-money"),o=s.querySelector('button[name="add"].btn--add-to-cart');e&&t.push(e),o&&t.push(o)}if(s=c.closest(".product-single__metas"),s){let e=s.querySelector(".product-single__buttons .js-quantity-selector.product-quantity"),o=s.querySelector(".product-single__buttons button.btn--add-to-cart");e&&t.push(e),o&&t.push(o)}if("dollie-wholesale.myshopify.com"===o&&(s=c.closest(".product-card"),s)){let e=s.querySelector(".product-card__buttons .product-card__quickview"),o=s.querySelector(".product-card__buttons .product-card__form"),r=s.querySelector(".product-card__buttons .button-wishlist"),c=s.querySelector(".wpb-variants-swatch");e&&t.push(e),o&&t.push(o),r&&t.push(r),c&&t.push(c)}if("obsequ.myshopify.com"===o&&(s=c.closest(".product-meta"),s)){let e=s.querySelector(".price-list[data-product-price-list]");e&&e.remove()}if(s=c.closest(".sticky-cart"),s){let e=s.querySelector(".product-form__buttons");e&&t.push(e)}if("wholesale-rubypearlco.myshopify.com"!==o&&"coventa-demo.myshopify.com"!==o&&(s=c.closest(".productitem--info")||c.closest(".product-pricing"),s)){let e=s.querySelector(".price");e&&t.push(e)}if(s=c.closest(".productitem--info"),s){let e=s.querySelector(".price__compare-at.visible");e&&"coventa-demo.myshopify.com"===o&&t.push(e)}if(s=c.closest(".product-block-list"),s&&window.Shopify&&"axiom-wholesale-parts.myshopify.com"===window.Shopify.shop){let e=s.querySelector(".price");e&&e.classList.remove("price")}if(s=c.closest(".product-layout"),s){let e=s.querySelector(".action-links");e&&t.push(e)}if(s=c.closest(".product-single__meta"),s){let e=s.querySelector(".product-block--price");e&&"comphycompany.myshopify.com"===o&&t.push(e)}if(s=c.closest(".product-details, .modal_price"),s){let e=s.querySelector(".current_price, .price__container");e&&t.push(e)}if("wholesale-rubypearlco.myshopify.com"===window.Shopify.shop&&(s=c.closest(".productitem__container .productitem--info, .product-details .product-pricing"),s)){let e=s.querySelectorAll(".price__compare-at--single, .price__compare-at, .price__current--max");
13132e.length&&e.forEach(e=>e.remove())}if("kerriecapelliusa-com.myshopify.com"===window.Shopify.shop&&(s=c.closest(".product-detail.quickbuy-content.spaced-row.container"),s)){let e=s.querySelectorAll(".product-form.theme-init .variant-visibility-area");e.length&&e.forEach(e=>e.remove())}if(s=c.closest(".widget_if_pr, .product-inner, .al_center.fl_center, .widget_if_pr"),s){let e=s.querySelectorAll(".product-price-pr-search, .hover_button, .nt_add_w, .nt_add_cp, .sticky_atc_btn.variations_form, .transcy-money");e.length&&e.forEach(e=>e.remove())}if(s=c.closest(".ProductItem__Wrapper, .ProductForm"),s){let e=s.querySelector(".ProductItem__PriceList, .ProductForm__QuantitySelector");e&&"sirenwireless.myshopify.com"!==o&&e.remove();let r=s.querySelector(".ProductFormWrapper");r&&"sirenwireless.myshopify.com"===o&&t.push(r)}if("butterfly-health-and-wellness.myshopify.com"===window.Shopify.shop){if(s=c.closest(".item-content"),s){let e=s.querySelector('.module-wrap[data-label="(P) Cart Button"] button.gf_add-to-cart');e&&e.remove()}if(s=c.closest(".gf_product-desc"),s){let e=s.querySelector("h4");e&&(e.remove(),c.style.display="none")}if(s=c.closest(".gf_column[data-id]"),s){let e=s.querySelectorAll('.elementor-section[data-element_type="section"] .elementor-text-editor strong, .gf_product-desc h4, .gf_product-desc strong');if(e)for(let t of e)t.remove()}}if(s=c.closest(".product-block"),s){let e=s.querySelector(".quickbuy-toggle");e&&t.push(e)}if(s=c.closest(".productView-details"),s){let e=s.querySelector(".productView-buttons"),r=s.querySelector(".quantity_selector"),c=s.querySelector(".productView-subtotal");e&&t.push(e),r&&t.push(r),c&&t.push(c),"remote-king-au.myshopify.com"===o&&s.querySelectorAll(".product-customInformation").forEach(e=>e.remove())}if(s=c.closest(".product__content"),s&&"campomarzio-trade-uk.myshopify.com"===o){let e=s.querySelector(".product__text"),o=s.querySelector(".select__fieldset"),r=s.querySelector(".product__submit");e&&t.push(e),o&&t.push(o),r&&t.push(r)}if(s=c.closest(".product-card__price, .product-single__meta-list"),s){let e=s.querySelector(".product-single__price, .money-product");e&&e.remove()}if("ens-nutrition-3419.myshopify.com"===o&&(s=c.closest(".card__content"),s)){let e=s.querySelector(".button.quick-add__submit");e&&e.remove()}if("b2b-nandu.myshopify.com"===o){if(s=c.closest(".grid-product__content"),s){let e=s.querySelector(".grid-product__meta .grid-product__price ");e&&e.remove()}let e=c.closest(".product-single__meta");if(e){let t=e.querySelector(".product__price.product__price--compare"),o=e.querySelector(".product__price.on-sale"),r=e.querySelector(".product__price-savings");t&&o&&r&&(t.remove(),o.remove(),r.remove())}}if("impjarwholesale.myshopify.com"===o){if(s=c.closest(".tp-product-content"),s){let e=s.querySelector("button#AddToCart"),o=s.querySelector(".tp-product-singe-action .tp-product-quantity");e&&t.push(e),o&&t.push(o)}if(s=c.closest(".grid-item"),s){let e=s.querySelector('form[action="/cart/add"]');e&&t.push(e)}}if("b2b-dbodhi-singapore.myshopify.com"===o&&(s=c.closest("del"),s&&t.push(c),s=c.closest(".product-information--inner"),s)){const e=s.querySelector(".product-form");e&&t.push(e)}if(s=c.closest(".lh-details-product"),s){if("ags2020.myshopify.com"===o){let e=s.querySelector(".lh-price");e&&e.classList.remove("lh-price")}let e=s.querySelector(".lh-add_to_cart");e&&t.push(e);let r=s.querySelector(".lh-buy-now");r&&t.push(r);let c=s.querySelector(".lh-compare-at-price");c&&t.push(c)}if(s=c.closest(".lh-collection-item"),s){if("ags2020.myshopify.com"===o){let e=s.querySelector(".lh-price");e&&e.classList.remove("lh-price")}let e=s.querySelector(".lh-product-compare-price");e&&t.push(e)}if(s=c.closest(".ProductMeta, .ProductItem__Info"),s){let e=s.querySelectorAll(".Price");e&&e.forEach(e=>e.remove())}}t.forEach((function(e){e.remove()}))}}(e),function(e){e.ltsp.removeElementByLTSPWrapper=function(){let e=document.getElementsByClassName("bss-ltsp-price-wrapper"),t=[];for(let o=0;o<e.length;o++){let r=e[o],c=[],l=r.closest(".product-parent");if(l){let e=l.querySelector("form .tt-btn-addtocart");e&&t.push(e);let o=l.querySelector(".tt-btn-quickview");o&&t.push(o)}if(l=r.closest(".product-single__meta"),l=r.closest(".tt-product-single-info"),l){let e=l.querySelector("form .btn-addtocart");e&&t.push(e);let o=l.querySelector('form[action*="/cart/add"]');o&&t.push(o)}if(l=r.closest(".product_section"),l){let e=l.querySelector("form .add_to_cart, form .b2b-ajax-submit");e&&t.push(e);let o=l.querySelector(".sale.savings");o&&t.push(o)}if(l=r.closest(".quick-shop-style--inline"),l){let e=l.querySelector("form .add_to_cart, form .b2b-ajax-submit");e&&t.push(e)}if(l=r.closest(".product-details"),l){let e=l.querySelector("small em");e&&t.push(e)}if(l=r.closest(".gt_product-body"),l){let e=l.querySelector("form .gt_product-addtocart");e&&t.push(e);let o=l.querySelector(".gt_product-saved");o&&t.push(o);let r=l.querySelector(".gt_product-price--compare");r&&t.push(r)}if(l=r.closest(".gt_product_content"),l){let e=l.querySelector("form .gt_product-addtocart");e&&t.push(e);let o=l.querySelector(".gt_product-price--compare");o&&t.push(o)}if(l=r.closest(".gt-single-product"),l){let e=l.querySelector("div.gt_method_addToCart");e&&t.push(e);let o=l.querySelector(".gt_product-price--compare");o&&t.push(o)}if(l=r.closest("#cont-form"),l){let e=l.querySelector("form .cont-add-btns");e&&t.push(e)}if(l=r.closest(".theiaStickySidebar"),l){let e=l.querySelector(".variations_button");e&&t.push(e)}if(l=r.closest(".product-submit"),l){let e=l.querySelector(".payment-buttons-container");e&&t.push(e)}if(l=r.closest(".productitem"),l){let e=l.querySelector(".productitem--action");e&&t.push(e)}if(l=r.closest(".product--outer"),l){let e=l.querySelector(".product-form--atc");e&&t.push(e),e=l.querySelector(".shopify-payment-button"),e&&t.push(e)}if(l=r.closest(".product-grouped"),l){let e=l.querySelector(".product_top form#add-to-cart-form");e&&t.push(e)}if(l=r.closest(".product-item"),l){let e=l.querySelector(".product-top .product-des .action");e&&t.push(e)}if(l=r.closest(".product-item"),l){let e=l.querySelector('.product-item__action-button[data-action="add-to-cart"]');e&&t.push(e)}if(l=r.closest(".grid__item.grid-product"),l){let e=l.querySelector('form[action="/cart/add"] input[type="submit"]');e&&t.push(e);let o=l.querySelector(".grid-product__tag");o&&t.push(o);let r=l.querySelector(".visually-hidden");r&&t.push(r)}if(l=r.closest(".product-info"),l){let e=l.querySelector('form[action="/cart/add"] .payment-buttons');e&&t.push(e);let o=l.querySelector(".variant-wrapper.variant-wrapper--button");o&&t.push(o)}if(l=r.closest("#product-right"),l){let e=l.querySelector(".was");e&&t.push(e);let o=l.querySelector(".product-add");o&&t.push(o)}if(l=r.closest(".was"),l&&t.push(l),l=r.closest(".product-single__meta"),l){let e=l.querySelector(".pf__actions");e&&t.push(e)}if(l=r.closest("#AddToCartForm-product-template"),l){let e=l.querySelector("#CartButtons-product-template");e&&t.push(e)}if(l=r.closest(".Product__Info"),l){let e=l.querySelector(".ProductMeta__PriceList");e&&t.push(e)}if(l=r.closest(".grid-item"),l){let e=l.querySelector("#addToCart-product-template");e&&t.push(e);let o=l.querySelector(".payment-buttons");o&&t.push(o)}c.forEach((function(e){r.closest(e)&&t.push(r.closest(e))}))}t.forEach((function(e){e.remove()}))}}(e),e.ltsp.removePattern=function(){e.ltsp.removeElementByLTSPMessage(),e.ltsp.removeElementByLTSPWrapper()},e.ltsp.insertBeforeAddToCart=function(){let t=document.querySelectorAll(".bsscommerce-ltsp-message[data-ltsp-cart-message]");for(let o=0;o<t.length;o++){let r=t[o],c=r.getAttribute("data-ltsp-cart-message");r.removeAttribute("data-ltsp-cart-message");let l=[".main-content .product-single__meta",".main-content .grid__item",".main-content .grid-item",".main-content .product__content.product__content--template.product__content--information","main#MainContent .product__info-container",".container#product-product .product-info-main",'main#main section[data-section-id="collection-template"] .product-item',".product-area__details.product-detail .product-detail__form"];for(let t=0;t<l.length;t++){let o=r.closest(l[t]);if(o&&!o.querySelector(".bsscommerce-ltsp-message.hide-message")){let t=
13132o.querySelector('form[action="/cart/add"]');if(t){let o=e.helperLTSP.createHidePriceMessageSpan(c);t.before(o)}}}let s=[[".product-layout .item .item-inner .caption",".button.btn-cart"],['main#main section[data-section-id="product-template"] .card__section',".product-form__payment-container"],[".main#MainContent .content.product",'form[action="/cart/add"] .offers']];for(let t=0;t<s.length;t++){let o=r.closest(s[t][0]);if(o&&!o.querySelector(".bsscommerce-ltsp-message.hide-message")){let r=o.querySelector(s[t][1]);if(r){let t=e.helperLTSP.createHidePriceMessageSpan(c);r.before(t)}}}if(window.Shopify&&"airbesafe.myshopify.com"===window.Shopify.shop){let t=[[".shopify-section--main-collection .product-list__inner .product-item ",".product-item__info .product-item-meta__price-list-container .price-list"],[".shopify-section--main-product .product--thumbnails-bottom .product__info",".product-meta__price-list-container"],["product-item.product-item .product-item__info",".product-item-meta__price-list-container"]];for(let o=0;o<t.length;o++){let l=r.closest(t[o][0]);if(l&&!l.querySelector(".bsscommerce-ltsp-message.hide-message")){let r=l.querySelector(t[o][1]);if(r){let t=e.helperLTSP.createHidePriceMessageSpan(c);r.after(t)}}}}}}}function c(e){!function(e){e.helperLTSP={},e.helperLTSP.createHidePriceMessageSpan=function(e){let t=document.createElement("span");return t.classList.add("bsscommerce-ltsp-message"),t.classList.add("hide-message"),t.style.fontSize="16px",t.style.fontWeight="normal",t.style.color="initial",t.style.textTransform="none",t.style.visibility="visible",t.innerHTML=e,t},e.helperLTSP.onLoadMore=function(e){const t=document.querySelector([".sf__product-listing[data-product-container] > div",'.row[data-js-collection-replace="products"]',".product-list-container .product-list.use-infinite-scroll","#collection-product .product-container",".container #col-main"].join(","));if(t){new MutationObserver((function(t){t.forEach((function(t){t.addedNodes.length&&e()}))})).observe(t,{childList:!0})}}}(e)}function l(){const e={};c(e),r(e),function(e){e.ptvp={},e.ptvp.addPasscodeForm=function(){let e=document.querySelector('form[action*="/cart/add"]'),t=document.getElementsByClassName("bss-passcode-wrapper-tag"),o=document.getElementsByClassName("bsscommerce-password-form"),r=document.querySelector(".toggle-passcode-input"),c=null;if(o.length&&(c=o[0],c.style.display="block",r&&r.addEventListener("click",(function(e){let t=document.getElementById("bsscommerce-password");"password"===t.type?(t.type="text",e.target.closest(".toggle-passcode-input").style.fill="#5C5F62"):(t.type="password",e.target.closest(".toggle-passcode-input").style.fill="#BABEC3")}))),t.length&&e&&o.length){e.before(c);let o=document.getElementById("bsscommerce-password"),r=new FormData;r.append(o.name,o.value),document.getElementById("bsscommerce-password-submit").style.padding="12px 16px",document.getElementById("bsscommerce-password-submit").style.display="block";let l=new XMLHttpRequest;l.open("post","/cart/update.js"),l.send(r);let s=document.getElementsByClassName("bsscommerce-ltap-password");if(s.length)for(let e=0;e<s.length;e++)s[e].addEventListener("submit",(function(e){e.preventDefault();let t=this;if(t.length)for(let e=0;e<t.length;e++)if("bsscommerce-password"==t[e].id){let o=t[e];if(o.addEventListener("input",(function(){o.classList.remove("input--error")})),o.value)if(""!=o.value){let e=new FormData;e.append(o.name,o.value);let t=new XMLHttpRequest;t.onreadystatechange=function(){4==t.readyState&&200==t.status&&location.reload()},t.open("post","/cart/update.js"),t.send(e)}else o.classList.add("input--error")}}));for(let e=0;e<t.length;e++)t[e].remove()}}}(e),e.ptvp.addPasscodeForm(),document.querySelectorAll(".quick-view-btn").forEach((function(t){t.addEventListener("click",(function(){setTimeout((function(){e.ptvp.addPasscodeForm()}),1e3)}))})),function e(){document.querySelectorAll(".advanced-filter a").forEach((function(t){t.addEventListener("click",(function(){setTimeout((function(){let t=document.getElementsByClassName("bsscommerce-ltsp-message");for(let e=0;e<t.length;e++){let o=t[e].closest(".item-row");
13132if(o){let e=o.querySelector(".add-to-cart");e&&e.remove()}}e()}),1200)}))}))}(),e.ltsp.quickView(),e.ltsp.insertBeforeAddToCart(),e.ltsp.removePattern(),e.helperLTSP.onLoadMore(e.ltsp.removePattern),setTimeout((function(){e.ltsp.removePattern()}),2500);if(window.Shopify&&-1!==["showroom1-ducanero.myshopify.com","sparklinbluewholesale.myshopify.com","youchique-4183.myshopify.com","wilkens-gmbh.myshopify.com","friends-forever-pets.myshopify.com"].indexOf(window.Shopify.shop)&&(window.onscroll=function(e,t){let o;return function(...r){o&&clearTimeout(o),o=setTimeout(()=>{e(...r),o=null},t)}}((function(){let t=setInterval((function(){e.ltsp.removePattern()}),200);setTimeout((function(){clearInterval(t)}),3e3)}),500)),"amoreo.eu"===window.location.host){let t=setInterval((function(){e.ltsp.removePattern()}),200);setTimeout((function(){clearInterval(t)}),3e3)}let t=document.querySelector(".infinite-scrolling-homepage a.btn");"airbesafe.myshopify.com"===window.location.host&&setTimeout((function(){e.ltsp.insertBeforeAddToCart()}),3e3),t&&(t.onclick=function(){setTimeout((function(){e.ltsp.removePattern()}),1e3)});let o=document.querySelectorAll("#shopify-section-product-recommendations, .product-modal-wrapper");var l,s,u;(o.length&&o.forEach((function(t){t.addEventListener("DOMSubtreeModified",(function(){e.ltsp.removePattern()}))})),"valleys-group.myshopify.com"===window.location.host)&&(l=function(){e.ltsp.removePattern();
13132let t=document.querySelectorAll(".slideout__drawer-right, .sidebar_leftside_wapper, .filtering__results");t.length&&t.forEach((function(e){e.addEventListener("click",(function(){setTimeout(()=>{l()},1700)}))}))});"b.salonpremium.com"===window.location.host&&(s=function(){e.ltsp.removePattern();let t=document.querySelectorAll(".pagination");t.length&&t.forEach((function(e){e.addEventListener("click",(function(){setTimeout(()=>{s()},3e3)}))}))});"www.internationalbeauty.ca"===window.location.host&&(u=function(){let t=document.querySelector('[id^="RecentlyViewed"]');new MutationObserver((function(t){t.forEach((function(t){t.addedNodes.length&&(e.ltsp.removePattern(),document.querySelectorAll(".btn--icon.quick-product__btn").forEach((function(e){e.addEventListener("click",(function(){setTimeout((function(){let e=document.getElementsByClassName("bsscommerce-ltsp-message");for(let t=0;t<e.length;t++){let o=e[t].closest(".product-grid__content");if(o){let e=o.querySelector(".payment-buttons");e&&e.remove()}}u()}),2e3)}))})))}))})).observe(t,{childList:!0})});if("bluebasketb2b.myshopify.com"===window.Shopify.shop){let t=document.querySelector("#CartDrawer");const o=()=>{let e=document.querySelectorAll("script#bss-ltap-login-require");for(let t in e)t.remove()};if(t){new MutationObserver((function(t){t.forEach((function(t){t.addedNodes.length&&(e.ltsp.removePattern(),o())}))})).observe(t,{childList:!0})}}if("dollie-wholesale.myshopify.com"===window.Shopify.shop){let t=document.querySelector("#product-grid .products__row");if(t){new MutationObserver((function(t){t.forEach((function(t){t.addedNodes.length&&e.ltsp.removePattern()}))})).observe(t,{childList:!0})}}if("impjarwholesale.myshopify.com"===window.Shopify.shop){let t=document.querySelector(".tp-collection-content");if(t){new MutationObserver((function(t){t.forEach((function(t){t.addedNodes.length&&e.ltsp.removePattern()}))})).observe(t,{childList:!0})}}if("inex-studio.myshopify.com"===window.Shopify.shop){let t=document.querySelector("#Search .Search__Results");if(t){new MutationObserver((function(t){t.forEach((function(t){t.addedNodes.length&&e.ltsp.removePattern()}))})).observe(t,{childList:!0,subtree:!0})}}}o.r(t),o.d(t,"default",(function(){return l})),l()}]); 13133</script>
13133 13134 13135 </main> 13136 13137 <div id="shopify-section-newsletter" class="shopify-section"> 13138 <style> 13139 #shopify-section-newsletter { 13140 background-color: #EEEEEE; 13141 margin-bottom: 0; 13142 } 13143 input:-webkit-autofill, 13144 input:-webkit-autofill:hover, 13145 input:-webkit-autofill:active, 13146 input:-webkit-autofill:focus { 13147 -webkit-box-shadow:0 0 0 50px white inset; 13148 -webkit-text-fill-color: #212121; 13149 } 13150 .section-newsletter { 13151 max-width: 800px; 13152 margin: auto; 13153 padding: 50px 0; 13154 } 13155 .section-newsletter h2 { 13156 font-weight: 700; 13157 font-size: 24px; 13158 } 13159 .section-newsletter input[type="email"] { 13160 width: 100%; 13161 text-align: center; 13162 border: none; 13163 border-bottom: 1px solid #212121; 13164 font-size: 16px; 13165 color: #757575; 13166 background-color: #eeeeee; 13167 } 13168 .section-newsletter .row label { 13169 font-size: 14px; 13170 cursor: pointer; 13171 } 13172 .section-newsletter .radio-inline input { 13173 width: auto; 13174 } 13175 .section-newsletter .btn { 13176 width: 130px; 13177 border: 1px solid #212121; 13178 box-shadow: none; 13179 font-size: 16px; 13180 font-weight: 500; 13181 text-transform: uppercase; 13182 } 13183 .section-newsletter form { 13184 margin: 30px 0 60px; 13185 } 13186 .section-newsletter input[type="radio"] { 13187 position: absolute; 13188 width: 1px; 13189 height: 1px; 13190 } 13191 .section-newsletter [type="radio"]:checked + label, .section-newsletter [type="radio"]:not(:checked) + label { 13192 position: relative; 13193 padding-left: 28px; 13194 cursor: pointer; 13195 line-height: 20px; 13196 display: inline-block; 13197 color: #666; 13198 } 13199 .section-newsletter [type="radio"]:checked + label:before, .section-newsletter [type="radio"]:not(:checked) + label:before { 13200 content: ''; 13201 position: absolute; 13202 left: 0; 13203 top: 0; 13204 width: 18px; 13205 height: 18px; 13206 border: 1px solid #ddd; 13207 border-radius: 100%; 13208 background: #fff; 13209 } 13210 .section-newsletter [type="radio"]:checked + label:after, .section-newsletter [type="radio"]:not(:checked) + label:after { 13211 content: ''; 13212 width: 12px; 13213 height: 12px; 13214 background: #212121; 13215 position: absolute; 13216 top: 3px; 13217 left: 3px; 13218 border-radius: 100%; 13219 -webkit-transition: all 0.2s ease; 13220 transition: all 0.2s ease; 13221 } 13222 .section-newsletter [type="radio"]:not(:checked) + label:after { 13223 opacity: 0; 13224 -webkit-transform: scale(0); 13225 transform: scale(0); 13226 } 13227 .opt-newsletter {display:none;} 13228 .footer-newsletter p, .footer-newsletter p a { 13229 color: #757575; 13230 } 13231 @media (max-width:991px){ 13232 .section-newsletter h2 { 13233 font-size: 32px; 13234 } 13235 .section-newsletter input { 13236 width: 300px; 13237 font-size: 14px; 13238 } 13239 .section-newsletter { 13240 padding: 50px 20px; 13241 } 13242 } 13243 @media (max-width: 480px){ 13244 .section-newsletter input[type="email"] {font-size: 16px;} 13245 } 13246 </style> 13247 13248 <div class="section-newsletter text-center"> 13249 <div class="header-newsletter"> 13250 <h2>HANTUSLOT ð° Situs Game Online Lengkap, Cepat & Nyaman</h2> 13251 13252 <p style="color: #000000; line-height: 1.9; font-size: 15px; text-align: justify; margin-bottom: 18px;"> 13253 Perkembangan <a href="https://hotelverta.com/">game online</a> semakin menghadirkan berbagai inovasi yang membuat pengalaman digital menjadi lebih praktis dan mudah digunakan. HANTUSLOT hadir dengan konsep platform modern yang mengutamakan tampilan berbahasa Indonesia, navigasi sederhana, serta struktur menu yang mudah dipahami. Setiap bagian dirancang agar pengguna dapat menemukan informasi dan fitur yang tersedia dengan lebih cepat melalui perangkat desktop maupun smartphone. Bagi pengguna yang sedang mencari <strong>GAME REKOMENDASI</strong> dengan tampilan modern, HANTUSLOT menawarkan pengalaman penggunaan yang intuitif melalui desain responsif dan penyajian informasi yang lebih terstruktur. 13254 </p> 13255 13256 <p style="color: #000000; line-height: 1.9; font-size: 15px; text-align: justify; margin-bottom: 18px;"> 13257 Salah satu keunggulan <a href="https://hotelverta.com/">HANTUSLOT</a> adalah perpaduan antara desain visual modern dengan performa platform yang responsif. Berbagai menu disusun secara sistematis sehingga pengguna dapat berpindah dari satu bagian ke bagian lainnya dengan lebih praktis. Dukungan teknologi yang terus dikembangkan juga membantu menghadirkan pengalaman akses yang sesuai dengan kebutuhan pengguna masa kini. HANTUSLOT dapat digunakan melalui berbagai perangkat yang kompatibel, sehingga pengguna memiliki fleksibilitas dalam mengakses platform sesuai dengan perangkat yang digunakan. Tampilan yang adaptif juga membuat navigasi tetap nyaman ketika dibuka melalui layar smartphone, tablet, laptop, maupun komputer desktop. 13258 </p> 13259 13260 <p style="color: #000000; line-height: 1.9; font-size: 15px; text-align: justify; margin-bottom: 18px;"> 13261 Sebagai platform yang mengutamakan kenyamanan pengguna, HANTUSLOT terus mengembangkan fitur dan tampilan agar tetap relevan dengan perkembangan teknologi digital. Kombinasi antara sistem yang ringan, antarmuka berbahasa Indonesia, navigasi intuitif, serta dukungan akses multi-perangkat membuat penggunaan platform terasa lebih efisien. Inilah yang menjadikan HANTUSLOT dapat menjadi salah satu <strong>GAME REKOMENDASI</strong> bagi pengguna yang menginginkan platform dengan tampilan sederhana namun tetap modern. Dengan berbagai fitur inovatif dan struktur informasi yang mudah dipahami, HANTUSLOT berupaya memberikan pengalaman game online yang lebih praktis, responsif, dan sesuai dengan kebutuhan pengguna di era digital. 13262 </p> 13263 </div> 13264</div> 13265 </div> 13266 </div> 13267
13267<script> 13268 $(document).ready(function(){ 13269 $('.section-newsletter input[type="email"]').bind('input propertychange', function() { 13270 if(($(this).val().length) > 0) { 13271 $('.opt-newsletter').css('display','flex'); 13272 }else { 13273 $('.opt-newsletter').css('display','none'); 13274 } 13275 }); 13276 }); 13277 </script>
13277 13278 13279 13280</div> 13281 13282 13283 <div id="shopify-section-Footer" class="shopify-section Footer Section"><!-- begin site-footer --> 13284 13285<link href="https://outerbloom.com/cdn/shop/t/138/assets/section-footer.css?v=100040659411828343611752652419" rel="stylesheet" type="text/css" media="all" /> 13286<style> 13287 13288 .site-footer__list-item a {color: #212121;font-size: 14px;font-weight: 400;} 13289 .social-icons li {display: inline-block;} 13290 .social-icons li a {display: block;color: #212121!important;font-size: 16px;} 13291 .social-icons li a img {vertical-align: middle;height: 20px;margin-right: 7px;} 13292 .icon-footer-whatsapp .icon-svg {width: 18px;height: 18px;vertical-align: middle;} 13293 .copyright * {display: inline-block;vertical-align: middle;color: #212121;letter-spacing: normal!important;font-size: 16px!important;} 13294 .copyright a {border-left: 1px solid;padding-left: 10px;margin-left: 5px;} 13295 .icon-minus {display:none} 13296 .bc-border { 13297 border-top: 1px solid #C4C4C4; 13298 border-bottom: 1px solid #C4C4C4; 13299 padding: 40px 0; 13300 margin-bottom: 50px; 13301 } 13302 @media (min-width: 769px) { 13303 .site-footer__list-item{margin-bottom:8px;} 13304 } 13305 @media (max-width: 992px){ 13306 ul.site-footer__list {display: none;} 13307 .site-footer__section .bottom-line .icon {float: right;width: 20px;height: 20px;} 13308 .bottom-line.site-footer__section-title.open .icon-minus {display: block;} 13309 .bottom-line.site-footer__section-title.open .icon-plus {display: none;} 13310 13311 .site-footer__list.cust-service {margin-bottom: 25px;} 13312 .site-footer__list.cust-service li {width: 100%;text-align: center;} 13313 /*.site-footer__list.cust-service li:first-child {border-right: 1px solid #757575;} 13314 .site-footer__list.cust-service li:last-child {border-left: 1px solid #757575;}*/ 13315 } 13316 @media (max-width: 768px) { 13317 .seo-footer, .seo-article {padding-top: 0!important;} 13318 .copyright {padding: 0px 0 0!important;} 13319 .copyright span { 13320 width: 100%; 13321 font-size: 14px!important; 13322 } 13323 .copyright a { 13324 padding: 0; 13325 margin: 0 5px; 13326 border: none; 13327 font-size: 14px!important; 13328 } 13329 .article-lists {column-count: 2;-webkit-column-count: 2;} 13330 } 13331 /** Newsletter Footer **/ 13332 .site-footer__newsletter-input {height: 37px;border-radius: 0;}#mc-embedded-subscribe-form .input-group-btn {width: initial;} 13333 /** Method Footer **/ 13334 .footer-method ul {margin: 0;}.footer-method ul li {display: inline-block;width: 65px;float: left;margin-right: 5px;margin-bottom: 5px;}.footer-method ul li img {display: block;width: 100%;background-color: #fff;} 13335 /** SEO **/ 13336 .c-seo-links h6 {font-size: 24px;font-weight: 600;} 13337 .c-seo-links .about_text p {font-size: 14px!important;font-weight: 400;} 13338 .seo-article * {color: #212121!important;} 13339 .seo-article a:hover {text-decoration: underline;} 13340</style> 13341<footer class="site-footer" role="contentinfo"> 13342 13343 <div class="footer-menu"> 13344 <div class="container pt-0"> 13345 <div class="row px-1 px-md-0 pb-4 pb-md-0"> 13346 <div class="footer-navigation col-12"> 13347 <div class="row justify-content-around m-0 m-sm-0"> 13348 <div class="site-footer__section site-footer__section-mbl col-lg-3 mt-3 mt-md-0 p-0 d-lg-none"> 13349 <h5 class="bottom-line site-footer__section-title mb-1"> 13350 Layanan Customers 13351 <svg class="d-none icon icon-plus" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 13352 <title>icon-plus</title> 13353 <path d="M16.667 15.333h8.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-8.667v8.667c0 0.368-0.298 0.667-0.667 0.667s-0.667-0.298-0.667-0.667v-8.667h-8.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h8.667v-8.667c0-0.368 0.298-0.667 0.667-0.667s0.667 0.298 0.667 0.667v8.667z"></path> 13354 </svg> 13355 <svg class="d-lg-none icon icon-minus" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 13356 <title>icon-minus</title> 13357 <path d="M6.667 16.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h18.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-18.667z"></path> 13358 </svg> 13359</h5> 13360<ul class="site-footer__list cust-service ml-0 contact-footer-mobile d-flex d-lg-block justify-content-between"> 13361 <li class="site-footer__list-item fist list-unstyled icon-footer-whatsapp">
13362 <a href="https://api.whatsapp.com/send?phone=6281514234600&text=https://outerbloom.com" target="_blank" class="small"><span class="lc-icon"> 13363 <svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="whatsapp" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" class="icon-svg svg-inline--fa fa-whatsapp fa-w-14 fa-2x"><path fill="currentColor" d="M380.9 97.1C339 55.1 283.2 32 223.9 32c-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3L72 359.2l-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1 34.8 34.9 56.2 81.2 56.1 130.5 0 101.8-84.9 184.6-186.6 184.6zm101.2-138.2c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8-3.7 5.6-14.3 18-17.6 21.8-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7-1.4-2.8-12.5-30.1-17.1-41.2-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2-3.7 0-9.7 1.4-14.8 6.9-5.1 5.6-19.4 19-19.4 46.3 0 27.3 19.9 53.7 22.6 57.4 2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4 4.6-13 4.6-24.1 3.2-26.4-1.3-2.5-5-3.9-10.5-6.6z" class=""></path></svg></span>
13364 <span class="d-none d-lg-inline-block">0857-6388-1890</span> 13365 <span class="d-lg-none lc-icon-text align-middle">Whatsapp</span> 13366 </a> 13367 </li> 13368 <li class="site-footer__list-item second list-unstyled"> 13369 <a href="tel:+622157937918" class="small" target="_blank"> 13370 <span class="lc-icon"> 13371 <img src="https://outerbloom.com/cdn/shop/t/138/assets/call-footer.svg?v=66245936344487562681752652418" alt="Icon Phone"/> 13372 </span> 13373 <span class="d-none d-lg-inline-block">021-57937918</span> 13374 <span class="d-lg-none lc-icon-text align-middle">Phone</span> 13375 </a> 13376 </li> 13377 13378</ul> 13379 </div> 13380 13381 13382 <div class="site-footer__section col-lg-3 mt-3 mt-md-0 p-0"> 13383 <h5 class="bottom-line footer-trigger site-footer__section-title mb-1"> 13384 HANTUSLOT 13385 <svg class="d-lg-none icon icon-plus" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 13386 <title>icon-plus</title> 13387 <path d="M16.667 15.333h8.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-8.667v8.667c0 0.368-0.298 0.667-0.667 0.667s-0.667-0.298-0.667-0.667v-8.667h-8.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h8.667v-8.667c0-0.368 0.298-0.667 0.667-0.667s0.667 0.298 0.667 0.667v8.667z"></path> 13388 </svg> 13389 <svg class="d-lg-none icon icon-minus" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 13390 <title>icon-minus</title> 13391 <path d="M6.667 16.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h18.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-18.667z"></path> 13392 </svg> 13393 13394 </h5> 13395<ul class="site-footer__list ml-0"> 13396 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">Tentang HANTUSLOT</a></li> 13397 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">Kebijakan Privasi HANTUSLOT</a></li> 13398 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">Syarat & Ketentuan HANTUSLOT</a></li> 13399 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">Blog & HANTUSLOT</a></li> 13400 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">Karir di HANTUSLOT</a></li> 13401 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">Game Online HANTUSLOT</a></li> 13402 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">Terms of Service HANTUSLOT</a></li> 13403 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">Kebijakan Pengembalian & Pembayaran HANTUSLOT</a></li> 13404</ul> 13405 13406 </div> 13407 13408 13409 13410 <div class="site-footer__section col-lg-3 mt-3 mt-md-0 p-0"> 13411 <h5 class="bottom-line footer-trigger site-footer__section-title mb-1"> 13412 Bantuan 13413 <svg class="d-lg-none icon icon-plus" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 13414 <title>icon-plus</title> 13415 <path d="M16.667 15.333h8.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-8.667v8.667c0 0.368-0.298 0.667-0.667 0.667s-0.667-0.298-0.667-0.667v-8.667h-8.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h8.667v-8.667c0-0.368 0.298-0.667 0.667-0.667s0.667 0.298 0.667 0.667v8.667z"></path> 13416 </svg> 13417 <svg class="d-lg-none icon icon-minus" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 13418 <title>icon-minus</title> 13419 <path d="M6.667 16.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h18.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-18.667z"></path> 13420 </svg> 13421 13422 </h5> 13423<ul class="site-footer__list ml-0"> 13424 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">Login HANTUSLOT</a></li> 13425 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">Daftar Akun HANTUSLOT</a></li> 13426 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">Game HANTUSLOT</a></li> 13427 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">GAME REKOMENDASI</a></li> 13428 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">Situs HANTUSLOT</a></li> 13429 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">FAQ HANTUSLOT</a></li> 13430 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://hotelverta.com/" class="small">Kontak CS 24 Jam</a></li> 13431</ul> 13432 13433 </div> 13434 13435 13436 13437 <div class="site-footer__section col-lg-3 mt-3 mt-md-0 p-0"> 13438 <h5 class="bottom-line footer-trigger site-footer__section-title mb-1"> 13439 B2B Programs 13440 <svg class="d-lg-none icon icon-plus" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 13441 <title>icon-plus</title> 13442 <path d="M16.667 15.333h8.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-8.667v8.667c0 0.368-0.298 0.667-0.667 0.667s-0.667-0.298-0.667-0.667v-8.667h-8.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h8.667v-8.667c0-0.368 0.298-0.667 0.667-0.667s0.667 0.298 0.667 0.667v8.667z"></path> 13443 </svg> 13444 <svg class="d-lg-none icon icon-minus" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 13445 <title>icon-minus</title>
13446 <path d="M6.667 16.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h18.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-18.667z"></path> 13447 </svg> 13448 13449 </h5> 13450 <ul class="site-footer__list ml-0"> 13451 13452 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://outerbloom.com/pages/corporate-program" class="small">Corporate Program</a></li> 13453 13454 <li class="site-footer__list-item list-unstyled mb-1"><a href="https://outerbloom.com/pages/be-our-partner" class="small">Be Our Partner</a></li> 13455 13456 </ul> 13457 13458 <div class="d-none d-lg-block"> 13459 <h5 class="bottom-line site-footer__section-title mb-1"> 13460 Layanan Customers 13461 <svg class="d-none icon icon-plus" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 13462 <title>icon-plus</title> 13463 <path d="M16.667 15.333h8.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-8.667v8.667c0 0.368-0.298 0.667-0.667 0.667s-0.667-0.298-0.667-0.667v-8.667h-8.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h8.667v-8.667c0-0.368 0.298-0.667 0.667-0.667s0.667 0.298 0.667 0.667v8.667z"></path> 13464 </svg> 13465 <svg class="d-lg-none icon icon-minus" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 13466 <title>icon-minus</title> 13467 <path d="M6.667 16.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h18.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-18.667z"></path> 13468 </svg> 13469</h5> 13470<ul class="site-footer__list cust-service ml-0 contact-footer-mobile d-flex d-lg-block justify-content-between"> 13471 <li class="site-footer__list-item fist list-unstyled icon-footer-whatsapp"> 13472 <a href="https://api.whatsapp.com/send?phone=6281514234600&text=https://outerbloom.com" target="_blank" class="small"><span class="lc-icon"> 13473 <svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="whatsapp" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" class="icon-svg svg-inline--fa fa-whatsapp fa-w-14 fa-2x"><path fill="currentColor" d="M380.9 97.1C339 55.1 283.2 32 223.9 32c-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3L72 359.2l-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1 34.8 34.9 56.2 81.2 56.1 130.5 0 101.8-84.9 184.6-186.6 184.6zm101.2-138.2c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8-3.7 5.6-14.3 18-17.6 21.8-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7-1.4-2.8-12.5-30.1-17.1-41.2-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2-3.7 0-9.7 1.4-14.8 6.9-5.1 5.6-19.4 19-19.4 46.3 0 27.3 19.9 53.7 22.6 57.4 2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4 4.6-13 4.6-24.1 3.2-26.4-1.3-2.5-5-3.9-10.5-6.6z" class=""></path></svg></span>
13474 <span class="d-none d-lg-inline-block">0857-6370-1890</span> 13475 <span class="d-lg-none lc-icon-text align-middle">Whatsapp</span> 13476 </a> 13477 </li> 13478 <li class="site-footer__list-item second list-unstyled"> 13479 <a href="tel:+622157937918" class="small" target="_blank"> 13480 <span class="lc-icon"> 13481 <img src="https://outerbloom.com/cdn/shop/t/138/assets/call-footer.svg?v=66245936344487562681752652418" alt="Icon Phone"/> 13482 </span> 13483 <span class="d-none d-lg-inline-block">085763881890</span> 13484 <span class="d-lg-none lc-icon-text align-middle">Phone</span> 13485 </a> 13486 </li> 13487 13488</ul> 13489 </div> 13490 13491 </div> 13492 13493 13494 <div class="site-footer__section footer-method col-lg-3 mt-3 mt-md-0 p-0 d-block d-lg-none"> 13495 <h5 class="bottom-line footer-trigger site-footer__section-title mb-1"> 13496 Metode Pembayaran 13497 <svg class="d-lg-none icon icon-plus" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 13498 <title>icon-plus</title> 13499 <path d="M16.667 15.333h8.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-8.667v8.667c0 0.368-0.298 0.667-0.667 0.667s-0.667-0.298-0.667-0.667v-8.667h-8.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h8.667v-8.667c0-0.368 0.298-0.667 0.667-0.667s0.667 0.298 0.667 0.667v8.667z"></path> 13500 </svg> 13501 <svg class="d-lg-none icon icon-minus" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 13502 <title>icon-minus</title> 13503 <path d="M6.667 16.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h18.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-18.667z"></path> 13504 </svg> 13505 </h5> 13506 <ul class="site-footer__list ml-0 method-payment"> 13507 13508 <li><img src="https://outerbloom.com/cdn/shop/files/Payment_2021_Icon_ovo_d9091448-9e8e-4049-8b9c-47b022942188_65x.jpg?v=1614385284" alt="Icon Payment"/></li> 13509 13510 13511 <li><img src="https://outerbloom.com/cdn/shop/files/Payment_2021_Icon_dana_1e55a7bb-cbe4-456e-89ed-fdb0cdd7fe38_65x.jpg?v=1614385284" alt="Icon Payment"/></li> 13512 13513 13514 <li><img src="https://outerbloom.com/cdn/shop/files/Payment_2021_Icon_shopee_pay_c987eae8-c53e-4493-a243-52a015c87d34_65x.jpg?v=1614385285" alt="Icon Payment"/></li> 13515 13516 13517 <li><img src="https://outerbloom.com/cdn/shop/files/Payment_2021_Icon_Link_aja_9a413328-03f7-4024-bc31-004f3197b700_65x.jpg?v=1614385285" alt="Icon Payment"/></li> 13518 13519 13520 <li><img src="https://outerbloom.com/cdn/shop/files/Payment_2021_Icon_mastercard_bb55b01a-72ea-440a-9973-35609e91735f_65x.jpg?v=1614385285" alt="Icon Payment"/></li> 13521 13522 13523 <li><img src="https://outerbloom.com/cdn/shop/files/Payment_2021_Icon_visa_de5de8b1-bd17-47dc-8f6e-eb78ae3e755a_65x.jpg?v=1614385285" alt="Icon Payment"/></li> 13524 13525 13526 <li><img src="https://outerbloom.com/cdn/shop/files/Payment_2021_Icon_bca_96093da7-3e37-4a6b-a35f-3ea840732292_65x.jpg?v=1614385285" alt="Icon Payment"/></li> 13527 13528 13529 <li><img src="https://outerbloom.com/cdn/shop/files/Payment_2021_Icon_mandiri_9966e6e5-1a91-4fd3-88dd-a7fe254f9371_65x.jpg?v=1614385285" alt="Icon Payment"/></li> 13530 13531 13532 <li><img src="https://outerbloom.com/cdn/shop/files/Payment_2021_Icon_bri_63ba1791-409c-4049-a5d1-66358d5b2c8e_65x.jpg?v=1614385285" alt="Icon Payment"/></li> 13533 13534 13535 <li><img src="https://outerbloom.com/cdn/shop/files/Payment_2021_Icon_bank_transfer_0edfac97-0da1-445b-8917-d91f0591091a_65x.jpg?v=1614385285" alt="Icon Payment"/></li> 13536 13537 13538 <li><img src="https://outerbloom.com/cdn/shop/files/Payment_2021_Icon_alfamart_d9366c0c-8728-4c7e-bf11-5417b23e7cf0_65x.jpg?v=1614385285" alt="Icon Payment"/></li> 13539 13540 13541 <li><img src="https://outerbloom.com/cdn/shop/files/Payment_2021_Icon_Paypal_d6e7bc39-f865-4429-a72b-1f02424c9aa8_65x.jpg?v=1614385285" alt="Icon Payment"/></li> 13542 13543 13544 13545 13546 </ul> 13547 </div> 13548 <div class="site-footer__section col-lg-3 mt-3 mt-md-0 p-0"> 13549 <div class="social-media-desktop d-none d-md-block"> 13550 13551 <div class="social-media"> 13552 <h5 class="site-footer__section-title">Follow Our Social Medias</h5> 13553 <ul class="inline-list social-icons mt-2"> 13554 13555 <li> 13556 <a href="https://twitter.com/outerbloom" title="Outerbloom on Twitter" target="_blank"> 13557 <svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 22 22" fill="none"> 13558 <path d="M9.60246 11.7963L1.48771 21.0573M19.1225 0.642921L11.9066 9.14092M0.855957 0.641754L16.8626 21.0584H21.2726L5.26654 0.641754H0.855957Z" stroke="#212121" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round"/> 13559</svg> 13560 13561 </a> 13562 </li> 13563 13564 13565 <li> 13566 <a href="https://www.facebook.com/outerbloom/" title="Outerbloom on Facebook" target="_blank"> 13567 <svg xmlns="http://www.w3.org/2000/svg" width="22" height="23" viewBox="0 0 22 23" fill="none"> 13568 <path d="M21.0625 0.912598H0.9375C0.453516 0.912598 0.0625 1.30361 0.0625 1.7876V21.9126C0.0625 22.3966 0.453516 22.7876 0.9375 22.7876H21.0625C21.5465 22.7876 21.9375 22.3966 21.9375 21.9126V1.7876C21.9375 1.30361 21.5465 0.912598 21.0625 0.912598ZM18.5359 7.29736H16.7887C15.4188 7.29736 15.1535 7.94814 15.1535 8.90518V11.0134H18.4238L17.9973 14.3138H15.1535V22.7876H11.7438V14.3165H8.8918V11.0134H11.7438V8.57978C11.7438 5.75518 13.4691 4.21572 15.9902 4.21572C17.1988 4.21572 18.2352 4.30596 18.5387 4.34697V7.29736H18.5359Z" fill="#212121"/> 13569</svg> 13570 13571 </a> 13572 </li> 13573 13574 13575 <li> 13576 <a href="https://www.instagram.com/outerbloom" title="Outerbloom on Instagram" target="_blank"> 13577 <svg xmlns="http://www.w3.org/2000/svg" width="22" height="23" viewBox="0 0 22 23" fill="none"> 13578 <path d="M11 7.0376C10.0482 7.0376 9.11773 7.31985 8.32632 7.84865C7.53491 8.37745 6.91808 9.12906 6.55383 10.0084C6.
1357818958 10.8878 6.09428 11.8554 6.27997 12.789C6.46566 13.7225 6.92401 14.58 7.59705 15.253C8.27009 15.9261 9.12759 16.3844 10.0611 16.5701C10.9947 16.7558 11.9623 16.6605 12.8417 16.2963C13.721 15.932 14.4726 15.3152 15.0014 14.5238C15.5303 13.7324 15.8125 12.8019 15.8125 11.8501C15.8111 10.5742 15.3036 9.35095 14.4014 8.44874C13.4991 7.54654 12.2759 7.03904 11 7.0376ZM11 15.7876C10.2212 15.7876 9.45996 15.5567 8.81244 15.124C8.16492 14.6914 7.66024 14.0764 7.36222 13.3569C7.0642 12.6374 6.98623 11.8457 7.13816 11.0819C7.29009 10.3181 7.6651 9.61653 8.21577 9.06586C8.76644 8.5152 9.46803 8.14018 10.2318 7.98826C10.9956 7.83633 11.7873 7.9143 12.5068 8.21232C13.2263 8.51034 13.8413 9.01502 14.2739 9.66254C14.7066 10.3101 14.9375 11.0713 14.9375 11.8501C14.9375 12.8944 14.5227 13.8959 13.7842 14.6343C13.0458 15.3728 12.0443 15.7876 11 15.7876ZM16.25 0.912598H5.75C4.24211 0.914335 2.79649 1.51411 1.73025 2.58035C0.664012 3.64658 0.0642369 5.09221 0.0625 6.6001V17.1001C0.0642369 18.608 0.664012 20.0536 1.73025 21.1199C2.79649 22.1861 4.24211 22.7859 5.75 22.7876H16.25C17.7579 22.7859 19.2035 22.1861 20.2698 21.1199C21.336 20.0536 21.9358 18.608 21.9375 17.1001V6.6001C21.9358 5.09221 21.336 3.64658 20.2698 2.58035C19.2035 1.51411 17.7579 0.914335 16.25 0.912598ZM21.0625 17.1001C21.0611 18.376 20.5536 19.5992 19.6514 20.5014C18.7491 21.4037 17.5259 21.9111 16.25 21.9126H5.75C4.47409 21.9111 3.25085 21.4037 2.34865 20.5014C1.44644 19.5992 0.938947 18.376 0.9375 17.1001V6.6001C0.938947 5.32419 1.44644 4.10095 2.34865 3.19874C3.25085 2.29654 4.47409 1.78905 5.75 1.7876H16.25C17.5259 1.78905 18.7491 2.29654 19.6514 3.19874C20.5536 4.10095 21.0611 5.32419 21.0625 6.6001V17.1001ZM17.5625 6.1626C17.5625 6.33566 17.5112 6.50483 17.415 6.64872C17.3189 6.79261 17.1822 6.90477 17.0223 6.97099C16.8625 7.03722 16.6865 7.05455 16.5168 7.02078C16.3471 6.98702 16.1912 6.90369 16.0688 6.78132C15.9464 6.65895 15.8631 6.50304 15.8293 6.3333C15.7956 6.16357 15.8129 5.98763 15.8791 5.82775C15.9453 5.66786 16.0575 5.53121 16.2014 5.43506C16.3453 5.33892 16.5144 5.2876 16.6875 5.2876C16.9196 5.2876 17.1421 5.37979 17.3062 5.54388C17.4703 5.70797 17.5625 5.93053 17.5625 6.1626Z" fill="#212121"/> 13579</svg> 13580 13581 </a> 13582 </li> 13583 13584 13585 <li> 13586 <a href="https://www.youtube.com/channel/UCSxRXcJS9JeYxRnq-m7MPYQ" title="Outerbloom on YouTube" target="_blank"> 13587 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="20" viewBox="0 0 24 20" fill="none"> 13588 <path d="M15.7428 9.48587L10.4928 5.98587C10.4269 5.9419 10.3503 5.91665 10.2712 5.91282C10.192 5.90898 10.1134 5.92671 10.0435 5.9641C9.97366 6.00149 9.91528 6.05715 9.8746 6.12513C9.83391 6.19311 9.81245 6.27086 9.8125 6.35009V13.3501C9.81241 13.4293 9.83383 13.5071 9.87447 13.5751C9.91512 13.6431 9.97346 13.6988 10.0433 13.7362C10.1132 13.7736 10.1919 13.7913 10.2711 13.7875C10.3503 13.7836 10.4269 13.7583 10.4928 13.7143L15.7428 10.2143C15.8028 10.1744 15.852 10.1202 15.8861 10.0567C15.9201 9.99314 15.9379 9.92217 15.9379 9.85009C15.9379 9.778 15.9201 9.70704 15.8861 9.64349C15.852 9.57995 15.8028 9.52581 15.7428 9.48587ZM10.6875 12.5331V7.16712L14.7114 9.85009L10.6875 12.5331ZM23.2066 3.56431C23.121 3.2282 22.9568 2.91724 22.7275 2.65709C22.4982 2.39693 22.2102 2.19504 21.8875 2.06806C18.1906 0.63962 12.2483 0.662589 12 0.662589C11.7517 0.662589 5.80937 0.63962 2.1125 2.06806C1.78989 2.19493 1.50205 2.39666 1.27272 2.65661C1.04338 2.91657 0.879104 3.22731 0.793438 3.56321C0.515625 4.62962 0.1875 6.58634 0.1875 9.85009C0.1875 13.1138 0.515625 15.0706 0.793438 16.137C0.879104 16.4729 1.04338 16.7836 1.27272 17.0436C1.50205 17.3035 1.78989 17.5052 2.1125 17.6321C5.80937 19.0606 11.7517 19.0376 12 19.0376H12.0777C12.8313 19.0376 18.3755 18.9906 21.8908 17.6321C22.2134 17.5052 22.5012 17.3035 22.7306 17.0436C22.9599 16.7836 23.1242 16.4729 23.2098 16.137C23.4844 15.0695 23.8125 13.1138 23.8125 9.85009C23.8125 6.58634 23.4844 4.62962 23.2066 3.56321V3.56431ZM22.36 15.9237C22.3092 16.1253 22.2112 16.3119 22.0741 16.4682C21.9369 16.6246 21.7647 16.7461 21.5714 16.8227C18.0309 18.1834 12.0623 18.1626 12 18.1626C11.9377 18.1626 5.97234 18.1834 2.43187 16.8162C2.23861 16.7395 2.06633 16.618 1.92923 16.4617C1.79213 16.3054 1.69412 16.1187 1.64328 15.9171C1.37641 14.8999 1.0625 13.022 1.0625 9.85009C1.0625 6.67821 1.37641 4.80025 1.64 3.78306C1.69084 3.58145 1.78884 3.3948 1.92595 3.23849C2.06305 3.08218 2.23533 2.96068 2.42859 2.884C5.96906 1.51681 11.9377 1.53759 12 1.53759C12.0623 1.53759 18.0277 1.51571 21.5681 2.884C21.7614 2.96068 21.9337 3.08218 22.0708 3.23849C22.2079 3.3948 22.3059 3.58145 22.3567 3.78306C22.6236 4.80025 22.9375 6.67821 22.9375 9.85009C22.9375 13.022 22.6236 14.8999 22.36 15.9171V15.9237Z" fill="#212121"/> 13589</svg> 13590 13591 </a> 13592 </li> 13593 13594 </ul> 13595 </div> 13596 13597 </div> 13598 <p class="fs-body">Download our app.</p> 13599 <a href="https://play.google.com/store/apps/details?id=com.outerBloom1Expo&referrer=utm_source%3Dwebsite%26utm_medium%3Dfooter%26utm_term%3Dapp%2520install%26anid%3Dadmob" target="_blank"><img src="https://outerbloom.com/cdn/shop/t/138/assets/google-play-logo.png?v=71844389215489113031752652420" alt="Logo Google Play" width="120"/></a> 13600 <a href="https://apps.apple.com/us/app/outerbloom-flower-cake/id1576832504?itsct=apps_box_link&itscg=30200&utm_source=website&utm_medium=footer&utm_campaign=app+install" target="_blank"><img src="https://outerbloom.com/cdn/shop/t/138/assets/app-store-logo.png?v=41600940253401965221752652422" alt="Logo Google Play" width="120"/></a> 13601 </div> 13602</div> 13603
13604<script> 13605 if ($(window).width() < 992) { 13606 $("document").ready(function(){ 13607 $(".site-footer__section .footer-trigger").click(function(){ 13608 $(this).toggleClass("open"); 13609 $(this).next("ul").slideToggle(); 13610 }); 13611 }); 13612 } 13613</script>
13613 13614 </div> 13615 </div> 13616 <div class="copyright"> 13617 <span 13618 >© 2026 PEJUANGSEO - HANTUSLOT . All rights reserved 13619 13620 </span> 13621 </div> 13622 </div> 13623 </div> 13624 13625 13626</footer> 13627 13628<!-- //site-footer --> 13629 13630 13631</div> 13632 13633 13634 13635 </div> 13636 13637 <style> 13638 #CartDrawer .drawer__title {color: #fff;} 13639 #CartDrawer .drawer__close button {color: #fff;} 13640 #CartDrawer .drawer__header {background-color: #212121;padding: 5px 0;} 13641 #CartDrawer .drawer {top: 48px;} 13642 .login-customer a {text-decoration: underline;} 13643</style> 13644 13645<div class="overlay overlay-cart"></div> 13646<div id="CartDrawer" class="drawer drawer--right"> 13647 <div class="drawer__header pl-2 pr-2"> 13648 <div class="drawer__icon-cart display-table-cell"> 13649 <a href="/cart" class=""> 13650 <svg class="icon icon-cart" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> <path fill="#fff" d="M13.638 23.203c0 0 3.5-2.113 3.502-4.11 0.002-2.304-2.689-3.537-3.497-1.76-0.916-1.778-3.493-1.714-3.497 0.59-0.003 1.999 3.491 5.28 3.491 5.28z"></path> <path fill="#fff" d="M8.112 9.809v16.662l11.063 2.491v-17.58l-11.063-1.573zM7.74 8.858l11.925 1.696c0.213 0.030 0.372 0.218 0.372 0.44v18.519c0 0.284-0.254 0.495-0.523 0.434l-11.925-2.685c-0.198-0.045-0.339-0.225-0.339-0.434v-17.53c0-0.27 0.231-0.477 0.49-0.44z"></path> <path fill="#fff" d="M23.7 10.046l-3.275 0.146-0.388 0.897v17.656l3.664-2.174v-16.526zM24.346 27.214l-4.526 2.685c-0.287 0.17-0.646-0.043-0.646-0.385v-18.519l0.037-0.181 0.534-1.235c0.067-0.154 0.212-0.256 0.375-0.263l3.991-0.178c0.245-0.011 0.45 0.191 0.45 0.444v17.247c0 0.159-0.082 0.306-0.216 0.385z"></path> <path fill="#000" d="M20.772 27.081l-0.501 2.383c-0.050 0.24-0.28 0.392-0.512 0.34s-0.38-0.289-0.33-0.528l0.569-2.707v-16.588c0-0.245 0.193-0.444 0.431-0.444s0.431 0.199 0.431 0.444v16.215l3.296 0.189c0.238 0.014 0.42 0.223 0.406 0.468s-0.217 0.433-0.454 0.419l-3.335-0.191z"></path> <path fill="#fff" d="M20.772 27.081l-0.501 2.383c-0.050 0.24-0.28 0.392-0.512 0.34s-0.38-0.289-0.33-0.528l0.569-2.707v-16.588c0-0.245 0.193-0.444 0.431-0.444s0.431 0.199 0.431 0.444v16.215l3.296 0.189c0.238 0.014 0.42 0.223 0.406 0.468s-0.217 0.433-0.454 0.419l-3.335-0.191z"></path> <path fill="#fff" d="M11.336 8.354l-0.257-0.333c-0.243-0.315 0.012-0.774 0.398-0.717l12.51 1.838c0.236 0.035 0.399 0.26 0.366 0.503s-0.252 0.412-0.487 0.377l-11.436-1.68 0.056 0.073c0.209 0.27 0.052 0.672-0.281 0.718l-4.467 0.607c-0.236 0.032-0.452-0.139-0.484-0.383s0.135-0.467 0.371-0.499l3.711-0.504z"></path> <path fill="#fff" d="M17.152 11.344c0.026-0.003 0.053-0.005 0.079-0.005 0.357 0 0.645 0.297 0.645 0.665s-0.288 0.665-0.645 0.665c-0.322 0-0.59-0.245-0.637-0.565-0.383-0.45-0.515-1.321-0.521-2.536-0.003-0.556 0.026-1.149 0.076-1.739 0.028-0.339 0.057-0.603 0.074-0.735 0.195-2.391-2.008-3.379-3.568-1.658-0.64 0.707-1.041 1.855-1.266 3.412-0.092 0.634-0.137 1.111-0.194 2.024 0.107 0.119 0.172 0.278 0.172 0.453 0 0.342-0.251 0.624-0.573 0.661-0.031 0.005-0.064 0.007-0.097 0.005-0.015-0.001-0.029-0.003-0.044-0.005-0.324-0.036-0.576-0.318-0.576-0.661 0-0.218 0.102-0.412 0.259-0.533 0.058-0.924 0.105-1.415 0.201-2.075 0.249-1.719 0.703-3.020 1.489-3.888 2.114-2.335 5.321-0.897 5.054 2.359-0.018 0.141-0.045 0.392-0.072 0.717-0.047 0.566-0.075 1.133-0.073 1.658 0.004 0.839 0.098 1.47 0.216 1.78z"></path> <path fill="#fff" d="M14.43 8.138c-0.008 0.245-0.207 0.438-0.445 0.43s-0.424-0.213-0.417-0.459c0.001-0.026 0.001-0.026 0.002-0.051 0.029-0.909 0.047-1.282 0.102-1.792 0.164-1.528 0.58-2.665 1.434-3.481 2.037-1.949 5.235-0.623 5.066 2.208-0.007 0.119-0.018 0.331-0.029 0.608-0.022 0.539-0.033 1.084-0.029 1.59 0.007 0.797 0.053 1.412 0.139 1.744 0.062 0.237-0.075 0.481-0.305 0.544s-0.466-0.077-0.528-0.314c-0.111-0.427-0.161-1.097-0.168-1.966-0.004-0.523 0.007-1.081 0.029-1.634 0.011-0.284 0.023-0.502 0.030-0.626 0.119-1.995-2.13-2.927-3.619-1.501-0.673 0.644-1.021 1.591-1.164 2.927-0.051 0.479-0.069 0.838-0.097 1.723-0.001 0.026-0.001 0.026-0.002 0.052z"></path> </svg> 13651 </a> 13652 </div> 13653 <div class="drawer__title h4">Keranjang Belanja</div> 13654 <div class="drawer__close js-drawer-close"> 13655 <button type="button"> 13656 <svg class="icon icon-close" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 13657<title>icon-close</title> 13658<path d="M16.943 16l8.862 8.862c0.26 0.26 0.26 0.682 0 0.943s-0.682 0.26-0.943 0l-8.862-8.862-8.862 8.862c-0.26 0.26-0.682 0.26-0.943 0s-0.26-0.682 0-0.943l8.862-8.862-8.862-8.862c-0.26-0.26-0.26-0.682 0-0.943s0.682-0.26 0.943 0l8.862 8.862 8.862-8.862c0.26-0.26 0.682-0.26 0.943 0s0.26 0.682 0 0.943l-8.862 8.862z"></path> 13659</svg> 13660 </button> 13661 </div> 13662 </div> 13663 <div id="CartContainer" class="p-2"></div> 13664</div> 13665
13666<script> 13667 13668 </script>
13668 13669
13669<script src="https://outerbloom.com/cdn/shop/t/138/assets/handlebars.min.js?v=79044469952368397291752652415" defer></script>
13669 13670 <!-- /snippets/ajax-cart-template.liquid --> 13671 13672
13672<script id="CartTemplate" type="text/template"> 13673 13674 <form action="/cart" method="post" novalidate class="cart ajaxcart"> 13675 <div class="ajaxcart__inner" {{ cart.item_count }}> 13676 {{#items}} 13677 <div class="ajaxcart__product"> 13678 <div class="ajaxcart__row" data-line="{{line}}"> 13679 <div class="grid"> 13680 <div class="grid__item one-quarter"> 13681 <a href="{{url}}" class="ajaxcart__product-image"><img src="{{img}}" alt="HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman"></a> 13682 </div> 13683 <div class="grid__item three-quarters"> 13684 <p class="d-block mb-3"> 13685 <a class="h4 d-block mb-2" href="{{url}}" class="ajaxcart__product-name">{{name}}</a> 13686 {{#if variation}} 13687 <span class="ajaxcart__product-meta p">{{variation}}</span> 13688 {{/if}} 13689 {{#properties}} 13690 {{#each this}} 13691 {{#if this}} 13692 <span class="ajaxcart__product-meta p hide">{{@key}}: {{this}}</span> 13693 {{/if}} 13694 {{/each}} 13695 {{/properties}} 13696 13697 </p> 13698 <div class="grid--full display-table"> 13699 <div class="grid__item display-table-cell one-half"> 13700 <div class="ajaxcart__qty"> 13701 <button type="button" class="ajaxcart__qty-adjust ajaxcart__qty--minus" data-id="{{key}}" data-qty="{{itemMinus}}" data-line="{{line}}"> 13702 <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 32 32"><title>icon-minus</title><path d="M6.667 16.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h18.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-18.667z"></path></svg> 13703 <span class="visually-hidden">Kurangi jumlah barang</span> 13704 </button> 13705 <input type="text" name="updates[]" class="btn ajaxcart__qty-num" value="{{itemQty}}" min="0" data-id="{{key}}" data-line="{{line}}" aria-label="quantity" pattern="[0-9]*"> 13706 <button type="button" class="ajaxcart__qty-adjust ajaxcart__qty--plus" data-id="{{key}}" data-line="{{line}}" data-qty="{{itemAdd}}"> 13707 <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 32 32"><title>icon-plus</title><path d="M16.667 15.333h8.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-8.667v8.667c0 0.368-0.298 0.667-0.667 0.667s-0.667-0.298-0.667-0.667v-8.667h-8.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h8.667v-8.667c0-0.368 0.298-0.667 0.667-0.667s0.667 0.298 0.667 0.667v8.667z"></path></svg> 13708 <span class="visually-hidden">Tambahkan jumlah barang</span> 13709 </button> 13710 </div> 13711 </div> 13712 <div class="grid__item display-table-cell one-half text-right"> 13713 {{#if discountsApplied}} 13714 <small class="ajaxcart-item__price-strikethrough"><s>{{{originalLinePrice}}}</s></small> 13715 <br><span class="h4">{{{linePrice}}}</span> 13716 {{else}} 13717 <span class="h4">{{{linePrice}}}</span> 13718 {{/if}} 13719 </div> 13720 </div> 13721 {{#if discountsApplied}} 13722 <div class="grid--full display-table"> 13723 <div class="grid__item text-right"> 13724 {{#each discounts}} 13725 <small class="ajaxcart-item__discount">{{ this.title }}</small><br> 13726 {{/each}} 13727 </div> 13728 </div> 13729 {{/if}} 13730 </div> 13731 </div> 13732 </div> 13733 </div> 13734 </div> 13735 </div> 13736 {{/items}} 13737 </div> 13738 <div class="ajaxcart__footer"> 13739 <div class="grid--full cart-subtotal py-2"> 13740 <p>Subtotal</p> 13741 <h3 class="primary">{{{totalPrice}}}</h3> 13742 {{#if totalCartDiscount}} 13743 <p class="ajaxcart__savings text-center"><em>{{{totalCartDiscount}}}</em></p> 13744 {{/if}} 13745 </div> 13746 13747 <a href="/cart" class="btn btn-cta view-more btn-block cart__checkout mt-2">Checkout</a> 13748 13749 <p class="cart-checkout-shipping hide">Free Ongkir dengan belanja di atas Rp.100.000 <a href="/pages/pengiriman">detail</a></p> 13750 </div> 13751 </form> 13752
13753 </script>
13753 13754
13754<script id="AjaxQty" type="text/template"> 13755 13756 <div class="ajaxcart__qty"> 13757 <button type="button" class="ajaxcart__qty-adjust ajaxcart__qty--minus" data-id="{{key}}" data-qty="{{itemMinus}}"> 13758 <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 32 32"> 13759 <title>icon-minus</title> 13760 <path d="M6.667 16.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h18.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-18.667z"></path> 13761 </svg> 13762 <span class="visually-hidden">Kurangi jumlah barang</span> 13763 </button> 13764 <input type="text" class="ajaxcart__qty-num" value="{{itemQty}}" min="0" data-id="{{key}}" aria-label="quantity" pattern="[0-9]*"> 13765 <button type="button" class="ajaxcart__qty-adjust ajaxcart__qty--plus" data-id="{{key}}" data-qty="{{itemAdd}}"> 13766 <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 32 32"><title>icon-plus</title><path d="M16.667 15.333h8.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-8.667v8.667c0 0.368-0.298 0.667-0.667 0.667s-0.667-0.298-0.667-0.667v-8.667h-8.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h8.667v-8.667c0-0.368 0.298-0.667 0.667-0.667s0.667 0.298 0.667 0.667v8.667z"></path></svg> 13767 <span class="visually-hidden">Tambahkan jumlah barang</span> 13768 </button> 13769 </div> 13770 13771 </script>
13771 13772
13772<script id="JsQty" type="text/template"> 13773 13774 <div class="js-qty mt-2"> 13775 <button type="button" data-action="minus" class="js-qty__adjust js-qty__adjust--minus" data-id="{{key}}" data-qty="{{itemMinus}}"> 13776 <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 32 32"><title>icon-minus</title><path d="M6.667 16.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h18.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-18.667z"></path></svg> 13777 <span class="visually-hidden">Kurangi jumlah barang</span> 13778 </button> 13779 <input type="text" class="js-qty__num" value="{{itemQty}}" min="1" data-id="{{key}}" aria-label="quantity" pattern="[0-9]*" name="{{inputName}}" id="{{inputId}}"> 13780 <button type="button" data-action="plus" class="js-qty__adjust js-qty__adjust--plus" data-id="{{key}}" data-qty="{{itemAdd}}"> 13781 <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 32 32"><title>icon-plus</title><path d="M16.667 15.333h8.667c0.368 0 0.667 0.298 0.667 0.667s-0.298 0.667-0.667 0.667h-8.667v8.667c0 0.368-0.298 0.667-0.667 0.667s-0.667-0.298-0.667-0.667v-8.667h-8.667c-0.368 0-0.667-0.298-0.667-0.667s0.298-0.667 0.667-0.667h8.667v-8.667c0-0.368 0.298-0.667 0.667-0.667s0.667 0.298 0.667 0.667v8.667z"></path></svg> 13782 <span class="visually-hidden">Tambahkan jumlah barang</span> 13783 </button> 13784 </div> 13785 13786 </script>
13786 13787 13788<style> 13789 #CartDrawer .ajaxcart__product.nExtra.Shipping.Cost .ajaxcart__qty button, 13790 #CartDrawer .ajaxcart__product.n3D2N .ajaxcart__qty button, 13791 #CartDrawer .ajaxcart__product.n4D3N .ajaxcart__qty button {display: none;} 13792 #CartDrawer .ajaxcart__product.nExtra.Shipping.Cost .ajaxcart__qty input, 13793 #CartDrawer .ajaxcart__product.n3D2N .ajaxcart__qty input, 13794 #CartDrawer .ajaxcart__product.n4D3N .ajaxcart__qty input {pointer-events: none;opacity: 0.5;} 13795 #CartDrawer .ajaxcart__product.nExtra.Shipping.Cost .ajaxcart__qty input, 13796 #CartDrawer .ajaxcart__product.n3D2N .ajaxcart__qty input, 13797 #CartDrawer .ajaxcart__product.n4D3N .ajaxcart__qty input {pointer-events: none;} 13798</style> 13799
13799<script src="https://outerbloom.com/cdn/shop/t/138/assets/ajax-cart.js?v=51128912329657147331752652452" defer></script>
13799 13800
13800<script> 13801 jQuery(function($) { 13802 ajaxCart.init({ 13803 formSelector: '#AddToCartForm', 13804 cartContainer: '#CartContainer', 13805 addToCartSelector: '#AddToCartXX', 13806 cartCountSelector: '#CartCount, #CartCount2', 13807 cartCostSelector: '#CartCost', 13808 moneyFormat: "Rp {{amount_no_decimals}}" 13809 }); 13810 }); 13811 13812 jQuery(document.body).on('afterCartLoad.ajaxCart', function(evt, cart) { 13813 // Bind to 'afterCartLoad.ajaxCart' to run any javascript after the cart has loaded in the DOM 13814 timber.RightDrawer.open(); 13815 }); 13816 </script>
13816 13817 13818 13819 13820 13821<style> 13822 /** Search AutoComplete **/ 13823 .resultsearch .ui-menu-item[data-cat="Collection"], 13824 .resultsearch .ui-menu-item[data-cat="Collection"] {display: none;} 13825 .resultsearch .ui-widget.ui-widget-content { 13826 width: 100%; 13827 top: 48px; 13828 border: none; 13829 box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); 13830 } 13831 .resultsearch .ui-menu-item {text-align: left;} 13832 .resultsearch .ui-menu-item>a, .resultsearch .ui-menu-item>span {display: inline-block;width: 100%;font-size: 16px;}.resultsearch .ui-menu-item img {vertical-align: middle;}.resultsearch .ui-menu-item a[data-cat="Collection"] img {display: none;}.resultsearch .ui-menu .ui-state-focus, .resultsearch .ui-menu .ui-state-active {margin: 0;}.ui-state-active, .ui-widget-content .ui-state-active {background: #f2f2f2;border: none;color: #212121;}.resultsearch .ui-menu-item>a,.resultsearch .ui-menu-item>span {display: inline-block;width: 100%;font-size: 13px;}.resultsearch .ui-menu-item a[data-cat="Produk"] img {margin-right: 10px;}.resultsearch .ui-menu-item a[data-cat="Produk"] .price {float: right;padding: 15px 0;}.ui-autocomplete-category.ui-menu-item[data-cat="Produk"]:before {content: "Product Populer";font-size: 13px;padding: 5px;margin: 5px 0;background: #f2f2f2;width: 100%;display: block;color: #212121;}.ui-autocomplete-category.ui-menu-item[data-cat="Produk"] span {display: none;} 13833 .ui-state-active { 13834 border: none!important; 13835 background-color: #fafafa!important; 13836 color: #000!important; 13837 } 13838 .ui-menu-item a[data-cat="Collection"] {padding: 5px 12px;} 13839 .ui-menu .ui-menu-item {line-height: normal;} 13840</style>
13841<script> 13842$(window).load(function(){ 13843 13844 function format(item) {var cell = '';cell += "<a data-cat=" + item.category + " " + "href=" + item.url + ">" + "<img src=" + item.images + "/>" + "<span class='title'>" + item.label + "</span>" + "<span class='price'>" + item.price + "</span>" + "</a>";return cell;} 13845 13846 $.widget("custom.catcomplete", $.ui.autocomplete, { 13847 _renderMenu: function (ul, items) { 13848 // have search reults split up in categories 13849 var that = this, 13850 currentCategory = ""; 13851 $.each(items, function (index, item) { 13852 if (item.category != currentCategory) { 13853 ul.append("<li class='ui-autocomplete-category' data-cat=" + item.category + ">" + "<span>" + item.category + "</span>" + "</li>"); 13854 currentCategory = item.category; 13855 } 13856 that._renderItemData(ul, item); 13857 }); 13858 } 13859 }); 13860 13861 // higlight searched for term 13862 $.ui.autocomplete.prototype._renderItem = function( ul, item ) { 13863 var term = this.element.val(), 13864 html = item.label.replace( term, "<b>$&</b>" ); 13865 return $( "<li>" ) 13866 .append(format(item)) 13867 .appendTo( ul ); 13868 }; 13869 13870 13871 var data = [ 13872 { label: "3D Cookies", category: "Collection", url: "/collections/3d-cookies", images: " ", price: " " },{ label: "< Rp 500.000", category: "Collection", url: "/collections/rp-500-000", images: " ", price: " " },{ label: "> Rp 1.000.000", category: "Collection", url: "/collections/rp-1-000-000", images: " ", price: " " },{ label: "Ajmal", category: "Collection", url: "/collections/ajmal", images: " ", price: " " },{ label: "Alamat Rumah Duka", category: "Collection", url: "/collections/rumah-duka", images: " ", price: " " },{ label: "Anggrek Bulan", category: "Collection", url: "/collections/anggrek-bulan", images: " ", price: " " },{ label: "Anniversary Gift", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Aquarius âï¸ 20Jan - 18Feb", category: "Collection", url: "/collections/kado-untuk-zodiak-aquarius", images: " ", price: " " },{ label: "Aries âï¸ 21March - 19April", category: "Collection", url: "/collections/kado-untuk-zodiak-aries", images: " ", price: " " },{ label: "Armaf", category: "Collection", url: "/collections/armaf", images: " ", price: " " },{ label: "Aromatherapy Diffuser", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Artisan Soap", category: "Collection", url: "/collections/artisan-soap", images: " ", price: " " },{ label: "Artisan Tea", category: "Collection", url: "/collections/artisan-tea", images: " ", price: " " },{ label: "AsmaraKu", category: "Collection", url: "/collections/asmaraku", images: " ", price: " " },{ label: "Atkinsons", category: "Collection", url: "/collections/atkinsons", images: " ", price: " " },{ label: "Autumn by Outerbloom", category: "Collection", url: "/collections/autumn-by-outerbloom", images: " ", price: " " },{ label: "Autumn by Outerbloom Chinese New Year", category: "Collection", url: "/collections/autumn-by-outerbloom-chinese-new-year", images: " ", price: " " },{ label: "Autumn by Outerbloom Christmas", category: "Collection", url: "/collections/autumn-by-outerbloom-christmas", images: " ", price: " " },{ label: "Autumn by Outerbloom Luar Jadetabek", category: "Collection", url: "/collections/autumn-by-outerbloom-luar-jadetabek", images: " ", price: " " },{ label: "Autumn by Outerbloom Ramadan", category: "Collection", url: "/collections/autumn-by-outerbloom-ramadan", images: " ", price: " " },{ label: "Autumn Pop", category: "Collection", url: "/collections/autumn-pop", images: " ", price: " " },{ label: "Bachelorette", category: "Collection", url: "/collections/bachelorette", images: " ", price: " " },{ label: "Bachelorette Cookies", category: "Collection", url: "/collections/bachelorette-cookies", images: " ", price: " " },{ label: "Bag Newborn Hampers", category: "Collection", url: "/collections/bag-newborn-hampers", images: " ", price: " " },{ label: "Balon", category: "Collection", url: "/collections/balon", images: " ", price: " " },{ label: "Beauty Package", category: "Collection", url: "/collections/beauty-package", images: " ", price: " " },{ label: "Best Deal", category: "Collection", url: "/collections/best-deal", images: " ", price: " " },{ label: "Best Seller", category: "Collection", url: "/collections/best-seller", images: " ", price: " " },{ label: "Best Valentine's Deals", category: "Collection", url: "/collections/bes-valentines-deals", images: " ", price: " " },{ label: "Best Value Newborn Hampers Collection", category: "Collection", url: "/collections/best-value-newborn-hampers-collection", images: " ", price: " " },{ label: "Black Tea", category: "Collection", url: "/collections/black-tea", images: " ", price: " " },{ label: "Blessing Hampers", category: "Collection", url: "/collections/blessing-hampers", images: " ", price: " " },{ label: "Bloom Box", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Bloomcard", category: "Collection", url: "/collections/bloomcard", images: " ", price: " " },{ label: "Boutonniere", category: "Collection", url: "/collections/boutonniere", images: " ", price: " " },{ label: "Bracelet", category: "Collection", url: "/collections/gelang", images: " ", price: " " },{ label: "Buket Bunga Bali", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Buket Bunga Bandung", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Buket Bunga Batam", category: "Collection", url: "https://hotelverta.com/-batam", images: " ", price: " " },{ label: "Buket Bunga Demak", category: "Collection", url: "https://hotelverta.com/-demak", images: " ", price: " " },{ label: "Buket Bunga Fresh", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Buket Bunga Jepara", category: "Collection", url: "https://hotelverta.com/-jepara", images: " ", price: " " },{ label: "Buket Bunga Medan", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Buket Bunga Nusantara", category: "Collection", url: "https://hotelverta.com/-nusantara", images: " ", price: " " },{ label: "Buket Bunga Semarang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Buket Bunga Sidoarjo", category: "Collection", url: "https://hotelverta.com/-sidoarjo", images: " ", price: " " },{ label: "Buket Bunga Surabaya", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Buket Bunga Tangerang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Buket Bunga Uang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Buket Bunga Valentine", category: "Collection", url: "https://hotelverta.com/-valentine", images: " ", price: " " },{ label: "Buket Bunga Yogyakarta", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Bunga Anggrek Bali", category: "Collection", url: "/collections/bunga-anggrek-bali", images: " ", price: " " },{ label: "Bunga Anggrek Bandung", category: "Collection", url: "/collections/bunga-anggrek-bandung", images: " ", price: " " },{ label: "Bunga Anggrek Surabaya", category: "Collection", url: "/collections/bunga-anggrek-surabaya", images: " ", price: " " },{ label: "Bunga Anniversary", category: "Collection", url: "/collections/bunga-anniversary", images: " ", price: " " },{ label: "Bunga Artificial", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Bunga Buket", category: "Collection", url: "/collections/bunga-buket", images: " ", price: " " },{ label: "Bunga Carnations Bali", category: "Collection", url: "/collections/bunga-carnations-bali", images: " ", price: " " },{ label: "Bunga Carnations Bandung", category: "Collection", url: "/collections/bunga-carnations-bandung", images: " ", price: " " },{ label: "Bunga Carnations Surabaya", category: "Collection", url: "/collections/bunga-carnations-surabaya", images: " ", price: " " },{ label: "Bunga Daisy Bali", category: "Collection", url: "/collections/bunga-daisy-bali", images: " ", price: " " },{ label: "Bunga Daisy Bandung", category: "Collection", url: "/collections/bunga-daisy-bandung", images: " ", price: " " },{ label: "Bunga Daisy Surabaya", category: "Collection", url: "/collections/bunga-daisy-surabaya", images: " ", price: " " },{ label: "Bunga Gerbera Bali", category: "Collection", url: "/collections/bunga-gerbera-bali", images: " ", price: " " },{ label: "Bunga Gerbera Bandung", category: "Collection", url: "/collections/bunga-gerbera-bandung", images: " ", price: " " },{ label: "Bunga Gerbera Surabaya", category: "Collection", url: "/collections/bunga-gerbera-surabaya", images: " ", price: " " },{ label: "Bunga Imlek", category: "Collection", url: "/collections/rangkaian-bunga-tahun-baru-imlek", images: " ", price: " " },{ label: "Bunga Lebaran", category: "Collection", url: "/collections/rangkaian-bunga-lebaran", images: " ", price: " " },{ label: "Bunga Lily Bali", category: "Collection", url: "/collections/bunga-lily-bali", images: " ", price: " " },{ label: "Bunga Lily Bandung", category: "Collection", url: "/collections/bunga-lily-bandung", images: " ", price: " " },{ label: "Bunga Lily Surabaya", category: "Collection", url: "/collections/bunga-lily-surabaya", images: " ", price: " " },{ label: "Bunga Matahari Bali", category: "Collection", url: "/collections/bunga-matahari-bali", images: " ", price: " " },{ label: "Bunga Matahari Bandung", category: "Collection", url: "/collections/bunga-matahari-bandung", images: " ", price: " " },{ label: "Bunga Matahari Surabaya", category: "Collection", url: "/collections/bunga-matahari-surabaya", images: " ", price: " " },{ label: "Bunga Mawar Bali", category: "Collection", url: "/collections/bunga-mawar-bali", images: " ", price: " " },{ label: "Bunga Mawar Bandung", category: "Collection", url: "/collections/bunga-mawar-bandung", images: " ", price: " " },{ label: "Bunga Mawar Surabaya", category: "Collection", url: "/collections/bunga-mawar-surabaya", images: " ", price: " " },{ label: "Bunga Meja", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Bunga Meja Bali", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Bunga Meja Bandung", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Bunga Meja Batam", category: "Collection", url: "https://hotelverta.com/-batam", images: " ", price: " " },{ label: "Bunga Meja Jepara", category: "Collection", url: "https://hotelverta.com/-jepara", images: " ", price: " " },{ label: "Bunga Meja Medan", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Bunga Meja Semarang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Bunga Meja Sidoarjo", category: "Collection", url: "https://hotelverta.com/-sidoarjo", images: " ", price: " " },{ label: "Bunga Meja Surabaya", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Bunga Meja Tangerang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Bunga Meja Yogyakarta", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Bunga Modern Pastel Bali", category: "Collection", url: "/collections/bunga-modern-pastel-bali", images: " ", price: " " },{ label: "Bunga Modern Pastel Bandung", category: "Collection", url: "/collections/bunga-modern-pastel-bandung", images: " ", price: " " },{ label: "Bunga Modern Pastel Medan", category: "Collection", url: "/collections/bunga-modern-pastel-medan", images: " ", price: " " },{ label: "Bunga Modern Pastel Semarang", category: "Collection", url: "/collections/bunga-modern-pastel-semarang", images: " ", price: " " },{ label: "Bunga Modern Pastel Surabaya", category: "Collection", url: "/collections/bunga-modern-pastel-surabaya", images: " ", price: " " },{ label: "Bunga Modern Pastel Yogyakarta", category: "Collection", url: "/collections/bunga-modern-pastel-yogyakarta", images: " ", price: " " },{ label: "Bunga Natal", category: "Collection", url: "/collections/rangkaian-bunga-christmas", images: " ", price: " " },{ label: "Bunga Papan", category: "Collection", url: "/collections/bunga-papan", images: " ", price: " " },{ label: "Bunga Pernikahan", category: "Collection", url: "/collections/bunga-pernikahan", images: " ", price: " " },{ label: "Bunga Plastik", category: "Collection", url: "/collections/bunga-plastik", images: " ", price: " " },{ label: "Bunga Tulip", category: "Collection", url: "/collections/bunga-tulip", images: " ", price: " " },{ label: "Bunga Ulang Tahun", category: "Collection", url: "/collections/bunga-ulang-tahun", images: " ", price: " " },{ label: "Bunga Wisuda", category: "Collection", url: "https://hotelverta.com/-wisuda", images: " ", price: " " },{ label: "Cake", category: "Collection", url: "/collections/kue", images: " ", price: " " },{ label: "Cake", category: "Collection", url: "/collections/cake", images: " ", price: " " },{ label: "Cake Sameday Delivery", category: "Collection", url: "/collections/cake-sameday-delivery", images: " ", price: " " },{ label: "Cake, Hampers & Gifts", category: "Collection", url: "/collections/cake-hampers", images: " ", price: " " },{ label: "Cancer âï¸ 22June - 22July", category: "Collection", url: "/collections/kado-untuk-zodiak-cancer", images: " ", price: " " },{ label: "Capricorn âï¸ 21Dec - 19Jan", category: "Collection", url: "/collections/kado-untuk-zodiak-capricorn", images: " ", price: " " },{ label: "Care Packages", category: "Collection", url: "/collections/toko-parcel-murah", images: " ", price: " " },{ label: "Care Packages (Keluarga, Sahabat, Karyawan)", category: "Collection", url: "/collections/sehat-bebas-corona", images: " ", price: " " },{ label: "Carnations", category: "Collection", url: "/collections/bunga-anyelir", images: " ", price: " " },{ label: "Celebration", category: "Collection", url: "/collections/celebration", images: " ", price: " " },{ label: "Chléa Paperie", category: "Collection", url: "/collections/chlea-paperie", images: " ", price: " " },{ label: "Chocodot", category: "Collection", url: "/collections/chocodot", images: " ", price: " " },{ label: "Christmas", category: "Collection", url: "/collections/christmas", images: " ", price: " " },{ label: "Christmas Holo Bag", category: "Collection", url: "/collections/christmas-holo-bag", images: " ", price: " " },{ label: "Christmas Holo Series", category: "Collection", url: "/collections/christmas-holo-series", images: " ", price: " " },{ label: "Classic Cake", category: "Collection", url: "/collections/classic-cake", images: " ", price: " " },{ label: "Classic CNY Hampers", category: "Collection", url: "/collections/classic-cny-hampers", images: " ", price: " " },{ label: "Classic CNY Hampers Luar Jabodetabek", category: "Collection", url: "/collections/classic-cny-hampers-luar-jabodetabek", images: " ", price: " " },{ label: "Classic Hampers", category: "Collection", url: "/collections/classic-hampers", images: " ", price: " " },{ label: "Classic Hampers Luar Jadetabek", category: "Collection", url: "/collections/classic-hampers-luar-jadetabek", images: " ", price: " " },{ label: "Classic Lebaran Hampers", category: "Collection", url: "/collections/classic-lebaran-hampers", images: " ", price: " " },{ label: "Classic Style Flowers", category: "Collection", url: "/collections/classic-style-flowers", images: " ", price: " " },{ label: "Cokelat", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Collection List", category: "Collection", url: "/collections/collection-list", images: " ", price: " " },{ label: "Condolences", category: "Collection", url: "/collections/axa-condolences", images: " ", price: " " },{ label: "Congratulations", category: "Collection", url: "/collections/rangkaian-bunga-ucapan-selamat", images: " ", price: " " },{ label: "Corporate Gifts", category: "Collection", url: "
13872https://hotelverta.com/", images: " ", price: " " },{ label: "Corporate Hampers", category: "Collection", url: "/collections/corporate-hampers", images: " ", price: " " },{ label: "Couple Gift", category: "Collection", url: "/collections/couple-gift", images: " ", price: " " },{ label: "Craft Sweetbox Newborn", category: "Collection", url: "/collections/craft-sweetbox-newborn", images: " ", price: " " },{ label: "Crystal Florarium", category: "Collection", url: "/collections/crystal-florarium", images: " ", price: " " },{ label: "Cuddlemate Doll", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Cufflinks", category: "Collection", url: "/collections/cufflinks", images: " ", price: " " },{ label: "Cupcakes", category: "Collection", url: "/collections/cupcakes", images: " ", price: " " },{ label: "Custom Alat Tulis", category: "Collection", url: "/collections/alat-tulis", images: " ", price: " " },{ label: "Custom Cake", category: "Collection", url: "/collections/custom-cake", images: " ", price: " " },{ label: "Custom Card Holder", category: "Collection", url: "/collections/custom-card-holder", images: " ", price: " " },{ label: "Custom Coaster", category: "Collection", url: "/collections/custom-coaster", images: " ", price: " " },{ label: "Custom Cutlery", category: "Collection", url: "/collections/custom-cutlery", images: " ", price: " " },{ label: "Custom E-Money", category: "Collection", url: "/collections/custom-e-money", images: " ", price: " " },{ label: "Custom Earpod", category: "Collection", url: "/collections/custom-earpod", images: " ", price: " " },{ label: "Custom Fan", category: "Collection", url: "/collections/custom-fan", images: " ", price: " " },{ label: "Custom Jewelry", category: "Collection", url: "/collections/custom-jewelry", images: " ", price: " " },{ label: "Custom Keychain", category: "Collection", url: "/collections/custom-keychain", images: " ", price: " " },{ label: "Custom Medallion", category: "Collection", url: "/collections/custom-medallion", images: " ", price: " " },{ label: "Custom Mirror", category: "Collection", url: "/collections/custom-mirror", images: " ", price: " " },{ label: "Custom Mug", category: "Collection", url: "/collections/custom-mug", images: " ", price: " " },{ label: "Custom Necklace", category: "Collection", url: "/collections/custom-necklace", images: " ", price: " " },{ label: "Custom Notebook", category: "Collection", url: "/collections/custom-notebook", images: " ", price: " " },{ label: "Custom Pen & Pencil", category: "Collection", url: "/collections/custom-pen-pencil", images: " ", price: " " },{ label: "Custom Photo Frame", category: "Collection", url: "/collections/photo-frame", images: " ", price: " " },{ label: "Custom Pillow", category: "Collection", url: "/collections/bantal-custom", images: " ", price: " " },{ label: "Custom Powerbank", category: "Collection", url: "/collections/custom-powerbank", images: " ", price: " " },{ label: "Custom Scarf", category: "Collection", url: "/collections/custom-scarf", images: " ", price: " " },{ label: "Custom Speaker", category: "Collection", url: "/collections/custom-speaker", images: " ", price: " " },{ label: "Custom T-Shirt", category: "Collection", url: "/collections/custom-t-shirt", images: " ", price: " " },{ label: "Custom Tote Bag", category: "Collection", url: "/collections/custom-tote-bag", images: " ", price: " " },{ label: "Custom Tumbler Minuman", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "D'paris", category: "Collection", url: "/collections/dparis", images: " ", price: " " },{ label: "Daisy", category: "Collection", url: "/collections/bunga-aster", images: " ", price: " " },{ label: "Dekorasi", category: "Collection", url: "/collections/dekorasi", images: " ", price: " " },{ label: "Dekorasi Duka Cita", category: "Collection", url: "/collections/dekorasi-bunga-duka-cita", images: " ", price: " " },{ label: "Dekorasi Pemakaman", category: "Collection", url: "/collections/dekorasi-pemakaman", images: " ", price: " " },{ label: "Dekorasi Pernikahan", category: "Collection", url: "/collections/dekorasi-bunga-pernikahan", images: " ", price: " " },{ label: "Dekorasi Ulang Tahun", category: "Collection", url: "/collections/dekorasi-bunga-ulang-tahun", images: " ", price: " " },{ label: "Delivery", category: "Collection", url: "/collections/delivery", images: " ", price: " " },{ label: "Deluxe Newborn Hampers Collection", category: "Collection", url: "/collections/deluxe-newborn-hampers-collection", images: " ", price: " " },{ label: "Diamond Bracelet", category: "Collection", url: "/collections/diamond-bracelet", images: " ", price: " " }
13872,{ label: "Diamond Earrings", category: "Collection", url: "/collections/diamond-earrings", images: " ", price: " " },{ label: "Diamond Jewelry", category: "Collection", url: "/collections/diamond-jewelry", images: " ", price: " " },{ label: "Diamond Necklaces", category: "Collection", url: "/collections/diamond-necklaces", images: " ", price: " " },{ label: "Diamond Rings", category: "Collection", url: "/collections/diamond-rings", images: " ", price: " " },{ label: "Digital Gift", category: "Collection", url: "/collections/digital-gift", images: " ", price: " " },{ label: "Donasi", category: "Collection", url: "/collections/donasi", images: " ", price: " " },{ label: "E-Card", category: "Collection", url: "/collections/ecard", images: " ", price: " " },{ label: "E-Gift Card", category: "Collection", url: "/collections/e-gift-card", images: " ", price: " " },{ label: "Earrings", category: "Collection", url: "/collections/anting", images: " ", price: " " },{ label: "Edible Gift", category: "Collection", url: "/collections/edible-gift", images: " ", price: " " },{ label: "Enchanted Grande Love Pirouette", category: "Collection", url: "/collections/enchanted-grande-love-pirouette", images: " ", price: " " },{ label: "Enchanted Love Pirouette", category: "Collection", url: "/collections/enchanted-love-pirouette", images: " ", price: " " },{ label: "Engagement", category: "Collection", url: "/collections/rangkaian-bunga-lamaran", images: " ", price: " " },{ label: "Expression", category: "Collection", url: "/collections/expression", images: " ", price: " " },{ label: "Father's Day Special", category: "Collection", url: "/collections/kado-untuk-ayah", images: " ", price: " " },{ label: "Ferrari", category: "Collection", url: "/collections/ferrari", images: " ", price: " " },{ label: "Ferrero Rocher", category: "Collection", url: "/collections/ferrero-rocher", images: " ", price: " " },{ label: "Festival Belanja Online", category: "Collection", url: "/collections/fbo-2018", images: " ", price: " " },{ label: "Floatbox", category: "Collection", url: "/collections/floatbox", images: " ", price: " " },{ label: "Flower", category: "Collection", url: "/collections/flower", images: " ", price: " " },{ label: "Flower Best Deals", category: "Collection", url: "/collections/flower-best-deals", images: " ", price: " " },{ label: "Flowers", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Flowers For Him", category: "Collection", url: "/collections/bunga-untuk-pria", images: " ", price: " " },{ label: "Flowers Style", category: "Collection", url: "/collections/style", images: " ", price: " " },{ label: "Flowers Type", category: "Collection", url: "/collections/type", images: " ", price: " " },{ label: "For Her", category: "Collection", url: "/collections/kado-untuk-wanita", images: " ", price: " " },{ label: "For Him", category: "Collection", url: "/collections/kado-untuk-pria", images: " ", price: " " },{ label: "Forever Flower", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Forever Flower Holo Series", category: "Collection", url: "https://hotelverta.com/-holo-series", images: " ", price: " " },{ label: "Forever Flower x NestBloom", category: "Collection", url: "https://hotelverta.com/-x-nestbloom", images: " ", price: " " },{ label: "Fortune Hampers", category: "Collection", url: "/collections/fortune-hampers", images: " ", price: " " },{ label: "Frank & Co", category: "Collection", url: "/collections/franknco", images: " ", price: " " },{ label: "Fresh Flowers", category: "Collection", url: "/collections/fresh-flower", images: " ", price: " " },{ label: "Gantungan Kunci", category: "Collection", url: "/collections/gantungan-kunci", images: " ", price: " " },{ label: "Gelato", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Gelato Pie", category: "Collection", url: "https://hotelverta.com/-pie", images: " ", price: " " },{ label: "Gemini âï¸ 21May - 21June", category: "Collection", url: "/collections/kado-untuk-zodiak-gemini", images: " ", price: " " },{ label: "Gerbera", category: "Collection", url: "/collections/gerbera", images: " ", price: " " },{ label: "Get Well Soon", category: "Collection", url: "/collections/rangkaian-bunga-gws", images: " ", price: " " },{ label: "Giant Flower Bali", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Giant Flower Bandung", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " }
13872,{ label: "Giant Flower Bouquet", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Gift", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Gift by Recipient", category: "Collection", url: "/collections/gift-by-recipient", images: " ", price: " " },{ label: "Gift for Your Girlfriend", category: "Collection", url: "/collections/kado-untuk-pacar-wanita", images: " ", price: " " },{ label: "Gifts", category: "Collection", url: "/collections/gifts", images: " ", price: " " },{ label: "Glassbox Hampers", category: "Collection", url: "/collections/glassbox-hampers", images: " ", price: " " },{ label: "Glassware CNY Hampers", category: "Collection", url: "https://hotelverta.com/-pecah-belah-imlek", images: " ", price: " " },{ label: "Glassware Eid Hampers", category: "Collection", url: "https://hotelverta.com/-pecah-belah-lebaran", images: " ", price: " " },{ label: "Glassware Hampers", category: "Collection", url: "https://hotelverta.com/-pecah-belah", images: " ", price: " " },{ label: "Gold Jewelry", category: "Collection", url: "/collections/perhiasan-emas", images: " ", price: " " },{ label: "Grand Opening", category: "Collection", url: "/collections/grand-opening", images: " ", price: " " },{ label: "Granola", category: "Collection", url: "/collections/granola", images: " ", price: " " },{ label: "Green Tea", category: "Collection", url: "/collections/green-tea", images: " ", price: " " },{ label: "Greeting Card All", category: "Collection", url: "/collections/greeting-card-all", images: " ", price: " " },{ label: "Greeting Card Anniversary", category: "Collection", url: "/collections/greeting-card-anniversary", images: " ", price: " " },{ label: "Greeting Card Birthday", category: "Collection", url: "/collections/greeting-card-birthday", images: " ", price: " " },{ label: "Greeting Card Eid", category: "Collection", url: "/collections/greeting-card-eid", images: " ", price: " " },{ label: "Greeting Card Graduation", category: "Collection", url: "/collections/greeting-card-graduation", images: " ", price: " " },{ label: "Greeting Card Mother's Day", category: "Collection", url: "/collections/greeting-card-mothers-day", images: " ", price: " " },{ label: "Greeting Card Newborn", category: "Collection", url: "/collections/greeting-card-newborn", images: " ", price: " " },{ label: "Greeting Card Others", category: "Collection", url: "/collections/greeting-card-others", images: " ", price: " " },{ label: "Greeting Card Valentine", category: "Collection", url: "/collections/greeting-card-valentine", images: " ", price: " " },{ label: "Greeting Card Wedding", category: "Collection", url: "/collections/greeting-card-wedding", images: " ", price: " " },{ label: "Grooming", category: "Collection", url: "/collections/grooming", images: " ", price: " " },{ label: "Hadiah Tahun Baru Imlek", category: "Collection", url: "/collections/kado-imlek", images: " ", price: " " },{ label: "Hadiah untuk Bayi", category: "Collection", url: "/collections/kado-untuk-bayi", images: " ", price: " " },{ label: "Hadiah untuk Pacar", category: "Collection", url: "/collections/kado-untuk-pacar", images: " ", price: " " },{ label: "Hadiah untuk Pernikahan", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Hadiah untuk Sahabat", category: "Collection", url: "/collections/kado-untuk-sahabat", images: " ", price: " " },{ label: "Hampers", category: "Collection", url: "/collections/hampers", images: " ", price: " " },{ label: "Hampers Baby Boy", category: "Collection", url: "/collections/hampers-baby-boy", images: " ", price: " " },{ label: "Hampers Baby Girl", category: "Collection", url: "/collections/hampers-baby-girl", images: " ", price: " " },{ label: "Hampers Baby Unisex", category: "Collection", url: "/collections/hampers-baby-unisex", images: " ", price: " " },{ label: "Hampers Delivery Indonesia", category: "Collection", url: "https://hotelverta.com/-indonesia", images: " ", price: " " },{ label: "Hampers Lebaran 2026", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Hampers Lebaran Bali", category: "Collection", url: "/collections/hampers-lebaran-bali", images: " ", price: " " },{ label: "Hampers Lebaran Bandung", category: "Collection", url: "/collections/hampers-lebaran-bandung", images: " ", price: " " },{ label: "Hampers Lebaran Jakarta", category: "Collection", url: "/collections/hampers-lebaran-jakarta", images: " ", price: " " },{ label: "Hampers Lebaran Semarang", category: "Collection", url: "/collections/hampers-lebaran-semarang", images: " ", price: " " },{ label: "Hampers Lebaran Surabaya", category: "Collection", url: "/collections/hampers-lebaran-surabaya", images: " ", price: " " },{ label: "Hampers Lebaran Yogyakarta", category: "Collection", url: "/collections/hampers-lebaran-yogyakarta", images: " ", price: " " },{ label: "Hand Sanitizer", category: "Collection", url: "/collections/hand-sanitizer", images: " ", price: " " },{ label: "Happy Birthday", category: "Collection", url: "/collections/kado-ulang-tahun", images: " ", price: " " },{ label: "Harbolnas", category: "Collection", url: "/collections/harbolnas-2018", images: " ", price: " " },{ label: "Harbolnas Produk Lokal", category: "Collection", url: "/collections/produk-lokal", images: " ", price: " " },{ label: "Hari Belanja Online Nasional", category: "Collection", url: "/collections/harbolnas", images: " ", price: " " },{ label: "Hari Guru", category: "Collection", url: "/collections/hari-guru", images: " ", price: " " },{ label: "Healthy Creations", category: "Collection", url: "/collections/healthy-creations", images: " ", price: " " },{ label: "Healthy Hampers", category: "Collection", url: "/collections/healthy-hampers", images: " ", price: " " },{ label: "Heritage Box", category: "Collection", url: "/collections/heritage-boxes", images: " ", price: " " },{ label: "Heritage Chinese New Year Hampers", category: "Collection", url: "/collections/heritage-chinese-new-year-hampers", images: " ", price: " " },{ label: "Heritage Christmas Hampers", category: "Collection", url: "/collections/heritage-christmas-hampers", images: " ", price: " " },{ label: "Heritage Hampers", category: "Collection", url: "/collections/heritage-hampers", images: " ", price: " " },{ label: "Heritage Ramadan Hampers", category: "Collection", url: "/collections/heritage-ramadan-hampers", images: " ", price: " " },{ label: "Hexa Hampers", category: "Collection", url: "/collections/hexa-hampers", images: " ", price: " " },{ label: "Hexa Hampers Luar Jadetabek", category: "Collection", url: "/collections/hexa-hampers-luar-jadetabek", images: " ", price: " " },{ label: "Hexa Newborn", category: "Collection", url: "/collections/hexa-newborn", images: " ", price: " " },{ label: "Holo Bag", category: "Collection", url: "/collections/holo-bag", images: " ", price: " " },{ label: "Holo Bag Ramadan", category: "Collection", url: "/collections/holo-bag-ramadan", images: " ", price: " " },{ label: "Holo Series", category: "Collection", url: "/collections/holo-series", images: " ", price: " " },{ label: "Home Decoration & Photo Frame", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " }
13872,{ label: "Hospitalization", category: "Collection", url: "/collections/axa-hospitalization", images: " ", price: " " },{ label: "House Hampers", category: "Collection", url: "/collections/house-hampers", images: " ", price: " " },{ label: "I'm Sorry", category: "Collection", url: "/collections/rangkaian-bunga-sorry", images: " ", price: " " },{ label: "Ice Cream Cake", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Idul Fitri", category: "Collection", url: "/collections/rangkaian-bunga-idul-fitri", images: " ", price: " " },{ label: "Jam Tangan", category: "Collection", url: "/collections/jam-tangan", images: " ", price: " " },{ label: "Jam Tangan Couple", category: "Collection", url: "/collections/jam-tangan-couple", images: " ", price: " " },{ label: "Jam Tangan Pria", category: "Collection", url: "/collections/jam-tangan-pria", images: " ", price: " " },{ label: "Jam Tangan Wanita", category: "Collection", url: "/collections/jam-tangan-wanita", images: " ", price: " " },{ label: "Jasa Packing Parcel", category: "Collection", url: "/collections/jasa-packing-parcel", images: " ", price: " " },{ label: "Jewelry", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Jual Custom Cake & Hampers Termurah & Terlengkap | Outerbloom Florist & Gift", category: "Collection", url: "/collections/custom-cake-hampers", images: " ", price: " " },{ label: "Just Because", category: "Collection", url: "/collections/just-because", images: " ", price: " " },{ label: "Kado Makanan", category: "Collection", url: "/collections/kado-makanan", images: " ", price: " " },{ label: "Kado Minuman", category: "Collection", url: "/collections/kado-minuman", images: " ", price: " " },{ label: "Kado Natal", category: "Collection", url: "/collections/kado-natal", images: " ", price: " " },{ label: "Kado Unik", category: "Collection", url: "/collections/kado-unik", images: " ", price: " " },{ label: "Kado Valentine Nusantara", category: "Collection", url: "/collections/kado-valentine-nusantara", images: " ", price: " " },{ label: "Kado Valentine untuk Pria", category: "Collection", url: "/collections/kado-valentine-untuk-pria", images: " ", price: " " },{ label: "Kado Wisuda", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Kado Zodiak", category: "Collection", url: "/collections/kado-untuk-zodiak", images: " ", price: " " },{ label: "Karangan Bunga Aceh", category: "Collection", url: "https://hotelverta.com/-aceh", images: " ", price: " " },{ label: "Karangan Bunga Ambon", category: "Collection", url: "https://hotelverta.com/-ambon", images: " ", price: " " },{ label: "Karangan Bunga Atambua", category: "Collection", url: "https://hotelverta.com/-atambua", images: " ", price: " " },{ label: "Karangan Bunga Bali", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Balikpapan", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Bandung", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Bandung Barat", category: "Collection", url: "https://hotelverta.com/-barat", images: " ", price: " " },{ label: "Karangan Bunga Bangka", category: "Collection", url: "https://hotelverta.com/-bangka", images: " ", price: " " },{ label: "Karangan Bunga Banjarmasin", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Banten", category: "Collection", url: "https://hotelverta.com/-banten", images: " ", price: " " },{ label: "Karangan Bunga Banyumas", category: "Collection", url: "https://hotelverta.com/-banyumas", images: " ", price: " " },{ label: "Karangan Bunga Banyuwangi", category: "Collection", url: "https://hotelverta.com/-banyuwangi", images: " ", price: " " },{ label: "Karangan Bunga Batam", category: "Collection", url: "https://hotelverta.com/-batam", images: " ", price: " " },{ label: "Karangan Bunga Baubau", category: "Collection", url: "https://hotelverta.com/-baubau", images: " ", price: " " },{ label: "Karangan Bunga Bengkalis", category: "Collection", url: "https://hotelverta.com/-bengkalis", images: " ", price: " " },{ label: "Karangan Bunga Bengkayang", category: "Collection", url: "https://hotelverta.com/-bengkayang", images: " ", price: " " },{ label: "Karangan Bunga Bengkulu", category: "Collection", url: "https://hotelverta.com/-bengkulu", images: " ", price: " " },{ label: "Karangan Bunga Blora", category: "Collection", url: "https://hotelverta.com/-blora", images: " ", price: " " },{ label: "Karangan Bunga Bogor", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Bojonegoro", category: "Collection", url: "https://hotelverta.com/-bojonegoro", images: " ", price: " " },{ label: "Karangan Bunga Boyolali", category: "Collection", url: "https://hotelverta.com/-boyolali", images: " ", price: " " },{ label: "Karangan Bunga Brebes", category: "Collection", url: "https://hotelverta.com/-brebes", images: " ", price: " " },{ label: "Karangan Bunga Bukittinggi", category: "Collection", url: "https://hotelverta.com/-bukittinggi", images: " ", price: " " },{ label: "Karangan Bunga Ciamis", category: "Collection", url: "https://hotelverta.com/-ciamis", images: " ", price: " " }
13872,{ label: "Karangan Bunga Cianjur", category: "Collection", url: "https://hotelverta.com/-cianjur", images: " ", price: " " },{ label: "Karangan Bunga Cikarang", category: "Collection", url: "https://hotelverta.com/-cikarang", images: " ", price: " " },{ label: "Karangan Bunga Cikupa", category: "Collection", url: "https://hotelverta.com/-cikupa", images: " ", price: " " },{ label: "Karangan Bunga Cilacap", category: "Collection", url: "https://hotelverta.com/-cilacap", images: " ", price: " " },{ label: "Karangan Bunga Cileunyi", category: "Collection", url: "https://hotelverta.com/-cileunyi", images: " ", price: " " },{ label: "Karangan Bunga Cimahi", category: "Collection", url: "https://hotelverta.com/-cimahi", images: " ", price: " " },{ label: "Karangan Bunga Cirebon", category: "Collection", url: "https://hotelverta.com/-cirebon", images: " ", price: " " },{ label: "Karangan Bunga Ciwidey", category: "Collection", url: "https://hotelverta.com/-ciwidey", images: " ", price: " " },{ label: "Karangan Bunga Danau Toba", category: "Collection", url: "https://hotelverta.com/-danau-toba", images: " ", price: " " },{ label: "Karangan Bunga Demak", category: "Collection", url: "https://hotelverta.com/-demak", images: " ", price: " " },{ label: "Karangan Bunga Denpasar", category: "Collection", url: "https://hotelverta.com/-denpasar", images: " ", price: " " },{ label: "Karangan Bunga Depok", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Duka Cita", category: "Collection", url: "https://hotelverta.com/-duka-cita", images: " ", price: " " },{ label: "Karangan Bunga Garut", category: "Collection", url: "https://hotelverta.com/-garut", images: " ", price: " " },{ label: "Karangan Bunga Gianyar", category: "Collection", url: "https://hotelverta.com/-gianyar", images: " ", price: " " },{ label: "Karangan Bunga Gorontalo", category: "Collection", url: "https://hotelverta.com/-gorontalo", images: " ", price: " " },{ label: "Karangan Bunga Gowa", category: "Collection", url: "https://hotelverta.com/-gowa", images: " ", price: " " },{ label: "Karangan Bunga Gresik", category: "Collection", url: "https://hotelverta.com/-gresik", images: " ", price: " " },{ label: "Karangan Bunga Grobogan", category: "Collection", url: "https://hotelverta.com/-grobogan", images: " ", price: " " },{ label: "Karangan Bunga Gunung Kidul", category: "Collection", url: "https://hotelverta.com/-gunungkidul", images: " ", price: " " },{ label: "Karangan Bunga Indramayu", category: "Collection", url: "https://hotelverta.com/-indramayu", images: " ", price: " " },{ label: "Karangan Bunga Jakarta", category: "Collection", url: "https://hotelverta.com/-jakarta", images: " ", price: " " },{ label: "Karangan Bunga Jambi", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Jayapura", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Jember", category: "Collection", url: "https://hotelverta.com/-jember", images: " ", price: " " },{ label: "Karangan Bunga Jembrana", category: "Collection", url: "https://hotelverta.com/-jembrana", images: " ", price: " " },{ label: "Karangan Bunga Jepara", category: "Collection", url: "https://hotelverta.com/-jepara", images: " ", price: " " },{ label: "Karangan Bunga Jombang", category: "Collection", url: "https://hotelverta.com/-jombang", images: " ", price: " " },{ label: "Karangan Bunga Kampung Baru", category: "Collection", url: "https://hotelverta.com/-kampung-baru", images: " ", price: " " },{ label: "Karangan Bunga Kapuas", category: "Collection", url: "https://hotelverta.com/-kapuas", images: " ", price: " " },{ label: "Karangan Bunga Karanganyar", category: "Collection", url: "https://hotelverta.com/-karanganyar", images: " ", price: " " },{ label: "Karangan Bunga Karangasem", category: "Collection", url: "https://hotelverta.com/-karangasem", images: " ", price: " " },{ label: "Karangan Bunga Karawang", category: "Collection", url: "https://hotelverta.com/-karawang", images: " ", price: " " },{ label: "Karangan Bunga Kartosuro", category: "Collection", url: "https://hotelverta.com/-kartosuro", images: " ", price: " " },{ label: "Karangan Bunga Kebumen", category: "Collection", url: "https://hotelverta.com/-kebumen", images: " ", price: " " },{ label: "Karangan Bunga Kediri", category: "Collection", url: "https://hotelverta.com/-kediri", images: " ", price: " " },{ label: "Karangan Bunga Kendal", category: "Collection", url: "https://hotelverta.com/-kendal", images: " ", price: " " },{ label: "Karangan Bunga Kendari", category: "Collection", url: "https://hotelverta.com/-kendari", images: " ", price: " " },{ label: "Karangan Bunga Ketapang", category: "Collection", url: "https://hotelverta.com/-ketapang", images: " ", price: " " },{ label: "Karangan Bunga Klaten", category: "Collection", url: "https://hotelverta.com/-klaten", images: " ", price: " " },{ label: "Karangan Bunga Kota Batu", category: "Collection", url: "https://hotelverta.com/-kota-batu", images: " ", price: " " },{ label: "Karangan Bunga Kudus", category: "Collection", url: "https://hotelverta.com/-kudus", images: " ", price: " " },{ label: "Karangan Bunga Kupang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Lamongan", category: "Collection", url: "https://hotelverta.com/-lamongan", images: " ", price: " " },{ label: "Karangan Bunga Lampung", category: "Collection", url: "https://hotelverta.com/-lampung", images: " ", price: " " },{ label: "Karangan Bunga Langkat", category: "Collection", url: "https://hotelverta.com/-langkat", images: " ", price: " " },{ label: "Karangan Bunga Lembang", category: "Collection", url: "https://hotelverta.com/-lembang", images: " ", price: " " },{ label: "Karangan Bunga Lombok", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Lubuk Pakam", category: "Collection", url: "https://hotelverta.com/-lubuk-pakam", images: " ", price: " " },{ label: "Karangan Bunga Lumajang", category: "Collection", url: "https://hotelverta.com/-lumajang", images: " ", price: " " },{ label: "Karangan Bunga Madiun", category: "Collection", url: "https://hotelverta.com/-madiun", images: " ", price: " " },{ label: "Karangan Bunga Magelang", category: "Collection", url: "https://hotelverta.com/-magelang", images: " ", price: " " },{ label: "Karangan Bunga Majalengka", category: "Collection", url: "https://hotelverta.com/-majalengka", images: " ", price: " " },{ label: "Karangan Bunga Makassar", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Malang", category: "Collection", url: "https://hotelverta.com/-malang", images: " ", price: " " },{ label: "Karangan Bunga Mamuju", category: "Collection", url: "https://hotelverta.com/-mamuju", images: " ", price: " " },{ label: "Karangan Bunga Manado", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Manokwari", category: "Collection", url: "https://hotelverta.com/-manokwari", images: " ", price: " " },{ label: "Karangan Bunga Maros", category: "Collection", url: "https://hotelverta.com/-maros", images: " ", price: " " },{ label: "Karangan Bunga Mataram", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Mojokerto", category: "Collection", url: "https://hotelverta.com/-mojokerto", images: " ", price: " " },{ label: "Karangan Bunga Nganjuk", category: "Collection", url: "https://hotelverta.com/-nganjuk", images: " ", price: " " },{ label: "Karangan Bunga Nias", category: "Collection", url: "https://hotelverta.com/-nias", images: " ", price: " " },{ label: "Karangan Bunga Padang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Palangkaraya", category: "Collection", url: "https://hotelverta.com/-palangkaraya", images: " ", price: " " },{ label: "Karangan Bunga Palu", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Pangkal Pinang", category: "Collection", url: "https://hotelverta.com/-pangkal-pinang", images: " ", price: " " },{ label: "Karangan Bunga Papan", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " }
13872,{ label: "Karangan Bunga Papan Bandar Lampung", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Papan Bekasi", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Papan Binjai", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Papan Blitar", category: "Collection", url: "https://hotelverta.com/-blitar", images: " ", price: " " },{ label: "Karangan Bunga Papan Buleleng", category: "Collection", url: "https://hotelverta.com/-buleleng", images: " ", price: " " },{ label: "Karangan Bunga Papan Cibubur", category: "Collection", url: "https://hotelverta.com/-cibubur", images: " ", price: " " },{ label: "Karangan Bunga Papan Deli Serdang", category: "Collection", url: "https://hotelverta.com/-deli-serdang", images: " ", price: " " },{ label: "Karangan Bunga Papan Jakarta Timur", category: "Collection", url: "https://hotelverta.com/-jakarta-timur", images: " ", price: " " },{ label: "Karangan Bunga Papan Karo", category: "Collection", url: "https://hotelverta.com/-karo", images: " ", price: " " },{ label: "Karangan Bunga Papan Medan", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Papan Ngawi", category: "Collection", url: "https://hotelverta.com/-ngawi", images: " ", price: " " },{ label: "Karangan Bunga Papan Palembang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Papan Pemalang", category: "Collection", url: "https://hotelverta.com/-pemalang", images: " ", price: " " },{ label: "Karangan Bunga Papan Rembang", category: "Collection", url: "https://hotelverta.com/-rembang", images: " ", price: " " },{ label: "Karangan Bunga Papan Sragen", category: "Collection", url: "https://hotelverta.com/-sragen", images: " ", price: " " },{ label: "Karangan Bunga Papan Tegal", category: "Collection", url: "https://hotelverta.com/-tegal", images: " ", price: " " },{ label: "Karangan Bunga Papan Temanggung", category: "Collection", url: "https://hotelverta.com/-temanggung", images: " ", price: " " },{ label: "Karangan Bunga Parepare", category: "Collection", url: "https://hotelverta.com/-parepare", images: " ", price: " " },{ label: "Karangan Bunga Pasuruan", category: "Collection", url: "https://hotelverta.com/-pasuruan", images: " ", price: " " },{ label: "Karangan Bunga Pati", category: "Collection", url: "https://hotelverta.com/-pati", images: " ", price: " " },{ label: "Karangan Bunga Pekalongan", category: "Collection", url: "https://hotelverta.com/-pekalongan", images: " ", price: " " },{ label: "Karangan Bunga Pekanbaru", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Pematangsiantar", category: "Collection", url: "https://hotelverta.com/-pematangsiantar", images: " ", price: " " },{ label: "Karangan Bunga Ponorogo", category: "Collection", url: "https://hotelverta.com/-ponorogo", images: " ", price: " " },{ label: "Karangan Bunga Pontianak", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Probolinggo", category: "Collection", url: "https://hotelverta.com/-probolinggo", images: " ", price: " " },{ label: "Karangan Bunga Purbalingga", category: "Collection", url: "https://hotelverta.com/-purbalingga", images: " ", price: " " },{ label: "Karangan Bunga Purwokerto", category: "Collection", url: "https://hotelverta.com/-purwokerto", images: " ", price: " " },{ label: "Karangan Bunga Purworejo", category: "Collection", url: "https://hotelverta.com/-purworejo", images: " ", price: " " },{ label: "Karangan Bunga Riau", category: "Collection", url: "https://hotelverta.com/-riau", images: " ", price: " " },{ label: "Karangan Bunga Salatiga", category: "Collection", url: "https://hotelverta.com/-salatiga", images: " ", price: " " },{ label: "Karangan Bunga Samarinda", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Semarang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Serang", category: "Collection", url: "https://hotelverta.com/-serang", images: " ", price: " " },{ label: "Karangan Bunga Sibolga", category: "Collection", url: "https://hotelverta.com/-sibolga", images: " ", price: " " },{ label: "Karangan Bunga Sidoarjo", category: "Collection", url: "https://hotelverta.com/-sidoarjo", images: " ", price: " " },{ label: "Karangan Bunga Singkawang", category: "Collection", url: "https://hotelverta.com/-singkawang", images: " ", price: " " },{ label: "Karangan Bunga Solo", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Sorong", category: "Collection", url: "https://hotelverta.com/-sorong", images: " ", price: " " },{ label: "Karangan Bunga Subang", category: "Collection", url: "https://hotelverta.com/-subang", images: " ", price: " " },{ label: "Karangan Bunga Sukabumi", category: "Collection", url: "https://hotelverta.com/-sukabumi", images: " ", price: " " },{ label: "Karangan Bunga Sumbawa", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Surabaya", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Surakarta", category: "Collection", url: "https://hotelverta.com/-surakarta", images: " ", price: " " },{ label: "Karangan Bunga Tangerang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Karangan Bunga Tasikmalaya", category: "Collection", url: "https://hotelverta.com/-tasikmalaya", images: " ", price: " " },{ label: "Karangan Bunga Ternate", category: "Collection", url: "https://hotelverta.com/-ternate", images: " ", price: " " },{ label: "Karangan Bunga Tolitoli", category: "Collection", url: "https://hotelverta.com/-tolitoli", images: " ", price: " " },{ label: "Karangan Bunga Toraja", category: "Collection", url: "https://hotelverta.com/-toraja", images: " ", price: " " },{ label: "Karangan Bunga Tuban", category: "Collection", url: "https://hotelverta.com/-tuban", images: " ", price: " " },{ label: "Karangan Bunga Tulungagung", category: "Collection", url: "https://hotelverta.com/-tulungagung", images: " ", price: " " },{ label: "Karangan Bunga Wakatobi", category: "Collection", url: "https://hotelverta.com/-wakatobi", images: " ", price: " " },{ label: "Karangan Bunga Wiyung", category: "Collection", url: "https://hotelverta.com/-wiyung", images: " ", price: " " },{ label: "Karangan Bunga Wonogiri", category: "Collection", url: "https://hotelverta.com/-wonogiri", images: " ", price: " " },{ label: "Karangan Bunga Wonokromo", category: "Collection", url: "https://hotelverta.com/-wonokromo", images: " ", price: " " },{ label: "Karangan Bunga Wonosobo", category: "Collection", url: "https://hotelverta.com/-wonosobo", images: " ", price: " " },{ label: "Karangan Bunga Yogyakarta", category: "Collection", url: "https://hotelverta.com/-yogyakarta", images: " ", price: " " },{ label: "Kartu Ucapan", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Kue Anniversary", category: "Collection", url: "/collections/kue-anniversary", images: " ", price: " " },{ label: "Kue Bachelorette", category: "Collection", url: "/collections/kue-bachelorette", images: " ", price: " " },{ label: "Kue Bandung", category: "Collection", url: "/collections/kue-bandung", images: " ", price: " " },{ label: "Kue Bulan", category: "Collection", url: "/collections/kue-bulan", images: " ", price: " " },{ label: "Kue Imlek", category: "Collection", url: "/collections/kue-imlek", images: " ", price: " " },{ label: "Kue Kering", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Kue Natal", category: "Collection", url: "/collections/kue-natal", images: " ", price: " " },{ label: "Kue Pernikahan", category: "Collection", url: "/collections/kue-pernikahan", images: " ", price: " " },{ label: "Kue Tart", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Kue Tart Oma Elly", category: "Collection", url: "https://hotelverta.com/-oma-elly", images: " ", price: " " },{ label: "Kue Ulang Tahun", category: "Collection", url: "/collections/kue-ulang-tahun", images: " ", price: " " },{ label: "Lalique", category: "Collection", url: "/collections/lalique", images: " ", price: " " },{ label: "Le Sucre Du Patisserie", category: "Collection", url: "/collections/le-sucre-du-patisserie", images: " ", price: " " },{ label: "Leo âï¸ 23July - 22Augst", category: "Collection", url: "/collections/kado-untuk-zodiak-leo", images: " ", price: " " },{ label: "Letter Box", category: "Collection", url: "/collections/letter-box", images: " ", price: " " },{ label: "Libra âï¸ 23Sept - 23Oct", category: "Collection", url: "/collections/kado-untuk-zodiak-libra", images: " ", price: " " },{ label: "Lilin Aromaterapi", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Lily", category: "Collection", url: "/collections/bunga-lily", images: " ", price: " " },{ label: "Lindt", category: "Collection", url: "/collections/lindt", images: " ", price: " " },{ label: "Locations", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Love & Romance", category: "Collection", url: "/collections/rangkaian-bunga-i-love-you", images: " ", price: " " },{ label: "Love Bag Collection", category: "Collection", url: "/collections/love-bag-collection", images: " ", price: " " },{ label: "Love Bundle", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Love Bundle Nusantara", category: "Collection", url: "/collections/love-bundle-nusantara", images: " ", price: " " },{ label: "Luxury Chinese New Year Hampers", category: "Collection", url: "/collections/luxury-chinese-new-year-hampers", images: " ", price: " " },{ label: "Luxury Christmas Hampers", category: "Collection", url: "/collections/luxury-christmas-hampers", images: " ", price: " " },{ label: "Luxury Hampers", category: "Collection", url: "/collections/luxury-hampers", images: " ", price: " " },{ label: "Luxury Hampers Luar Jadetabek", category: "Collection", url: "/collections/luxury-hampers-luar-jadetabek", images: " ", price: " " },{ label: "Luxury Newborn Hampers Collection", category: "Collection", url: "/collections/luxury-newborn-hampers-collection", images: " ", price: " " },{ label: "Luxury Ramadan Hampers", category: "Collection", url: "/collections/luxury-ramadan-hampers", images: " ", price: " " },{ label: "Luxury Set", category: "Collection", url: "/collections/luxury", images: " ", price: " " },{ label: "Macaroon", category: "Collection", url: "/collections/macaroon", images: " ", price: " " },{ label: "Manual", category: "Collection", url: "/collections/manual", images: " ", price: " " },{ label: "Massimo Gelato", category: "Collection", url: "/collections/massimo-gelato", images: " ", price: " " },{ label: "Men's Collection", category: "Collection", url: "/collections/mens-collection", images: " ", price: " " },{ label: "Mercedes Benz", category: "Collection", url: "/collections/mercedes-benz", images: " ", price: " " },{ label: "Mercy Hampers", category: "Collection", url: "/collections/mercy-
13872hampers", images: " ", price: " " },{ label: "Merry Hampers", category: "Collection", url: "/collections/merry-hampers", images: " ", price: " " },{ label: "Merry Hampers Luar Jabodetabek", category: "Collection", url: "/collections/merry-hampers-luar-jabodetabek", images: " ", price: " " },{ label: "Mini Bouquet", category: "Collection", url: "/collections/mini-bouquet", images: " ", price: " " },{ label: "Miss Mondial", category: "Collection", url: "/collections/miss-mondial", images: " ", price: " " },{ label: "Modern & Chic Chinese New Year", category: "Collection", url: "/collections/modern-chic-chinese-new-year", images: " ", price: " " },{ label: "Modern & Chic Christmas Hampers", category: "Collection", url: "/collections/modern-chic-christmas", images: " ", price: " " },{ label: "Modern & Chic Hampers", category: "Collection", url: "/collections/modern-chic-hampers", images: " ", price: " " },{ label: "Modern & Chic Hampers Luar Jadetabek", category: "Collection", url: "/collections/modern-chic-hampers-luar-jadetabek", images: " ", price: " " },{ label: "Modern & Chic Ramadan Hampers", category: "Collection", url: "/collections/modern-chic-ramadan-hampers", images: " ", price: " " },{ label: "Modern & Classy Hampers", category: "Collection", url: "https://hotelverta.com/-unik", images: " ", price: " " },{ label: "Modern 3D Cake", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Modern Style Flowers", category: "Collection", url: "/collections/modern-style-flowers", images: " ", price: " " },{ label: "Monochrome Hampers", category: "Collection", url: "/collections/monochrome-hampers", images: " ", price: " " },{ label: "Monochrome Hampers Luar Jadetabek", category: "Collection", url: "/collections/monochrome-hampers-luar-jadetabek", images: " ", price: " " },{ label: "Mooncake", category: "Collection", url: "/collections/kue-bulan-mooncake-2025-mid-autumn-festival", images: " ", price: " " },{ label: "Mooncake Assorted Selection", category: "Collection", url: "/collections/mooncake-assorted-selection", images: " ", price: " " },{ label: "Mother's Day", category: "Collection", url: "/collections/rangkaian-bunga-hari-ibu", images: " ", price: " " },{ label: "Mother's Day Special", category: "Collection", url: "/collections/kado-untuk-ibu", images: " ", price: " " },{ label: "Necklaces", category: "Collection", url: "/collections/kalung", images: " ", price: " " },{ label: "NestBloom Bird Nest Hampers", category: "Collection", url: "/collections/nestbloom-birds-nest", images: " ", price: " " },{ label: "NestBloom Gift Set", category: "Collection", url: "/collections/nestbloom-gift-set", images: " ", price: " " },{ label: "Nestbloom Ritual Kit", category: "Collection", url: "/collections/nestbloom-ritual-kit", images: " ", price: " " },{ label: "NestBloom Single Bloom", category: "Collection", url: "/collections/nestbloom-single-bloom", images: " ", price: " " },{ label: "New Collection", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "New Product", category: "Collection", url: "/collections/new-product", images: " ", price: " " },{ label: "Newborn", category: "Collection", url: "/collections/rangkaian-bunga-newborn-baby", images: " ", price: " " },{ label: "Newborn Hampers", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Nibbl", category: "Collection", url: "/collections/nibbl", images: " ", price: " " },{ label: "Occasions", category: "Collection", url: "/collections/occasions", images: " ", price: " " },{ label: "Oma Elly", category: "Collection", url: "/collections/oma-elly", images: " ", price: " " },{ label: "Oma Elly Gelato", category: "Collection", url: "/collections/oma-elly-gelato", images: " ", price: " " },{ label: "Orchid", category: "Collection", url: "/collections/bunga-anggrek", images: " ", price: " " },{ label: "Orori", category: "Collection", url: "/collections/orori", images: " ", price: " " },{ label: "Outerbloom", category: "Collection", url: "/collections/outerbloom", images: " ", price: " " }
13872,{ label: "Outerbloom Cake", category: "Collection", url: "/collections/outerbloom-cake", images: " ", price: " " },{ label: "Outerbloom Florist", category: "Collection", url: "/collections/outerbloom-florist", images: " ", price: " " },{ label: "Outerbloom Gift", category: "Collection", url: "/collections/outerbloom-gift", images: " ", price: " " },{ label: "Outerbloom Hampers", category: "Collection", url: "/collections/outerbloom-hampers", images: " ", price: " " },{ label: "Outerbloom Indonesia", category: "Collection", url: "/collections/indonesia", images: " ", price: " " },{ label: "Outerbloom x Boho Panna", category: "Collection", url: "/collections/outerbloom-x-boho-panna", images: " ", price: " " },{ label: "Outerbloom x Clairmont", category: "Collection", url: "/collections/outerbloom-x-clairmont", images: " ", price: " " },{ label: "Outerbloom x Kikido", category: "Collection", url: "/collections/outerbloom-x-kikido", images: " ", price: " " },{ label: "Outerbloom x Miwa Pattern", category: "Collection", url: "/collections/outerbloom-x-miwa", images: " ", price: " " },{ label: "Outerbloom x Nestbloom Chinese New Year", category: "Collection", url: "/collections/outerbloom-x-nestbloom-chinese-new-year", images: " ", price: " " },{ label: "Outerbloom x NestBloom Hampers", category: "Collection", url: "/collections/outerbloom-x-nestbloom", images: " ", price: " " },{ label: "Paket Kolaborasi Outerbloom", category: "Collection", url: "/collections/paket-kolaborasi-outerbloom", images: " ", price: " " },{ label: "Paket Kolaborasi Valentine", category: "Collection", url: "/collections/paket-kolaborasi-valentine", images: " ", price: " " },{ label: "Paket Ulang Tahun", category: "Collection", url: "/collections/paket-ulang-tahun", images: " ", price: " " },{ label: "Paket Valentine Nusantara", category: "Collection", url: "/collections/paket-valentine-nusantara", images: " ", price: " " },{ label: "Paket Valentine Outerbloom", category: "Collection", url: "/collections/paket-valentine", images: " ", price: " " },{ label: "Papan Bunga", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Aceh", category: "Collection", url: "https://hotelverta.com/-aceh", images: " ", price: " " },{ label: "Papan Bunga Acrylic", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Ambon", category: "Collection", url: "https://hotelverta.com/-ambon", images: " ", price: " " },{ label: "Papan Bunga Artificial", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Atambua", category: "Collection", url: "https://hotelverta.com/-atambua", images: " ", price: " " },{ label: "Papan Bunga Bali", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Balikpapan", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Bandar Lampung", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Bandung", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Bandung Barat", category: "Collection", url: "https://hotelverta.com/-barat", images: " ", price: " " },{ label: "Papan Bunga Bangka", category: "Collection", url: "https://hotelverta.com/-bangka", images: " ", price: " " },{ label: "Papan Bunga Banjarmasin", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Banten", category: "Collection", url: "https://hotelverta.com/-banten", images: " ", price: " " },{ label: "Papan Bunga Banyumas", category: "Collection", url: "https://hotelverta.com/-banyumas", images: " ", price: " " },{ label: "Papan Bunga Banyuwangi", category: "Collection", url: "https://hotelverta.com/-banyuwangi", images: " ", price: " " },{ label: "Papan Bunga Batam", category: "Collection", url: "https://hotelverta.com/-batam", images: " ", price: " " },{ label: "Papan Bunga Baubau", category: "Collection", url: "https://hotelverta.com/-baubau", images: " ", price: " " }
13872,{ label: "Papan Bunga Bekasi", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Bengkalis", category: "Collection", url: "https://hotelverta.com/-bengkalis", images: " ", price: " " },{ label: "Papan Bunga Bengkayang", category: "Collection", url: "https://hotelverta.com/-bengkayang", images: " ", price: " " },{ label: "Papan Bunga Bengkulu", category: "Collection", url: "https://hotelverta.com/-bengkulu", images: " ", price: " " },{ label: "Papan Bunga Binjai", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Blitar", category: "Collection", url: "https://hotelverta.com/-blitar", images: " ", price: " " },{ label: "Papan Bunga Blora", category: "Collection", url: "https://hotelverta.com/-blora", images: " ", price: " " },{ label: "Papan Bunga Bogor", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Bojonegoro", category: "Collection", url: "https://hotelverta.com/-bojonegoro", images: " ", price: " " },{ label: "Papan Bunga Boyolali", category: "Collection", url: "https://hotelverta.com/-boyolali", images: " ", price: " " },{ label: "Papan Bunga Brebes", category: "Collection", url: "https://hotelverta.com/-brebes", images: " ", price: " " },{ label: "Papan Bunga Bukittinggi", category: "Collection", url: "https://hotelverta.com/-bukittinggi", images: " ", price: " " },{ label: "Papan Bunga Buleleng", category: "Collection", url: "https://hotelverta.com/-buleleng", images: " ", price: " " },{ label: "Papan Bunga Ciamis", category: "Collection", url: "https://hotelverta.com/-ciamis", images: " ", price: " " },{ label: "Papan Bunga Cianjur", category: "Collection", url: "https://hotelverta.com/-cianjur", images: " ", price: " " },{ label: "Papan Bunga Cibubur", category: "Collection", url: "https://hotelverta.com/-cibubur", images: " ", price: " " },{ label: "Papan Bunga Cikarang", category: "Collection", url: "https://hotelverta.com/-cikarang", images: " ", price: " " },{ label: "Papan Bunga Cikupa", category: "Collection", url: "https://hotelverta.com/-cikupa", images: " ", price: " " },{ label: "Papan Bunga Cikupa", category: "Collection", url: "https://hotelverta.com/-cikupa-1", images: " ", price: " " },{ label: "Papan Bunga Cilacap", category: "Collection", url: "https://hotelverta.com/-cilacap", images: " ", price: " " },{ label: "Papan Bunga Cileunyi", category: "Collection", url: "https://hotelverta.com/-cileunyi", images: " ", price: " " },{ label: "Papan Bunga Cirebon", category: "Collection", url: "https://hotelverta.com/-cirebon", images: " ", price: " " },{ label: "Papan Bunga Congratulations", category: "Collection", url: "https://hotelverta.com/-ucapan-selamat", images: " ", price: " " },{ label: "Papan Bunga Congratulations Bali", category: "Collection", url: "https://hotelverta.com/-congratulations-bali", images: " ", price: " " },{ label: "Papan Bunga Congratulations Bandung", category: "Collection", url: "https://hotelverta.com/-congratulations-bandung", images: " ", price: " " },{ label: "Papan Bunga Congratulations Bekasi", category: "Collection", url: "https://hotelverta.com/-congratulations-bekasi", images: " ", price: " " },{ label: "Papan Bunga Congratulations Bogor", category: "Collection", url: "https://hotelverta.com/-congratulations-bogor", images: " ", price: " " },{ label: "Papan Bunga Congratulations Cikupa", category: "Collection", url: "https://hotelverta.com/-congratulations-cikupa", images: " ", price: " " },{ label: "Papan Bunga Congratulations Demak", category: "Collection", url: "https://hotelverta.com/-congratulations-demak", images: " ", price: " " },{ label: "Papan Bunga Congratulations Depok", category: "Collection", url: "https://hotelverta.com/-congratulations-depok", images: " ", price: " " },{ label: "Papan Bunga Congratulations Gresik", category: "Collection", url: "https://hotelverta.com/-congratulations-gresik", images: " ", price: " " },{ label: "Papan Bunga Congratulations Jakarta", category: "Collection", url: "https://hotelverta.com/-congratulations-jakarta", images: " ", price: " " }
13872,{ label: "Papan Bunga Congratulations Jepara", category: "Collection", url: "https://hotelverta.com/-congratulations-jepara", images: " ", price: " " },{ label: "Papan Bunga Congratulations Medan", category: "Collection", url: "https://hotelverta.com/-congratulations-medan", images: " ", price: " " },{ label: "Papan Bunga Congratulations Semarang", category: "Collection", url: "https://hotelverta.com/-congratulations-semarang", images: " ", price: " " },{ label: "Papan Bunga Congratulations Serang", category: "Collection", url: "https://hotelverta.com/-congratulations-serang", images: " ", price: " " },{ label: "Papan Bunga Congratulations Sidoarjo", category: "Collection", url: "https://hotelverta.com/-congratulations-sidoarjo", images: " ", price: " " },{ label: "Papan Bunga Congratulations Surabaya", category: "Collection", url: "https://hotelverta.com/-congratulations-surabaya", images: " ", price: " " },{ label: "Papan Bunga Congratulations Tangerang", category: "Collection", url: "https://hotelverta.com/-congratulations-tangerang", images: " ", price: " " },{ label: "Papan Bunga Congratulations Yogyakarta", category: "Collection", url: "https://hotelverta.com/-congratulations-yogyakarta", images: " ", price: " " },{ label: "Papan Bunga Danau Toba", category: "Collection", url: "https://hotelverta.com/-danau-toba", images: " ", price: " " },{ label: "Papan Bunga Deli Serdang", category: "Collection", url: "https://hotelverta.com/-deli-serdang", images: " ", price: " " },{ label: "Papan Bunga Demak", category: "Collection", url: "https://hotelverta.com/-demak", images: " ", price: " " },{ label: "Papan Bunga Denpasar", category: "Collection", url: "https://hotelverta.com/-denpasar", images: " ", price: " " },{ label: "Papan Bunga Depok", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Duka Cita", category: "Collection", url: "/collections/bunga-duka-cita", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Bali", category: "Collection", url: "https://hotelverta.com/-duka-cita-bali", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Bandung", category: "Collection", url: "https://hotelverta.com/-duka-cita-bandung", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Bekasi", category: "Collection", url: "https://hotelverta.com/-duka-cita-bekasi", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Bogor", category: "Collection", url: "https://hotelverta.com/-duka-cita-bogor", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Cikupa", category: "Collection", url: "https://hotelverta.com/-duka-cita-cikupa", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Demak", category: "Collection", url: "https://hotelverta.com/-duka-cita-demak", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Depok", category: "Collection", url: "https://hotelverta.com/-duka-cita-depok", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Gresik", category: "Collection", url: "https://hotelverta.com/-duka-cita-gresik", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Jakarta", category: "Collection", url: "https://hotelverta.com/-duka-cita-jakarta", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Jepara", category: "Collection", url: "https://hotelverta.com/-duka-cita-jepara", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Medan", category: "Collection", url: "https://hotelverta.com/-duka-cita-medan", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Semarang", category: "Collection", url: "https://hotelverta.com/-duka-cita-semarang", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Serang", category: "Collection", url: "https://hotelverta.com/-duka-cita-serang", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Sidoarjo", category: "Collection", url: "https://hotelverta.com/-duka-cita-sidoarjo", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Surabaya", category: "Collection", url: "https://hotelverta.com/-duka-cita-surabaya", images: " ", price: " " },{ label: "Papan Bunga Duka Cita Tangerang", category: "Collection", url: "https://hotelverta.com/-duka-cita-tangerang", images: " ", price: " " }
13872,{ label: "Papan Bunga Duka Cita Yogyakarta", category: "Collection", url: "https://hotelverta.com/-duka-cita-yogyakarta", images: " ", price: " " },{ label: "Papan Bunga Garut", category: "Collection", url: "https://hotelverta.com/-garut", images: " ", price: " " },{ label: "Papan Bunga Gianyar", category: "Collection", url: "https://hotelverta.com/-gianyar", images: " ", price: " " },{ label: "Papan Bunga Gorontalo", category: "Collection", url: "https://hotelverta.com/-gorontalo", images: " ", price: " " },{ label: "Papan Bunga Gowa", category: "Collection", url: "https://hotelverta.com/-gowa", images: " ", price: " " },{ label: "Papan Bunga Gresik", category: "Collection", url: "https://hotelverta.com/-gresik", images: " ", price: " " },{ label: "Papan Bunga Grobogan", category: "Collection", url: "https://hotelverta.com/-grobogan", images: " ", price: " " },{ label: "Papan Bunga Gunungkidul", category: "Collection", url: "https://hotelverta.com/-gunungkidul", images: " ", price: " " },{ label: "Papan Bunga Indramayu", category: "Collection", url: "https://hotelverta.com/-indramayu", images: " ", price: " " },{ label: "Papan Bunga Jakarta", category: "Collection", url: "https://hotelverta.com/-jakarta", images: " ", price: " " },{ label: "Papan Bunga Jakarta Timur", category: "Collection", url: "https://hotelverta.com/-jakarta-timur", images: " ", price: " " },{ label: "Papan Bunga Jambi", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Jayapura", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Jember", category: "Collection", url: "https://hotelverta.com/-jember", images: " ", price: " " },{ label: "Papan Bunga Jembrana", category: "Collection", url: "https://hotelverta.com/-jembrana", images: " ", price: " " },{ label: "Papan Bunga Jepara", category: "Collection", url: "https://hotelverta.com/-jepara", images: " ", price: " " },{ label: "Papan Bunga Jombang", category: "Collection", url: "https://hotelverta.com/-jombang", images: " ", price: " " },{ label: "Papan Bunga Kampung Baru", category: "Collection", url: "https://hotelverta.com/-kampung-baru", images: " ", price: " " },{ label: "Papan Bunga Kapuas", category: "Collection", url: "https://hotelverta.com/-kapuas", images: " ", price: " " },{ label: "Papan Bunga Karanganyar", category: "Collection", url: "https://hotelverta.com/-karanganyar", images: " ", price: " " },{ label: "Papan Bunga Karangasem", category: "Collection", url: "https://hotelverta.com/-karangasem", images: " ", price: " " },{ label: "Papan Bunga Karawang", category: "Collection", url: "https://hotelverta.com/-karawang", images: " ", price: " " },{ label: "Papan Bunga Karo", category: "Collection", url: "https://hotelverta.com/-karo", images: " ", price: " " },{ label: "Papan Bunga Kartosuro", category: "Collection", url: "https://hotelverta.com/-kartosuro", images: " ", price: " " },{ label: "Papan Bunga Kebumen", category: "Collection", url: "https://hotelverta.com/-kebumen", images: " ", price: " " },{ label: "Papan Bunga Kediri", category: "Collection", url: "https://hotelverta.com/-kediri", images: " ", price: " " },{ label: "Papan Bunga Kendal", category: "Collection", url: "https://hotelverta.com/-kendal", images: " ", price: " " },{ label: "Papan Bunga Kendari", category: "Collection", url: "https://hotelverta.com/-kendari", images: " ", price: " " },{ label: "Papan Bunga Ketapang", category: "Collection", url: "https://hotelverta.com/-ketapang", images: " ", price: " " },{ label: "Papan Bunga Klaten", category: "Collection", url: "https://hotelverta.com/-klaten", images: " ", price: " " },{ label: "Papan Bunga Kota Batu", category: "Collection", url: "https://hotelverta.com/-kota-batu", images: " ", price: " " },{ label: "Papan Bunga Kudus", category: "Collection", url: "https://hotelverta.com/-kudus", images: " ", price: " " },{ label: "Papan Bunga Kupang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Lamongan", category: "Collection", url: "https://hotelverta.com/-lamongan", images: " ", price: " " }
13872,{ label: "Papan Bunga Lampu LED", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Lampung", category: "Collection", url: "https://hotelverta.com/-lampung", images: " ", price: " " },{ label: "Papan Bunga Langkat", category: "Collection", url: "https://hotelverta.com/-langkat", images: " ", price: " " },{ label: "Papan Bunga Lembang", category: "Collection", url: "https://hotelverta.com/-lembang", images: " ", price: " " },{ label: "Papan Bunga Lombok", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Lubuk Pakam", category: "Collection", url: "https://hotelverta.com/-lubuk-pakam", images: " ", price: " " },{ label: "Papan Bunga Lumajang", category: "Collection", url: "https://hotelverta.com/-lumajang", images: " ", price: " " },{ label: "Papan Bunga Madiun", category: "Collection", url: "https://hotelverta.com/-madiun", images: " ", price: " " },{ label: "Papan Bunga Magelang", category: "Collection", url: "https://hotelverta.com/-magelang", images: " ", price: " " },{ label: "Papan Bunga Majalengka", category: "Collection", url: "https://hotelverta.com/-majalengka", images: " ", price: " " },{ label: "Papan Bunga Makassar", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Malang", category: "Collection", url: "https://hotelverta.com/-malang", images: " ", price: " " },{ label: "Papan Bunga Mamuju", category: "Collection", url: "https://hotelverta.com/-mamuju", images: " ", price: " " },{ label: "Papan Bunga Manado", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Manokwari", category: "Collection", url: "https://hotelverta.com/-manokwari", images: " ", price: " " },{ label: "Papan Bunga Maros", category: "Collection", url: "https://hotelverta.com/-maros", images: " ", price: " " },{ label: "Papan Bunga Mataram", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Medan", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Mojokerto", category: "Collection", url: "https://hotelverta.com/-mojokerto", images: " ", price: " " },{ label: "Papan Bunga Nganjuk", category: "Collection", url: "https://hotelverta.com/-nganjuk", images: " ", price: " " },{ label: "Papan Bunga Ngawi", category: "Collection", url: "https://hotelverta.com/-ngawi", images: " ", price: " " },{ label: "Papan Bunga Nias", category: "Collection", url: "https://hotelverta.com/-nias", images: " ", price: " " },{ label: "Papan Bunga Organza", category: "Collection", url: "https://hotelverta.com/-organza", images: " ", price: " " },{ label: "Papan Bunga Padang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Palangkaraya", category: "Collection", url: "https://hotelverta.com/-palangkaraya", images: " ", price: " " },{ label: "Papan Bunga Palembang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Palu", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Pangkal Pinang", category: "Collection", url: "https://hotelverta.com/-pangkal-pinang", images: " ", price: " " },{ label: "Papan Bunga Parepare", category: "Collection", url: "https://hotelverta.com/-parepare", images: " ", price: " " },{ label: "Papan Bunga Pasuruan", category: "Collection", url: "https://hotelverta.com/-pasuruan", images: " ", price: " " },{ label: "Papan Bunga Pati", category: "Collection", url: "https://hotelverta.com/-pati", images: " ", price: " " },{ label: "Papan Bunga Pekalongan", category: "Collection", url: "https://hotelverta.com/-pekalongan", images: " ", price: " " },{ label: "Papan Bunga Pekanbaru", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Pemalang", category: "Collection", url: "https://hotelverta.com/-pemalang", images: " ", price: " " }
13872,{ label: "Papan Bunga Pematangsiantar", category: "Collection", url: "https://hotelverta.com/-pematangsiantar", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Bali", category: "Collection", url: "https://hotelverta.com/-pernikahan-bali", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Bandung", category: "Collection", url: "https://hotelverta.com/-pernikahan-bandung", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Bekasi", category: "Collection", url: "https://hotelverta.com/-pernikahan-bekasi", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Bogor", category: "Collection", url: "https://hotelverta.com/-pernikahan-bogor", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Cikupa", category: "Collection", url: "https://hotelverta.com/-pernikahan-cikupa", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Demak", category: "Collection", url: "https://hotelverta.com/-pernikahan-demak", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Depok", category: "Collection", url: "https://hotelverta.com/-pernikahan-depok", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Gresik", category: "Collection", url: "https://hotelverta.com/-pernikahan-gresik", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Jakarta", category: "Collection", url: "https://hotelverta.com/-pernikahan-jakarta", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Jepara", category: "Collection", url: "https://hotelverta.com/-pernikahan-jepara", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Medan", category: "Collection", url: "https://hotelverta.com/-pernikahan-medan", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Semarang", category: "Collection", url: "https://hotelverta.com/-pernikahan-semarang", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Serang", category: "Collection", url: "https://hotelverta.com/-pernikahan-serang", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Sidoarjo", category: "Collection", url: "https://hotelverta.com/-pernikahan-sidoarjo", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Surabaya", category: "Collection", url: "https://hotelverta.com/-pernikahan-surabaya", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Tangerang", category: "Collection", url: "https://hotelverta.com/-pernikahan-tangerang", images: " ", price: " " },{ label: "Papan Bunga Pernikahan Yogyakarta", category: "Collection", url: "https://hotelverta.com/-pernikahan-yogyakarta", images: " ", price: " " },{ label: "Papan Bunga Ponorogo", category: "Collection", url: "https://hotelverta.com/-ponorogo", images: " ", price: " " },{ label: "Papan Bunga Pontianak", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Premium", category: "Collection", url: "https://hotelverta.com/-premium", images: " ", price: " " },{ label: "Papan Bunga Printing", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Printing Congratulations", category: "Collection", url: "https://hotelverta.com/-congratulations", images: " ", price: " " },{ label: "Papan Bunga Probolinggo", category: "Collection", url: "https://hotelverta.com/-probolinggo", images: " ", price: " " },{ label: "Papan Bunga Promo", category: "Collection", url: "/collections/promo-papan-bunga", images: " ", price: " " },{ label: "Papan Bunga Purbalingga", category: "Collection", url: "https://hotelverta.com/-purbalingga", images: " ", price: " " },{ label: "Papan Bunga Purwokerto", category: "Collection", url: "https://hotelverta.com/-purwokerto", images: " ", price: " " },{ label: "Papan Bunga Purworejo", category: "Collection", url: "https://hotelverta.com/-purworejo", images: " ", price: " " },{ label: "Papan Bunga Rembang", category: "Collection", url: "https://hotelverta.com/-rembang", images: " ", price: " " },{ label: "Papan Bunga Riau", category: "Collection", url: "https://hotelverta.com/-riau", images: " ", price: " " },{ label: "Papan Bunga Salatiga", category: "Collection", url: "https://hotelverta.com/-salatiga", images: " ", price: " " }
13872,{ label: "Papan Bunga Samarinda", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Selamat Bandung", category: "Collection", url: "https://hotelverta.com/-selamat-bandung", images: " ", price: " " },{ label: "Papan Bunga Selamat Medan", category: "Collection", url: "https://hotelverta.com/-selamat-medan", images: " ", price: " " },{ label: "Papan Bunga Semarang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Serang", category: "Collection", url: "https://hotelverta.com/-serang", images: " ", price: " " },{ label: "Papan Bunga Sibolga", category: "Collection", url: "https://hotelverta.com/-sibolga", images: " ", price: " " },{ label: "Papan Bunga Sidoarjo", category: "Collection", url: "https://hotelverta.com/-sidoarjo", images: " ", price: " " },{ label: "Papan Bunga Singkawang", category: "Collection", url: "https://hotelverta.com/-singkawang", images: " ", price: " " },{ label: "Papan Bunga Solo", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Sorong", category: "Collection", url: "https://hotelverta.com/-sorong", images: " ", price: " " },{ label: "Papan Bunga Sragen", category: "Collection", url: "https://hotelverta.com/-sragen", images: " ", price: " " },{ label: "Papan Bunga Standard", category: "Collection", url: "https://hotelverta.com/-standard", images: " ", price: " " },{ label: "Papan Bunga Subang", category: "Collection", url: "https://hotelverta.com/-subang", images: " ", price: " " },{ label: "Papan Bunga Sukabumi", category: "Collection", url: "https://hotelverta.com/-sukabumi", images: " ", price: " " },{ label: "Papan Bunga Sumbawa", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Surabaya", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Surakarta", category: "Collection", url: "https://hotelverta.com/-surakarta", images: " ", price: " " },{ label: "Papan Bunga Tangerang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Papan Bunga Tasikmalaya", category: "Collection", url: "https://hotelverta.com/-tasikmalaya", images: " ", price: " " },{ label: "Papan Bunga Tegal", category: "Collection", url: "https://hotelverta.com/-tegal", images: " ", price: " " },{ label: "Papan Bunga Temanggung", category: "Collection", url: "https://hotelverta.com/-temanggung", images: " ", price: " " },{ label: "Papan Bunga Ternate", category: "Collection", url: "https://hotelverta.com/-ternate", images: " ", price: " " },{ label: "Papan Bunga Tolitoli", category: "Collection", url: "https://hotelverta.com/-tolitoli", images: " ", price: " " },{ label: "Papan Bunga Toraja", category: "Collection", url: "https://hotelverta.com/-toraja", images: " ", price: " " },{ label: "Papan Bunga Tuban", category: "Collection", url: "https://hotelverta.com/-tuban", images: " ", price: " " },{ label: "Papan Bunga Tulungagung", category: "Collection", url: "https://hotelverta.com/-tulungagung", images: " ", price: " " },{ label: "Papan Bunga Wakatobi", category: "Collection", url: "https://hotelverta.com/-wakatobi", images: " ", price: " " },{ label: "Papan Bunga Wedding", category: "Collection", url: "https://hotelverta.com/-ucapan-pernikahan", images: " ", price: " " },{ label: "Papan Bunga Wiyung", category: "Collection", url: "https://hotelverta.com/-wiyung", images: " ", price: " " },{ label: "Papan Bunga Wonogiri", category: "Collection", url: "https://hotelverta.com/-wonogiri", images: " ", price: " " },{ label: "Papan Bunga Wonokromo", category: "Collection", url: "https://hotelverta.com/-wonokromo", images: " ", price: " " },{ label: "Papan Bunga Wonosobo", category: "Collection", url: "https://hotelverta.com/-wonosobo", images: " ", price: " " },{ label: "Papan Bunga Yogyakarta", category: "Collection", url: "https://hotelverta.com/-yogyakarta", images: " ", price: " " },{ label: "Paper Flower Board", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " }
13872,{ label: "Paper Flower Board Bali", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Paper Flower Board Gresik", category: "Collection", url: "https://hotelverta.com/-gresik", images: " ", price: " " },{ label: "Paper Flower Board Sidoarjo", category: "Collection", url: "https://hotelverta.com/-sidoarjo", images: " ", price: " " },{ label: "Paper Flower Board Surabaya", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Paper Flower Board Yogyakarta", category: "Collection", url: "https://hotelverta.com/-yogyakarta", images: " ", price: " " },{ label: "Parcel", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Parcel Buah", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Parcel Buah Bandung", category: "Collection", url: "https://hotelverta.com/-buah-bandung", images: " ", price: " " },{ label: "Parcel Buah Semarang", category: "Collection", url: "https://hotelverta.com/-buah-semarang", images: " ", price: " " },{ label: "Parcel Buah Sidoarjo", category: "Collection", url: "https://hotelverta.com/-buah-sidoarjo", images: " ", price: " " },{ label: "Parcel Buah Surabaya", category: "Collection", url: "https://hotelverta.com/-buah-surabaya", images: " ", price: " " },{ label: "Parcel Imlek 2026", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Parcel Imlek Bandung", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Parcel Imlek Nusantara", category: "Collection", url: "https://hotelverta.com/-nusantara", images: " ", price: " " },{ label: "Parcel Lebaran Bandung", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Parcel Lebaran Nusantara", category: "Collection", url: "https://hotelverta.com/-indonesia", images: " ", price: " " },{ label: "Parcel Lebaran Surabaya", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Parcel Makanan", category: "Collection", url: "https://hotelverta.com/-makanan", images: " ", price: " " },{ label: "Parcel Natal & Tahun Baru 2026", category: "Collection", url: "/collections/hampers-natal", images: " ", price: " " },{ label: "Parcel Natal & Tahun Baru 2026 Bandung", category: "Collection", url: "https://hotelverta.com/-natal-bandung", images: " ", price: " " },{ label: "Parcel Newborn Nusantara", category: "Collection", url: "https://hotelverta.com/-nusantara", images: " ", price: " " },{ label: "Parcel Tahun Baru", category: "Collection", url: "/collections/new-year-tahun-baru", images: " ", price: " " },{ label: "Party Supplies", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Partysaurus", category: "Collection", url: "/collections/partysaurus", images: " ", price: " " },{ label: "Pasar Bunga Splendid Malang", category: "Collection", url: "/collections/pasar-bunga-splendid-malang", images: " ", price: " " },{ label: "Passionate Red Valentine", category: "Collection", url: "/collections/red-valentine", images: " ", price: " " },{ label: "Pendant", category: "Collection", url: "/collections/liontin", images: " ", price: " " },{ label: "Personalized Fashion", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Personalized Gift", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Personalized Gift Pria", category: "Collection", url: "https://hotelverta.com/-pria", images: " ", price: " " },{ label: "Personalized Gift Wanita", category: "Collection", url: "https://hotelverta.com/-wanita", images: " ", price: " " },{ label: "Personalized Gifts", category: "Collection", url: "https://hotelverta.com/s", images: " ", price: " " },{ label: "Pesca Ice Cream Cakes", category: "Collection", url: "/collections/pesca", images: " ", price: " " },{ label: "Phone Case", category: "Collection", url: "/collections/phone-case", images: " ", price: " " },{ label: "Photobook", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Pisces âï¸ 19Feb - 20March", category: "Collection", url: "/collections/kado-untuk-zodiak-pisces", images: " ", price: " " },{ label: "Pohon Natal", category: "Collection", url: "/collections/pohon-natal", images: " ", price: " " },{ label: "Premium Hampers", category: "Collection", url: "https://hotelverta.com/-premium", images: " ", price: " " },{ label: "Premium Newborn Hampers Collection", category: "Collection", url: "/collections/premium-newborn-hampers-collection", images: " ", price: " " },{ label: "Printing Cake", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Prom", category: "Collection", url: "/collections/prom", images: " ", price: " " },{ label: "Promo Merdeka", category: "Collection", url: "/collections/merdeka", images: " ", price: " " },{ label: "Rangkaian Bunga", category: "Collection", url: "/collections/rangkaian-bunga", images: " ", price: " " },{ label: "Rangkaian Bunga Dekorasi", category: "Collection", url: "/collections/rangkaian-bunga-dekorasi", images: " ", price: " " },{ label: "Rangkaian Bunga Ulang Tahun", category: "Collection", url: "/collections/rangkaian-bunga-ulang-tahun", images: " ", price: " " },{ label: "Rings", category: "Collection", url: "/collections/rings", images: " ", price: " " },{ label: "Romantic & Sweets", category: "Collection", url: "/collections/romantic-sweets", images: " ", price: " " },{ label: "Romantic Package", category: "Collection", url: "/collections/romantic-package", images: " ", price: " " },{ label: "Rose Beam", category: "Collection", url: "/collections/rose-beam", images: " ", price: " " },{ label: "Rose Box", category: "Collection", url: "/collections/rose-box", images: " ", price: " " },{ label: "Roses", category: "Collection", url: "/collections/bunga-mawar", images: " ", price: " " },{ label: "Rp 500.000 - Rp 800.000", category: "Collection", url: "/collections/rp-500-000-rp-800-000", images: " ", price: " " },{ label: "Rp 800.000 - Rp 1.000.000", category: "Collection", url: "/collections/rp-800-000-rp-1-000-000", images: " ", price: " " },{ label: "Rustic & Monochrome Ramadan Hampers", category: "Collection", url: "/collections/rustic-monochrome-ramadanhampers", images: " ", price: " " },{ label: "Rustic Bloom", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Rustic Style Flowers", category: "Collection", url: "/collections/rustic-style-flowers", images: " ", price: " " },{ label: "Sagittarius âï¸ 22Nov - 21Des", category: "Collection", url: "/collections/kado-untuk-zodiak-sagittarius", images: " ", price: " " },{ label: "Sameday Delivery", category: "Collection", url: "/collections/sameday", images: " ", price: " " },{ label: "Savoury Dish", category: "Collection", url: "/collections/savoury-dish", images: " ", price: " " },{ label: "Saychiz", category: "Collection", url: "/collections/saychiz", images: " ", price: " " },{ label: "Scented Candles", category: "Collection", url: "/collections/scented-candles", images: " ", price: " " },{ label: "Scorpio âï¸ 24Oct - 21Nov", category: "Collection", url: "/collections/kado-untuk-zodiak-scorpio", images: " ", price: " " },{ label: "Self Pick-Up", category: "Collection", url: "/collections/self-pick-up", images: " ", price: " " },{ label: "Semua Produk", category: "Collection", url: "/collections/all", images: " ", price: " " },{ label: "Serenitea", category: "Collection", url: "/collections/serenitea", images: " ", price: " " },{ label: "Share Outerbloom Moment", category: "Collection", url: "/collections/share-moment", images: " ", price: " " },{ label: "Share your Happiness", category: "Collection", url: "/collections/share-happiness", images: " ", price: " " },{ label: "Signature Cake", category: "Collection", url: "/collections/signature-cake", images: " ", price: " " },{ label: "Signature Chinese New Year Hampers", category: "Collection", url: "/collections/signature-chinese-new-year-hampers", images: " ", price: " " },{ label: "Signature Christmas & New Year Hampers", category: "Collection", url: "/collections/signature-christmas-hampers", images: " ", price: " " },{ label: "Signature Hampers", category: "Collection", url: "/collections/signature-hampers", images: " ", price: " " },{ label: "Signature Hampers Luar Jadetabek", category: "Collection", url: "/collections/signature-hampers-luar-jadetabek", images: " ", price: " " },{ label: "Signature Hampers Sameday", category: "Collection", url: "/collections/signature-hampers-sameday", images: " ", price: " " },{ label: "Signature Ramadan Hampers", category: "Collection", url: "/collections/signature-ramadan-hampers", images: " ", price: " " },{ label: "Slice Cake", category: "Collection", url: "/collections/slice-cake", images: " ", price: " " },{ label: "Snack Box", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Sorbet", category: "Collection", url: "/collections/sorbet", images: " ", price: " " },{ label: "Special Day", category: "Collection", url: "/collections/special-day", images: " ", price: " " },{ label: "Special Edition", category: "Collection", url: "/collections/special-edition", images: " ", price: " " },{ label: "Special For Her", category: "Collection", url: "/collections/special-for-her", images: " ", price: " " },{ label: "Standing Flower", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Standing Flower Bali", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Standing Flower Bandung", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Standing Flower Congratulations", category: "Collection", url: "https://hotelverta.com/-congratulations", images: " ", price: " " },{ label: "Standing Flower Demak", category: "Collection", url: "https://hotelverta.com/-demak", images: " ", price: " " },{ label: "Standing Flower Jepara", category: "Collection", url: "https://hotelverta.com/-jepara", images: " ", price: " " },{ label: "Standing Flower Semarang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Standing Flower Sidoarjo", category: "Collection", url: "https://hotelverta.com/-sidoarjo", images: " ", price: " " },{ label: "Standing Flower Surabaya", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Standing Flower Yogyakarta", category: "Collection", url: "https://hotelverta.com/-yogyakarta", images: " ", price: " " },{ label: "Standing Giant Flower", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Stationery", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Steekwerk", category: "Collection", url: "/collections/steekwerk", images: " ", price: " " },{ label: "Stylish Hampers", category: "Collection", url: "/collections/stylish-hampers", images: " ", price: " " },{ label: "Stylish Hampers Luar Jadetabek", category: "Collection", url: "/collections/stylish-hampers-luar-jadetabek", images: " ", price: " " },{ label: "Succulent", category: "Collection", url: "/collections/succulent", images: " ", price: " " },{ label: "Sunflower", category: "Collection", url: "/collections/bunga-matahari", images: " ", price: " " },{ label: "Sweet & Savoury Hampers", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Sweet Gracie", category: "Collection", url: "/collections/sweet-gracie", images: " ", price: " " },{ label: "Sweet Pastel Love", category: "Collection", url: "/collections/pastel-love", images: " ", price: " " },{ label: "Sweet Pastel Love Nusantara", category: "Collection", url: "/collections/sweet-pastel-love-nusantara", images: " ", price: " " },{ label: "Sweet Treats", category: "Collection", url: "/collections/sweet-treats", images: " ", price: " " },{ label: "Sweetooth", category: "Collection", url: "/collections/sweetooth", images: " ", price: " " },{ label: "SÅl et Terre x Outerbloom", category: "Collection", url: "/collections/sol-et-terre", images: " ", price: " " },{ label: "Taurus âï¸ 20April - 20May", category: "Collection", url: "/collections/kado-untuk-zodiak-taurus", images: " ", price: " " },{ label: "Teddy Bear", category: "Collection", url: "/collections/boneka-teddy-bear", images: " ", price: " " },{ label: "Teh", category: "Collection", url: "/collections/teh", images: " ", price: " " },{ label: "Test Error", category: "Collection", url: "/collections/test-error", images: " ", price: " " },{ label: "Testing", category: "Collection", url: "/collections/testing", images: " ", price: " " },{ label: "Thank You", category: "Collection", url: "/collections/rangkaian-bunga-ucapan-terima-kasih", images: " ", price: " " },{ label: "The Classic Astoria", category: "Collection", url: "/collections/astoria", images: " ", price: " " },{ label: "The Classic Enchanted Dome", category: "Collection", url: "/collections/enchanted-dome", images: " ", price: " " },{ label: "The Enchanted Love Pirouette Special Edition", category: "Collection", url: "/collections/the-enchanted-love-pirouette-special-edition", images: " ", price: " " },{ label: "The F Thing", category: "Collection", url: "/collections/the-f-thing", images: " ", price: " " },{ label: "The First", category: "Collection", url: "/collections/the-first", images: " ", price: " " },{ label: "The Novo Astoria", category: "Collection", url: "/collections/the-novo-astoria", images: " ", price: " " },{ label: "The Novo Enchanted Dome", category: "Collection", url: "/collections/the-novo-enchanted-dome", images: " ", price: " " },{ label: "The Novo Enchanted Dome Special Edition", category: "Collection", url: "/collections/the-novo-enchanted-dome-special-edition", images: " ", price: " " },{ label: "The Palace", category: "Collection", url: "/collections/the-palace", images: " ", price: " " },{ label: "Ties", category: "Collection", url: "/collections/dasi", images: " ", price: " " },{ label: "Tisane", category: "Collection", url: "/collections/tisane", images: " ", price: " " },{ label: "Toko Bunga Aceh", category: "Collection", url: "https://hotelverta.com/-aceh", images: " ", price: " " },{ label: "Toko Bunga Ambon", category: "Collection", url: "https://hotelverta.com/-ambon", images: " ", price: " " },{ label: "Toko Bunga Atambua", category: "Collection", url: "https://hotelverta.com/-atambua", images: " ", price: " " },{ label: "Toko Bunga Bali", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Balikpapan", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " }
13872,{ label: "Toko Bunga Bandar Lampung", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Bandung", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Bandung Barat", category: "Collection", url: "https://hotelverta.com/-barat", images: " ", price: " " },{ label: "Toko Bunga Banjarmasin", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Banten", category: "Collection", url: "https://hotelverta.com/-banten", images: " ", price: " " },{ label: "Toko Bunga Banyumas", category: "Collection", url: "https://hotelverta.com/-banyumas", images: " ", price: " " },{ label: "Toko Bunga Banyuwangi", category: "Collection", url: "https://hotelverta.com/-banyuwangi", images: " ", price: " " },{ label: "Toko Bunga Batam", category: "Collection", url: "https://hotelverta.com/-batam", images: " ", price: " " },{ label: "Toko Bunga Baubau", category: "Collection", url: "https://hotelverta.com/-baubau", images: " ", price: " " },{ label: "Toko Bunga Bekasi", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Bengkalis", category: "Collection", url: "https://hotelverta.com/-bengkalis", images: " ", price: " " },{ label: "Toko Bunga Bengkayang", category: "Collection", url: "https://hotelverta.com/-bengkayang", images: " ", price: " " },{ label: "Toko Bunga Binjai", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Bintaro", category: "Collection", url: "https://hotelverta.com/-bintaro", images: " ", price: " " },{ label: "Toko Bunga Blitar", category: "Collection", url: "https://hotelverta.com/-blitar", images: " ", price: " " },{ label: "Toko Bunga Blora", category: "Collection", url: "https://hotelverta.com/-blora", images: " ", price: " " },{ label: "Toko Bunga Bogor", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Bojonegoro", category: "Collection", url: "https://hotelverta.com/-bojonegoro", images: " ", price: " " },{ label: "Toko Bunga Boyolali", category: "Collection", url: "https://hotelverta.com/-boyolali", images: " ", price: " " },{ label: "Toko Bunga Brebes", category: "Collection", url: "https://hotelverta.com/-brebes", images: " ", price: " " },{ label: "Toko Bunga Bukittinggi", category: "Collection", url: "https://hotelverta.com/-bukittinggi", images: " ", price: " " },{ label: "Toko Bunga Buleleng", category: "Collection", url: "https://hotelverta.com/-buleleng", images: " ", price: " " },{ label: "Toko Bunga Cakung", category: "Collection", url: "https://hotelverta.com/-cakung", images: " ", price: " " },{ label: "Toko Bunga Cawang", category: "Collection", url: "https://hotelverta.com/-cawang", images: " ", price: " " },{ label: "Toko Bunga Cempaka Putih", category: "Collection", url: "https://hotelverta.com/-cempaka-putih", images: " ", price: " " },{ label: "Toko Bunga Cengkareng", category: "Collection", url: "https://hotelverta.com/-cengkareng", images: " ", price: " " },{ label: "Toko Bunga Ciamis", category: "Collection", url: "https://hotelverta.com/-ciamis", images: " ", price: " " },{ label: "Toko Bunga Cianjur", category: "Collection", url: "https://hotelverta.com/-cianjur", images: " ", price: " " },{ label: "Toko Bunga Cibinong", category: "Collection", url: "https://hotelverta.com/-cibinong", images: " ", price: " " },{ label: "Toko Bunga Cibubur", category: "Collection", url: "https://hotelverta.com/-cibubur", images: " ", price: " " },{ label: "Toko Bunga Cijantung", category: "Collection", url: "https://hotelverta.com/-cijantung", images: " ", price: " " },{ label: "Toko Bunga Cikarang", category: "Collection", url: "https://hotelverta.com/-cikarang", images: " ", price: " " },{ label: "Toko Bunga Cikini", category: "Collection", url: "https://hotelverta.com/-cikini", images: " ", price: " " },{ label: "Toko Bunga Cilacap", category: "Collection", url: "https://hotelverta.com/-cilacap", images: " ", price: " " },{ label: "Toko Bunga Cilandak", category: "Collection", url: "https://hotelverta.com/-cilandak", images: " ", price: " " },{ label: "Toko Bunga Cileunyi", category: "Collection", url: "https://hotelverta.com/-cileunyi", images: " ", price: " " },{ label: "Toko Bunga Ciracas", category: "Collection", url: "https://hotelverta.com/-ciracas", images: " ", price: " " },{ label: "Toko Bunga Cirebon", category: "Collection", url: "https://hotelverta.com/-cirebon", images: " ", price: " " }
13872,{ label: "Toko Bunga Ciwidey", category: "Collection", url: "https://hotelverta.com/-ciwidey", images: " ", price: " " },{ label: "Toko Bunga Danau Toba", category: "Collection", url: "https://hotelverta.com/-danau-toba", images: " ", price: " " },{ label: "Toko Bunga Demak", category: "Collection", url: "https://hotelverta.com/-demak", images: " ", price: " " },{ label: "Toko Bunga Denpasar", category: "Collection", url: "https://hotelverta.com/-denpasar", images: " ", price: " " },{ label: "Toko Bunga Depok", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Duren Sawit", category: "Collection", url: "https://hotelverta.com/-duren-sawit", images: " ", price: " " },{ label: "Toko Bunga Garut", category: "Collection", url: "https://hotelverta.com/-garut", images: " ", price: " " },{ label: "Toko Bunga Gianyar", category: "Collection", url: "https://hotelverta.com/-gianyar", images: " ", price: " " },{ label: "Toko Bunga Gowa", category: "Collection", url: "https://hotelverta.com/-gowa", images: " ", price: " " },{ label: "Toko Bunga Gresik", category: "Collection", url: "https://hotelverta.com/-gresik", images: " ", price: " " },{ label: "Toko Bunga Grobogan", category: "Collection", url: "https://hotelverta.com/-grobogan", images: " ", price: " " },{ label: "Toko Bunga Grogol", category: "Collection", url: "https://hotelverta.com/-grogol", images: " ", price: " " },{ label: "Toko Bunga Gunungkidul", category: "Collection", url: "https://hotelverta.com/-gunungkidul", images: " ", price: " " },{ label: "Toko Bunga Indramayu", category: "Collection", url: "https://hotelverta.com/-indramayu", images: " ", price: " " },{ label: "Toko Bunga Jakarta", category: "Collection", url: "https://hotelverta.com/-jakarta", images: " ", price: " " },{ label: "Toko Bunga Jakarta Barat", category: "Collection", url: "https://hotelverta.com/-jakarta-barat", images: " ", price: " " },{ label: "Toko Bunga Jakarta Pusat", category: "Collection", url: "https://hotelverta.com/-jakarta-pusat", images: " ", price: " " },{ label: "Toko Bunga Jakarta Selatan", category: "Collection", url: "https://hotelverta.com/-jakarta-selatan", images: " ", price: " " },{ label: "Toko Bunga Jakarta Timur", category: "Collection", url: "https://hotelverta.com/-jakarta-timur", images: " ", price: " " },{ label: "Toko Bunga Jakarta Utara", category: "Collection", url: "https://hotelverta.com/-jakarta-utara", images: " ", price: " " },{ label: "Toko Bunga Jambi", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Jatinegara", category: "Collection", url: "https://hotelverta.com/-jatinegara", images: " ", price: " " },{ label: "Toko Bunga Jawa & Bali", category: "Collection", url: "https://hotelverta.com/-jawa-bali", images: " ", price: " " },{ label: "Toko Bunga Jayapura", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Jelambar - Florist Onine 24 Jam", category: "Collection", url: "https://hotelverta.com/-jelambar", images: " ", price: " " },{ label: "Toko Bunga Jember", category: "Collection", url: "https://hotelverta.com/-jember", images: " ", price: " " },{ label: "Toko Bunga Jembrana", category: "Collection", url: "https://hotelverta.com/-jembrana", images: " ", price: " " },{ label: "Toko Bunga Jepara", category: "Collection", url: "https://hotelverta.com/-jepara", images: " ", price: " " },{ label: "Toko Bunga Joglo", category: "Collection", url: "https://hotelverta.com/-joglo", images: " ", price: " " },{ label: "Toko Bunga Jombang", category: "Collection", url: "https://hotelverta.com/-jombang", images: " ", price: " " },{ label: "Toko Bunga Kalibata", category: "Collection", url: "https://hotelverta.com/-kalibata", images: " ", price: " " },{ label: "Toko Bunga Kalimantan", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Kalisari Semarang", category: "Collection", url: "https://hotelverta.com/-kalisari-semarang", images: " ", price: " " },{ label: "Toko Bunga Kampung Baru", category: "Collection", url: "https://hotelverta.com/-kampung-baru", images: " ", price: " " },{ label: "Toko Bunga Kapuas", category: "Collection", url: "https://hotelverta.com/-kapuas", images: " ", price: " " },{ label: "Toko Bunga Karanganyar", category: "Collection", url: "https://hotelverta.com/-karanganyar", images: " ", price: " " },{ label: "Toko Bunga Karangasem", category: "Collection", url: "https://hotelverta.com/-karangasem", images: " ", price: " " },{ label: "Toko Bunga Karawang", category: "Collection", url: "https://hotelverta.com/-karawang", images: " ", price: " " },{ label: "Toko Bunga Kartosuro", category: "Collection", url: "https://hotelverta.com/-kartosuro", images: " ", price: " " },{ label: "Toko Bunga Kayoon Surabaya", category: "Collection", url: "https://hotelverta.com/-kayoon-surabaya", images: " ", price: " " },{ label: "Toko Bunga Kebayoran Baru", category: "Collection", url: "https://hotelverta.com/-kebayoran-baru", images: " ", price: " " },{ label: "Toko Bunga Kebon Jeruk", category: "Collection", url: "https://hotelverta.com/-kebon-jeruk", images: " ", price: " " },{ label: "Toko Bunga Kebumen", category: "Collection", url: "https://hotelverta.com/-kebumen", images: " ", price: " " },{ label: "Toko Bunga Kediri", category: "Collection", url: "https://hotelverta.com/-kediri", images: " ", price: " " },{ label: "Toko Bunga Kelapa Gading", category: "Collection", url: "https://hotelverta.com/-kelapa-gading", images: " ", price: " " },{ label: "Toko Bunga Kemayoran", category: "Collection", url: "https://hotelverta.com/-kemayoran", images: " ", price: " " },{ label: "Toko Bunga Kendal", category: "Collection", url: "https://hotelverta.com/-kendal", images: " ", price: " " },{ label: "Toko Bunga Kendari", category: "Collection", url: "https://hotelverta.com/-kendari", images: " ", price: " " },{ label: "Toko Bunga Ketapang", category: "Collection", url: "https://hotelverta.com/-ketapang", images: " ", price: " " },{ label: "Toko Bunga Klaten", category: "Collection", url: "https://hotelverta.com/-klaten", images: " ", price: " " },{ label: "Toko Bunga Klender", category: "Collection", url: "https://hotelverta.com/-klender", images: " ", price: " " },{ label: "Toko Bunga Kota Baru Yogyakarta", category: "Collection", url: "https://hotelverta.com/-kota-baru-yogyakarta", images: " ", price: " " },{ label: "Toko Bunga Kota Batu", category: "Collection", url: "https://hotelverta.com/-kota-batu", images: " ", price: " " },{ label: "Toko Bunga Kramat Jati", category: "Collection", url: "https://hotelverta.com/-kramat-jati", images: " ", price: " " },{ label: "Toko Bunga Kudus", category: "Collection", url: "https://hotelverta.com/-kudus", images: " ", price: " " },{ label: "Toko Bunga Kupang", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Lamongan", category: "Collection", url: "https://hotelverta.com/-lamongan", images: " ", price: " " },{ label: "Toko Bunga Langkat", category: "Collection", url: "https://hotelverta.com/-langkat", images: " ", price: " " },{ label: "Toko Bunga Lebak Bulus", category: "Collection", url: "https://hotelverta.com/-lebak-bulus", images: " ", price: " " },{ label: "Toko Bunga Lembang", category: "Collection", url: "https://hotelverta.com/-lembang", images: " ", price: " " },{ label: "Toko Bunga Lenteng Agung", category: "Collection", url: "https://hotelverta.com/-lenteng-agung", images: " ", price: " " },{ label: "Toko Bunga Lombok", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Lubuk Pakam", category: "Collection", url: "https://hotelverta.com/-lubuk-pakam", images: " ", price: " " },{ label: "Toko Bunga Lumajang", category: "Collection", url: "https://hotelverta.com/-lumajang", images: " ", price: " " },{ label: "Toko Bunga Madiun", category: "Collection", url: "https://hotelverta.com/-madiun", images: " ", price: " " },{ label: "Toko Bunga Magelang", category: "Collection", url: "https://hotelverta.com/-magelang", images: " ", price: " " },{ label: "Toko Bunga Majalengka", category: "Collection", url: "https://hotelverta.com/-majalengka", images: " ", price: " " },{ label: "Toko Bunga Makassar", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Malang", category: "Collection", url: "https://hotelverta.com/-malang", images: " ", price: " " },{ label: "Toko Bunga Manado", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Mangga Besar", category: "Collection", url: "https://hotelverta.com/-mangga-besar", images: " ", price: " " },{ label: "Toko Bunga Manokwari", category: "Collection", url: "https://hotelverta.com/-manokwari", images: " ", price: " " },{ label: "Toko Bunga Maros", category: "Collection", url: "https://hotelverta.com/-maros", images: " ", price: " " },{ label: "Toko Bunga Mataram", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Medan", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " },{ label: "Toko Bunga Mojokerto", category: "Collection", url: "https://hotelverta.com/-mojokerto", images: " ", price: " " },{ label: "Toko Bunga Nganjuk", category: "Collection", url: "https://hotelverta.com/-nganjuk", images: " ", price: " " },{ label: "Toko Bunga Ngawi", category: "Collection", url: "https://hotelverta.com/-ngawi", images: " ", price: " " },{ label: "Toko Bunga Nias", category: "Collection", url: "https://hotelverta.com/-nias", images: " ", price: " " },{ label: "Toko Bunga Nusa Tenggara", category: "Collection", url: "https://hotelverta.com/", images: " ", price: " " }, 13873 { label: "grand salutation jabodetabek", category: "Produk", url: "/products/grand-salutation", images: "https://outerbloom.com/cdn/shop/files/JKTCON1005_Grand-Salutation-Jabodetabek-WM_thumb.jpg?v=1703241523", price: "Rp 435.000" },{ label: "consolantibus jabodetabek", category: "Produk", url: "/products/consolantibus", images: "https://outerbloom.com/cdn/shop/files/JKTDUK1011_Consolantibus-Jabodetabek-WM_thumb.jpg?v=1703239823", price: "Rp 435.000" },{ label: "classic midnight hand bouquet fiery red", category: "Produk", url: "/products/the-classic-midnight-hand-bouquet-fiery-red", images: "https://outerbloom.com/cdn/shop/files/OBVBUN1422_Classic-Midnight-Hand-Bouquet---Fiery-Red-large_thumb.jpg?v=1757302521", price: "Rp 385.000" },{ label: "endearing ruby", category: "Produk", url: "/products/endearing-ruby", images: "https://outerbloom.com/cdn/shop/products/OUTSTF1003_Endearing-Ruby_thumb.jpg?v=1631296611", price: "Rp 1.386.737" },{ label: "gentle soul jabodetabek", category: "Produk", url: "/products/gentle-soul-jabodetabek", images: "https://outerbloom.com/cdn/shop/files/JKTDUK1030_Gentle-Soul-Jabodetabek-WM_thumb.jpg?v=1703239894", price: "Rp 435.000" },{ label: "belleza jabodetabek", category: "Produk", url: "/products/belleza", images: "https://outerbloom.com/cdn/shop/files/Belleza-Jabodetabek-LED_aecb756a-0737-45cc-8bfb-008515ca0a37_thumb.gif?v=1759229680", price: "Rp 435.000" },{ label: "sentiments jabodetabek", category: "Produk", url: "/products/sentiments", images: "https://outerbloom.com/cdn/shop/files/Sentiments-Jabodetabek-WM_thumb.jpg?v=1759224099", price: "Rp 485.000" }
13873,{ label: "majestic pink roses with baby breath bouquet", category: "Produk", url: "/products/majestic-pink-roses-with-baby-breath-bouquet", images: "https://outerbloom.com/cdn/shop/products/ef4a3be9-c938-4c70-98ac-4873e7da82bf_90820a66-923a-463d-a464-81bcbe6e6644_thumb.jpg?v=1581413440", price: "Rp 485.000" },{ label: "rose poetry bouquet", category: "Produk", url: "/products/rose-poetry-bouquet", images: "https://outerbloom.com/cdn/shop/products/Rose-Poetry-Bouquet-20-tangkai_thumb.jpg?v=1675151039", price: "Rp 385.000" },{ label: "genuine feeling", category: "Produk", url: "/products/genuine-feeling", images: "https://outerbloom.com/cdn/shop/products/OUTSTF1004Genuine-Feeling_981ade89-af27-433e-81aa-8d76175a0e4d_thumb.jpg?v=1612352389", price: "Rp 1.386.737" },{ label: "eternal fidelity jabodetabek", category: "Produk", url: "/products/eternal-fidelity-jabodetabek", images: "https://outerbloom.com/cdn/shop/products/0b89df45-dcc1-4876-820e-61b2243a1945_964e211d-2972-46c9-8593-976210929089_thumb.jpg?v=1590491458", price: "Rp 435.000" },{ label: "rosabelle hand bouquet", category: "Produk", url: "/products/rosabelle-hand-bouquet", images: "https://outerbloom.com/cdn/shop/files/OBVBUN1429_Rosabelle-Hand-Bouquet-Medium_thumb.jpg?v=1756971848", price: "Rp 385.000" },{ label: "dreaming in pink luxury in vase", category: "Produk", url: "/products/dreaming-in-pink-luxury-in-vase", images: "https://outerbloom.com/cdn/shop/products/OBVBUN1051_Dreaming-In-Pink-Luxury-In-Vase_3_thumb.jpg?v=1614594504", price: "Rp 8.008.008" },{ label: "excito jabodetabek", category: "Produk", url: "/products/excito", images: "https://outerbloom.com/cdn/shop/files/JKTCON1010_Excito-Jabodetabek-2023_thumb.gif?v=1717494677", price: "Rp 485.000" },{ label: "spirit of eminance jabodetabek", category: "Produk", url: "/products/spirit-of-eminance-jabodetabek", images: "https://outerbloom.com/cdn/shop/files/JKTCON1026_Spirit-of-Eminance-Jabodetabek-newest-WM_thumb.jpg?v=1693297526", price: "Rp 485.000" },{ label: "golden toast jabodetabek", category: "Produk", url: "/products/golden-toast", images: "https://outerbloom.com/cdn/shop/products/LED-GoldenToast_thumb.gif?v=1579249585", price: "Rp 485.000" },{ label: "white elysian bloom box", category: "Produk", url: "/products/white-elysian-bloom-box", images: "https://outerbloom.com/cdn/shop/files/OBVBUN1704_White-Elysian-Bloom-Box_thumb.jpg?v=1757328247", price: "Rp 685.000" },{ label: "charming forevermore jabodetabek", category: "Produk", url: "/products/charming-forevermore-jabodetabek", images: "https://outerbloom.com/cdn/shop/files/JKTWED1036_Charming-Forevermore-Jabodetabek-WM_thumb.jpg?v=1703239534", price: "Rp 485.000" },{ label: "moment of glory jabodetabek", category: "Produk", url: "/products/moment-of-glory-jabodetabek", images: "https://outerbloom.com/cdn/shop/products/JKTCON1051_Moment-of-Glory-Jabodetabek_2_thumb.jpg?v=1596614663", price: "Rp 385.000" },{ label: "with love bouquet", category: "Produk", url: "/products/with-love-bouquet", images: "https://outerbloom.com/cdn/shop/products/c5d6fed6-8ada-4c38-ae0f-36d395aacb19_613f78f0-d52c-443b-9e13-63a151cd8ec5_thumb.jpg?v=1590748429", price: "Rp 535.000" },{ label: "sincerely", category: "Produk", url: "/products/sincerely", images: "https://outerbloom.com/cdn/shop/files/Sincerely-WM_thumb.jpg?v=1688354677", price: "Rp 1.386.737" },{ label: "passion rouge bloom box", category: "Produk", url: "/products/passion-rouge-bloom-box", images: "https://outerbloom.com/cdn/shop/files/OBVBUN1725_Passion-Rouge-Bloom-Box_thumb.jpg?v=1756972410", price: "Rp 385.000" },{ label: "sweet romance jabodetabek", category: "Produk", url: "/products/sweet-romance", images: "https://outerbloom.com/cdn/shop/products/JKTWED1005_Sweet-Romance-Jabodetabek_thumb.gif?v=1677134791", price: "Rp 635.000" },{ label: "sunflower yellow and with white daisies in vase", category: "Produk", url: "/products/sunflower-yellow-roses-with-white-and-yellow-daisies-in-a-glass-vase", images: "https://outerbloom.com/cdn/shop/files/OBVBUN1132_Sunflower-Yellow-And-With-White-Daisies-in-Vase_thumb.jpg?v=1757930628", price: "Rp 435.000" },{ label: "everlasting peace jabodetabek", category: "Produk", url: "/products/everlasting-peace-jabodetabek", images: "https://outerbloom.com/cdn/shop/products/JKTDUK1034_Everlasting-Peace-Jabodetabek_2_thumb.jpg?v=1596614613", price: "Rp 385.000" },{ label: "classic purple orchid majesty in vase", category: "Produk", url: "/products/classic-purple-orchid-majesty-in-vase", images: "https://outerbloom.com/cdn/shop/products/Classic-Purple-Orchid-Majesty-in-Vase---White---4-Tangkai_40a5e337-283f-40f5-911c-5df9b506b9da_thumb.jpg?v=1639981404", price: "Rp 435.000" },{ label: "classic white orchid majesty in vase", category: "Produk", url: "/products/classic-white-orchid-majesty-in-vase", images: "https://outerbloom.com/cdn/shop/products/Classic-white-Orchid-Majesty-in-Vase---white---4-Tangkai_thumb.jpg?v=1644205542", price: "Rp 435.000" }
13873,{ label: "black pink bouquet", category: "Produk", url: "/products/black-pink-bouquet", images: "https://outerbloom.com/cdn/shop/files/Black-Pink-Bouquet_thumb.jpg?v=1756434063", price: "Rp 485.000" },{ label: "majestic blue romance bouquet", category: "Produk", url: "/products/majestic-blue-romance-bouquet", images: "https://outerbloom.com/cdn/shop/files/OBVBUN1357_Majestic-Blue-Romance-Bouquet_99b8ba96-0e67-4eef-a00e-b2daedcddb6a_thumb.jpg?v=1757390540", price: "Rp 435.000" },{ label: "happy days jabodetabek", category: "Produk", url: "/products/happy-days-jabodetabek", images: "https://outerbloom.com/cdn/shop/files/Happy-Days-Jabodetabek_WM_thumb.jpg?v=1759224026", price: "Rp 485.000" },{ label: "solemn comfort jabodetabek", category: "Produk", url: "/products/solemn-comfort-jabodetabek", images: "https://outerbloom.com/cdn/shop/products/7fe123d8-6bb2-4c0d-bd4c-f8c3032823f2_6b9c33b6-4a23-41cb-8709-fc9223fe096a_thumb.png?v=1590662086", price: "Rp 635.000" },{ label: "pink darling bouquet", category: "Produk", url: "/products/pink-darling-bouquet", images: "https://outerbloom.com/cdn/shop/products/Pink-Darling-Bouquet_thumb.jpg?v=1669969725", price: "Rp 485.000" },{ label: "profound happiness jabodetabek", category: "Produk", url: "/products/profound-happiness-jabodetabek", images: "https://outerbloom.com/cdn/shop/files/profound-happiness_thumb.gif?v=1689940309", price: "Rp 635.000" },{ label: "big dreams jabodetabek", category: "Produk", url: "/products/big-dreams", images: "https://outerbloom.com/cdn/shop/files/JKTCON1002_Big-Dreams-Jabodetabek_thumb.gif?v=1717494603", price: "Rp 485.000" },{ label: "amorous amos jabodetabek", category: "Produk", url: "/products/amorous-amos-jabodetabek", images: "https://outerbloom.com/cdn/shop/files/Amorous-Amos-Jabodetabek-WM_thumb.jpg?v=1759224071", price: "Rp 485.000" },{ label: "signature ramadan deluxe hampers", category: "Produk", url: "/products/outerbloom-signature-ramadhan-deluxe-hampers", images: "https://outerbloom.com/cdn/shop/files/Deluxe-Hampers_e16636a3-3c6b-4ac2-9e17-eb20579111cd_thumb.jpg?v=1769675273", price: "Rp 985.000" },{ label: "sincerity solace", category: "Produk", url: "/products/sincerity-solace", images: "https://outerbloom.com/cdn/shop/products/OUTSTF1038_sincerity-solace-WM_thumb.jpg?v=1612352477", price: "Rp 485.000" },{ label: "love symphony bloom box", category: "Produk", url: "/products/love-symphony-bloom-box", images: "https://outerbloom.com/cdn/shop/files/Love-Symphony-Bloom-Box_thumb.jpg?v=1701939722", price: "Rp 685.000" },{ label: "blue concerto", category: "Produk", url: "/products/blue-concerto", images: "https://outerbloom.com/cdn/shop/files/Blue-Concerto-WM_thumb.jpg?v=1723708248", price: "Rp 1.386.737" },{ label: "healing trove", category: "Produk", url: "/products/healing-trove", images: "https://outerbloom.com/cdn/shop/products/2ef5379f-27a6-41ba-85c7-c65cf3ec3f08_thumb.jpg?v=1571471845", price: "Rp 485.000" },{ label: "bellarosa bloom box", category: "Produk", url: "/products/bellarosa-bloom-box", images: "https://outerbloom.com/cdn/shop/files/OBVBUN1783_Bellarosa-Bloom-Box_c0000424-411c-48ed-abf4-0de7d925ea53_thumb.jpg?v=1757316757", price: "Rp 785.000" }, 13874 ]; 13875 13876 13877 $( ".header-input-search" ).catcomplete({ 13878 appendTo: ".searchResult",source: function(request, response) { 13879 var results = $.ui.autocomplete.filter(data, request.term); 13880 var predicate = function () { 13881 var counter = { Collection: 0, Produk: 0 }; 13882 var fn = function(item) {counter[item.category] += 1;return (counter[item.category] <= 5);} 13883 return fn 13884 }(); 13885 response(results.filter(predicate)); 13886 }, 13887 minLength:1, 13888 //results are clickable 13889 select: function( event, ui ) {window.location = ui.item.url;} 13890}); 13891$( ".header-input-search2" ).catcomplete({ 13892 appendTo: ".searchResult2", 13893 source: function(request, response) { 13894 var results = $.ui.autocomplete.filter(data, request.term); 13895 var predicate = function () { 13896 var counter = { Collection: 0, Produk: 0 }; 13897 var fn = function(item) { 13898 counter[item.category] += 1; 13899 return (counter[item.category] <= 5); 13900} 13901 return fn 13902 }(); 13903response(results.filter(predicate)); 13904}, 13905 minLength:1, 13906 //results are clickable 13907 select: function( event, ui ) { 13908 window.location = ui.item.url; 13909 } 13910}); 13911}); 13912</script>
13912 13913 13914
13914<script src="https://outerbloom.com/cdn/shop/t/138/assets/vendors.js?v=6349622868601634021752652419" defer></script>
vendor: 2 bytes, line 13914
13914
13915<script src="https://outerbloom.com/cdn/shop/t/138/assets/app.js?v=110161375600675176711769541235" defer></script>
13915 13916
13917<script> 13918 ( function() { 13919 var youtube = document.querySelectorAll( ".youtube" ); 13920 for (var i = 0; i < youtube.length; i++) { 13921 var source = "https://img.youtube.com/vi/"+ youtube[i].dataset.embed +"/sddefault_1x.jpg"; 13922 var datasource = "https://img.youtube.com/vi/"+ youtube[i].dataset.embed +"/sddefault.jpg"; 13923 var image = new Image(); 13924 image.src = source; 13925 image.setAttribute("data-src", datasource); 13926 image.classList.add("swiper-lazy"); 13927 image.addEventListener( "load", function() { 13928 youtube[ i ].appendChild( image ); 13929 }( i ) ); 13930 youtube[i].addEventListener( "click", function() { 13931 var iframe = document.createElement( "iframe" ); 13932 iframe.setAttribute( "width", "480" ); 13933 iframe.setAttribute( "height", "480" ); 13934 iframe.setAttribute( "frameborder", "0" ); 13935 iframe.setAttribute( "allowfullscreen", "" ); 13936 iframe.setAttribute( "src", "https://www.youtube.com/embed/"+ this.dataset.embed +"?rel=0&showinfo=0&autoplay=1" ); 13937 this.innerHTML = ""; 13938 this.appendChild( iframe ); 13939 } ); 13940 }; 13941 13942 } )(); 13943 13944 /* Lazy Load */ 13945 if (typeof mainLazyLoad === 'undefined') { 13946 var mainLazyLoad = new LazyLoad({threshold:400}); 13947 } 13948 $(document).ready(function(){ 13949 13950 $("selectxxx").addClass("needsclick"); 13951 FastClick.attach(document.body); 13952 13953 // Only initialize select2 on desktop screens (width > 992px) 13954 if ($(window).width() > 992) { 13955 var $customSelects = $('.select-search'); 13956 $customSelects.select2({ 13957 templateResult: function(result, container) { 13958 if (!result.id) { 13959 return result.text; 13960 } 13961 container.className += ' needsclick'; 13962 return result.text; 13963 } 13964 }); 13965 $customSelects.each(function(index, el){$(el).data('select2').$container.find('*').addClass('needsclick');}); 13966 $(document).on('select2:open', () => { 13967 document.querySelector('.select2-search__field').focus(); 13968 }); 13969 } 13970 13971 13972 $(".overlay").click(function(){ 13973 $(".js-drawer-close").click(); 13974 }); 13975 $(".site-nav--mobile .js-drawer-open-left, #NavDrawer .icon-close, .overlay-nav").click(function(){ 13976 $("html").toggleClass("nav_open"); 13977 }); 13978 13979 $('.swatch-element label').on('click', function(){ 13980 var srcImg = $(this).data('src'); 13981 $('#thumb-image-product .product-single__thumbnail').each(function(){ 13982 if ($(this).attr("href") == srcImg) { 13983 $(this).trigger('click'); 13984 } 13985 }); 13986 }); 13987 var defaultValue = $(".swatch input:checked").val() 13988 13989 $('#purchaseProduct .swatch [type=radio]').change(function() { 13990 var optionIndex = $(this).closest('.swatch').attr('data-option-index'); 13991 var optionValue = $(this).val(); 13992 console.log(optionIndex, optionValue) 13993 var value = parseInt(optionValue.split(' ')[0]) 13994 $(this) 13995 .closest('#purchaseProduct') 13996 .find('.single-option-selector') 13997 .eq(optionIndex) 13998 .val(optionValue) 13999 .trigger('change'); 14000 14001 }); 14002 14003 }); 14004 $(document).ready(function(){ 14005 $(".nav-search a").click(function(e){ 14006 e.preventDefault(); 14007 $(".icon-navsearch").toggle(); 14008 $(".icon-navclose").toggle(); 14009 $(".site-nav__item > .site-nav__link").toggle(); 14010 $(".open-search").toggle(); 14011 $(".open-search input").focus(); 14012 }); 14013 $(".best-price-guarantee").html("<img src='https://outerbloom.com/cdn/shop/t/138/assets/logo-best-price-guarantee-grid_75x.png?v=72489032173169839651752652420' alt='Logo Best Price Guarantee'>"); 14014 if ($(window).width() < 768) { 14015 $(".bg-products .label-tag.valentine").html("<img src='https://outerbloom.com/cdn/shop/t/138/assets/icon-valentine_30x.png?v=128458483378922561591768211980' alt='Icon Valentine'>"); 14016 $(".bg-products .label-tag.cny").html("<img src='https://outerbloom.com/cdn/shop/t/138/assets/icon-cny_45x.png?v=101884295148001743851752652418' alt='Icon CNY'>"); 14017 $(".bg-products .label-tag.free-valentine").html("<img src='https://outerbloom.com/cdn/shop/t/138/assets/free-valentine_150x.png?v=171641187769238175351752652421' alt='Icon Free Valentine'>"); 14018 } else { 14019 $(".bg-products .label-tag.valentine").html("<img src='https://outerbloom.com/cdn/shop/t/138/assets/icon-valentine_30x.png?v=128458483378922561591768211980' alt='Icon Valentine'>"); 14020 $(".bg-products .label-tag.cny").html("<img src='https://outerbloom.com/cdn/shop/t/138/assets/icon-cny_60x.png?v=101884295148001743851752652418' alt='Icon CNY'>"); 14021 $(".bg-products .label-tag.free-valentine").html("<img src='https://outerbloom.com/cdn/shop/t/138/assets/free-valentine_200x.png?v=171641187769238175351752652421' alt='Icon Free Valentine'>"); 14022 } 14023 $(".bg-products .label-tag.free-cookies").html("<img src='https://outerbloom.com/cdn/shop/t/138/assets/free-cookies_80x.png?v=57303' alt='Icon Free Cookies'>"); 14024 $(".bg-products .label-tag.mothersday").html("<img src='https://outerbloom.com/cdn/shop/t/138/assets/mothers-day_70x.png?v=171373711354766377891752652419' alt='Icon Mothers day'>"); 14025 }); 14026</script>
14026 14027 14028 14029
14029<script> 14030 /* Lazy Load */ 14031 if (typeof mainLazyLoad === 'undefined') { 14032 var mainLazyLoad = new LazyLoad({threshold:400}); 14033 } 14034 14035 // Function to initialize select2 when it's ready (only on desktop >992px) 14036 function initializeSelect2() { 14037 // Only initialize select2 on desktop screens (width > 992px) 14038 if ($(window).width() <= 992) { 14039 return; 14040 } 14041 14042 var $customSelects = $('.select-search'); 14043 14044 if ($customSelects.length > 0 && typeof $.fn.select2 !== 'undefined') { 14045 try { 14046 $customSelects.select2({ 14047 templateResult: function(result, container) { 14048 if (!result.id) { 14049 return result.text; 14050 } 14051 container.className += ' needsclick'; 14052 return result.text; 14053 } 14054 }); 14055 $customSelects.each(function(index, el){ 14056 $(el).data('select2').$container.find('*').addClass('needsclick'); 14057 }); 14058 console.log('Select2 initialized successfully'); 14059 } catch(e) { 14060 console.warn('Select2 initialization failed:', e); 14061 } 14062 } else if ($customSelects.length > 0) { 14063 // Retry after a short delay if select2 is not yet loaded 14064 setTimeout(initializeSelect2, 100); 14065 } 14066 } 14067 14068 $(document).ready(function(){ 14069 $("select").addClass("needsclick"); 14070 14071 if (typeof FastClick !== 'undefined') { 14072 FastClick.attach(document.body); 14073 } 14074 14075 // Initialize select2 with retry mechanism 14076 initializeSelect2(); 14077 14078 $(".overlay").click(function(){ 14079 $(".js-drawer-close").click(); 14080 }); 14081 $(".site-nav--mobile .js-drawer-open-left, #NavDrawer .icon-close, .overlay-nav").click(function(){ 14082 $("html").toggleClass("nav_open"); 14083 }); 14084 14085 // Wait for Shopify OptionSelectors to be initialized 14086 setTimeout(function() { 14087 // Remove any existing handlers first 14088 $('.swatch :radio').off('change.swatchHandler'); 14089 14090 // Attach new handler with namespace - use event delegation 14091 $(document).off('change.swatchHandler', '.swatch :radio'); 14092 $(document).on('change.swatchHandler', '.swatch :radio', function() { 14093 var optionIndex = $(this).closest('.swatch').attr('data-option-index'); 14094 var optionValue = $(this).val(); 14095 14096 // Find the corresponding single option selector 14097 var $selector = $('.single-option-selector[data-index="option' + (parseInt(optionIndex) + 1) + '"]'); 14098 14099 // If not found, try alternative selector 14100 if ($selector.length === 0) { 14101 $selector = $('#productSelect-option-' + optionIndex); 14102 } 14103 14104 // If still not found, try finding by position 14105 if ($selector.length === 0) { 14106 $selector = $('.single-option-selector').eq(optionIndex); 14107 } 14108 14109 if ($selector.length > 0) { 14110 $selector.val(optionValue).trigger('change'); 14111 } 14112 }); 14113 }, 300); 14114 14115 }); 14116 $(window).load(function(){ 14117 $(".best-price-guarantee").html("<img src='https://outerbloom.com/cdn/shop/t/138/assets/logo-best-price-guarantee-grid_65x.png?v=72489032173169839651752652420' alt='Logo Best Price Guarantee'>"); 14118 }); 14119</script>
14119 14120 14121 14122 14123 14124 14125 14126 14127 14128
14128<script type="text/javascript"> 14129 var wishlistpage = 0; 14130 14131 var quickShop_money_format="<span class='money'>"+"Rp {{amount_no_decimals}}"+"</span>"; 14132 </script>
14132 14133 14134 <!-- Remove duplicate wishlist.js reference --> 14135 <style> 14136 .fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:999999;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.fade.in{opacity:1}.modal-open .modal{overflow-x:hidden;overflow-y:auto;z-index:999999;background-color:rgba(0,0,0,.3)}.modal-dialog{position:relative;width:auto;margin:10px}.wishlist-model .modal-dialog{width:700px}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.wishlist-model .modal-content{}.wishlist-model .modal-header{min-height:0;padding:0;border-bottom:0}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #121212;filter:alpha(opacity=20);opacity:.2}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-header .close{margin-top:-2px}.wishlist-model .close{position:absolute;top:-10px;right:-10px;background:#fff;opacity:1;width:30px;height:30px;font-size:15px;border-radius:50%;z-index:10;box-shadow:0 1px 4px 0 #121212}.wishlist-model .close .icon-close{width:25px;height:25px}.modal-body{position:relative;padding:15px}.wishlist-model .modal-body{padding:0 30px;display:flex}.wishlist-model .wishlist-left{width:66.67%;border-right:1px solid #ccc;padding:30px 0}.wishlist-model .wishlist-note{position:relative;display:inline-block;margin-bottom:20px;margin-left:35px;border-bottom:1px solid #121212;color:#121212}.wishlist-model .wishlist-note a{color: #212121;}.wishlist-model .wishlist-note .cirle{position:absolute;top:-4px;left:-35px;width:25px;height:25px;color:#fff;background:#121212;line-height:25px;border-radius:50%;text-align:center}.wishlist-model .wishlist-note svg{fill:#fff}.wishlist-model .wishlist-note .cirle .icon-check{vertical-align:middle}.wishlist-model .product-left{width:33.33%;float:left;margin-right:30px}.wishlist-model .wishlist-image{overflow:hidden}.wishlist-model .wishlist-image img{transition:all .3s linear}.wishlist-model .wishlist-name{padding:0;margin-bottom:10px}.wishlist-model .wishlist-name a{color: #212121;}.wishlist-model .wishlist-price{margin-bottom:10px}.wishlist-model .wishlist-price .price{font-weight:700;margin-right:10px;font-size:15px}.wishlist-model .wishlist-price .price_compare{color:#ccc}.wishlist-model .wishlist-right{width:33.33%;padding:30px 0;padding-left:30px}.wishlist-model .btn-quick-shop{width:100%;border-color:#121212;background:#fff;color:#121212;padding:0 30px;transition:all .2s linear;height:36px;margin-bottom:10px;text-transform:uppercase}.wishlist-model .btn-cta{width:100%;font-size:1em;border-color:#212121;background:#212121;color:#fff;padding:0;transition:all .2s linear;height:36px;line-height:36px;margin-bottom:10px}.wishlist-model .quantity-content{text-align:center}.wishlist-model .quantity-content input{outline:none;text-align:center;font-weight:600;border:1px solid #121212}.wishlist-model .quantity-content button{border-color:#121212}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}} 14137</style> 14138 14139<div class="modal fade" id="modalwishlist0" tabindex="-1" role="dialog"> 14140 <div class="modal-dialog" role="document"> 14141 <div class="modal-content"> 14142 <div class="modal-body">Your Wishlist is empty!</div> 14143 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> 14144 </div> 14145 </div> 14146</div> 14147 14148<div class="wishlist-model"> 14149 <div class="modal fade" id="modalwishlist1" tabindex="-1" role="dialog" aria-hidden="true"> 14150 <div class="modal-dialog white-modal"> 14151 <div class="modal-content"> 14152 <div class="modal-header"> 14153 <button type="button" class="close" data-dismiss="modal" aria-label="Close"> 14154 <svg class="icon icon-close" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 14155<title>icon-close</title> 14156<path d="M16.943 16l8.862 8.862c0.26 0.26 0.26 0.682 0 0.943s-0.682 0.26-0.943 0l-8.862-8.862-8.862 8.862c-0.26 0.26-0.682 0.26-0.943 0s-0.26-0.682 0-0.943l8.862-8.862-8.862-8.862c-0.26-0.26-0.26-0.682 0-0.943s0.682-0.26 0.943 0l8.862 8.862 8.862-8.862c0.26-0.26 0.682-0.26 0.943 0s0.26 0.682 0 0.943l-8.862 8.862z"></path> 14157</svg> 14158 </button> 14159 </div> 14160 <div class="modal-body"> 14161 <div class="wishlist-left"> 14162 <div class="wishlist-note">
14163 <span class="cirle"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> 14164<title>icon-check</title> 14165<path d="M12 21.766l14.218-12.926c0.272-0.248 0.694-0.228 0.942 0.045s0.228 0.694-0.045 0.942l-14.667 13.333c-0.254 0.231-0.643 0.231-0.897 0l-6.667-6.061c-0.272-0.248-0.293-0.669-0.045-0.942s0.669-0.293 0.942-0.045l6.218 5.653z"></path> 14166</svg></span> 14167 Product added to <a href="/pages/wish-list">Wishlist</a> 14168 </div> 14169 <div class="wishlist-product"> 14170 <div class="product-left"> 14171 <div class="wishlist-image"></div> 14172 </div> 14173 <div class="product-right"> 14174 <div class="wishlist-name"></div> 14175 <div class="wishlist-price"></div> 14176 </div> 14177 </div> 14178 </div> 14179 <div class="wishlist-right"> 14180 <div class="wishlist-cart"> 14181 <form action="/cart/add" method="post" class="variants-form variants" id="AddToCartForm" enctype="multipart/form-data"> 14182 <div class="others-bottom"> 14183 <a class="btn btn-quick-shop" href="/pages/wish-list">View Wishlist</a> 14184 <button type="submit" name="add" id="AddToCart" class="btn btn-cta"> 14185 <span id="AddToCartText" class="">Beli Sekarang</span> 14186 </button> 14187 </div> 14188 <div id="wishlist-variants-container" class="variants-wrapper"></div> 14189 <div class="quantity-content"> 14190 <label>QTY</label> 14191 <input type="number" size="5" class="" name="quantity" value="1" /> 14192 </div> 14193 </form> 14194 </div> 14195 </div> 14196 </div> 14197 </div> 14198 </div> 14199 </div> 14200</div> 14201 14202 14203 14204 14205 14206 14207
14207<script type="application/ld+json"> 14208 { 14209 "@context": "http://schema.org/", 14210 "@type": "Product", 14211 "url": "https://hotelverta.com/", 14212 "name": "HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman", 14213 "image": "https://imagesme.b-cdn.net/landing/banner-hotelverta.png", 14214 "description": "<ul> 14215<li> 14216<strong>HANTUSLOT</strong><br><strong></strong><strong></strong> 14217</li> 14218<li> 14219<strong>GAME</strong><br> 14220</li> 14221<li><strong>GAMEONLINE</strong></li> 14222</ul> 14223<p>HANTUSLOT menghadirkan beragam game online modern dengan dukungan fitur berbahasa Indonesia, sehingga pengguna dapat memahami setiap menu dan fitur dengan lebih mudah serta menikmati pengalaman bermain yang praktis dan nyaman.</p> 14224<p><img src="https://imagesme.b-cdn.net/landing/banner-hotelverta.png" alt=""></p> 14225<table style="width: 100.091%;" width="100%"> 14226<tbody> 14227<tr> 14228<td style="width: 33.7327%;">SKU</td> 14229<td style="width: 65.9908%;">[C]HANTUSLOT<br>[C]OBIPCL1004-CNY2026<br> 14230</td> 14231</tr> 14232<tr> 14233<td style="width: 33.7327%;">Isi</td> 14234<td style="width: 65.9908%;">link login game online<br>GAME REKOMENDASI 2026<br>fitur inovatif game online<br>Situs HANTUSLOT<br>game terbaru 2026<br>link bandar game online<br>main game berbahasa indonesia<br> 14235</td> 14236</tr> 14237</tbody> 14238</table>", 14239 "brand": { 14240 "name": "Outerbloom Hampers" 14241 }, 14242 "sku": "[C]HANTUSLOT", 14243 "mpn": "[C]HANTUSLOT", 14244 "offers": { 14245 "@type": "Offer", 14246 "priceCurrency": "IDR", 14247 "price": "1885000", 14248 "availability": "http://schema.org/InStock", 14249 "seller": { 14250 "@type": "Organization", 14251 "name": "Outerbloom" 14252 }, 14253 "url": "https://hotelverta.com/" 14254 } 14255 14256 } 14257 </script>
vendor: 2 bytes, line 14257
14257
14258<script type="application/ld+json"> 14259{ 14260 "@context": "https://schema.org", 14261 "@type": "VideoObject", 14262 "name": "HANTUSLOTð°Situs Game Online Lengkap, Cepat & Nyaman", 14263 "description": "HANTUSLOT menghadirkan beragam game online modern dengan dukungan fitur berbahasa Indonesia, sehingga pengguna dapat memahami setiap menu dan fitur dengan lebih mudah serta menikmati pengalaman bermain yang praktis dan nyaman.", 14264 "thumbnailUrl": "https://imagesme.b-cdn.net/landing/banner-hotelverta.png", 14265 "uploadDate": "2025-02-15", 14266 "duration": "PT45S", 14267 "contentUrl": "https://imagesme.b-cdn.net/landing/banner-hotelverta.png", 14268 "embedUrl": "https://imagesme.b-cdn.net/landing/banner-hotelverta.png", 14269 "publisher": { 14270 "@type": "Organization", 14271 "name": "HANTUSLOT", 14272 "logo": { 14273 "@type": "ImageObject", 14274 "url": "https://imagesme.b-cdn.net/landing/banner-hotelverta.png" 14275 }, 14276 "url": "https://hotelverta.com/" 14277 }, 14278 "keywords": [ 14279 "HANTUSLOT", 14280 "HANTUSLOT LOGIN", 14281 "GAME HANTUSLOT", 14282 "GAME ONLINE", 14283 "GAME BERBAHASA INDONESIA", 14284 "GAME REKOMENDASI" 14285 ], 14286 "genre": "Entertainment", 14287 "inLanguage": "id-ID", 14288 "interactionStatistic": { 14289 "@type": "InteractionCounter", 14290 "interactionType": { 14291 "@type": "WatchAction" 14292 }, 14293 "userInteractionCount": 125000 14294 }, 14295 "isFamilyFriendly": true, 14296 "width": 1920, 14297 "height": 1080, 14298 "encodingFormat": "video/mp4" 14299} 14300</script>
14300 14301
14301<script type="application/ld+json"> 14302 { 14303 "@context": "https://schema.org", 14304 "@type": "BreadcrumbList", 14305 "name": "HANTUSLOT", 14306 "description": "HANTUSLOT menghadirkan beragam game online modern dengan dukungan fitur berbahasa Indonesia, sehingga pengguna dapat memahami setiap menu dan fitur dengan lebih mudah serta menikmati pengalaman bermain yang praktis dan nyaman.", 14307 "itemListElement": [ 14308 { 14309 "@type": "ListItem", 14310 "position": 1, 14311 "name": "Home", 14312 "item": "https://hotelverta.com/" 14313 }, 14314 { 14315 "@type": "ListItem", 14316 "position": 2, 14317 "name": "HANTUSLOT", 14318 "item": "https://hotelverta.com/" 14319 }, 14320 { 14321 "@type": "ListItem", 14322 "position": 3, 14323 "name": "HANTUSLOT LOGIN", 14324 "item": "https://hotelverta.com/" 14325 }, 14326 { 14327 "@type": "ListItem", 14328 "position": 4, 14329 "name": "GAME HANTUSLOT", 14330 "item": "https://hotelverta.com/" 14331 }, 14332 { 14333 "@type": "ListItem", 14334 "position": 5, 14335 "name": "GAME ONLINE", 14336 "item": "https://hotelverta.com/" 14337 }, 14338 { 14339 "@type": "ListItem", 14340 "position": 6, 14341 "name": "GAME BAHASA INDONESIA", 14342 "item": "https://hotelverta.com/" 14343 }, 14344 { 14345 "@type": "ListItem", 14346 "position": 7, 14347 "name": "REKOMENDASI GAME INOVATIF", 14348 "item": "https://hotelverta.com/" 14349 } 14350 ] 14351} 14352</script>
14352 14353 14354 <style> 14355 .stamped-badge[data-rating="0.0"]{display: none !Important;} 14356 14357 div[data-load-type="continue"] ul.stamped-pagination li.next a, div[data-widget-load-type="continue"] ul.stamped-pagination li.next a { 14358 border-radius: 0px; 14359 } 14360 .stamped-review-body { 14361 padding-left: 0px !important; 14362 } 14363 #product-reviews .stamped-header:after { 14364 display:none !Important; 14365 } 14366 #stamped-main-widget .stamped-container, .stamped-badge-caption,#stamped-reviews-widget { 14367 font-family:inherit !important; 14368 } 14369 </style> 14370 14371 14372 14373
14373<script src="https://outerbloom.com/cdn/shop/t/138/assets/variant-sku-handler.js?v=91239063692820757781752652418" defer></script>
14373 14374 14375 <!-- Wishlist API Configuration --> 14376
14376<script> 14377 window.WISHLIST_API_URL = 'https://app.asmaraku.com'; // Change to production URL 14378 14379 // Initialize Shopify object BEFORE wishlist-manager loads 14380 window.Shopify = window.Shopify || {}; 14381 14382 // Set shop domain - try multiple methods to ensure it's set 14383 const shopDomain = ''; 14384 14385 if (shopDomain && shopDomain.trim()) { 14386 window.Shopify.shop = shopDomain.trim(); 14387 } else { 14388 // Fallback: try to get from shop.domain or hardcode 14389 const shopDomain2 = 'outerbloom.com'; 14390 if (shopDomain2 && shopDomain2.trim()) { 14391 window.Shopify.shop = shopDomain2.trim(); 14392 } else { 14393 // Manual fallback - set your shop domain here 14394 window.Shopify.shop = 'outerbloom1.myshopify.com'; // TODO: Change this to your actual shop domain 14395 } 14396 } 14397 14398 14399 console.log('[Wishlist Setup] No customer logged in'); 14400 14401 </script>
14401 14402 14403 <!-- Wishlist Manager - New API Integration (load AFTER customer data) --> 14404
14404<script src="https://outerbloom.com/cdn/shop/t/138/assets/wishlist-manager.js?v=119203892983812840831770794810"></script>
14404 14405 14406
14406<script> 14407 function myInit(){ StampedFn.init({ apiKey: 'pubkey-hCS8DHE9QbBHhHN89WXFkuJ0Y3422D', sId: '23462' }); } 14408 </script>
14408 14409
14409<script async onload="myInit()" type="text/javascript" src="https://cdn1.stamped.io/files/widget.min.js"></script>
14409<style> 14410 .jss59 { 14411 background-color: rgba(0, 0, 0, 0.6); 14412 } 14413 .MuiBackdrop-root { 14414 top: 0; 14415 left: 0; 14416 right: 0; 14417 bottom: 0; 14418 display: flex; 14419 z-index: -1; 14420 position: fixed; 14421 align-items: center; 14422 justify-content: center; 14423 background-color: rgba(0, 0, 0, 0.5); 14424 -webkit-tap-highlight-color: transparent; 14425 } 14426 .MuiDialog-scrollPaper { 14427 display: flex; 14428 align-items: center; 14429 justify-content: center; 14430 } 14431 .MuiDialog-container { 14432 height: 100%; 14433 outline: 0; 14434 } 14435 .MuiPaper-elevation24 { 14436 box-shadow: 0px 11px 15px -7px rgba(0,0,0,0.2), 0px 24px 38px 3px rgba(0,0,0,0.14), 0px 9px 46px 8px rgba(0,0,0,0.12); 14437 } 14438 .MuiDialog-paper { 14439 margin: 32px; 14440 position: relative; 14441 overflow-y: auto; 14442 } 14443 .MuiDialog-paperScrollPaper { 14444 display: flex; 14445 max-height: calc(100% - 64px); 14446 flex-direction: column; 14447 } 14448 .MuiDialog-paperWidthSm { 14449 max-width: 600px; 14450 } 14451 #location-lock-dialog { 14452 top: 20%; 14453 left: 0; 14454 right: 0; 14455 width: 30%; 14456 margin: 0px auto; 14457 display: block; 14458 padding: 30px; 14459 z-index: 99999; 14460 position: fixed; 14461 font-size: 14px; 14462 background: rgb(255, 255, 255); 14463 box-shadow: rgba(11, 11, 12, 0.2) 2px 4px 5px 0px; 14464 text-align: center; 14465 font-family: Roboto, Arial, sans-serif; 14466 line-height: 1; 14467 border-radius: 8px; 14468 -webkit-font-smoothing: subpixel-antialiased; 14469 } 14470 .MuiButtonBase-root { 14471 color: inherit; 14472 border: 0; 14473 cursor: pointer; 14474 margin: 0; 14475 display: inline-flex; 14476 outline: 0; 14477 padding: 0; 14478 position: relative; 14479 align-items: center; 14480 user-select: none; 14481 border-radius: 0; 14482 vertical-align: middle; 14483 -moz-appearance: none; 14484 justify-content: center; 14485 text-decoration: none; 14486 background-color: transparent; 14487 -webkit-appearance: none; 14488 -webkit-tap-highlight-color: transparent; 14489 } 14490 .MuiIconButton-root { 14491 flex: 0 0 auto; 14492 color: rgba(0, 0, 0, 0.54); 14493 padding: 12px; 14494 overflow: visible; 14495 font-size: 1.5rem; 14496 text-align: center; 14497 transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; 14498 border-radius: 50%; 14499 } 14500 .MuiIconButton-label { 14501 width: 100%; 14502 display: flex;
14503 align-items: inherit; 14504 justify-content: inherit; 14505 } 14506 .MuiSvgIcon-root { 14507 fill: currentColor; 14508 width: 1em; 14509 height: 1em; 14510 display: inline-block; 14511 font-size: 1.5rem; 14512 transition: fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; 14513 flex-shrink: 0; 14514 user-select: none; 14515 } 14516 .MuiTouchRipple-root { 14517 top: 0; 14518 left: 0; 14519 right: 0; 14520 bottom: 0; 14521 z-index: 0; 14522 overflow: hidden; 14523 position: absolute; 14524 border-radius: inherit; 14525 pointer-events: none; 14526 } 14527 .jss36 { 14528 color: #222222; 14529 font-size: 24px; 14530 font-family: Roboto, Arial, sans-serif; 14531 font-weight: 500; 14532 } 14533 .jss37 { 14534 color: #555555; 14535 padding: 10px 0px 0px; 14536 font-size: 14px; 14537 } 14538 .MuiFormGroup-root { 14539 display: flex; 14540 flex-wrap: wrap; 14541 flex-direction: column; 14542 } 14543 .MuiFormGroup-row { 14544 flex-direction: row; 14545 } 14546 .jss63 { 14547 width: 85%; 14548 margin: 15px auto; 14549 display: flex; 14550 padding: 11px 0px 0px; 14551 justify-content: space-evenly; 14552 } 14553 .MuiFormControlLabel-root { 14554 cursor: pointer; 14555 display: inline-flex;
14556 align-items: center; 14557 margin-left: -11px; 14558 margin-right: 16px; 14559 vertical-align: middle; 14560 -webkit-tap-highlight-color: transparent; 14561 } 14562 .jss70 { 14563 margin: 0; 14564 } 14565 .MuiButtonBase-root { 14566 color: inherit; 14567 border: 0; 14568 cursor: pointer; 14569 margin: 0; 14570 display: inline-flex; 14571 outline: 0; 14572 padding: 0; 14573 position: relative; 14574 align-items: center; 14575 user-select: none; 14576 border-radius: 0; 14577 vertical-align: middle; 14578 -moz-appearance: none; 14579 justify-content: center; 14580 text-decoration: none; 14581 background-color: transparent; 14582 -webkit-appearance: none; 14583 -webkit-tap-highlight-color: transparent; 14584 } 14585 .MuiIconButton-root { 14586 flex: 0 0 auto; 14587 color: rgba(0, 0, 0, 0.54); 14588 padding: 12px; 14589 overflow: visible; 14590 font-size: 1.5rem; 14591 text-align: center; 14592 transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; 14593 border-radius: 50%; 14594 } 14595 .MuiIconButton-colorSecondary { 14596 color: #f50057; 14597 } 14598 .jss71 { 14599 padding: 9px; 14600 } 14601 .MuiRadio-root { 14602 color: rgba(0, 0, 0, 0.54); 14603 } 14604 .jss64 { 14605 padding: 2px; 14606 } 14607 .MuiRadio-colorSecondary.Mui-checked { 14608 color: #f50057; 14609 } 14610 .MuiIconButton-label { 14611 width: 100%; 14612 display: flex;
14613 align-items: inherit; 14614 justify-content: inherit; 14615 } 14616 .MuiTypography-root { 14617 margin: 0; 14618 } 14619 .MuiTypography-body1 { 14620 font-size: 18px; 14621 font-family: Roboto,sans-serif; 14622 font-weight: 400; 14623 line-height: 1.5; 14624 } 14625 .location-popup_area-block__sp9Ws { 14626 display: -moz-box; 14627 display: flex; 14628 -moz-box-orient: vertical; 14629 -moz-box-direction: normal; 14630 flex-direction: column; 14631 -moz-box-pack: center; 14632 justify-content: center; 14633 position: relative; 14634 margin: 10px 10% 0; 14635 } 14636 .location-popup_pin-search-box__3l5mJ { 14637 width: 100%; 14638 display: -moz-box; 14639 display: flex; 14640 -moz-box-align: center; 14641 align-items: center; 14642 } 14643 .location-popup_place-icon-city__1XAX5, .location-popup_place-icon__jSG0Q { 14644 position: absolute; 14645 z-index: 999; 14646 } 14647 .location-popup_place-icon__jSG0Q { 14648 color: #212121; 14649 padding-left: 8px; 14650 } 14651 .location-popup_place-icon__jSG0Q svg { 14652 width: 18px; 14653 height: 18px; 14654 } 14655 .location-popup_cancel-icon__FHujU { 14656 color: #fff; 14657 right: 10px; 14658 width: 16px; 14659 cursor: pointer; 14660 height: 16px; 14661 display: none; 14662 padding: 5px; 14663 position: absolute; 14664 background: #999; 14665 text-align: center; 14666 border-radius: 50%; 14667 } 14668 .location-popup_pin-search-box__3l5mJ>div>select { 14669/* -webkit-box-shadow: 0 0 10px #212121; 14670 box-shadow: 0 0 10px #212121; */ 14671 text-transform: capitalize; 14672 border: 1px solid #212121; 14673 color: #212121; 14674 width: 100%; 14675 margin: 0; 14676 display: -moz-box; 14677 display: flex; 14678 padding: 0 30px; 14679 -webkit-animation: location-popup_focuses__1I8Gj 1.5s ease-in-out infinite; 14680 -moz-animation: location-popup_focuses__1I8Gj 1.5s ease-in-out infinite; 14681 animation: location-popup_focuses__1I8Gj 1.5s ease-in-out infinite; 14682 font-size: 16px; 14683 border-radius: 4px; 14684 height: 44px; 14685 moz-animation: location-popup_focuses__1I8Gj ease-in-out 1.5s infinite; 14686 webkit-animation: location-popup_focuses__1I8Gj ease-in-out 1.5s infinite; 14687 } 14688 .MuiButtonBase-root { 14689 color: inherit; 14690 border: 0; 14691 cursor: pointer; 14692 margin: 0; 14693 display: inline-flex; 14694 outline: 0; 14695 padding: 0; 14696 position: relative; 14697 align-items: center; 14698 user-select: none; 14699 border-radius: 0; 14700 vertical-align: middle; 14701 -moz-appearance: none; 14702 justify-content: center; 14703 text-decoration: none; 14704 background-color: transparent; 14705 -webkit-appearance: none; 14706 -webkit-tap-highlight-color: transparent; 14707 } 14708 .MuiButton-root { 14709 color: rgba(0, 0, 0, 0.87); 14710 padding: 6px 16px; 14711 font-size: 0.875rem; 14712 min-width: 64px; 14713 box-sizing: border-box; 14714 transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; 14715 font-family: Roboto,sans-serif; 14716 font-weight: 500; 14717 line-height: 1.75; 14718 border-radius: 4px; 14719 text-transform: uppercase; 14720 } 14721 .MuiButton-contained { 14722 color: rgba(0, 0, 0, 0.87); 14723 box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12); 14724 background-color: #e0e0e0; 14725 } 14726 .MuiButtonBase-root.Mui-disabled { 14727 cursor: default; 14728 pointer-events: none; 14729 } 14730 .MuiButton-label { 14731 width: 100%; 14732 display: inherit; 14733 align-items: inherit; 14734 justify-content: inherit; 14735 } 14736 .cartButton_login_content__2j1f7 { 14737 display: -moz-box; 14738 display: flex; 14739 text-align: center; 14740 z-index: 9; 14741 font-size: 18px; 14742 font-weight: 500; 14743 color: #fff; 14744 } 14745 14746 .jss35 { 14747 top: 5px; 14748 right: 5px; 14749 padding: 4px; 14750 position: absolute; 14751 border-radius: 50%; 14752 } 14753 .jss67 { 14754 cursor: pointer; 14755 font-size: 15px; 14756 line-height: 1.3; 14757 padding-left: 5px; 14758 } 14759 .jss69 { 14760 color: #222222; 14761 } 14762 .jss80 { 14763 color: #fff; 14764 width: 100%; 14765 height: 52px; 14766 padding: 11px 16px; 14767 font-size: 18px; 14768 min-width: 88px; 14769 min-height: 36px; 14770 transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; 14771 font-weight: 500; 14772 line-weight: 1em; 14773 border-radius: 4px; 14774 text-transform: uppercase; 14775 background-color: #E87325; 14776 } 14777 @media (min-width: 991px){ 14778 .cartButton_login_content__2j1f7 { 14779 font-weight: 500; 14780 } 14781 } 14782 14783 @media (max-width: 992px) { 14784 #location-lock-dialog { 14785 width: 100%; 14786 top: auto; 14787 bottom: 0; 14788 padding-left: 0; 14789 padding-right: 0; 14790 } 14791 .MuiFormGroup-row { 14792 display: block 14793 } 14794 .MuiIconButton-label input { 14795 margin: 0; 14796 } 14797 } 14798</style> 14799<div role="presentation" class="MuiDialog-root jss34" style="display: none;position: fixed; z-index: 9999; inset: 0px;"> 14800 <div class="MuiBackdrop-root" aria-hidden="true" style="opacity: 1; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;"></div> 14801 <div tabindex="0" data-test="sentinelStart"></div> 14802 <div class="MuiDialog-container MuiDialog-scrollPaper" role="none presentation" tabindex="-1" style="opacity: 1; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;"> 14803 <div class="MuiPaper-root MuiDialog-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" role="dialog"> 14804 <div class="jss31 undefined" id="location-lock-dialog"> 14805 <button id="close-popup-delivery" class="MuiButtonBase-root MuiIconButton-root jss35" tabindex="0" type="button" aria-label="close">
14806 <span class="MuiIconButton-label"> 14807 <svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true"> 14808 <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path> 14809 </svg> 14810 </span> 14811 <span class="MuiTouchRipple-root"></span> 14812 </button> 14813 <div> 14814 <div class="jss36">Select Delivery Location</div> 14815 <div class="jss37">Select a delivery location to see product availability</div> 14816 </div> 14817 <div class="MuiFormGroup-root jss63 MuiFormGroup-row" role="radiogroup"> 14818 <label for="jabodetabek" class="MuiFormControlLabel-root jss45"> 14819 <span class="MuiButtonBase-root MuiIconButton-root jss46 MuiRadio-root MuiRadio-colorSecondary jss39 jss47 Mui-checked MuiIconButton-colorSecondary" aria-disabled="false"> 14820 <span class="MuiIconButton-label"> 14821 <input id="jabodetabek" class="jss49" type="radio" value="Jabodetabek" checked="" name="location"> 14822 <span class="jss41"></span> 14823 </span> 14824 <span class="MuiTouchRipple-root"></span> 14825 </span> 14826 <span class="MuiTypography-root MuiFormControlLabel-label MuiTypography-body1"> 14827 <span class="jss67 jss69">Jabodetabek</span> 14828 </span> 14829 </label> 14830 <label for="non-jabodetabek" class="MuiFormControlLabel-root jss45"> 14831 <span class="MuiButtonBase-root MuiIconButton-root jss46 MuiRadio-root MuiRadio-colorSecondary jss39 MuiIconButton-colorSecondary" aria-disabled="false"> 14832 <span class="MuiIconButton-label"> 14833 <input id="non-jabodetabek" class="jss49" type="radio" value="Outside Jabodetabek" name="location"> 14834 <span class="jss40"></span> 14835 </span> 14836 <span class="MuiTouchRipple-root"></span> 14837 </span> 14838 <span class="MuiTypography-root MuiFormControlLabel-label MuiTypography-body1"> 14839 <span class="jss67 jss68">Outside Jabodetabek</span> 14840 </span> 14841 </label> 14842 </div> 14843 <div> 14844 <div class="MuiGrid-root location-popup_area-block__sp9Ws"> 14845 <div class="MuiGrid-root location-popup_pin-search-box__3l5mJ false"> 14846 <div class="MuiGrid-root location-popup_place-icon__jSG0Q"> 14847 <svg class="MuiSvgIcon-root jss6" focusable="false" viewBox="0 0 24 24" aria-hidden="true" style="font-size:16px"><path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"></path></svg> 14848 </div> 14849 <div class="MuiGrid-root location-popup_cancel-icon__FHujU false"> 14850 <i class="material-icons location-popup_clear-pin__s1dRc">close</i> 14851 </div> 14852 <div style="width: 100%;"> 14853 <select id="choose-location" class="form-control"> 14854 <option value="">Choose Location</option> 14855 <option value="jakarta">Jakarta</option> 14856 <option value="bogor">Bogor</option> 14857 <option value="depok">Depok</option> 14858 <option value="tangerang">Tangerang</option> 14859 <option value="bekasi">Bekasi</option> 14860 </select> 14861 </div> 14862 </div> 14863 </div> 14864 </div> 14865 <button class="MuiButtonBase-root MuiButton-root MuiButton-contained jss55" tabindex="-1" type="button" title="" id="location-lock-submit" data-idforcdp="actionBtn-cdp" data-testid="location-lock-submit" style="background-color: #212121; width: 80%; padding: 14px 0px 12px; margin: 20px 0px; font-size: 18px; font-weight: 500; box-shadow: rgba(0, 0, 0, 0.1) 0px 2px 4px 0px; border-radius: 4px; color: rgb(255, 255, 255); height: 44px;" data-content=""> 14866 <span class="MuiButton-label"> 14867 <span class=""></span> 14868 <span id="location-lock-continue-btn" class="cartButton_login_content__2j1f7" style="font-weight: 500;" data-content="">Continue Shopping</span> 14869 </span> 14870 </button> 14871 </div> 14872 </div> 14873 </div> 14874 <div tabindex="0" data-test="sentinelEnd"></div> 14875</div> 14876
14877<script> 14878 const jabodetabek = [ 14879 { 14880 "code": "jakarta", 14881 "city": "jakarta", 14882 "zip": [] 14883 }, 14884 { 14885 "code": "bogor", 14886 "city": "bogor", 14887 "zip": [] 14888 }, 14889 { 14890 "code": "depok", 14891 "city": "depok", 14892 "zip": [] 14893 }, 14894 { 14895 "code": "tangerang", 14896 "city": "tangerang", 14897 "zip": [] 14898 }, 14899 { 14900 "code": "bekasi", 14901 "city": "bekasi", 14902 "zip": [] 14903 } 14904 ] 14905 let cityNonJabodetabek = [ 14906 14907 14908 14909 14910 14911 14912 14913 14914 14915 14916 14917 14918 14919 14920 14921 14922 14923 14924 14925 14926 14927 14928 14929 14930 14931 14932 14933 14934 14935 14936 14937 14938 14939 14940 14941 14942 14943 14944 14945 14946 14947 14948 14949 14950 14951 14952 14953 14954 14955 14956 14957 14958 14959 14960 14961 14962 14963 14964 14965 14966 14967 14968 14969 14970 14971 14972 14973 14974 14975 14976 14977 14978 14979 14980 14981 14982 14983 14984 14985 14986 14987 14988 14989 14990 14991 14992 14993 14994 14995 14996 14997 14998 14999 15000 15001 15002 15003 15004 15005 15006 15007 15008 15009 15010 15011 15012 15013 15014 15015 15016 15017 15018 15019 15020 15021 15022 15023 15024 15025 15026 15027 15028 15029 15030 15031 15032 15033 15034 15035 15036 15037 15038 15039 15040 15041 15042 15043 15044 15045 15046 15047 15048 15049 15050 15051 15052 15053 15054 15055 15056 15057 15058 15059 15060 15061 15062 15063 15064 15065 15066 15067 15068 15069 15070 15071 15072 15073 15074 15075 15076 15077 15078 15079 15080 15081 15082 15083 15084 15085 15086 15087 15088 15089 15090 15091 15092 15093 15094 15095 15096 15097 15098 15099 15100 15101 15102 15103 15104 15105 15106 15107 15108 15109 15110 15111 15112 15113 15114 15115 15116 15117 15118 15119 15120 15121 15122 15123 15124 15125 15126 15127 15128 15129 15130 15131 15132 15133 15134 15135 15136 15137 15138 15139 15140 15141 15142 15143 15144 15145 15146 15147 15148 15149 15150 15151 15152 15153 15154 15155 15156 15157 15158 15159 15160 15161 15162 15163 15164 15165 15166 15167 15168 15169 15170 15171 15172 15173 15174 15175 15176 15177 15178 15179 15180 15181 15182 15183 15184 15185 15186 15187 15188 15189 15190 15191 15192 15193 15194 15195 15196 15197 15198 15199 15200 15201 15202 15203 15204 15205 15206 15207 15208 15209 15210 15211 15212 15213 15214 15215 15216 15217 15218 15219 15220 15221 15222 15223 15224 15225 15226 15227 15228 15229 15230 15231 15232 15233 15234 15235 15236 15237 15238 15239 15240 15241 15242 15243 15244 15245 15246 15247 15248 15249 15250 15251 15252 15253 15254 15255 15256 15257 15258 15259 15260 15261 15262 15263 15264 15265 15266 15267 15268 15269 15270 15271 15272 15273 15274 15275 15276 15277 15278 15279 15280 15281 15282 15283 15284 15285 15286 15287 15288 15289 15290 15291 15292 15293 15294 15295 15296 15297 15298 15299 15300 15301 15302 15303 15304 15305 15306 15307 15308 15309 15310 15311 15312 15313 15314 15315 15316 15317 15318 15319 15320 15321 15322 15323 15324 15325 15326 15327 15328 15329 15330 15331 15332 15333 15334 15335 15336 15337 15338 15339 15340 15341 15342 15343 15344 15345 15346 15347 15348 15349 15350 15351 15352 15353 15354 15355 15356 15357 15358 15359 15360 15361 15362 15363 15364 15365 15366 15367 15368 15369 15370 15371 15372 15373 15374 15375 15376 15377 15378 15379 15380 15381 15382 15383 15384 15385 15386 15387 15388 15389 15390 15391 15392 15393 15394 15395 15396 15397 15398 15399 15400 15401 15402 15403 15404 15405 15406 15407 15408 15409 15410 15411 15412 15413 15414 15415 15416 15417 15418 15419 15420 15421 15422 15423 15424 15425 15426 15427 15428 15429 15430 15431 15432 15433 15434 15435 15436 15437 15438 15439 15440 15441 15442 15443 15444 15445 15446 15447 15448 15449 15450 15451 15452 15453 15454 15455 15456 15457 15458 15459 15460 15461 15462 15463 15464 15465 15466 15467 15468 15469 15470 15471 15472 15473 15474 15475 15476 15477 15478 15479 15480 15481 15482 15483 15484 15485 15486 15487 15488 15489 15490 15491 15492 15493 15494 15495 15496 15497 15498 15499 15500 15501 15502 15503 15504 15505 15506 15507 15508 15509 15510 15511 15512 15513 15514 15515 15516 15517 15518 15519 15520 15521 15522 15523 15524 15525 15526 15527 15528 15529 15530 15531 15532 15533 15534 15535 15536 15537 15538 15539 15540 15541 15542 15543 15544 15545 15546 15547 15548 15549 15550 15551 15552 15553 15554 15555 15556 15557 15558 15559 15560 15561 15562 15563 15564 15565 15566 15567 15568 15569 15570 15571 15572 15573 15574 15575 15576 15577 15578 15579 15580 15581 15582 15583 15584 15585 15586 15587 15588 15589 15590 15591 15592 15593 15594 15595 15596 15597 15598 15599 15600 15601 15602 15603 15604 15605 15606 15607 15608 15609 15610 15611 15612 15613 15614 15615 15616 15617 15618 15619 15620 15621 15622 15623 15624 15625 15626 15627 15628 15629 15630 15631 15632 15633 15634 15635 15636 15637 15638 15639 15640 15641 15642 15643 15644 15645 15646 15647 15648 15649 15650 15651 15652 15653 15654 15655 15656 15657 15658 15659 15660 15661 15662 15663 15664 15665 15666 15667 15668 15669 15670 15671 15672 15673 15674 15675 15676 15677 15678 15679 15680 15681 15682 15683 15684 15685 15686 15687 15688 15689 15690 15691 15692 15693 15694 15695 15696 15697 15698 15699 15700 15701 15702 15703 15704 15705 15706 15707 15708 15709 15710 15711 15712 15713 15714 15715 15716 15717 15718 15719 15720 15721 15722 15723 15724 15725 15726 15727 15728 15729 15730 15731 15732 15733 15734 15735 15736 15737 15738 15739 15740 15741 15742 15743 15744 15745 15746 15747 15748 15749 15750 15751 15752 15753 15754 15755 15756 15757 15758 15759 15760 15761 15762 15763 15764 15765 15766 15767 15768 15769 15770 15771 15772 15773 15774 15775 15776 15777 15778 15779 15780 15781 15782 15783 15784 15785 15786 15787 15788 15789 15790 15791 15792 15793 15794 15795 15796 15797 15798 15799 15800 15801 15802 15803 15804 15805 15806 15807 15808 15809 15810 15811 15812 15813 15814 15815 15816 15817 15818 15819 15820 15821 15822 15823 15824 15825 15826 15827 15828 15829 15830 15831 15832 15833 15834 15835 15836 15837 15838 15839 15840 15841 15842 15843 15844 15845 15846 15847 15848 15849 15850 15851 15852 15853 15854 15855 15856 15857 15858 15859 15860 15861 15862 15863 15864 15865 15866 15867 15868 15869 15870 15871 15872 15873 15874 15875 15876 15877 15878 15879 15880 15881 15882 15883 15884 15885 15886 15887 15888 15889 15890 15891 15892 15893 15894 15895 15896 15897 15898 15899 15900 15901 15902 15903 15904 15905 15906 15907 15908 15909 15910 15911 15912 15913 15914 15915 15916 15917 15918 15919 15920 15921 15922 15923 15924 15925 15926 15927 15928 15929 15930 15931 15932 15933 15934 15935 15936 15937 15938 15939 15940 15941 15942 15943 15944 15945 15946 15947 15948 15949 15950 15951 15952 15953 15954 15955 15956 15957 15958 15959 15960 15961 15962 15963 15964 15965 15966 15967 15968 15969 15970 15971 15972 15973 15974 15975 15976 15977 15978 15979 15980 15981 15982 15983 15984 15985 15986 15987 15988 15989 15990 15991 15992 15993 15994 15995 15996 15997 15998 15999 16000 16001 16002 16003 16004 16005 16006 16007 16008 16009 16010 16011 16012 16013 16014 16015 16016 16017 16018 16019 16020 16021 16022 16023 16024 16025 16026 16027 16028 16029 16030 16031 16032 16033 16034 16035 16036 16037 16038 16039 16040 16041 16042 16043 16044 16045 16046 16047 16048 16049 16050 16051 16052 16053 16054 16055 16056 16057 16058 16059 16060 16061 16062 16063 16064 16065 16066 16067 16068 16069 16070 16071 16072 16073 16074 16075 "pengiriman_aceh", 16076 16077 16078 16079 16080 16081 "pengiriman_ambon", 16082 16083 16084 16085 16086 16087 "pengiriman_atambua", 16088 16089 16090 16091 16092 16093 "pengiriman_badung", 16094 16095 16096 16097 16098 16099 "pengiriman_bali", 16100 16101 16102 16103 16104 16105 "pengiriman_balikpapan", 16106 16107 16108 16109 16110 16111 "pengiriman_bandar lampung", 16112 16113 16114 16115 16116 16117 "pengiriman_bandung", 16118 16119 16120 16121 16122 16123 "pengiriman_bandung barat", 16124 16125 16126 16127 16128 16129 "pengiriman_banjarmasin", 16130 16131 16132 16133 16134 16135 "pengiriman_banyumas", 16136 16137 16138 16139 16140 16141 "pengiriman_banyuwangi", 16142 16143 16144 16145 16146 16147 "pengiriman_batam", 16148 16149 16150 16151 16152 16153 16154 16155 16156 16157 "pengiriman_biak", 16158 16159 16160 16161 16162 16163 "pengiriman_binjai", 16164 16165 16166 16167 16168 16169 "pengiriman_blitar",
16170 16171 16172 16173 16174 16175 "pengiriman_blora", 16176 16177 16178 16179 16180 16181 16182 16183 16184 16185 "pengiriman_bojonegoro", 16186 16187 16188 16189 16190 16191 "pengiriman_boyolali", 16192 16193 16194 16195 16196 16197 "pengiriman_bukittinggi", 16198 16199 16200 16201 16202 16203 "pengiriman_buleleng", 16204 16205 16206 16207 16208 16209 "pengiriman_ciamis", 16210 16211 16212 16213 16214 16215 "pengiriman_cianjur", 16216 16217 16218 16219 16220 16221 "pengiriman_cibinong", 16222 16223 16224 16225 16226 16227 "pengiriman_cikarang", 16228 16229 16230 16231 16232 16233 "pengiriman_cikupa", 16234 16235 16236 16237 16238 16239 "pengiriman_cilacap", 16240 16241 16242 16243 16244 16245 "pengiriman_cileunyi", 16246 16247 16248 16249 16250 16251 "pengiriman_cimahi", 16252 16253 16254 16255 16256 16257 "pengiriman_cirebon", 16258 16259 16260 16261 16262 16263 "pengiriman_ciwidey", 16264 16265 16266 16267 16268 16269 "pengiriman_deli serdang", 16270 16271 16272 16273 16274 16275 "pengiriman_demak", 16276 16277 16278 16279 16280 16281 "pengiriman_denpasar", 16282 16283 16284 16285 16286 16287 16288 16289 16290 16291 "pengiriman_garut", 16292 16293 16294 16295 16296 16297 "pengiriman_gianyar", 16298 16299 16300 16301 16302 16303 "pengiriman_gresik", 16304 16305 16306 16307 16308 16309 "pengiriman_gunung kidul", 16310 16311 16312 16313 16314 16315 16316 16317 16318 16319 "pengiriman_jambi", 16320 16321 16322 16323 16324 16325 "pengiriman_jayapura", 16326 16327 16328 16329 16330 16331 "pengiriman_jember", 16332 16333 16334 16335 16336 16337 "pengiriman_jepara", 16338 16339 16340 16341 16342 16343 "pengiriman_jombang", 16344 16345 16346 16347 16348 16349 "pengiriman_karanganyar", 16350 16351 16352 16353 16354 16355 "pengiriman_karawang", 16356 16357 16358 16359 16360 16361 "pengiriman_karo", 16362 16363 16364 16365 16366 16367 "pengiriman_kebumen", 16368 16369 16370 16371 16372 16373 "pengiriman_kediri", 16374 16375 16376 16377 16378 16379 "pengiriman_keerom", 16380 16381 16382 16383 16384 16385 "pengiriman_kendal", 16386 16387 16388 16389 16390 16391 "pengiriman_klaten", 16392 16393 16394 16395 16396 16397 16398 16399 16400 16401 "pengiriman_kudus", 16402 16403 16404 16405 16406 16407 "pengiriman_kupang", 16408 16409 16410 16411 16412 16413 "pengiriman_lainnya", 16414 16415 16416 16417 16418 16419 "pengiriman_lamongan", 16420 16421 16422 16423 16424 16425 "pengiriman_lampung", 16426 16427 16428 16429 16430 16431 "pengiriman_lampung barat", 16432 16433 16434 16435 16436 16437 "pengiriman_lembang", 16438 16439 16440 16441 16442 16443 "pengiriman_lombok", 16444 16445 16446 16447 16448 16449 "pengiriman_lumajang", 16450 16451 16452 16453 16454 16455 "pengiriman_madiun", 16456 16457 16458 16459 16460 16461 "pengiriman_magelang", 16462 16463 16464 16465 16466 16467 "pengiriman_majalengka", 16468 16469 16470 16471 16472 16473 "pengiriman_makassar", 16474 16475 16476 16477 16478 16479 "pengiriman_malang", 16480 16481 16482 16483 16484 16485 "pengiriman_manado", 16486 16487 16488 16489 16490 16491 "pengiriman_medan", 16492 16493 16494 16495 16496 16497 "pengiriman_mengwi", 16498 16499 16500 16501 16502 16503 "pengiriman_mojokerto", 16504 16505 16506 16507 16508 16509 "pengiriman_nganjuk", 16510 16511 16512 16513 16514 16515 "pengiriman_ngawi", 16516 16517 16518 16519 16520 16521 "pengiriman_padang", 16522 16523 16524 16525 16526 16527 "pengiriman_palembang", 16528 16529 16530 16531 16532 16533 "pengiriman_palu", 16534 16535 16536 16537 16538 16539 "pengiriman_pasuruan", 16540 16541 16542 16543 16544 16545 "pengiriman_pati", 16546 16547 16548 16549 16550 16551 "pengiriman_pekalongan", 16552 16553 16554 16555 16556 16557 "pengiriman_pekanbaru", 16558 16559 16560 16561 16562 16563 "pengiriman_pemalang", 16564 16565 16566 16567 16568 16569 "pengiriman_ponorogo", 16570 16571 16572 16573 16574 16575 "pengiriman_pontianak", 16576 16577 16578 16579 16580 16581 "pengiriman_probolinggo", 16582 16583 16584 16585 16586 16587 "pengiriman_purbalingga", 16588 16589 16590 16591 16592 16593 "pengiriman_purwakarta", 16594 16595 16596 16597 16598 16599 "pengiriman_purwokerto", 16600 16601 16602 16603 16604 16605 "pengiriman_rembang", 16606 16607 16608 16609 16610 16611 "pengiriman_riau", 16612 16613 16614 16615 16616 16617 "pengiriman_salatiga", 16618 16619 16620 16621 16622 16623 "pengiriman_samarinda", 16624 16625 16626 16627 16628 16629 "pengiriman_semarang", 16630 16631 16632 16633 16634 16635 "pengiriman_sentani", 16636 16637 16638 16639 16640 16641 "pengiriman_serang", 16642 16643 16644 16645 16646 16647 "pengiriman_sidoarjo", 16648 16649 16650 16651 16652 16653 "pengiriman_singkawang", 16654 16655 16656 16657 16658 16659 "pengiriman_sragen", 16660 16661 16662 16663 16664 16665 "pengiriman_subang", 16666 16667 16668 16669 16670 16671 "pengiriman_sukabumi", 16672 16673 16674 16675 16676 16677 "pengiriman_sumbawa", 16678 16679 16680 16681 16682 16683 "pengiriman_surabaya", 16684 16685 16686 16687 16688 16689 "pengiriman_surakarta solo", 16690 16691 16692 16693 16694 16695 16696 16697 16698 16699 "pengiriman_tasikmalaya", 16700 16701 16702 16703 16704 16705 "pengiriman_tegal", 16706 16707 16708 16709 16710 16711 "pengiriman_timika", 16712 16713 16714 16715 16716 16717 "pengiriman_wamena", 16718 16719 16720 16721 16722 16723 "pengiriman_wiyung", 16724 16725 16726 16727 16728 16729 "pengiriman_wonokromo", 16730 16731 16732 16733 16734 16735 "pengiriman_yogyakarta", 16736 16737 16738 16739 16740 16741 16742 16743 16744 16745 16746 16747 16748 16749 16750 16751 16752 16753 16754 16755 16756 16757 16758 16759 16760 16761 16762 16763 16764 16765 16766 16767 16768 16769 16770 16771 16772 16773 16774 16775 16776 16777 16778 16779 16780 16781 16782 16783 16784 16785 16786 16787 16788 16789 16790 16791 16792 16793 16794 16795 16796 16797 16798 16799 16800 16801 16802 16803 16804 16805 16806 16807 16808 16809 16810 16811 16812 16813 16814 16815 16816 16817 16818 16819 16820 16821 16822 16823 16824 16825 16826 16827 16828 16829 16830 16831 16832 16833 16834 16835 16836 16837 16838 16839 16840 16841 16842 16843 16844 16845 16846 16847 16848 16849 16850 16851 16852 16853 16854 16855 16856 16857 16858 16859 16860 16861 16862 16863 16864 16865 16866 16867 16868 16869 16870 16871 16872 16873 16874 16875 16876 16877 16878 16879 16880 16881 16882 16883 16884 16885 16886 16887 16888 16889 16890 16891 16892 16893 16894 16895 16896 16897 16898 16899 16900 16901 16902 16903 16904 16905 16906 16907 16908 16909 16910 16911 16912 16913 16914 16915 16916 16917 16918 16919 16920 16921 16922 16923 16924 16925 16926 16927 16928 16929 16930 16931 16932 16933 16934 16935 16936 16937 16938 16939 16940 16941 16942 16943 16944 16945 16946 16947 16948 16949 16950 16951 16952 16953 16954 16955 16956 16957 16958 16959 16960 16961 16962 16963 16964 16965 16966 16967 16968 16969 16970 16971 16972 16973 16974 16975 16976 16977 16978 16979 16980 16981 16982 16983 16984 16985 16986 16987 16988 16989 16990 16991 16992 16993 16994 16995 16996 16997 16998 16999 17000 17001 17002 17003 17004 17005 17006 17007 17008 17009 17010 17011 17012 17013 17014 17015 17016 17017 17018 17019 17020 17021 17022 17023 17024 17025 17026 17027 17028 17029 17030 17031 17032 17033 17034 17035 17036 17037 17038 17039 17040 17041 17042 17043 17044 17045 17046 17047 17048 17049 17050 17051 17052 17053 17054 17055 17056 17057 17058 17059 17060 17061 17062 17063 17064 17065 17066 17067 17068 17069 17070 17071 17072 17073 17074 17075 17076 17077 17078 17079 17080 17081 17082 17083 17084 17085 17086 17087 17088 17089 17090 17091 17092 17093 17094 17095 17096 17097 17098 17099 17100 17101 17102 17103 17104 17105 17106 17107 17108 17109 17110 17111 17112 17113 17114 17115 17116 17117 17118 17119 17120 17121 17122 17123 17124 17125 17126 17127 17128 17129 17130 17131 17132 17133 17134 17135 17136 17137 17138 17139 17140 17141 17142 17143 17144 17145 17146 17147 17148 17149 17150 17151 17152 17153 17154 17155 17156 17157 17158 17159 17160 17161 17162 17163 17164 17165 17166 17167 17168 17169 17170 17171 17172 17173 17174 17175 17176 17177 17178 17179 17180 17181 17182 17183 17184 17185 17186 17187 17188 17189 17190 17191 17192 17193 17194 17195 17196 17197 17198 17199 17200 17201 17202 17203 17204 17205 17206 17207 17208 17209 17210 17211 17212 17213 17214 17215 17216 17217 17218 17219 17220 17221 17222 17223 17224 17225 17226 17227 17228 17229 17230 17231 17232 17233 17234 17235 17236 17237 17238 17239 17240 17241 17242 17243 17244 17245 17246 17247 17248 17249 17250 17251 17252 17253 17254 17255 17256 17257 17258 17259 17260 17261 17262 17263 17264 17265 17266 17267 17268 17269 17270 17271 17272 17273 17274 17275 17276 17277 17278 17279 17280 17281 17282 17283 17284 17285 17286 17287 17288 17289 17290 17291 17292 17293 17294 17295 17296 17297 17298 17299 17300 17301 17302 17303 17304 17305 17306 17307 17308 17309 17310 17311 17312 17313 17314 17315 17316 17317 17318 17319 17320 17321 17322 17323 17324 17325 17326 17327 17328 17329 17330 17331 17332 17333 17334 17335 17336 17337 17338 17339 17340 17341 17342 17343 17344 17345 17346 17347 ] 17348 17349 let non_jabodetabek = [] 17350 for(var i=0;i<cityNonJabodetabek.length;i++) { 17351 const obj = { 17352 "code": cityNonJabodetabek[i].toLowerCase().replace('pengiriman_', '').replace(' ','-'), 17353 "city": cityNonJabodetabek[i].replace('pengiriman_', '').replace(' ','-'), 17354 "zip": [] 17355 } 17356 non_jabodetabek.push(obj) 17357 } 17358 let current_location = getCookie("location_delivery") 17359 $("[name=location]").change(function(){ 17360 let v = $(this).val() 17361 let option = [] 17362 if(v == 'Jabodetabek') { 17363 for(var i=0;i<jabodetabek.length;i++) { 17364 const jabodetabekHtml = `<option value=${jabodetabek[i].city}>${jabodetabek[i].city}</option>` 17365 option.push(jabodetabekHtml) 17366 } 17367 $("#choose-location").html(`<option value="">Choose Location</option>${option}`) 17368 } else { 17369 for(var i=0;i<non_jabodetabek.length;i++) { 17370 const nonjabodetabekHtml = `<option value=${non_jabodetabek[i].city}>${non_jabodetabek[i].city}</option>` 17371 option.push(nonjabodetabekHtml) 17372 } 17373 $("#choose-location").html(`<option value="">Choose Location</option>${option}`) 17374 } 17375 }) 17376 17377 $("#location-lock-submit").click(function(e){
17378 let select = $("#choose-location") 17379 let value = select.val().toLowerCase() 17380 console.log(value) 17381 if(select.val() == "") { 17382 return alert("Choose Your Location") 17383 e.preventDefault() 17384 } 17385 setCookie("location_delivery",value,1000000); 17386 17387 location.reload(); 17388 17389 }) 17390 17391 $("#close-popup-delivery").click(function(){ 17392 $(".MuiDialog-root").hide() 17393 if(!current_location){ 17394 setCookie("location_delivery","jakarta",1000000); 17395 $("#loc_delivery_city, #loc_delivery_city_mobile").text("Jakarta") 17396 } 17397 }) 17398 $("#loc_delivery, #loc_delivery_mobile").click(function(){ 17399 $(".MuiDialog-root").show() 17400 }) 17401 17402 17403 if(!current_location){ 17404 17405 } else { 17406 $("#loc_delivery_city, #loc_delivery_city_mobile").text(current_location) 17407 $("#choose-location").each(function(){ 17408 if(current_location == 'jakarta' || current_location == 'depok' || current_location == 'bogor' || current_location == 'tangerang' || current_location == 'bekasi'){ 17409 $("#jabodetabek").trigger("click") 17410 } else { 17411 $("#non-jabodetabek").trigger("click") 17412 } 17413 $("#choose-location").find("option[value="+current_location+"]").attr("selected", "selected") 17414 }) 17415 } 17416 17417 // if(current_location == 'jakarta' || current_location == 'depok' || current_location == 'bogor' || current_location == 'tangerang' || current_location == 'bekasi' || current_location == 'bandung' || current_location == 'semarang' || current_location == 'yogyakarta' || current_location == 'surabaya'){ 17418 // $("#timeMalam").attr("disabled", false) 17419 // } else { 17420 // $("#timeMalam").attr("disabled", true) 17421 // } 17422 17423 if(current_location && current_location != 'jakarta') { 17424 $("#self-pickup").attr("disabled", true) 17425 } 17426 17427 function setCookie(name,value,days) { 17428 var expires = ""; 17429 if (days) { 17430 var date = new Date(); 17431 date.setTime(date.getTime() + (days*24*60*60*1000)); 17432 expires = "; expires=" + date.toUTCString(); 17433 } 17434 document.cookie = name + "=" + (value || "") + expires + "; path=/"; 17435 } 17436 function getCookie(name) { 17437 var nameEQ = name + "="; 17438 var ca = document.cookie.split(';'); 17439 for(var i=0;i < ca.length;i++) { 17440 var c = ca[i]; 17441 while (c.charAt(0)==' ') c = c.substring(1,c.length); 17442 if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); 17443 } 17444 return null; 17445 } 17446</script>
17446 17447<!-- One Tap --> 17448
17448<script> 17449 console.log("Outerbloom..."); 17450 </script>
17450 17451 17452 <!-- Initialize User Data (IP, Browser, Device) --> 17453 17454 <div id="shopify-block-ATzRpVTBPU3k1R2pnW__286197278318599166" class="shopify-block shopify-app-block"> 17455 17456 17457<div style="position: fixed; bottom: 0; right: 0"></div> 17458
17459<script> 17460console.info("bitlogin extension version: v2.5.7"); 17461 17462const googleScript = document.createElement("script"); 17463googleScript.setAttribute("src", "https://accounts.google.com/gsi/client"); 17464document.head.append(googleScript); 17465 17466const bitLoginBaseUrl = "https://api.bitbybit.studio"; 17467const apiUrl = `${bitLoginBaseUrl}/bitlogin/api`; 17468 17469const appearance = {"style":"square","hasShadow":true,"domain":"outerbloom1.myshopify.com","colorScheme":"match","backgroundColor":"#ffffff","outlineColor":"#ffe100","textColor":"#700000","position":"top","hideDivider":false,"dividerText":"","size":"small","format":"contentFlex","language":"en","buttonText":"Continue With","redirectLink":"\/account","googleOneTap":true,"googleOneTapBanner":true,"captureAdditionalData":true,"customerTag":"bitLogin","redirectOneTapDesktop":"[{\"label\":\"Account\",\"label2\":\"Desktop: Account\",\"value\":\"account\",\"parentValue\":\"Desktop\"}]","redirectOneTapMobile":"[{\"label\":\"Thank you page\",\"label2\":\"Mobile: Thank you page\",\"value\":\"thank_you\",\"parentValue\":\"Mobile\"}]","watermark":true,"buttonList":{"google":"Continue with Google","facebook":"Continue with Facebook","apple":"Continue with Apple","whatsapp":"Continue with WhatsApp","microsoft":"Continue with Microsoft","twitter":"Continue with X","amazon":"Continue with Amazon","instagram":"Continue with Instagram","magic_link":"Continue with Magic Link","mobile_app":"Continue with Mobile App","linkedin":"Continue with LinkedIn"}}; 17470const config = [{"domain":"outerbloom1.myshopify.com","provider":"FACEBOOK","enabledMobile":false,"enabledWeb":true,"clientId":"922184709213757","clientSecret":"e3c874c8bce6da4211538ebda706d1cb","appleTeamId":null,"applePrivateKey":null,"usePersonalOauth":false,"position":null},{"domain":"outerbloom1.myshopify.com","provider":"GOOGLE","enabledMobile":true,"enabledWeb":true,"clientId":"933600373534-vk6hiu9lqrtbblj0357q0gsoo7mqvsd0.apps.googleusercontent.com","clientSecret":"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","appleTeamId":null,"applePrivateKey":null,"usePersonalOauth":true,"position":null},{"domain":"outerbloom1.myshopify.com","provider":"APPLE","enabledMobile":true,"enabledWeb":true,"clientId":"com.bitlogin.outerbloom","clientSecret":"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","appleTeamId":"1A","applePrivateKey":"1A","usePersonalOauth":false,"position":null},{"domain":"outerbloom1.myshopify.com","provider":"WHATSAPP","enabledMobile":false,"enabledWeb":true,"clientId":null,"clientSecret":null,"appleTeamId":null,"applePrivateKey":null,"usePersonalOauth":false,"position":null},{"domain":"outerbloom1.myshopify.com","provider":"MICROSOFT","enabledMobile":false,"enabledWeb":false,"clientId":null,"clientSecret":null,"appleTeamId":null,"applePrivateKey":null,"usePersonalOauth":false,"position":null},{"domain":"outerbloom1.myshopify.com","provider":"TWITTER","enabledMobile":false,"enabledWeb":false,"clientId":null,"clientSecret":null,"appleTeamId":null,"applePrivateKey":null,"usePersonalOauth":false,"position":null},{"domain":"outerbloom1.myshopify.com","provider":"AMAZON","enabledMobile":false,"enabledWeb":false,"clientId":"amzn1.application-oa2-client.5b560a5e3e2943d6b25c50cd6dca5532","clientSecret":"amz
17470n1.oa2-cs.v1.1cb5f9085a202341f60daf5a7be16c570ccc0b4bd5908b3afd080f34e9b8935d","appleTeamId":null,"applePrivateKey":null,"usePersonalOauth":false,"position":null}]; 17471 17472const urlSearchParams = new URLSearchParams(window.location.search); 17473const checkoutUrl = urlSearchParams.get("checkout_url"); 17474const redirectUrl = checkoutUrl || appearance.redirectLink; 17475 17476let locationCacheSet = false; 17477let errorLocation = false; 17478let oneTapSet = false; 17479 17480let bitloginCache = { 17481 appearance: appearance, 17482 config: config 17483}; 17484 17485let isInitializing = false; 17486const queue = []; 17487 17488// Add CSS for the popup 17489const popupStyles = document.createElement('style'); 17490popupStyles.textContent = ` 17491 /* Styles for login popup */ 17492 .bitlogin-popup-overlay { 17493 position: fixed; 17494 top: 0; 17495 left: 0; 17496 width: 100%; 17497 height: 100%; 17498 background: rgba(0, 0, 0, 0.45); 17499 backdrop-filter: blur(4px); 17500 display: flex; 17501 align-items: center; 17502 justify-content: center; 17503 opacity: 0; 17504 transition: opacity 0.3s ease-in-out; 17505 z-index: 999999; 17506 } 17507 17508 .bitlogin-popup-overlay.visible { 17509 opacity: 1; 17510 } 17511 17512 .bitlogin-popup { 17513 background: #FFFFFF; 17514 box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); 17515 border-radius: 16px; 17516 width: 100%; 17517 max-width: 560px; 17518 display: flex; 17519 overflow: hidden; 17520 position: relative; 17521 opacity: 0; 17522 transform: translateY(20px) scale(0.98); 17523 transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1); 17524 } 17525 17526 .bitlogin-popup.visible { 17527 opacity: 1; 17528 transform: translateY(0) scale(1); 17529 } 17530 17531 .bitlogin-popup-with-image { 17532 max-width: 640px; 17533 } 17534 17535 .bitlogin-popup-right-image { 17536 flex-direction: row-reverse; 17537 } 17538 17539 .bitlogin-popup-image { 17540 object-fit: cover; 17541 width: 50%; 17542 height: auto; 17543 } 17544 17545 .bitlogin-popup-content { 17546 padding: 32px; 17547 position: relative; 17548 width: 50%; 17549 } 17550 17551 .bitlogin-popup-close { 17552 position: absolute; 17553 top: 16px; 17554 right: 16px; 17555 background: white; 17556 border: none; 17557 width: 30px; 17558 height: 30px; 17559 display: flex;
17560 align-items: center; 17561 justify-content: center; 17562 cursor: pointer; 17563 transition: background-color 0.2s; 17564 color: inherit; 17565 padding: 0; 17566 } 17567 17568 .bitlogin-popup-close:hover { 17569 background-color: #e5e5e5; 17570 } 17571 17572 .bitlogin-popup-buttons { 17573 display: flex; 17574 flex-direction: column; 17575 gap: 12px; 17576 margin-top: 24px; 17577 } 17578 17579 /* Button styles within popup - override width for popup buttons */ 17580 .bitlogin-popup-buttons #google-login, 17581 .bitlogin-popup-buttons #facebook-login, 17582 .bitlogin-popup-buttons #apple-login, 17583 .bitlogin-popup-buttons #whatsapp-login, 17584 .bitlogin-popup-buttons #microsoft-login, 17585 .bitlogin-popup-buttons #twitter-login, 17586 .bitlogin-popup-buttons #amazon-login, 17587 .bitlogin-popup-buttons #instagram-login, 17588 .bitlogin-popup-buttons #magic-link-login, 17589 .bitlogin-popup-buttons #mobile-app-login { 17590 width: 100% !important; 17591 font-family: inherit !important; 17592 } 17593 17594 .bitlogin-popup-footer { 17595 margin-top: 32px; 17596 text-align: center; 17597 font-size: 14px; 17598 opacity: 0.6; 17599 } 17600 17601 /* Modern Typography */ 17602 .bitlogin-popup h2 { 17603 margin-top: 12px; 17604 font-size: 21px !important; 17605 line-height: 1.2 !important; 17606 font-weight: 700 !important; 17607 letter-spacing: -0.02em !important; 17608 margin-bottom: 16px !important; 17609 } 17610 17611 .bitlogin-popup-header { 17612 position: relative; 17613 margin-bottom: 24px; 17614 } 17615 17616 /* Modern gradient accent */ 17617 .bitlogin-popup-content > div { 17618 font-size: 16px !important; 17619 line-height: 1.2 !important; 17620 opacity: 0.85 !important; 17621 } 17622 17623 /* Enhanced button interactions */ 17624 .bitlogin-popup-buttons button { 17625 position: relative; 17626 overflow: hidden; 17627 } 17628 17629 @keyframes ripple { 17630 0% { 17631 transform: scale(0, 0); 17632 opacity: 0.5; 17633 } 17634 100% { 17635 transform: scale(100, 100); 17636 opacity: 0; 17637 } 17638 } 17639 17640 /* Responsive adjustments */ 17641 @media (max-width: 640px) { 17642 .bitlogin-popup { 17643 max-width: 90%; 17644 width: 90%; 17645 margin: 0 16px; 17646 } 17647 17648 .bitlogin-popup-with-image { 17649 flex-direction: column !important; 17650 } 17651 17652 .bitlogin-popup-image { 17653 width: 100%; 17654 height: 180px; 17655 } 17656 17657 .bitlogin-popup-content { 17658 padding: 24px; 17659 } 17660 17661 .bitlogin-popup h2 { 17662 font-size: 24px !important; 17663 } 17664 } 17665`; 17666 17667document.head.appendChild(popupStyles); 17668 17669// Add fonts link for different font options 17670const fontsLink = document.createElement('link'); 17671fontsLink.rel = 'stylesheet'; 17672fontsLink.href = 'https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600&family=Roboto:wght@400;500&family=Open+Sans:wght@400;500;600&family=Noto+Sans:wght@400;500;600&family=Lato:wght@400;700&family=Poppins:wght@400;500;600&family=Quicksand:wght@400;500;600&family=Raleway:wght@400;500;600&family=PT+Sans:wght@400;700&family=Oswald:wght@400;500;600&display=swap'; 17673document.head.appendChild(fontsLink); 17674 17675(async () => { 17676 try { 17677 let host = window.location.host; 17678 if (host === "admin.shopify.com") { 17679 host = `${window.location.pathname.split("/")[2]}.myshopify.com`; 17680 } 17681 17682 const urlSearchParams = new URLSearchParams(window.location.search); 17683 const checkoutUrl = urlSearchParams.get("checkout_url"); 17684 17685 async function init({ inputRef, index }) { 17686 if (isInitializing) { 17687 queue.push(() => init({ inputRef, index })); 17688 return; 17689 } 17690 17691 isInitializing = true; 17692 17693 try { 17694 let bitLoginSectionRoot = document.querySelector( 17695 `.bitlogin-root[data-index="${index}"]` 17696 ); 17697 17698 const formRef = inputRef?.closest( 17699 "form:not([action='/account/recover'])" 17700 ); 17701 17702 if (formRef && !bitLoginSectionRoot) { 17703 await getLocation(); 17704 17705 bitLoginSectionRoot = document.createElement(`div`); 17706 17707 bitLoginSectionRoot.setAttribute("class", "bitlogin-root"); 17708 bitLoginSectionRoot.setAttribute("data-index", `${index}`); 17709 17710 updateAppearance({ 17711 formRef, 17712 rootRef: bitLoginSectionRoot, 17713 host, 17714 }); 17715 } 17716 } catch (err) { 17717 console.error(`error while initiating bitlogin extensions`, err); 17718 } finally { 17719 // Release the lock 17720 isInitializing = false; 17721 17722 // Check if there are pending items in the queue 17723 if (queue.length > 0) { 17724 // Process the next function in the queue 17725 const nextFunction = queue.shift(); 17726 nextFunction(); 17727 } 17728 } 17729 } 17730 17731 function initAll() { 17732 return new Promise((resolve, reject) => { 17733 setTimeout(async () => { 17734 const inputRefs = document.querySelectorAll( 17735 'input[name="customer[email]"]' 17736 ); 17737 17738 for (let i = 0; i < inputRefs.length; i++) { 17739 const currentInputRef = inputRefs[i]; 17740 const isVisible = isElementVisible(currentInputRef); 17741 17742 if (isVisible) { 17743 await init({ inputRef: currentInputRef, index: i }); 17744 } 17745 } 17746 17747 resolve("ok"); 17748 }, 100); 17749 }); 17750 } 17751 17752 const observer = new MutationObserver((mutationsList) => { 17753 for (let mutation of mutationsList) { 17754 initAll(); 17755 } 17756 });
17757 17758 observer.observe(document.body, { 17759 childList: true, 17760 subtree: true, 17761 attributes: true, 17762 }); 17763 17764 initAll(); 17765 17766 if (appearance.googleOneTap) { 17767 setupOneTap({ host, checkoutUrl }); 17768 } 17769 17770 // Initialize popup 17771 await initPopup(host); 17772 } catch (error) { 17773 console.error("Error initializing BitLogin:", error); 17774 } 17775})(); 17776 17777async function initPopup(host) { 17778 // Check if user is already logged in using Liquid checks properly 17779 const isLoggedIn = false || 17780 document.querySelector('.customer-logout-link') || 17781 document.querySelector('.account-link') || 17782 window.location.pathname.includes('/account'); 17783 17784 if (isLoggedIn) { 17785 return; // User is logged in, don't show popup 17786 } 17787 17788 try { 17789 // Fetch the popup configuration 17790 const popupConfig = await fetch(`${apiUrl}/appearance/popup/domain/${host}`) 17791 .then(res => res.json()) 17792 .catch(err => { 17793 console.error('Error fetching popup configuration:', err); 17794 return null; 17795 }); 17796 17797 if (!popupConfig || !popupConfig.enabled) { 17798 return; // Don't show popup if disabled or config not found 17799 } 17800 17801 // Create popup after 10 seconds 17802 setTimeout(() => { 17803 // Check if user is still on the page and still not logged in 17804 if (document.visibilityState === 'visible') { 17805 // Additional check in case user logged in during the 10 second wait 17806 const currentlyLoggedIn = false || 17807 document.querySelector('.customer-logout-link') || 17808 document.querySelector('.account-link'); 17809 17810 if (!currentlyLoggedIn) { 17811 createLoginPopup(popupConfig, host); 17812 } 17813 } 17814 }, 10000); 17815 } catch (error) { 17816 console.error('Error initializing popup:', error); 17817 } 17818} 17819 17820function createLoginPopup(popupConfig, host) { 17821 // Font mapping 17822 const fontFamilyMap = { 17823 system_fonts: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif', 17824 montserrat: 'Montserrat, sans-serif', 17825 roboto: 'Roboto, sans-serif', 17826 open_sans: 'Open Sans, sans-serif', 17827 noto_sans: 'Noto Sans, sans-serif', 17828 lato: 'Lato, sans-serif', 17829 poppins: 'Poppins, sans-serif', 17830 quicksand: 'Quicksand, sans-serif', 17831 raleway: 'Raleway, sans-serif', 17832 pt_sans: 'PT Sans, sans-serif', 17833 oswald: 'Oswald, sans-serif', 17834 }; 17835 17836 // Create overlay 17837 const overlay = document.createElement('div'); 17838 overlay.className = 'bitlogin-popup-overlay'; 17839 17840 // Create popup container with appropriate styling 17841 const popup = document.createElement('div'); 17842 popup.className = 'bitlogin-popup'; 17843 17844 if (popupConfig.layout === 'default') { 17845 popup.style.maxWidth = '400px'; 17846 } 17847 17848 // Function to close the popup 17849 const closePopup = () => { 17850 overlay.classList.remove('visible'); 17851 popup.classList.remove('visible'); 17852 setTimeout(() => { 17853 if (document.body.contains(overlay)) { 17854 document.body.removeChild(overlay); 17855 } 17856 }, 300); 17857 }; 17858 17859 // Add click handler to the overlay to close when clicking outside 17860 overlay.addEventListener('click', (event) => { 17861 // Close only if clicking directly on the overlay, not its children 17862 if (event.target === overlay) { 17863 closePopup(); 17864 } 17865 }); 17866 17867 // Add escape key handler to close popup 17868 document.addEventListener('keydown', (event) => { 17869 if (event.key === 'Escape' && document.body.contains(overlay)) { 17870 closePopup(); 17871 } 17872 }); 17873 17874 // Create layout with image if specified 17875 let contentWrapper; 17876 if (popupConfig.layout !== 'default' && popupConfig.popupImage) { 17877 popup.classList.add('bitlogin-popup-with-image'); 17878 17879 if (popupConfig.layout === 'right') { 17880 popup.classList.add('bitlogin-popup-right-image'); 17881 } 17882 17883 // Add image 17884 const image = document.createElement('img'); 17885 image.className = 'bitlogin-popup-image'; 17886 image.src = popupConfig.popupImage; 17887 image.alt = 'Login'; 17888 image.loading = 'lazy'; 17889 popup.appendChild(image); 17890 17891 // Create content container 17892 contentWrapper = document.createElement('div'); 17893 contentWrapper.className = 'bitlogin-popup-content'; 17894 17895 if (popupConfig.layout === 'right') { 17896 const closeButton = document.createElement('button'); 17897 closeButton.className = 'bitlogin-popup-close'; 17898 closeButton.innerHTML = `<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 17899 <path d="M13 1L1 13M1 1L13 13" stroke="${popupConfig.fontColor}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 17900 </svg>`; 17901 closeButton.setAttribute('aria-label', 'Close'); 17902 closeButton.onclick = closePopup; 17903 17904 popup.appendChild(closeButton); 17905 } 17906 } else { 17907 contentWrapper = document.createElement('div'); 17908 contentWrapper.className = 'bitlogin-popup-content'; 17909 contentWrapper.style.width = '100%'; 17910 } 17911 17912 // Set background style 17913 if (popupConfig.backgroundTheme === 'gradient') { 17914 contentWrapper.style.background = `linear-gradient(135deg, ${popupConfig.backgroundPopupColor}, ${popupConfig.gradientColor})`; 17915 } else { 17916 contentWrapper.style.backgroundColor = popupConfig.backgroundPopupColor; 17917 } 17918 17919 // Apply font family 17920 contentWrapper.style.setProperty('font-family', fontFamilyMap[popupConfig.font] || fontFamilyMap.system_fonts, 'important'); 17921 17922 if (popupConfig.layout !== 'right') { 17923 const closeButton = document.createElement('button'); 17924 closeButton.className = 'bitlogin-popup-close'; 17925 closeButton.innerHTML = `<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 17926 <path d="M13 1L1 13M1 1L13 13" stroke="${popupConfig.fontColor}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 17927 </svg>`; 17928 closeButton.setAttribute('aria-label', 'Close'); 17929 closeButton.onclick = closePopup; 17930 17931 contentWrapper.appendChild(closeButton); 17932 } 17933 17934 // Add heading with subtle animation effect 17935 const header = document.createElement('div'); 17936 header.className = 'bitlogin-popup-header'; 17937 17938 const heading = document.createElement('h2'); 17939 heading.textContent = popupConfig.headingText || 'Sign in for exclusive benef
17939its'; 17940 heading.style.color = popupConfig.fontColor; 17941 header.appendChild(heading); 17942 17943 // Add body text with improved formatting 17944 const bodyText = document.createElement('div'); 17945 bodyText.innerHTML = popupConfig.bodyText || 'Join our community to access exclusive offers and a personalized shopping experience.'; 17946 bodyText.style.color = popupConfig.fontColor; 17947 header.appendChild(bodyText); 17948 17949 contentWrapper.appendChild(header); 17950 17951 // Create buttons container with modern styling 17952 const buttonsContainer = document.createElement('div'); 17953 buttonsContainer.className = 'bitlogin-popup-buttons'; 17954 17955 // Add social buttons 17956 const providerLabels = { 17957 'GOOGLE': 'Continue with Google', 17958 'FACEBOOK': 'Continue with Facebook', 17959 'APPLE': 'Continue with Apple', 17960 'WHATSAPP': 'Continue with WhatsApp', 17961 'MAGIC_LINK': 'Continue with Email', 17962 }; 17963 17964 // Add first login provider button 17965 if (popupConfig.loginProvider1 !== 'NONE') { 17966 const buttonConfig = { 17967 theme: popupConfig.colorScheme || 'match', 17968 customColor: popupConfig.textColor, 17969 format: 'contentFlex', 17970 buttonText: bitloginCache.appearance.buttonList[popupConfig.loginProvider1.toLowerCase()], 17971 hasShadow: popupConfig.hasShadow !== undefined ? popupConfig.hasShadow : true, 17972 style: popupConfig.style || 'rounded', 17973 size: popupConfig.size || 'medium', 17974 colorScheme: popupConfig.colorScheme || 'match', 17975 backgroundColor: popupConfig.backgroundColor || '#3B82F6', 17976 textColor: popupConfig.textColor || '#FFFFFF', 17977 outlineColor: popupConfig.outlineColor || '#3B82F6', 17978 host: host 17979 }; 17980 17981 const button1 = createSocialLoginButton(popupConfig.loginProvider1, buttonConfig); 17982 17983 // Handle click event - this overrides the default click handler in createSocialLoginButton 17984 button1.onclick = () => { 17985 onClickSocialLogin({ provider: popupConfig.loginProvider1.toLowerCase(), host }); 17986 closePopup(); 17987 }; 17988 17989 buttonsContainer.appendChild(button1); 17990 } 17991 17992 // Add second login provider button if enabled 17993 if (popupConfig.loginProvider2 !== 'NONE') { 17994 const buttonConfig = { 17995 theme: popupConfig.colorScheme || 'match', 17996 customColor: popupConfig.textColor, 17997 format: 'contentFlex', 17998 buttonText: bitloginCache.appearance.buttonList[popupConfig.loginProvider2.toLowerCase()], 17999 hasShadow: popupConfig.hasShadow !== undefined ? popupConfig.hasShadow : true, 18000 style: popupConfig.style || 'rounded', 18001 size: popupConfig.size || 'medium', 18002 colorScheme: popupConfig.colorScheme || 'match', 18003 backgroundColor: popupConfig.backgroundColor || '#3B82F6', 18004 textColor: popupConfig.textColor || '#FFFFFF', 18005 outlineColor: popupConfig.outlineColor || '#3B82F6', 18006 host: host 18007 }; 18008 18009 const button2 = createSocialLoginButton(popupConfig.loginProvider2, buttonConfig); 18010 18011 // Handle click event - this overrides the default click handler in createSocialLoginButton 18012 button2.onclick = () => { 18013 onClickSocialLogin({ provider: popupConfig.loginProvider2.toLowerCase(), host }); 18014 closePopup(); 18015 }; 18016 18017 buttonsContainer.appendChild(button2); 18018 } 18019 18020 contentWrapper.appendChild(buttonsContainer); 18021 18022 // Append content to popup 18023 popup.appendChild(contentWrapper); 18024 18025 // Append popup to overlay 18026 overlay.appendChild(popup); 18027 18028 // Append overlay to body 18029 document.body.appendChild(overlay); 18030 18031 // Trigger animation with slight delay for better perceived performance 18032 setTimeout(() => { 18033 overlay.classList.add('visible'); 18034 setTimeout(() => { 18035 popup.classList.add('visible'); 18036 }, 50); 18037 }, 10); 18038} 18039 18040window.addEventListener("load", () => { 18041 window.addEventListener("message", (event) => { 18042 const receivedData = event.data; 18043 18044 if (receivedData.type === "authorize") { 18045 post( 18046 JSON.parse( 18047 JSON.stringify({ 18048 "customer[email]": receivedData.email, 18049 "customer[password]": receivedData.password, 18050 form_type: "customer_login", 18051 utf8: "â", 18052 return_url: redirectUrl, 18053 }) 18054 ) 18055 ); 18056 } else if (receivedData.type === "rejected") { 18057 if (receivedData.reason === "customer_account_disabled") { 18058 showAlert( 18059 "Your account needs to be activated. We've sent you an activation link - please check your email to complete this step." 18060 ); 18061 } else if (receivedData.reason === "customer_entry_created_email_not_set") { 18062 showAlert( 18063 "A new account was created but requires an email address. Please update your account with a valid email address to continue." 18064 ); 18065 } else if (receivedData.reason === "customer_exist_email_not_set") { 18066 showAlert( 18067 "Your existing account is missing an email address. Please contact support to update your account with a valid email address." 18068 ); 18069 } 18070 } 18071 18072 if (receivedData.type === "customer_authenticated") { 18073 // Dispatch a custom event that merchants can listen for to implement their custom logic 18074 const customerAuthEvent = new CustomEvent('bitlogin:customer_authenticated', { 18075 detail: { 18076 provider: receivedData.provider, 18077 customer: receivedData.customer, 18078 shopifyCustomerCreated: receivedData.shopifyCustomerCreated 18079 } 18080 }); 18081 18082 // Dispatch the event on the window object so merchants can listen for it 18083 window.dispatchEvent(customerAuthEvent); 18084 18085 } 18086 }); 18087}); 18088 18089// Reusable functions for social login buttons 18090function createSocialLoginButton(provider, config = {}) { 18091 const { 18092 theme = 'match', 18093 customColor = null, 18094 format = 'contentFlex', 18095 buttonText = null, 18096 hasShadow = true, 18097 style = 'rounded', 18098 size = 'medium', 18099 colorScheme = 'match', 18100 backgroundColor = '#3B82F6', 18101 textColor = '#FFFFFF', 18102 outlineColor = '#3B82F6', 18103 rootRef = null, 18104 host = null 18105 } = config; 18106 18107 // Create button element with appropriate ID and attributes 18108 const button = document.createElement('button'); 18109 button.id = `${provider.toLowerCase()}-login`; 18110 button.type = 'button'; 18111 18112 // Set the inner SVG based on provider 18113 switch (provider.toUpperCase()) { 18114 case 'GOOGLE': 18115 button.innerHTML = googleLoginIcon(theme, customColor); 18116 break; 18117 case 'FACEBOOK': 18118 button.innerHTML = facebookLoginIcon(theme, customColor); 18119 break; 18120 case 'APPLE': 18121 button.innerHTML = appleLoginIcon(theme, customColor); 18122 break; 18123 case 'WHATSAPP': 18124 button.innerHTML = whatsappLoginIcon(theme, customColor); 18125 break; 18126 case 'MICROSOFT': 18127 button.innerHTML = microsoftLoginIcon(theme, customColor); 18128 break; 18129 case 'TWITTER': 18130 button.innerHTML = twitterLoginIcon(theme, customColor); 18131 break; 18132 case 'AMAZON': 18133 button.innerHTML = amazonLoginIcon(theme, customColor); 18134 break; 18135 case 'INSTAGRAM': 18136 button.innerHTML = instagramLoginIcon(theme, customColor); 18137 break; 18138 case 'MAGIC_LINK': 18139 button.innerHTML = magicLinkLoginIcon(theme, customColor); 18140 break; 18141 case 'MOBILE_APP':
18142 button.innerHTML = mobileAppLoginIcon(theme, customColor); 18143 break; 18144 case 'LINKEDIN': 18145 button.innerHTML = linkedinLoginIcon(theme, customColor); 18146 break; 18147 } 18148 18149 // Add text if format isn't icon-only and buttonText is provided 18150 if (format !== "wrapperFlexContainerOnlyLogo" && buttonText) { 18151 button.innerHTML += `<p>${buttonText}</p>`; 18152 } 18153 18154 // Apply styling 18155 // Shadow 18156 if (hasShadow) { 18157 const shadowProperties = `0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)`; 18158 button.style["box-shadow"] = shadowProperties; 18159 } 18160 18161 // Border radius 18162 const radiusProperties = 18163 style === "rounded" 18164 ? "8px" 18165 : style === "square" 18166 ? "0px" 18167 : style === "fullRounded" 18168 ? format === "wrapperFlexContainerOnlyLogo" 18169 ? "50%" 18170 : "50px" 18171 : undefined; 18172 button.style["border-radius"] = radiusProperties; 18173 18174 // Size 18175 const sizeProperties = 18176 size === "medium" 18177 ? "12px" 18178 : size === "small" 18179 ? "8px" 18180 : size === "large" 18181 ? "16px" 18182 : "8px"; 18183 18184 button.style["padding-block"] = sizeProperties; 18185 18186 // Format styling 18187 if (format) { 18188 if ( 18189 format === "contentFlexReverse" || 18190 format === "contentFlexCenterReverse" 18191 ) { 18192 const flexDir = `row-reverse`; 18193 button.style["flex-direction"] = flexDir; 18194 } 18195 18196 if ( 18197 format === "contentFlexCenter" || 18198 format === "contentFlexCenterReverse" 18199 ) { 18200 const justifyContent = `center`; 18201 button.style["justify-content"] = justifyContent; 18202 } else if ( 18203 format === "contentFlex" || 18204 format === "contentFlexReverse" 18205 ) { 18206 const buttonTextElement = button.querySelector("p"); 18207 if (buttonTextElement) { 18208 buttonTextElement.style["flex-grow"] = 1; 18209 buttonTextElement.style["text-align"] = "center"; 18210 } 18211 } 18212 18213 if (format === "wrapperFlexContainerOnlyLogo" && rootRef) { 18214 rootRef.style["flex-direction"] = "row"; 18215 rootRef.style["gap"] = "8px"; 18216 rootRef.style["display"] = "flex"; 18217 rootRef.style["flex-wrap"] = "wrap"; 18218 18219 const sizeMapping = { 18220 small: "52px", 18221 medium: "62px", 18222 large: "72px", 18223 }; 18224 const buttonSize = sizeMapping[size] || "52px"; 18225 18226 button.style["margin"] = 0; 18227 button.style["width"] = buttonSize; 18228 button.style["height"] = buttonSize; 18229 button.style["display"] = "flex"; 18230 button.style["align-items"] = "center"; 18231 button.style["justify-content"] = "center"; 18232 18233 const svgElement = button.querySelector("svg"); 18234 if (svgElement) { 18235 svgElement.style["flex"] = "none"; 18236 } 18237 } 18238 } 18239 18240 // Color scheme styling 18241 if (colorScheme === "black") { 18242 button.classList.add("scheme-black"); 18243 } else if (colorScheme === "white") { 18244 button.classList.add("scheme-white"); 18245 } else if (colorScheme === "custom") { 18246 button.style["background-color"] = backgroundColor; 18247 button.style["color"] = textColor; 18248 button.style["border-color"] = outlineColor; 18249 18250 const darkenColor = (color, percentage) => { 18251 const value = parseInt(color.slice(1), 16); 18252 const r = Math.max(0, ((value >> 16) & 0xff) - (0xff * percentage)); 18253 const g = Math.max(0, ((value >> 8) & 0xff) - (0xff * percentage)); 18254 const b = Math.max(0, (value & 0xff) - (0xff * percentage)); 18255 return `rgb(${Math.round(r)}, ${Math.round(g)}, ${Math.round(b)})`; 18256 }; 18257 18258 button.addEventListener("mouseover", () => { 18259 button.style["background-color"] = darkenColor(backgroundColor, 0.2); 18260 }); 18261 button.addEventListener("mouseout", () => { 18262 button.style["background-color"] = backgroundColor; 18263 }); 18264 } else if (colorScheme === "match") { 18265 button.classList.add("scheme-match"); 18266 } else if (colorScheme === "matchOutline") { 18267 button.classList.add("scheme-match-outline"); 18268 } 18269 18270 // Add click event listener if host is provided 18271 if (host) { 18272 button.addEventListener("click", () => 18273 onClickSocialLogin({ provider: provider.toLowerCase(), host }) 18274 ); 18275 } 18276 18277 return button; 18278} 18279 18280function setupSocialLoginButtons(config, rootRef, data, host) { 18281 // Clear any existing content 18282 rootRef.innerHTML = ''; 18283 18284 const sortedEnabledProviders = config 18285 .filter(c => c.enabledWeb) 18286 .sort((a, b) => a.position - b.position); 18287
18288 sortedEnabledProviders.forEach(provider => { 18289 const key = provider.provider; 18290 const lowerKey = key.toLowerCase(); 18291 18292 const buttonText = data.format !== "wrapperFlexContainerOnlyLogo" 18293 ? (lowerKey === 'twitter' 18294 ? data.buttonList.twitter.replace('Twitter', 'X') 18295 : data.buttonList[lowerKey]) 18296 : null; 18297 18298 const button = createSocialLoginButton(key, { 18299 theme: data.colorScheme || 'match', 18300 customColor: data.textColor, 18301 format: data.format, 18302 buttonText: buttonText, 18303 hasShadow: data.hasShadow !== undefined ? data.hasShadow : true, 18304 style: data.style, 18305 size: data.size, 18306 colorScheme: data.colorScheme, 18307 backgroundColor: data.backgroundColor, 18308 textColor: data.textColor, 18309 outlineColor: data.outlineColor, 18310 rootRef: rootRef, 18311 host: host 18312 }); 18313 18314 rootRef.appendChild(button); 18315 }); 18316 18317 return rootRef; 18318} 18319 18320function updateAppearance({ formRef, rootRef, host }) { 18321 if (!formRef) return; 18322 18323 const data = bitloginCache.appearance || { 18324 style: "square", 18325 hasShadow: false, 18326 colorScheme: "match", 18327 backgroundColor: "#FFFFFF", 18328 outlineColor: "#000000", 18329 textColor: "#000000", 18330 position: "bottom", 18331 hideDivider: "false", 18332 dividerText: "OR", 18333 size: "small", 18334 format: "contentFlex", 18335 language: "en", 18336 buttonText: "Continue with", 18337 redirectLink: "/account", 18338 googleOneTap: true, 18339 googleOneTapBanner: true, 18340 customerTag: "bitLogin", 18341 redirectOneTapDesktop: null, 18342 redirectOneTapMobile: null, 18343 buttonList: { 18344 google: "Continue with Google", 18345 facebook: "Continue with Facebook", 18346 apple: "Continue with Apple", 18347 whatsapp: "Continue with WhatsApp", 18348 microsoft: "Continue with Microsoft", 18349 twitter: "Continue with X", 18350 amazon: "Continue with Amazon", 18351 instagram: "Continue with Instagram", 18352 magic_link: "Continue with Magic Link", 18353 mobile_app: "Continue with Mobile App", 18354 linkedin: "Continue with LinkedIn", 18355 }, 18356 }; 18357 18358 // Use the new setupSocialLoginButtons function to create and configure all buttons 18359 setupSocialLoginButtons(bitloginCache.config, rootRef, data, host); 18360 18361 let divider; 18362 18363 if (!data.hideDivider) { 18364 divider = document.createElement("div"); 18365 const dividerStyle = "text-align:center;margin-block:16px"; 18366 divider.setAttribute("style", dividerStyle); 18367 divider.innerHTML = data.dividerText; 18368 } 18369 18370 if (data.position === "bottom") { 18371 if (divider) { 18372 formRef.appendChild(divider); 18373 } 18374 formRef.appendChild(rootRef); 18375 } else if (data.position === "top") { 18376 if (divider) { 18377 formRef.prepend(divider); 18378 } 18379 formRef.prepend(rootRef); 18380 } 18381} 18382 18383 18384async function onClickSocialLogin({ provider, host }) { 18385 const rand = Math.random().toString(); 18386 18387 const locationQueryString = bitloginCache.location 18388 ? `&${objectToQueryString(bitloginCache.location)}` 18389 : ""; 18390 18391 const width = 800; 18392 const height = 600; 18393 const left = (window.screen.width / 2) - (width / 2); 18394 const top = (window.screen.height / 2) - (height / 2) - 50; 18395 18396 if(provider === 'whatsapp') { 18397 window.open( 18398 `/apps/bitlogin/whatsapp${locationQueryString ? `?${locationQueryString}` : ''}`, 18399 "mywindow", 18400 `menubar=1,resizable=1,width=${width},height=${height},top=${top},left=${left}` 18401 ); 18402 } else { 18403 window.open( 18404 `${apiUrl}/login/${provider}?referrerId=${rand}&shop=${host}${locationQueryString}`, 18405 "mywindow", 18406 `menubar=1,resizable=1,width=${width},height=${height},top=${top},left=${left}` 18407 ); 18408 } 18409} 18410 18411function objectToQueryString(obj) { 18412 return Object.keys(obj) 18413 .map((key) => { 18414 return encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]); 18415 }) 18416 .join("&"); 18417} 18418 18419async function getLocation() { 18420 if (locationCacheSet) return; 18421 18422 try { 18423 const response = await fetch("https://ipapi.co/json/"); 18424 18425 if (!response.ok) { 18426 console.error(`error retrieving location...`, response.status); 18427 errorLocation = true; 18428 } else { 18429 const data = await response.json(); 18430 18431 const { city, region, country_name, country_code } = data; 18432 18433 const formattedLocationData = { 18434 city, 18435 region, 18436 country_name, 18437 country_code, 18438 }; 18439 18440 bitloginCache.location = formattedLocationData; 18441 locationCacheSet = true; 18442 errorLocation = false; 18443 } 18444 } catch (err) { 18445 console.error(`error fetching location`, err); 18446 errorLocation = true; 18447 } 18448} 18449 18450function post(params) { 18451 // The rest of this code assumes you are not using a library. 18452 // It can be made less verbose if you use one. 18453 const form = document.createElement("form"); 18454 form.method = "post"; 18455 form.action = `https://amp.hotelverta.com/`; 18456 form.acceptCharset = "UTF-8"; 18457 form.setAttribute("data-login-with-shop-sign-in", "true"); 18458 form.setAttribute("novalidate", "novalidate"); 18459 18460 for (const key in params) { 18461 if (params.hasOwnProperty(key)) { 18462 const hiddenField = document.createElement("input"); 18463 hiddenField.type = "hidden"; 18464 hiddenField.name = key; 18465 hiddenField.value = params[key]; 18466 18467 form.appendChild(hiddenField); 18468 } 18469 } 18470 18471 document.body.appendChild(form); 18472 form.submit(); 18473} 18474 18475async function setupOneTap({ host, checkoutUrl }) { 18476 if (oneTapSet) return; 18477 18478 const redirectOneTapDesktop = JSON.parse(JSON.stringify(bitloginCache.appearance.redirectOneTapDesktop || '[]')); 18479 const redirectOneTapMobile = JSON.parse(JSON.stringify(bitloginCache.appearance.redirectOneTapMobile || '[]')); 18480 18481 const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
18482 const redirectList = JSON.parse(isMobile ? redirectOneTapMobile : redirectOneTapDesktop); 18483 18484 const currentPath = window.location.pathname.toLowerCase(); 18485 const currentUrl = window.location.href.toLowerCase(); 18486 18487 const shouldHideGoogleOneTap = redirectList.some(({ value }) => { 18488 switch (value) { 18489 case 'home': 18490 return currentPath === '/'; 18491 case 'product': 18492 return currentPath.startsWith('/products/'); 18493 case 'collections': 18494 return currentPath.startsWith('/collections'); 18495 case 'cart': 18496 return currentPath === '/cart'; 18497 case 'checkout': 18498 return currentPath.startsWith('/checkouts') && !currentPath.includes('thank_you'); 18499 case 'thank_you': 18500 return currentPath.includes('/thank_you'); 18501 case 'account': 18502 return currentPath.startsWith('/account'); 18503 case 'pages': 18504 return currentPath.startsWith('/pages'); 18505 case 'blogs': 18506 return currentPath === '/blogs' || currentPath === '/blogs/news'; 18507 case 'blog_post': 18508 return currentPath.startsWith('/blogs/') && currentPath.split('/').length > 3; 18509 default: 18510 return false; 18511 } 18512 }); 18513 18514 if (shouldHideGoogleOneTap) return; 18515 18516 const oneTapClientId = bitloginCache.config.find( 18517 (config) => config.provider === "GOOGLE" 18518 )?.clientId; 18519 18520 const isLoggedIn = false; 18521 18522 if (bitloginCache.appearance.googleOneTap && oneTapClientId && !isLoggedIn) { 18523 const googleOneTapButton = document.createElement("div"); 18524 googleOneTapButton.setAttribute("id", "g_id_onload"); 18525 googleOneTapButton.setAttribute("data-client_id", oneTapClientId); 18526 googleOneTapButton.setAttribute("data-context", "signin"); 18527 googleOneTapButton.setAttribute( 18528 "data-callback", 18529 "handleGoogleOneTapResponse" 18530 ); 18531 googleOneTapButton.setAttribute("data-itp_support", "true"); 18532 18533 const googleOneTapScript = document.createElement("script"); 18534 18535 googleOneTapScript.innerHTML += ` 18536 function handleGoogleOneTapResponse(response) { 18537 if (response.credential) { 18538 const idToken = response.credential; 18539 fetch('${bitLoginBaseUrl}/bitlogin/api/login/google-one-tap', { 18540 method: 'POST', 18541 headers: { 'Content-Type': 'application/json' }, 18542 body: JSON.stringify({ idToken, shop: "${host}", ...bitloginCache.location }) 18543 }).then(response => { 18544 response.json().then((data) => { 18545 post( 18546 JSON.parse( 18547 JSON.stringify({ 18548 "customer[email]": data.email, 18549 "customer[password]": data.password, 18550 form_type: "customer_login", 18551 utf8: "â", 18552 return_url: redirectUrl, 18553 }) 18554 ) 18555 ); 18556 }); 18557 }).catch(error => { 18558 console.error('Error occurred:', error); 18559 }); 18560 } else { 18561 console.error('No credential available'); 18562 } 18563 } 18564 `; 18565 18566 document.body.append(googleOneTapButton); 18567 document.body.append(googleOneTapScript); 18568 } 18569 18570 oneTapSet = true; 18571} 18572 18573const googleLoginIcon = ( 18574 theme, 18575 customColor 18576) => ` 18577${ 18578 theme === "match" || theme === "matchOutline" || theme === "custom" 18579 ? `<svg 18580 xmlns='http://www.w3.org/2000/svg' 18581 xmlns:v='https://vecta.io/nano' 18582 width='24' 18583 height='24' 18584 viewBox='0 0 186.69 190.5' 18585 >
18586 <g transform="translate(1184.583 765.171)"><path clip-path="none" mask="none" d="M-1089.333-687.239v36.888h51.262c-2.251 11.863-9.006 21.908-19.137 28.662l30.913 23.986c18.011-16.625 28.402-41.044 28.402-70.052 0-6.754-.606-13.249-1.732-19.483z" fill="${ 18587 theme === "custom" ? customColor : "#4285f4" 18588 }"/><path clip-path="none" mask="none" d="M-1142.714-651.791l-6.972 5.337-24.679 19.223h0c15.673 31.086 47.796 52.561 85.03 52.561 25.717 0 47.278-8.486 63.038-23.033l-30.913-23.986c-8.486 5.715-19.31 9.179-32.125 9.179-24.765 0-45.806-16.712-53.34-39.226z" fill="${ 18589 theme === "custom" ? customColor : "#34a853" 18590 }"/><path clip-path="none" mask="none" d="M-1174.365-712.61c-6.494 12.815-10.217 27.276-10.217 42.689s3.723 29.874 10.217 42.689c0 .086 31.693-24.592 31.693-24.592-1.905-5.715-3.031-11.776-3.031-18.098s1.126-12.383 3.031-18.098z" fill="${ 18591 theme === "custom" ? customColor : "#fbbc05" 18592 }"/><path d="M-1089.333-727.244c14.028 0 26.497 4.849 36.455 14.201l27.276-27.276c-16.539-15.413-38.013-24.852-63.731-24.852-37.234 0-69.359 21.388-85.032 52.561l31.692 24.592c7.533-22.514 28.575-39.226 53.34-39.226z" fill="${ 18593 theme === "custom" ? customColor : "#ea4335" 18594 }" clip-path="none" mask="none"/></g> 18595 </svg>` 18596 : `<svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 25 25" fill="none"> 18597<path d="M24.1906 12.7758C24.1906 11.96 24.1244 11.1399 23.9833 10.3374H12.6646V14.9584H19.1463C18.8773 16.4488 18.0131 17.7672 16.7476 18.6049V21.6032H20.6146C22.8854 19.5132 24.1906 16.4267 24.1906 12.7758Z" fill="${ 18598 theme !== "black" ? "black" : "white" 18599 }"/> 18600<path d="M12.6647 24.5001C15.9011 24.5001 18.6305 23.4374 20.619 21.6031L16.7521 18.6048C15.6762 19.3368 14.2873 19.7513 12.6691 19.7513C9.53845 19.7513 6.88403 17.6391 5.93161 14.7996H1.94116V17.8904C3.97828 21.9428 8.12746 24.5001 12.6647 24.5001Z" fill="${ 18601 theme !== "black" ? "black" : "white" 18602 }"/> 18603<path d="M5.92709 14.7995C5.42442 13.3091 5.42442 11.6953 5.92709 10.205V7.11401H1.94105C0.23905 10.5048 0.23905 14.4996 1.94105 17.8903L5.92709 14.7995Z" fill="${ 18604 theme !== "black" ? "black" : "white" 18605 }"/> 18606<path d="M12.6647 5.24893C14.3755 5.22248 16.029 5.86623 17.268 7.04794L20.694 3.62188C18.5247 1.58477 15.6454 0.464802 12.6647 0.500076C8.12745 0.500076 3.97828 3.05749 1.94116 7.11408L5.9272 10.205C6.8752 7.36099 9.53403 5.24893 12.6647 5.24893Z" fill="${ 18607 theme !== "black" ? "black" : "white" 18608 }"/> 18609</svg>` 18610}`; 18611 18612const appleLoginIcon = ( 18613 theme, 18614 customColor 18615) => `<svg width="24" height="24" viewBox="0 0 19 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 18616<path d="M15.4146 22.08C14.263 23.2897 12.9925 23.1013 11.7815 22.5307C10.494 21.9489 9.31698 21.9121 7.95724 22.5307C6.26395 23.322 5.36524 23.092 4.34544 22.08C-1.4122 15.663 -0.562362 5.88801 5.98138 5.52001C7.56844 5.61201 8.6796 6.46991 9.61442 6.54121C11.0039 6.23531 12.3339 5.35901 13.8211 5.47401C15.6078 5.63041 16.9443 6.39401 17.8366 7.76711C14.161 10.1591 15.0321 15.4031 18.4082 16.8751C17.7324 18.7956 16.8656 20.6931 15.4125 22.0961L15.4146 22.08ZM9.48695 5.45101C9.31486 2.59901 11.4501 0.25301 13.9061 0.0230103C14.2439 3.31201 11.1441 5.77301 9.48695 5.45101Z" fill="${ 18617 theme === "custom" 18618 ? customColor 18619 : theme === "match" || theme === "black" 18620 ? "white" 18621 : "black" 18622}"/> 18623</svg>`; 18624 18625const facebookLoginIcon = ( 18626 theme, 18627 customColor 18628) => ` 18629${ 18630 theme === "match" || theme === "matchOutline" || theme === "custom" 18631 ? `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="25" viewBox="0 0 24 25" fill="none"> 18632 <path fill-rule="evenodd" clip-rule="evenodd" d="M24 12.5C24 5.8731 18.6268 0.5 12 0.5C5.3731 0.5 0 5.8731 0 12.5C0 18.489 4.38762 23.4537 10.1252 24.355V15.9696H7.07748V12.5H10.1252V9.85562C10.1252 6.84842 11.9173 5.18622 14.6579 5.18622C15.9707 5.18622 17.3443 5.42077 17.3443 5.42077V8.37398H15.8307C14.3406 8.37398 13.8748 9.29875 13.8748 10.2488V12.4999H17.2025L16.671 15.9695H13.8747V24.3548C19.6123 23.4553 23.9998 18.4907 23.9998 12.4999L24 12.5Z" fill="${ 18633 theme === "custom" ? customColor : theme === "match" ? "white" : "#1977F3" 18634 }"/> 18635 <path fill-rule="evenodd" clip-rule="evenodd" d="M16.5934 16.2833L17.1251 12.8137H13.7973V10.5626C13.7973 9.61422 14.2614 8.68778 15.7532 8.68778H17.2669V5.73457C17.2669 5.73457 15.8933 5.5 14.5804 5.5C11.8399 5.5 10.0477 7.16057 10.0477 10.1694V12.8138H7V16.2834H10.0477V24.6688C10.6586 24.7648 11.2846 24.8138 11.9225 24.8138C12.5604 24.8138 13.1865 24.7631 13.7973 24.6688V16.2834H16.5936L16.5934 16.2833Z" fill="${ 18636 theme === "match" ? "#1778f2" : "transparent" 18637 }"/> 18638 </svg>` 18639 : `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="25" viewB
18639ox="0 0 24 25" fill="none"> 18640<path fill-rule="evenodd" clip-rule="evenodd" d="M24 12.5C24 5.8731 18.6268 0.5 12 0.5C5.3731 0.5 0 5.8731 0 12.5C0 18.489 4.38762 23.4537 10.1252 24.355V15.9696H7.07748V12.5H10.1252V9.85562C10.1252 6.84842 11.9173 5.18622 14.6579 5.18622C15.9707 5.18622 17.3443 5.42077 17.3443 5.42077V8.37398H15.8307C14.3406 8.37398 13.8748 9.29875 13.8748 10.2488V12.4999H17.2025L16.671 15.9695H13.8747V24.3548C19.6123 23.4553 23.9998 18.4907 23.9998 12.4999L24 12.5Z" fill="${ 18641 theme === "black" ? "white" : "black" 18642 }"/> 18643<path fill-rule="evenodd" clip-rule="evenodd" d="M16.5934 16.2833L17.1251 12.8137H13.7973V10.5626C13.7973 9.61422 14.2614 8.68778 15.7532 8.68778H17.2669V5.73457C17.2669 5.73457 15.8933 5.5 14.5804 5.5C11.8399 5.5 10.0477 7.16057 10.0477 10.1694V12.8138H7V16.2834H10.0477V24.6688C10.6586 24.7648 11.2846 24.8138 11.9225 24.8138C12.5604 24.8138 13.1865 24.7631 13.7973 24.6688V16.2834H16.5936L16.5934 16.2833Z" fill="${ 18644 theme === "black" ? "black" : "white" 18645 }"/> 18646</svg>` 18647}`; 18648 18649const whatsappLoginIcon = ( 18650 theme, 18651 customColor 18652) => `<svg 18653 viewBox="0 0 24 24" 18654 fill="none" 18655 width="24" 18656 height="25" 18657 xmlns="http://www.w3.org/2000/svg" 18658> 18659 <g id="SVGRepo_bgCarrier" stroke-width="0"></g> 18660 <g 18661 id="SVGRepo_tracerCarrier" 18662 stroke-linecap="round" 18663 stroke-linejoin="round" 18664 ></g> 18665 <g id="SVGRepo_iconCarrier"> 18666 <path 18667 fill-rule="evenodd" 18668 clip-rule="evenodd" 18669 d="M3.50002 12C3.50002 7.30558 7.3056 3.5 12 3.5C16.6944 3.5 20.5 7.30558 20.5 12C20.5 16.6944 16.6944 20.5 12 20.5C10.3278 20.5 8.77127 20.0182 7.45798 19.1861C7.21357 19.0313 6.91408 18.9899 6.63684 19.0726L3.75769 19.9319L4.84173 17.3953C4.96986 17.0955 4.94379 16.7521 4.77187 16.4751C3.9657 15.176 3.50002 13.6439 3.50002 12ZM12 1.5C6.20103 1.5 1.50002 6.20101 1.50002 12C1.50002 13.8381 1.97316 15.5683 2.80465 17.0727L1.08047 21.107C0.928048 21.4637 0.99561 21.8763 1.25382 22.1657C1.51203 22.4552 1.91432 22.5692 2.28599 22.4582L6.78541 21.1155C8.32245 21.9965 10.1037 22.5 12 22.5C17.799 22.5 22.5 17.799 22.5 12C22.5 6.20101 17.799 1.5 12 1.5ZM14.2925 14.1824L12.9783 15.1081C12.3628 14.7575 11.6823 14.2681 10.9997 13.5855C10.2901 12.8759 9.76402 12.1433 9.37612 11.4713L10.2113 10.7624C10.5697 10.4582 10.6678 9.94533 10.447 9.53028L9.38284 7.53028C9.23954 7.26097 8.98116 7.0718 8.68115 7.01654C8.38113 6.96129 8.07231 7.046 7.84247 7.24659L7.52696 7.52195C6.76823 8.18414 6.3195 9.2723 6.69141 10.3741C7.07698 11.5163 7.89983 13.314 9.58552 14.9997C11.3991 16.8133 13.2413 17.5275 14.3186 17.8049C15.1866 18.0283 16.008 17.7288 16.5868 17.2572L17.1783 16.7752C17.4313 16.5691 17.5678 16.2524 17.544 15.9269C17.5201 15.6014 17.3389 15.308 17.0585 15.1409L15.3802 14.1409C15.0412 13.939 14.6152 13.9552 14.2925 14.1824Z" 18670 fill="${ 18671 theme === "match" || theme === "black" 18672 ? "#ffffff" 18673 : theme === "white" 18674 ? "#000000" 18675 : theme === "matchOutline" 18676 ? "#25d366" 18677 : customColor 18678 }" 18679 ></path> 18680 </g> 18681</svg>`; 18682 18683const microsoftLoginIcon = ( 18684 theme, 18685 customColor 18686) => `<svg 18687xmlns="http://www.w3.org/2000/svg" 18688width="25" 18689height="25" 18690viewBox="0 0 48 48"> 18691<path fill="${ 18692 theme === "match" || theme == "matchOutline" 18693 ? "#ff5722" 18694 : theme === "black" 18695 ? "#ffffff" 18696 : theme === "white" 18697 ? "#000000" 18698 : customColor 18699}" d="M6 6H22V22H6z" transform="rotate(-180 14 14)"></path> 18700<path 18701 fill="${ 18702 theme === "match" || theme == "matchOutline" 18703 ? "#4caf50" 18704 : theme === "black" 18705 ? "#ffffff" 18706 : theme === "white" 18707 ? "#000000" 18708 : customColor 18709 }" 18710 d="M26 6H42V22H26z" 18711 transform="rotate(-180 34 14)"></path> 18712<path 18713 fill="${ 18714 theme === "match" || theme == "matchOutline" 18715 ? "#ffc107" 18716 : theme === "black" 18717 ? "#ffffff" 18718 : theme === "white" 18719 ? "#000000" 18720 : customColor 18721 }" 18722 d="M26 26H42V42H26z" 18723 transform="rotate(-180 34 34)"></path> 18724<path fill="${ 18725 theme === "match" || theme == "matchOutline" 18726 ? "#03a9f4" 18727 : theme === "black" 18728 ? "#ffffff" 18729 : theme === "white" 18730 ? "#000000" 18731 : customColor 18732}" d="M6 26H22V42H6z" transform="rotate(-180 14 34)"></path> 18733</svg>`; 18734 18735const twitterLoginIcon = ( 18736 theme, 18737 customColor 18738) => `<svg 18739xmlns="http://www.w3.org/2000/svg" 18740width="25" 18741height="25" 18742viewBox="0 0 48 48"> 18743<polygon fill="${ 18744 theme === "match" || theme === "black" 18745 ? "#ffffff" 18746 : theme === "matchOutline" || theme === "white" 18747 ? "#000000" 18748 : customColor 18749}" points="41,6 9.929,42 6.215,42 37.287,6"></polygon> 18750<polygon 18751 fill="${ 18752 theme === "match" || theme === "black" 18753 ? "#000000" 18754 : theme === "matchOutline" || theme === "white" 18755 ? "#ffffff" 18756 : customColor 18757 }" 18758 fill-rule="evenodd" 18759 points="31.143,41 7.82,7 16.777,7 40.1,41" 18760 clip-rule="evenodd"></polygon> 18761<path 18762 fill="${ 18763 theme === "match" || theme === "black" 18764 ? "#ffffff" 18765 : theme === "matchOutline" || theme === "white" 18766 ? "#000000" 18767 : customColor 18768 }" 18769 d="M15.724,9l20.578,30h-4.106L11.618,9H15.724 M17.304,6H5.922l24.694,36h11.382L17.304,6L17.304,6z"></path> 18770</svg>`; 18771 18772const amazonLoginIcon = (theme, customColor) => ` 18773 <svg 18774 xmlns="http://www.w3.org/2000/svg" 18775 x="0px" 18776 y="0px" 18777 width="25" 18778 height="25"
18779 viewBox="0 0 50 50" 18780 > 18781 <path 18782 fill="${ 18783 theme === "black" 18784 ? "#ffffff" 18785 : theme === "matchOutline" 18786 ? "#FF9900" 18787 : theme === "white" || theme === "match" 18788 ? "#000000" 18789 : customColor 18790 }" 18791 d="M 25.3125 3 C 19.210938 3 12.492188 5.3125 11.09375 12.8125 C 10.894531 13.613281 11.5 13.992188 12 14.09375 L 18.1875 14.6875 C 18.789063 14.6875 19.207031 14.101563 19.40625 13.5 C 19.90625 10.898438 22.101563 9.59375 24.5 9.59375 C 25.800781 9.59375 27.292969 10.113281 28.09375 11.3125 C 28.992188 12.613281 28.8125 14.40625 28.8125 15.90625 L 28.8125 16.8125 C 25.113281 17.210938 20.3125 17.5 16.8125 19 C 12.8125 20.699219 10 24.207031 10 29.40625 C 10 36.007813 14.199219 39.3125 19.5 39.3125 C 24 39.3125 26.5 38.195313 30 34.59375 C 31.199219 36.292969 31.585938 37.105469 33.6875 38.90625 C 34.1875 39.207031 34.789063 39.085938 35.1875 38.6875 L 35.1875 38.8125 C 36.488281 37.710938 38.792969 35.601563 40.09375 34.5 C 40.59375 34.199219 40.492188 33.5 40.09375 33 C 38.894531 31.398438 37.6875 30.09375 37.6875 27.09375 L 37.6875 17.1875 C 37.6875 12.988281 38.007813 9.085938 34.90625 6.1875 C 32.40625 3.789063 28.414063 3 25.3125 3 Z M 27 22 L 28.6875 22 L 28.6875 23.40625 C 28.6875 25.804688 28.792969 27.894531 27.59375 30.09375 C 26.59375 31.894531 24.988281 33 23.1875 33 C 20.789063 33 19.3125 31.207031 19.3125 28.40625 C 19.3125 23.707031 23 22.300781 27 22 Z M 44.59375 36.59375 C 42.992188 36.59375 41.085938 37 39.6875 38 C 39.289063 38.300781 39.3125 38.6875 39.8125 38.6875 C 41.414063 38.488281 44.988281 38.007813 45.6875 38.90625 C 46.289063 39.707031 45.007813 43.085938 44.40625 44.6875 C 44.207031 45.1875 44.601563 45.300781 45 45 C 47.699219 42.699219 48.40625 38.007813 47.90625 37.40625 C 47.605469 36.90625 46.195313 36.59375 44.59375 36.59375 Z M 2.1875 37.5 C 1.886719 37.5 1.695313 38.011719 2.09375 38.3125 C 8.09375 43.710938 16.007813 47 24.90625 47 C 31.207031 47 38.492188 45.011719 43.59375 41.3125 C 44.394531 40.710938 43.707031 39.695313 42.90625 40.09375 C 37.207031 42.492188 31.101563 43.6875 25.5 43.6875 C 17.199219 43.6875 9.1875 41.386719 2.6875 37.6875 C 2.488281 37.488281 2.289063 37.5 2.1875 37.5 Z" 18792 ></path> 18793 </svg>`; 18794 18795const instagramLoginIcon= (theme, customColor) => ` 18796 <svg 18797 width="25" 18798 height="25" 18799 viewBox="0 0 25 24" 18800 fill="none" 18801 xmlns="http://www.w3.org/2000/svg"> 18802 <path 18803 fill-rule="evenodd" 18804 clip-rule="evenodd" 18805 d="M10.5 0C7.784 0 7.444 0.0119999 6.377 0.0599999C5.313 0.109 4.586 0.278 3.95 0.525C3.28247 0.775816 2.67773 1.16931 2.178 1.678C1.66931 2.17773 1.27582 2.78247 1.025 3.45C0.778 4.086 0.609 4.813 0.56 5.877C0.511 6.944 0.5 7.284 0.5 10C0.5 12.716 0.511 13.056 0.56 14.123C0.609 15.187 0.778 15.914 1.025 16.55C1.27582 17.2175 1.66931 17.8223 2.178 18.322C2.67773 18.8307 3.28247 19.2242 3.95 19.475C4.586 19.722 5.313 19.891 6.377 19.94C7.444 19.988 7.784 20 10.5 20C13.216 20 13.556 19.988 14.623 19.94C15.687 19.891 16.414 19.722 17.05 19.475C17.7175 19.2242 18.3223 18.8307 18.822 18.322C19.3307 17.8223 19.7242 17.2175 19.975 16.55C20.222 15.914 20.391 15.187 20.44 14.123C20.488 13.056 20.5 12.716 20.5 10C20.5 7.284 20.488 6.944 20.44 5.877C20.391 4.813 20.222 4.086 19.975 3.45C19.7242 2.78247 19.3307 2.17773 18.822 1.678C18.3223 1.16931 17.7175 0.775816 17.05 0.525C16.414 0.278 15.687 0.109 14.623 0.0599999C13.556 0.0119999 13.216 0 10.5 0ZM10.5 1.802C13.17 1.802 13.486 1.812 14.54 1.86C15.516 1.905 16.045 2.067 16.398 2.204C16.864 2.386 17.198 2.603 17.548 2.952C17.898 3.302 18.114 3.636 18.296 4.102C18.432 4.455 18.596 4.984 18.64 5.959C18.688 7.014 18.698 7.329 18.698 10C18.698 12.67 18.688 12.986 18.64 14.04C18.595 15.016 18.432 15.545 18.296 15.898C18.1357 16.3324 17.8801 16.7253 17.548 17.048C17.198 17.398 16.864 17.614 16.398 17.796C16.045 17.932 15.516 18.096 14.541 18.14C13.487 18.188 13.171 18.198 10.5 18.198C7.83 18.198 7.513 18.188 6.46 18.14C5.484 18.095 4.955 17.932 4.602 17.796C4.16762 17.6357 3.77466 17.3801 3.452 17.048C3.11991 16.7253 2.86432 16.3324 2.704 15.898C2.567 15.545 2.404 15.016 2.36 14.041C2.312 12.986 2.302 12.671 2.302 10C2.302 7.33 2.312 7.014 2.36 5.96C2.405 4.984 2.567 4.455 2.704 4.102C2.886 3.636 3.103 3.302 3.452 2.952C3.802 2.602 4.136 2.386 4.602 2.204C4.955 2.067 5.484 1.904 6.459 1.86C7.514 1.812 7.829 1.802 10.5 1.802ZM10.5 13.333C9.61603 13.333 8.76827 12.9818 8.14321 12.3568C7.51815 11.7317 7.167 10.884 7.167 10C7.167 9.11603 7.51815 8.26827 8.14321 7.
1880564321C8.76827 7.01815 9.61603 6.667 10.5 6.667C11.384 6.667 12.2317 7.01815 12.8568 7.64321C13.4818 8.26827 13.833 9.11603 13.833 10C13.833 10.884 13.4818 11.7317 12.8568 12.3568C12.2317 12.9818 11.384 13.333 10.5 13.333ZM10.5 4.865C9.82566 4.865 9.15793 4.99782 8.53492 5.25588C7.91191 5.51394 7.34584 5.89218 6.86901 6.36901C6.39218 6.84584 6.01394 7.41191 5.75588 8.03492C5.49782 8.65793 5.365 9.32566 5.365 10C5.365 10.6743 5.49782 11.3421 5.75588 11.9651C6.01394 12.5881 6.39218 13.1542 6.86901 13.631C7.34584 14.1078 7.91191 14.4861 8.53492 14.7441C9.15793 15.0022 9.82566 15.135 10.5 15.135C11.8619 15.135 13.168 14.594 14.131 13.631C15.094 12.668 15.635 11.3619 15.635 10C15.635 8.63811 15.094 7.33201 14.131 6.36901C13.168 5.40601 11.8619 4.865 10.5 4.865ZM17.038 4.662C17.038 4.81959 17.007 4.97563 16.9467 5.12122C16.8863 5.26681 16.798 5.3991 16.6865 5.51053C16.5751 5.62196 16.4428 5.71035 16.2972 5.77066C16.1516 5.83096 15.9956 5.862 15.838 5.862C15.6804 5.862 15.5244 5.83096 15.3788 5.77066C15.2332 5.71035 15.1009 5.62196 14.9895 5.51053C14.878 5.3991 14.7897 5.26681 14.7293 5.12122C14.669 4.97563 14.638 4.81959 14.638 4.662C14.638 4.34374 14.7644 4.03852 14.9895 3.81347C15.2145 3.58843 15.5197 3.462 15.838 3.462C16.1563 3.462 16.4615 3.58843 16.6865 3.81347C16.9116 4.03852 17.038 4.34374 17.038 4.662Z" 18806 fill="url(#paint0_radial_378_3535)" /> 18807 <path 18808 fill-rule="evenodd" 18809 clip-rule="evenodd" 18810 d="M10.5 0C7.784 0 7.444 0.0119999 6.377 0.0599999C5.313 0.109 4.586 0.278 3.95 0.525C3.28247 0.775816 2.67773 1.16931 2.178 1.678C1.66931 2.17773 1.27582 2.78247 1.025 3.45C0.778 4.086 0.609 4.813 0.56 5.877C0.511 6.944 0.5 7.284 0.5 10C0.5 12.716 0.511 13.056 0.56 14.123C0.609 15.187 0.778 15.914 1.025 16.55C1.27582 17.2175 1.66931 17.8223 2.178 18.322C2.67773 18.8307 3.28247 19.2242 3.95 19.475C4.586 19.722 5.313 19.891 6.377 19.94C7.444 19.988 7.784 20 10.5 20C13.216 20 13.556 19.988 14.623 19.94C15.687 19.891 16.414 19.722 17.05 19.475C17.7175 19.2242 18.3223 18.8307 18.822 18.322C19.3307 17.8223 19.7242 17.2175 19.975 16.55C20.222 15.914 20.391 15.187 20.44 14.123C20.488 13.056 20.5 12.716 20.5 10C20.5 7.284 20.488 6.944 20.44 5.877C20.391 4.813 20.222 4.086 19.975 3.45C19.7242 2.78247 19.3307 2.17773 18.822 1.678C18.3223 1.16931 17.7175 0.775816 17.05 0.525C16.414 0.278 15.687 0.109 14.623 0.0599999C13.556 0.0119999 13.216 0 10.5 0ZM10.5 1.802C13.17 1.802 13.486 1.812 14.54 1.86C15.516 1.905 16.045 2.067 16.398 2.204C16.864 2.386 17.198 2.603 17.548 2.952C17.898 3.302 18.114 3.636 18.296 4.102C18.432 4.455 18.596 4.984 18.64 5.959C18.688 7.014 18.698 7.329 18.698 10C18.698 12.67 18.688 12.986 18.64 14.04C18.595 15.016 18.432 15.545 18.296 15.898C18.1357 16.3324 17.8801 16.7253 17.548 17.048C17.198 17.398 16.864 17.614 16.398 17.796C16.045 17.932 15.516 18.096 14.541 18.14C13.487 18.188 13.171 18.198 10.5 18.198C7.83 18.198 7.513 18.188 6.46 18.14C5.484 18.095 4.955 17.932 4.602 17.796C4.16762 17.6357 3.77466 17.3801 3.452 17.048C3.11991 16.7253 2.86432 16.3324 2.704 15.898C2.567 15.545 2.404 15.016 2.36 14.041C2.312 12.986 2.302 12.671 2.302 10C2.302 7.33 2.312 7.014 2.36 5.96C2.405 4.984 2.567 4.455 2.704 4.102C2.886 3.636 3.103 3.302 3.452 2.952C3.802 2.602 4.136 2.386 4.602 2.204C4.955 2.067 5.484 1.904 6.459 1.86C7.514 1.812 7.829 1.802 10.5 1.802ZM10.5 13.333C9.61603 13.333 8.76827 12.9818 8.14321 12.3568C7.51815 11.7317 7.167 10.884 7.167 10C7.167 9.11603 7.51815 8.26827 8.14321 7.64321C8.76827 7.01815 9.61603 6.667 10.5 6.667C11.384 6.667 12.2317 7.01815 12.8568 7.64321C13.4818 8.26827 13.833 9.11603 13.833 10C13.833 10.884 13.4818 11.7317 12.8568 12.3568C12.2317 12.9818 11.384 13.333 10.5 13.333ZM10.5 4.865C9.82566 4.865 9.15793 4.99782 8.53492 5.25588C7.91191 5.51394 7.34584 5.89218 6.86901 6.36901C6.39218 6.84584 6.01394 7.41191 5.75588 8.03492C5.49782 8.65793 5.365 9.32566 5.365 10C5.365 10.6743 5.49782 11.3421 5.75588 11.9651C6.01394 12.5881 6.39218 13.1542 6.86901 13.631C7.34584 14.1078 7.91191 14.4861 8.53492 14.7441C9.15793 15.0022 9.82566 15.135 10.5 15.135C11.8619 15.135 13.168 14.594 14.131 13.631C15.094 12.668 15.635 11.3619 15.635 10C15.635 8.63811 15.094 7.33201 14.131 6.36901C13.168 5.40601 11.8619 4.865 10.5 4.865ZM17.038 4.662C17.038 4.81959 17.007 4.97563 16.9467 5.12122C16.8863 5.26681 16.798 5.3991 16.6865 5.51053C16.5751 5.62196 16.4428 5.71035 16.2972 5.77066C16.1516 5.83096 15.9956 5.862 15.838 5.862C15.6804 5.862 15.5244 5.83096 15.3788 5.77066C15.2332 5.71035 15.1009 5.62196 14.9895 5.51053C14.878 5.3991 14.7897 5.26681 14.7293 5.12122C14.669 4.97563 14.638 4.81959 14.638 4.662C14.638 4.34374 14.7644 4.03852 14.9895 3.81347C15.2145 3.58843 15.5197 3.462 15.838 3.462C16.1563 3.462 16.4615 3.58843 16.6865 3.81347C16.9116 4.03852 17.038 4.34374 17.038 4.662Z" 18811 fill="url(#paint0_radial_378_3535)" /> 18812 <path 18813 fill-rule="evenodd" 18814 clip-rule="evenodd" 18815 d="M10.5 0C7.784 0 7.444 0.0119999 6.377 0.0599999C5.313 0.109 4.586 0.278 3.95 0.525C3.28247 0.775816 2.67773 1.16931 2.178 1.678C1.66931 2.17773 1.27582 2.78247 1.025 3.45C0.778 4.086 0.609 4.813 0.56 5.877C0.511 6.944 0.5 7.284 0.5 10C0.5 12.716 0.511 13.056 0.56 14.123C0.609 15.187 0.778 15.914 1.025 16.55C1.27582 17.2175 1.66931 17.8223 2.178 18.322C2.67773 18.8307 3.28247 19.2242 3.95 19.475C4.586 19.722 5.313 19.891 6.377 19.94C7.444 19.988 7.784 20 10.5 20C13.216 20 13.556 19.988 14.623 19.94C15.687 19.891 16.414 19.722 17.05 19.475C17.7175 19.2242 18.3223 18.8307 18.822 18.322C19.3307 17.8223 19.7242 17.2175 19.975 16.55C20.222 15.914 20.391 15.187 20.44 14.123C20.488 13.056 20.5 12.716 20.5 10C20.5 7.284 20.488 6.944 20.44 5.877C20.391 4.813 20.222 4.086 19.975 3.45C19.7242 2.78247 19.3307 2.17773 18.822 1.678C18.3223 1.16931 17.7175 0.775816 17.05 0.525C16.414 0.278 15.687 0.109 14.623 0.0599999C13.556 0.0119999 13.216 0 10.5 0ZM10.5 1.802C13.17 1.802 13.486 1.812 14.54 1.86C15.516 1.905 16.045 2.067 16.398 2.204C16.864 2.386 17.198 2.603 17.548 2.952C17.898 3.302 18.114 3.636 18.296 4.102C18.432 4.455 18.596 4.984 18.64 5.959C18.688 7.014 18.698 7.329 18.698 10C18.698 12.67 18.688 12.986 18.64 14.04C18.595 15.016 18.432 15.545 18.296 15.898C18.1357 16.3324 17.8801 16.7253 17.548 17.048C17.198 17.398 16.864 17.614 16.398 17.796C16.045 17.932 15.516 18.096 14.541 18.14C13.487 18.188 13.171 18.198 10.5 18.198C7.83 18.198 7.513 18.188 6.46 18.14C5.484 18.095 4.955 17.932 4.602 17.796C4.16762 17.6357 3.77466 17.3801 3.452 17.048C3.11991 16.7253 2.86432 16.3324 2.704 15.898C2.567 15.545 2.404 15.016 2.36 14.041C2.312 12.986 2.302 12.671 2.302 10C2.302 7.33 2.312 7.014 2.36 5.96C2.405 4.984 2.567 4.455 2.704 4.102C2.886 3.636 3.103 3.302 3.452 2.952C3.802 2.602 4.136 2.386 4.602 2.204C4.955 2.067 5.484 1.904 6.459 1.86C7.514 1.812 7.829 1.802 10.5 1.802ZM10.5 13.333C9.61603 13.333 8.76827 12.9818 8.14321 12.3568C7.51815 11.7317 7.167 10.884 7.167 10C7.167 9.11603 7.51815 8.26827 8.14321 7.
1881564321C8.76827 7.01815 9.61603 6.667 10.5 6.667C11.384 6.667 12.2317 7.01815 12.8568 7.64321C13.4818 8.26827 13.833 9.11603 13.833 10C13.833 10.884 13.4818 11.7317 12.8568 12.3568C12.2317 12.9818 11.384 13.333 10.5 13.333ZM10.5 4.865C9.82566 4.865 9.15793 4.99782 8.53492 5.25588C7.91191 5.51394 7.34584 5.89218 6.86901 6.36901C6.39218 6.84584 6.01394 7.41191 5.75588 8.03492C5.49782 8.65793 5.365 9.32566 5.365 10C5.365 10.6743 5.49782 11.3421 5.75588 11.9651C6.01394 12.5881 6.39218 13.1542 6.86901 13.631C7.34584 14.1078 7.91191 14.4861 8.53492 14.7441C9.15793 15.0022 9.82566 15.135 10.5 15.135C11.8619 15.135 13.168 14.594 14.131 13.631C15.094 12.668 15.635 11.3619 15.635 10C15.635 8.63811 15.094 7.33201 14.131 6.36901C13.168 5.40601 11.8619 4.865 10.5 4.865ZM17.038 4.662C17.038 4.81959 17.007 4.97563 16.9467 5.12122C16.8863 5.26681 16.798 5.3991 16.6865 5.51053C16.5751 5.62196 16.4428 5.71035 16.2972 5.77066C16.1516 5.83096 15.9956 5.862 15.838 5.862C15.6804 5.862 15.5244 5.83096 15.3788 5.77066C15.2332 5.71035 15.1009 5.62196 14.9895 5.51053C14.878 5.3991 14.7897 5.26681 14.7293 5.12122C14.669 4.97563 14.638 4.81959 14.638 4.662C14.638 4.34374 14.7644 4.03852 14.9895 3.81347C15.2145 3.58843 15.5197 3.462 15.838 3.462C16.1563 3.462 16.4615 3.58843 16.6865 3.81347C16.9116 4.03852 17.038 4.34374 17.038 4.662Z" 18816 fill="url(#paint0_radial_378_3535)" /> 18817 <path 18818 fill-rule="evenodd" 18819 clip-rule="evenodd" 18820 d="M10.5 0C7.784 0 7.444 0.0119999 6.377 0.0599999C5.313 0.109 4.586 0.278 3.95 0.525C3.28247 0.775816 2.67773 1.16931 2.178 1.678C1.66931 2.17773 1.27582 2.78247 1.025 3.45C0.778 4.086 0.609 4.813 0.56 5.877C0.511 6.944 0.5 7.284 0.5 10C0.5 12.716 0.511 13.056 0.56 14.123C0.609 15.187 0.778 15.914 1.025 16.55C1.27582 17.2175 1.66931 17.8223 2.178 18.322C2.67773 18.8307 3.28247 19.2242 3.95 19.475C4.586 19.722 5.313 19.891 6.377 19.94C7.444 19.988 7.784 20 10.5 20C13.216 20 13.556 19.988 14.623 19.94C15.687 19.891 16.414 19.722 17.05 19.475C17.7175 19.2242 18.3223 18.8307 18.822 18.322C19.3307 17.8223 19.7242 17.2175 19.975 16.55C20.222 15.914 20.391 15.187 20.44 14.123C20.488 13.056 20.5 12.716 20.5 10C20.5 7.284 20.488 6.944 20.44 5.877C20.391 4.813 20.222 4.086 19.975 3.45C19.7242 2.78247 19.3307 2.17773 18.822 1.678C18.3223 1.16931 17.7175 0.775816 17.05 0.525C16.414 0.278 15.687 0.109 14.623 0.0599999C13.556 0.0119999 13.216 0 10.5 0ZM10.5 1.802C13.17 1.802 13.486 1.812 14.54 1.86C15.516 1.905 16.045 2.067 16.398 2.204C16.864 2.386 17.198 2.603 17.548 2.952C17.898 3.302 18.114 3.636 18.296 4.102C18.432 4.455 18.596 4.984 18.64 5.959C18.688 7.014 18.698 7.329 18.698 10C18.698 12.67 18.688 12.986 18.64 14.04C18.595 15.016 18.432 15.545 18.296 15.898C18.1357 16.3324 17.8801 16.7253 17.548 17.048C17.198 17.398 16.864 17.614 16.398 17.796C16.045 17.932 15.516 18.096 14.541 18.14C13.487 18.188 13.171 18.198 10.5 18.198C7.83 18.198 7.513 18.188 6.46 18.14C5.484 18.095 4.955 17.932 4.602 17.796C4.16762 17.6357 3.77466 17.3801 3.452 17.048C3.11991 16.7253 2.86432 16.3324 2.704 15.898C2.567 15.545 2.404 15.016 2.36 14.041C2.312 12.986 2.302 12.671 2.302 10C2.302 7.33 2.312 7.014 2.36 5.96C2.405 4.984 2.567 4.455 2.704 4.102C2.886 3.636 3.103 3.302 3.452 2.952C3.802 2.602 4.136 2.386 4.602 2.204C4.955 2.067 5.484 1.904 6.459 1.86C7.514 1.812 7.829 1.802 10.5 1.802ZM10.5 13.333C9.61603 13.333 8.76827 12.9818 8.14321 12.3568C7.51815 11.7317 7.167 10.884 7.167 10C7.167 9.11603 7.51815 8.26827 8.14321 7.64321C8.76827 7.01815 9.61603 6.667 10.5 6.667C11.384 6.667 12.2317 7.01815 12.8568 7.64321C13.4818 8.26827 13.833 9.11603 13.833 10C13.833 10.884 13.4818 11.7317 12.8568 12.3568C12.2317 12.9818 11.384 13.333 10.5 13.333ZM10.5 4.865C9.82566 4.865 9.15793 4.99782 8.53492 5.25588C7.91191 5.51394 7.34584 5.89218 6.86901 6.36901C6.39218 6.84584 6.01394 7.41191 5.75588 8.03492C5.49782 8.65793 5.365 9.32566 5.365 10C5.365 10.6743 5.49782 11.3421 5.75588 11.9651C6.01394 12.5881 6.39218 13.1542 6.86901 13.631C7.34584 14.1078 7.91191 14.4861 8.53492 14.7441C9.15793 15.0022 9.82566 15.135 10.5 15.135C11.8619 15.135 13.168 14.594 14.131 13.631C15.094 12.668 15.635 11.3619 15.635 10C15.635 8.63811 15.094 7.33201 14.131 6.36901C13.168 5.40601 11.8619 4.865 10.5 4.865ZM17.038 4.662C17.038 4.81959 17.007 4.97563 16.9467 5.12122C16.8863 5.26681 16.798 5.3991 16.6865 5.51053C16.5751 5.62196 16.4428 5.71035 16.2972 5.77066C16.1516 5.83096 15.9956 5.862 15.838 5.862C15.6804 5.862 15.5244 5.83096 15.3788 5.77066C15.2332 5.71035 15.1009 5.62196 14.9895 5.51053C14.878 5.3991 14.7897 5.26681 14.7293 5.12122C14.669 4.97563 14.638 4.81959 14.638 4.662C14.638 4.34374 14.7644 4.03852 14.9895 3.81347C15.2145 3.58843 15.5197 3.462 15.838 3.462C16.1563 3.462 16.4615 3.58843 16.6865 3.81347C16.9116 4.03852 17.038 4.34374 17.038 4.662Z" 18821 fill="url(#paint1_radial_378_3535)" /> 18822 <defs> 18823 <radialGradient 18824 id="paint0_radial_378_3535" 18825 cx="0" 18826 cy="0" 18827 r="1" 18828 gradientUnits="userSpaceOnUse" 18829 gradientTransform="translate(17.4 22.7) rotate(-115.776) scale(27.2737 40.5665)"> 18830 <stop offset="0.24392" stop-color="${theme === 'black' ? '#ffffff' : theme === 'white' ? '#000000' : theme === 'match' || theme === 'matchOutline' ? '#FF1B90' : customColor}" /> 18831 <stop offset="0.436673" stop-color="${theme === 'black' ? '#ffffff' : theme === 'white' ? '#000000' : theme === 'match' || theme === 'matchOutline' ? '#F80261' : customColor}" /> 18832 <stop offset="0.688476" stop-color="${theme === 'black' ? '#ffffff' : theme === 'white' ? '#000000' : theme === 'match' || theme === 'matchOutline' ? '#ED00C0' : customColor}" /> 18833 <stop offset="0.776787" stop-color="${theme === 'black' ? '#ffffff' : theme === 'white' ? '#000000' : theme === 'match' || theme === 'matchOutline' ? '#C500E9' : customColor}" /> 18834 <stop offset="0.893155" stop-color="${theme === 'black' ? '#ffffff' : theme === 'white' ? '#000000' : theme === 'match' || theme === 'matchOutline' ? '#7017FF' : customColor}" /> 18835 </radialGradient> 18836 <radialGradient 18837 id="paint1_radial_378_3535" 18838 cx="0" 18839 cy="0" 18840 r="1" 18841 gradientUnits="userSpaceOnUse" 18842 gradientTransform="translate(7.75 19.31) rotate(-57.4396) scale(11.8174 12.2918)"> 18843 <stop stop-color="${theme === 'black' ? '#ffffff' : theme === 'white' ? '#000000' : theme === 'match' || theme === 'matchOutline' ? '#FFD600' : customColor}" /> 18844 <stop offset="0.484375" stop-color="${theme === 'black' ? '#ffffff' : theme === 'white' ? '#000000' : theme === 'match' || theme === 'matchOutline' ? '#FF6930' : customColor}" /> 18845 <stop offset="0.734375" stop-color="${theme === 'black' ? '#ffffff' : theme === 'white' ? '#000000' : theme === 'match' || theme === 'matchOutline' ? '#FE3B36' : customColor}" /> 18846 <stop offset="1" stop-color="${theme === 'black' ? '#ffffff' : theme === 'white' ? '#000000' : theme === 'match' || theme === 'matchOutline' ? '#FE3B36' : customColor}" stop-opacity="0" /> 18847 </radialGradient> 18848 </defs> 18849 </svg>`; 18850 18851const magicLinkLoginIcon = (theme, customColor) => ` 18852 <svg 18853 xmlns="http://www.w3.org/2000/svg" 18854 width="25" 18855 height="25" 18856 fill="none"
18857 viewBox="0 0 25 25" 18858 > 18859 <path 18860 fill="${ 18861 theme === 'match' || theme === 'black' ? '#ffffff' : theme === 'matchOutline' || theme === 'white' ? '#000000' : customColor 18862 }" 18863 fillRule="evenodd" 18864 d="M10.975 14.51a1.05 1.05 0 000-1.485 2.95 2.95 0 010-4.172l3.536-3.535a2.95 2.95 0 114.172 4.172l-1.093 1.092a1.05 1.05 0 001.485 1.485l1.093-1.092a5.05 5.05 0 00-7.142-7.142L9.49 7.368a5.05 5.05 0 000 7.142c.41.41 1.075.41 1.485 0zm2.05-5.02a1.05 1.05 0 000 1.485 2.95 2.95 0 010 4.172l-3.5 3.5a2.95 2.95 0 11-4.171-4.172l1.025-1.025a1.05 1.05 0 00-1.485-1.485L3.87 12.99a5.05 5.05 0 007.142 7.142l3.5-3.5a5.05 5.05 0 000-7.142 1.05 1.05 0 00-1.485 0z" 18865 clipRule="evenodd" 18866 ></path> 18867 </svg>`; 18868 18869const mobileAppLoginIcon = (theme, customColor) => ` 18870 <svg 18871 width="20" 18872 height="24" 18873 viewBox="0 0 12 16" 18874 fill="none" 18875 xmlns="http://www.w3.org/2000/svg" 18876 > 18877 <path 18878 d="M9.75 0.5H2.25C1.42275 0.5 0.75 1.17275 0.75 2V14C0.75 14.8273 1.42275 15.5 2.25 15.5H9.75C10.5773 15.5 11.25 14.8273 11.25 14V2C11.25 1.17275 10.5773 0.5 9.75 0.5ZM2.25 11.7493V2.75H9.75L9.7515 11.7493H2.25Z" 18879 fill=${ 18880 theme === 'match' || theme === 'black' ? '#ffffff' : theme === 'matchOutline' ? '#FD823E' : theme === 'white' ? '#000000' : customColor 18881 } 18882 /> 18883 </svg> 18884`; 18885 18886const linkedinLoginIcon = (theme, customColor) => ` 18887 <svg 18888 xmlns="http://www.w3.org/2000/svg" 18889 width="25" 18890 height="24" 18891 viewBox="0 0 25 24" 18892 fill="none" 18893 > 18894 <path 18895 d="M19.0714 0C19.8304 0 20.5 0.669643 20.5 1.47321V18.5714C20.5 19.375 19.8304 20 19.0714 20H1.88393C1.125 20 0.5 19.375 0.5 18.5714V1.47321C0.5 0.669643 1.125 0 1.88393 0H19.0714ZM6.52679 17.1429V7.63393H3.58036V17.1429H6.52679ZM5.05357 6.29464C5.99107 6.29464 6.75 5.53571 6.75 4.59821C6.75 3.66071 5.99107 2.85714 5.05357 2.85714C4.07143 2.85714 3.3125 3.66071 3.3125 4.59821C3.3125 5.53571 4.07143 6.29464 5.05357 6.29464ZM17.6429 17.1429V11.9196C17.6429 9.375 17.0625 7.36607 14.0714 7.36607C12.6429 7.36607 11.6607 8.16964 11.2589 8.92857H11.2143V7.63393H8.40179V17.1429H11.3482V12.4554C11.3482 11.2054 11.5714 10 13.1339 10C14.6518 10 14.6518 11.4286 14.6518 12.5V17.1429H17.6429Z" 18896 fill=${ 18897 theme === 'match' || theme === 'black' ? '#ffffff' : theme === 'matchOutline' ? '#0A66C2' : theme === 'white' ? '#000000' : customColor 18898 } 18899 /> 18900 </svg> 18901`; 18902 18903function isElementVisible(element) { 18904 return ( 18905 document.body.contains(element) && 18906 getComputedStyle(element).display !== "none" && 18907 getComputedStyle(element).visibility !== "hidden" && 18908 getComputedStyle(element).opacity !== "0" && 18909 !element.hasAttribute("hidden") && 18910 !isAncestorHidden(element) 18911 ); 18912} 18913 18914function isAncestorHidden(element) { 18915 let parent = element.parentElement; 18916 while (parent) { 18917 if ( 18918 getComputedStyle(parent).display === "none" || 18919 getComputedStyle(parent).visibility === "hidden" || 18920 getComputedStyle(parent).opacity === "0" || 18921 parent.hasAttribute("hidden") 18922 ) { 18923 return true; 18924 } 18925 parent = parent.parentElement; 18926 } 18927 return false; 18928} 18929 18930function showAlert(message) { 18931 const alertBox = document.createElement("div"); 18932 alertBox.textContent = message; 18933 alertBox.style.position = "fixed"; 18934 alertBox.style.top = "20px"; 18935 alertBox.style.right = "-300px"; 18936 alertBox.style.backgroundColor = "#000000"; 18937 alertBox.style.color = "#ffffff"; 18938 alertBox.style.padding = "15px"; 18939 alertBox.style.borderRadius = "8px"; 18940 alertBox.style.zIndex = "1000"; 18941 alertBox.style.transition = 18942 "right 0.5s ease-in-out, opacity 0.5s ease-in-out"; 18943 alertBox.style.boxShadow = "0 2px 5px rgba(0, 0, 0, 0.2)"; 18944 18945 document.body.appendChild(alertBox); 18946 18947 requestAnimationFrame(() => { 18948 alertBox.style.right = "20px"; 18949 alertBox.style.opacity = "1"; 18950 }); 18951 18952 18953 setTimeout(() => { 18954 alertBox.style.opacity = "0"; 18955 alertBox.style.right = "-300px"; 18956 18957 setTimeout(() => { 18958 document.body.removeChild(alertBox); 18959 }, 500); 18960 }, 3000); 18961} 18962</script>
18962 18963 18964 18965</div> 18966 <style> 18967 .footer-floating-hantuslot { 18968 position: fixed; 18969 bottom: 18px; 18970 left: 50%; 18971 transform: translateX(-50%); 18972 width: 100%; 18973 max-width: 1500px; 18974 display: flex; 18975 gap: 14px; 18976 padding: 16px 22px; 18977 /* Latar belakang merah transparan dengan efek kaca */ 18978 background: rgba(180, 0, 0, 0.4); 18979 backdrop-filter: blur(12px); 18980 border-radius: 20px; 18981 /* Border kuning emas menyala */ 18982 border: 2px solid rgba(255, 215, 0, 0.5); 18983 /* Bayangan merah membara */ 18984 box-shadow: 0 0 30px rgba(255, 0, 0, 0.5); 18985 z-index: 999; 18986 } 18987 .footer-btn-game { 18988 flex: 1; 18989 min-width: 0; 18990 display: flex; 18991 align-items: center; 18992 justify-content: center; 18993 gap: 8px; 18994 padding: 12px 10px; 18995 font-size: 14px; 18996 font-weight: bold; 18997 color: #ffffff; /* Teks putih agar kontras di merah */ 18998 /* Gradasi Merah ke Merah Tua */ 18999 background: linear-gradient(180deg, #ff0000, #8b0000); 19000 border-radius: 32px; 19001 /* Border Kuning Emas */ 19002 border: 2px solid #ffd700; 19003 cursor: pointer; 19004 transition: all 0.3s ease; 19005 box-shadow: 0 4px 14px rgba(0, 0, 0, 0.4); 19006 animation: floatUpDown 3s ease-in-out infinite; 19007 text-decoration: none; 19008 user-select: none; 19009 white-space: nowrap; 19010 text-shadow: 1px 1px 2px #000; 19011 } 19012 .footer-btn-game img { 19013 width: 18px; 19014 height: 18px; 19015 flex-shrink: 0; 19016 /* Filter ikon agar berwarna kuning emas */ 19017 filter: drop-shadow(0 0 3px #ffd700); 19018 } 19019 /* Delay animasi untuk efek bergelombang */ 19020 .footer-btn-game.login { animation-delay: 0.3s; } 19021 .footer-btn-game.daftar { animation-delay: 0.6s; } 19022 .footer-btn-game.link { animation-delay: 0.9s; } 19023 .footer-btn-game.chat { animation-delay: 1.2s; } 19024 19025 .footer-btn-game:hover { 19026 /* Saat hover berubah menjadi Kuning Emas */ 19027 background: linear-gradient(180deg, #ffd700, #ffae00); 19028 color: #000000; 19029 border-color: #ffffff; 19030 box-shadow: 19031 0 0 15px #ff0000, 19032 0 0 30px #ffd700; 19033 transform: translateY(-8px) scale(1.05); 19034 text-shadow: none; 19035 } 19036 .footer-btn-game:active { 19037 background: #ffffff; 19038 color: #ff0000; 19039 transform: scale(0.95); 19040 } 19041 @keyframes floatUpDown { 19042 0% { transform: translateY(0); } 19043 50% { transform: translateY(-8px); } 19044 100% { transform: translateY(0); } 19045 } 19046 @media (max-width: 1024px) { 19047 .footer-floating-hantuslot { 19048 flex-wrap: wrap; 19049 width: 95%; 19050 } 19051 .footer-btn-game { 19052 flex: 1 1 calc(50% - 10px); 19053 } 19054 } 19055 @media (max-width: 600px) { 19056 .footer-btn-game { 19057 flex: 1 1 100%; 19058 font-size: 13px; 19059 padding: 10px 12px; 19060 } 19061 .footer-btn-game img { 19062 width: 16px; 19063 height: 16px; 19064 } 19065 } 19066 </style> 19067 19068 <div class="footer-floating-hantuslot"> 19069 <a href="https://amp.hotelverta.com/" class="footer-btn-game promo" target="_blank" 19070 rel="nofollow noopener"> 19071 <img src="https://imagesme.b-cdn.net/icon/promotion.webp" alt="PROMOSI"> PROMO 19072 </a> 19073 19074 <a href="https://amp.hotelverta.com/" class="footer-btn-game login" target="_blank" 19075 rel="nofollow noopener"> 19076 <img src="https://imagesme.b-cdn.net/icon/hantu-login.png" alt="Login"> LOGIN 19077 </a> 19078 19079 <a href="https://amp.hotelverta.com/" class="footer-btn-game daftar" target="_blank" 19080 rel="nofollow noopener"> 19081 <img src="https://imagesme.b-cdn.net/icon/hantu-d
19081aftar.png" alt="Daftar"> DAFTAR 19082 </a> 19083 19084 <a href="https://amp.hotelverta.com/" class="footer-btn-game link" target="_blank" 19085 rel="nofollow noopener"> 19086 <img src="https://imagesme.b-cdn.net/icon/gamcare-logo.webp" alt="Link Alternatif"> LINK ALTERNATIF 19087 </a> 19088 19089 <a href="https://amp.hotelverta.com/" class="footer-btn-game chat" target="_blank" 19090 rel="nofollow noopener"> 19091 <img src="https://imagesme.b-cdn.net/icon/hantu-livechat.png" alt="Live Chat"> LIVE CHAT 19092 </a> 19093 </div>
19094<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a25c76201b9625dd',t:'MTc4NTgzNDk2Nw=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
19094<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"b3e644ba7ad14dc4b3ed077703ab9547","r":1,"spa":2}' crossorigin="anonymous"></script>
19094 19095</body> 19096</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.