1<!doctype html> 2<html lang="en"> 3<head > 4 <meta charset="utf-8"/> 5<meta name="title" content="Blog"/> 6<meta name="description" content="Mr. Hankey's sells and manufactures the most Realistic Sex Toys, Dildos, & Fantasy Sex Toys online. All sex toys are made with premium platinum-cured silicone. Shop Now."/> 7<meta name="keywords" content="sex toys, sex toy, Sex toy shop, sex toys shop, sex toy shop near me, shop sex toys, online sex toy shop, adult sex toy shop, sex toys shop near me, sex toy shop online, best online sex toy shop, adult sex toy shops, adult sex toy shops, buy sex toys, sex shop,sex shops near me, adult shops near me, adult toys shop, adult toy shops, online adult stores, adult sex shops near me, online sex toy shops, best sex toy shop, sex toy hop online, adult sex toy shops, sex toy shop online, sex toys online shop, adult toy shopping"/> 8<meta name="robots" content="INDEX,FOLLOW"/> 9<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no"/> 10<title>Blog</title> 11 <link rel="stylesheet" type="text/css" media="all" href="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/css/styles.css" /> 12<link rel="stylesheet" type="text/css" media="all" href="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/Afterpay_Afterpay/css/afterpay-express-checkout.css" /> 13<link rel="stylesheet" type="text/css" media="all" href="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/Magento_Theme/css/swiper-bundle.min.css" /> 14<link rel="stylesheet" type="text/css" media="all" href="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/Algolia_AlgoliaSearch/css/algolia-reset.css" /> 15<link rel="stylesheet" type="text/css" media="all" href="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/Algolia_AlgoliaSearch/css/recommend.css" />
16<script type="text/javascript" src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/Magento_PaymentServicesPaypal/js/lib/script-loader.js"></script>
vendor: 1 bytes, line 16
16
17<script type="text/javascript" src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/Magento_Theme/js/equal-height.js"></script>
vendor: 1 bytes, line 17
17
18<script type="text/javascript" src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/Smile_ElasticsuiteTracker/js/tracking.js"></script>
vendor: 1 bytes, line 18
18
19<script type="text/javascript" src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/Magento_Theme/js/swiper-bundle.min.js"></script>
19 20<link rel="canonical" href="https://www.mrhankeystoys.com/blog" /> 21<link rel="next" href="https://www.mrhankeystoys.com/blog?page=2" /> 22<link rel="icon" type="image/x-icon" href="https://www.mrhankeystoys.com/media/favicon/default/favicon-32x32_1.png" /> 23<link rel="shortcut icon" type="image/x-icon" href="https://www.mrhankeystoys.com/media/favicon/default/favicon-32x32_1.png" /> 24<style> 25.catalog-category-view .product-image-photo { 26 width: 100% !important; 27} 28</style> <!-- Google Tag Manager --> 29 30
30<script> 31 document.addEventListener('scroll', mfGtmUserActionDetect); 32 document.addEventListener('mousemove', mfGtmUserActionDetect); 33 document.addEventListener('touchstart', mfGtmUserActionDetect); 34 function mfGtmUserActionDetect() 35 { 36 document.removeEventListener('scroll', mfGtmUserActionDetect); 37 document.removeEventListener('mousemove', mfGtmUserActionDetect); 38 document.removeEventListener('touchstart', mfGtmUserActionDetect); 39 window.mfGtmUserActionDetected = true; 40 mfLoadGtm(); 41 } 42 43 window.mfGtmUserCookiesAllowed = true; 44 mfLoadGtm(); 45 46 47 function getMfGtmCustomerData() { 48 return localStorage.getItem('mf_gtm_customer_data') ? JSON.parse(localStorage.getItem('mf_gtm_customer_data')) : {}; 49 }; 50 51 function mfLoadGtm() { 52 if (!window.mfGtmUserActionDetected) return false; 53 if (!window.mfGtmLoadBeforeCookieAllowed && !window.mfGtmUserCookiesAllowed) return false; 54 55 if (window.mfGTMTriedToLoad) return; 56 window.mfGTMTriedToLoad = true;
vendor: 342 bytes, lines 56-62
56 57 58(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 59new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 60j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 61'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 62})(window,document,'script','dataLayer','
62GTM-NW62S7VM
vendor: 10 bytes, lines 62-64
62'); 63 64
64}; 65 </script>
65 66
66<script> 67 /* Hyva code */ 68 function mfHyvaGtmSetCustomerData(event) { 69 let data, j; 70 let sections = event.detail.data; 71 for (j in sections) { 72 data = sections[j]; 73 if (data.mf_gtm_customer_data) { 74 localStorage.setItem('mf_gtm_customer_data', JSON.stringify(data.mf_gtm_customer_data)); 75 return; 76 } 77 } 78 }; 79 window.addEventListener('private-content-loaded', mfHyvaGtmSetCustomerData); 80 /* End Hyva code */ 81 </script>
81<!-- End Google Tag Manager -->
81<script> 82 if (typeof afterpayCurrency === 'undefined') { 83 window.afterpayCurrency = "USD"; 84 } 85 if (typeof afterpayLocale === 'undefined') { 86 var afterpayLocale = "en_US"; 87 } 88</script>
vendor: 1 bytes, line 88
88
89<script src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/Afterpay_Afterpay/js/view/container/cta/minicart/headless.js" async></script>
89 90 91
91<script> 92 window.addEventListener('init-external-scripts', () => { 93 (function(d){ 94 var s = d.createElement("script"); 95 /* uncomment the following line to override default position*/ 96 /* s.setAttribute("data-position", 3);*/ 97 /* uncomment the following line to override default size (values: small, large)*/ 98 /* s.setAttribute("data-size", "small");*/ 99 /* uncomment the following line to override default language (e.g., fr, de, es, he, nl, etc.)*/ 100 /* s.setAttribute("data-language", "language");*/ 101 /* uncomment the following line to override color set via widget (e.g., #053f67)*/ 102 /* s.setAttribute("data-color", "#053e67");*/ 103 /* uncomment the following line to override type set via widget (1=person, 2=chair, 3=eye, 4=text)*/ 104 /* s.setAttribute("data-type", "1");*/ 105 /* s.setAttribute("data-statement_text:", "Our Accessibility Statement");*/ 106 /* s.setAttribute("data-statement_url", "http://www.example.com/accessibility")";*/ 107 /* uncomment the following line to override support on mobile devices*/ 108 /* s.setAttribute("data-mobile", true);*/ 109 /* uncomment the following line to set custom trigger action for accessibility menu*/ 110 s.setAttribute("data-trigger", "userAccessibilityWidget") 111 /* uncomment the following line to override widget's z-index property*/ 112 /* s.setAttribute("data-z-index", 10001);*/ 113 /* uncomment the following line to enable Live site translations (e.g., fr, de, es, he, nl, etc.)*/ 114 /* s.setAttribute("data-site-language", "null");*/ 115 s.setAttribute("data-widget_layout", "full") 116 s.setAttribute("data-account", "G0etI2O83R"); 117 s.setAttribute("src", "https://cdn.userway.org/widget.js"); 118 119 (d.body || d.head).appendChild(s); 120 })(document) 121 }, {once: true, passive: true}); 122 123 </script>
vendor: 1 bytes, line 123
123
124<script> 125 const JajumaUIO = { 126 isEnabled: true, 127 isHyva: true } 128 window.loadModernizr = () => { 129 if (typeof ModernizrJajuma !== 'undefined') { 130 return ; 131 } 132 /*! modernizr 3.11.4 (Custom Build) | MIT * 133 * https://modernizr.com/download/?-avif-webp-setclasses !*/ 134 !function (A, n, e, o) { 135 function a(A, n) { 136 return typeof A === n 137 } 138 139 function t(A) { 140 var n = f.className, e = ModernizrJajuma._config.classPrefix || ""; 141 if (u && (n = n.baseVal), ModernizrJajuma._config.enableJSClass) { 142 var o = new RegExp("(^|\\s)" + e + "no-js(\\s|$)"); 143 n = n.replace(o, "$1" + e + "js$2") 144 } 145 ModernizrJajuma._config.enableClasses && (A.length > 0 && (n += " " + e + A.join(" " + e)), u ? f.className.baseVal = n : f.className = n) 146 } 147 148 function i(A, n) { 149 if ("object" == typeof A) for (var e in A) r(A, e) && i(e, A[e]); else { 150 A = A.toLowerCase(); 151 var o = A.split("."), a = ModernizrJajuma[o[0]]; 152 if (2 === o.length && (a = a[o[1]]), void 0 !== a) return ModernizrJajuma; 153 n = "function" == typeof n ? n() : n, 1 === o.length ? ModernizrJajuma[o[0]] = n : (!ModernizrJajuma[o[0]] || ModernizrJajuma[o[0]] instanceof Boolean || (ModernizrJajuma[o[0]] = new Boolean(ModernizrJajuma[o[0]])), ModernizrJajuma[o[0]][o[1]] = n), t([(n && !1 !== n ? "" : "no-") + o.join("-")]), ModernizrJajuma._trigger(A, n) 154 } 155 return ModernizrJajuma 156 } 157 158 var s = [], l = { 159 _version: "3.11.4", 160 _config: {classPrefix: "", enableClasses: !0, enableJSClass: !0, usePrefixes: !0}, 161 _q: [], 162 on: function (A, n) { 163 var e = this; 164 setTimeout(function () { 165 n(e[A]) 166 }, 0) 167 }, 168 addTest: function (A, n, e) { 169 s.push({name: A, fn: n, options: e}) 170 }, 171 addAsyncTest: function (A) { 172 s.push({name: null, fn: A}) 173 } 174 }, ModernizrJajuma = function () { 175 }; 176 ModernizrJajuma.prototype = l, ModernizrJajuma = new ModernizrJajuma; 177 var r, c = [], f = e.documentElement, u = "svg" === f.nodeName.toLowerCase(); 178 !function () { 179 var A = {}.hasOwnProperty; 180 r = a(A, "undefined") || a(A.call, "undefined") ? function (A, n) { 181 return n in A && a(A.constructor.prototype[n], "undefined") 182 } : function (n, e) { 183 return A.call(n, e) 184 } 185 }(), l._l = {}, l.on = function (A, n) { 186 this._l[A] || (this._l[A] = []), this._l[A].push(n), ModernizrJajuma.hasOwnProperty(A) && setTimeout(function () { 187 ModernizrJajuma._trigger(A, ModernizrJajuma[A]) 188 }, 0) 189 }, l._trigger = function (A, n) { 190 if (this._l[A]) { 191 var e = this._l[A]; 192 setTimeout(function () { 193 var A; 194 for (A = 0; A < e.length; A++) (0, e[A])(n) 195 }, 0), delete this._l[A] 196 } 197 }, ModernizrJajuma._q.push(function () { 198 l.addTest = i 199 }), ModernizrJajuma.addAsyncTest(function () { 200 function A(A, n, e) { 201 function o(n) { 202 var o = !(!n || "load" !== n.type) && 1 === a.width; 203 i(A, "webp" === A && o ? new Boolean(o) : o), e && e(n) 204 } 205 206 var a = new Image; 207 a.onerror = o, a.onload = o, a.src = n 208 } 209 210 var n = [{ 211 uri: "data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoBAAEAAwA0JaQAA3AA/vuUAAA=",
212 name: "webp" 213 }], 214 e = n.shift(); 215 A(e.name, e.uri, function (e) { 216 if (e && "load" === e.type) for (var o = 0; o < n.length; o++) A(n[o].name, n[o].uri) 217 }) 218 }), ModernizrJajuma.addAsyncTest(function () { 219 var A = new Image; 220 A.onload = A.onerror = function () { 221 i("avif", 1 === A.width) 222 }, A.src = "data:image/avif;base64,AAAAHGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZgAAAPBtZXRhAAAAAAAAAChoZGxyAAAAAAAAAABwaWN0AAAAAAAAAAAAAAAAbGliYXZpZgAAAAAOcGl0bQAAAAAAAQAAAB5pbG9jAAAAAEQAAAEAAQAAAAEAAAEUAAAAFQAAAChpaW5mAAAAAAABAAAAGmluZmUCAAAAAAEAAGF2MDFDb2xvcgAAAABoaXBycAAAAElpcGNvAAAAFGlzcGUAAAAAAAAAAQAAAAEAAAAOcGl4aQAAAAABCAAAAAxhdjFDgQAcAAAAABNjb2xybmNseAABAAEAAQAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB1tZGF0EgAKBxgADlgICAkyCB/xgAAghQm0" 223 }), function () { 224 var A, n, e, o, t, i, l; 225 for (var r in s) if (s.hasOwnProperty(r)) { 226 if (A = [], n = s[r], n.name && (A.push(n.name.toLowerCase()), n.options && n.options.aliases && n.options.aliases.length)) for (e = 0; e < n.options.aliases.length; e++) A.push(n.options.aliases[e].toLowerCase()); 227 for (o = a(n.fn, "function") ? n.fn() : n.fn, t = 0; t < A.length; t++) i = A[t], l = i.split("."), 1 === l.length ? ModernizrJajuma[l[0]] = o : (ModernizrJajuma[l[0]] && (!ModernizrJajuma[l[0]] || ModernizrJajuma[l[0]] instanceof Boolean) || (ModernizrJajuma[l[0]] = new Boolean(ModernizrJajuma[l[0]])), ModernizrJajuma[l[0]][l[1]] = o), c.push((o ? "" : "no-") + l.join("-")) 228 } 229 }(), t(c), delete l.addTest, delete l.addAsyncTest; 230 for (var d = 0; d < ModernizrJajuma._q.length; d++) ModernizrJajuma._q[d](); 231 A.ModernizrJajuma = ModernizrJajuma 232 }(window, window, document); 233 } 234 window.loadModernizr(); </script>
234 235<style> 236 237 #gallery figure picture { 238 display: flex; flex-direction: column; 239 } 240 .swatch-option-loading-webp { 241 content: url(https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/images/loader-2.gif); 242 } 243 @keyframes imgpulse { 244 50% { 245 opacity: 0.5; 246 } 247 } 248</style>
249<script> 250 var BASE_URL = 'https://www.mrhankeystoys.com/'; 251 var THEME_PATH = 'https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US'; 252 var COOKIE_CONFIG = { 253 "expires": null, 254 "path": "\u002F", 255 "domain": ".www.mrhankeystoys.com", 256 "secure": true, 257 "lifetime": "259200", 258 "cookie_restriction_enabled": false }; 259 var CURRENT_STORE_CODE = 'default'; 260 var CURRENT_WEBSITE_ID = '1'; 261 262 window.hyva = window.hyva || {} 263 264 window.cookie_consent_groups = window.cookie_consent_groups || {} 265 window.cookie_consent_groups['necessary'] = true; 266 267 window.cookie_consent_config = window.cookie_consent_config || {}; 268 window.cookie_consent_config['necessary'] = [].concat( 269 window.cookie_consent_config['necessary'] || [], 270 [ 271 'user_allowed_save_cookie', 272 'form_key', 273 'mage-messages', 274 'private_content_version', 275 'mage-cache-sessid', 276 'last_visited_store', 277 'section_data_ids' 278 ] 279 ); 280</script>
vendor: 1 bytes, line 280
280
281<script> 282 'use strict'; 283 (function( hyva, undefined ) { 284 285 function lifetimeToExpires(options, defaults) { 286 287 const lifetime = options.lifetime || defaults.lifetime; 288 289 if (lifetime) { 290 const date = new Date; 291 date.setTime(date.getTime() + lifetime * 1000); 292 return date; 293 } 294 295 return null; 296 } 297 298 function generateRandomString() { 299 300 const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 301 length = 16; 302 303 let formKey = '', 304 charactersLength = allowedCharacters.length; 305 306 for (let i = 0; i < length; i++) { 307 formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] 308 } 309 310 return formKey; 311 } 312 313 const sessionCookieMarker = {noLifetime: true} 314 315 const cookieTempStorage = {}; 316 317 const internalCookie = { 318 get(name) { 319 const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 320 return v ? v[2] : null; 321 }, 322 set(name, value, days, skipSetDomain) { 323 let expires, 324 path, 325 domain, 326 secure, 327 samesite; 328 329 const defaultCookieConfig = { 330 expires: null, 331 path: '/', 332 domain: null, 333 secure: false, 334 lifetime: null, 335 samesite: 'lax' 336 }; 337 338 const cookieConfig = window.COOKIE_CONFIG || {}; 339 340 expires = days && days !== sessionCookieMarker 341 ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) 342 : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; 343 344 path = cookieConfig.path || defaultCookieConfig.path; 345 domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); 346 secure = cookieConfig.secure || defaultCookieConfig.secure; 347 samesite = cookieConfig.samesite || defaultCookieConfig.samesite; 348 349 document.cookie = name + "=" + encodeURIComponent(value) + 350 (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + 351 (path ? '; path=' + path : '') + 352 (domain ? '; domain=' + domain : '') + 353 (secure ? '; secure' : '') + 354 (samesite ? '; samesite=' + samesite : 'lax'); 355 }, 356 isWebsiteAllowedToSaveCookie() { 357 const allowedCookies = this.get('user_allowed_save_cookie'); 358 if (allowedCookies) { 359 const allowedWebsites = JSON.parse(unescape(allowedCookies)); 360 361 return allowedWebsites[CURRENT_WEBSITE_ID] === 1; 362 } 363 return false; 364 }, 365 getGroupByCookieName(name) { 366 const cookieConsentConfig = window.cookie_consent_config || {}; 367 let group = null; 368 for (let prop in cookieConsentConfig) { 369 if (!cookieConsentConfig.hasOwnProperty(prop)) continue; 370 if (cookieConsentConfig[prop].includes(name)) { 371 group = prop; 372 break; 373 } 374 } 375 return group; 376 }, 377 isCookieAllowed(name) { 378 const cookieGroup = this.getGroupByCookieName(name); 379 return cookieGroup 380 ? window.cookie_consent_groups[cookieGroup] 381 : this.isWebsiteAllowedToSaveCookie(); 382 }, 383 saveTempStorageCookies() { 384 for (const [name, data] of Object.entries(cookieTempStorage)) { 385 if (this.isCookieAllowed(name)) { 386 this.set(name, data['value'], data['days'], data['skipSetDomain']); 387 delete cookieTempStorage[name]; 388 } 389 } 390 } 391 }; 392 393 hyva.getCookie = (name) => { 394 const cookieConfig = window.COOKIE_CONFIG || {}; 395 396 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 397 return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; 398 } 399 400 return internalCookie.get(name); 401 } 402 403 hyva.setCookie = (name, value, days, skipSetDomain) => { 404 const cookieConfig = window.COOKIE_CONFIG || {}; 405 406 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 407 cookieTempStorage[name] = {value, days, skipSetDomain}; 408 return; 409 } 410 return internalCookie.set(name, value, days, skipSetDomain); 411 } 412 413 414 hyva.setSessionCookie = (name, value, skipSetDomain) => { 415 return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) 416 } 417 418 hyva.getBrowserStorage = () => { 419 const browserStorage = window.localStorage || window.sessionStorage; 420 if (!browserStorage) { 421 console.warn('Browser Storage is unavailable'); 422 return false;
423 } 424 try { 425 browserStorage.setItem('storage_test', '1'); 426 browserStorage.removeItem('storage_test'); 427 } catch (error) { 428 console.warn('Browser Storage is not accessible', error); 429 return false; 430 } 431 return browserStorage; 432 } 433 434 hyva.postForm = (postParams) => { 435 const form = document.createElement("form"); 436 437 let data = postParams.data; 438 439 if (! postParams.skipUenc && ! data.uenc) { 440 data.uenc = btoa(window.location.href); 441 } 442 form.method = "POST"; 443 form.action = postParams.action; 444 445 Object.keys(postParams.data).map(key => { 446 const field = document.createElement("input"); 447 field.type = 'hidden' 448 field.value = postParams.data[key]; 449 field.name = key; 450 form.appendChild(field); 451 }); 452 453 const form_key = document.createElement("input"); 454 form_key.type = 'hidden'; 455 form_key.value = hyva.getFormKey(); 456 form_key.name="form_key"; 457 form.appendChild(form_key); 458 459 document.body.appendChild(form); 460 461 form.submit(); 462 } 463 464 hyva.getFormKey = function () { 465 let formKey = hyva.getCookie('form_key'); 466 467 if (!formKey) { 468 formKey = generateRandomString(); 469 hyva.setCookie('form_key', formKey); 470 } 471 472 return formKey; 473 } 474 475 hyva.formatPrice = (value, showSign, options = {}) => { 476 const groupSeparator = options.groupSeparator; 477 const decimalSeparator = options.decimalSeparator 478 delete options.groupSeparator; 479 delete options.decimalSeparator; 480 const formatter = new Intl.NumberFormat( 481 'en\u002DUS', 482 Object.assign({ 483 style: 'currency', 484 currency: 'USD', 485 signDisplay: showSign ? 'always' : 'auto' 486 }, options) 487 ); 488 return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? 489 formatter.formatToParts(value).map(({type, value}) => { 490 switch (type) { 491 case 'currency': 492 return '\u0024' || value; 493 case 'minusSign': 494 return '- '; 495 case 'plusSign': 496 return '+ '; 497 case 'group': 498 return groupSeparator !== undefined ? groupSeparator : value; 499 case 'decimal': 500 return decimalSeparator !== undefined ? decimalSeparator : value; 501 default : 502 return value; 503 } 504 }).reduce((string, part) => string + part) : 505 formatter.format(value); 506 } 507 508 const formatStr = function (str, nStart) { 509 const args = Array.from(arguments).slice(2); 510 511 return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { 512 const idx = parseInt(n) - nStart; 513 514 if (args[idx] === null || args[idx] === void 0) { 515 return m; 516 } 517 return p.length % 2 518 ? p.slice(0, -1).replace('%%', '%') + args[idx] 519 : p.replace('%%', '%') + n; 520 }) 521 } 522 523 hyva.str = function (string) { 524 const args = Array.from(arguments); 525 args.splice(1, 0, 1); 526 527 return formatStr.apply(undefined, args); 528 } 529 530 hyva.strf = function () { 531 const args = Array.from(arguments); 532 args.splice(1, 0, 0); 533 534 return formatStr.apply(undefined, args); 535 } 536 537 /** 538 * Take a html string as `content` parameter and 539 * extract an element from the DOM to replace in 540 * the current page under the same selector, 541 * defined by `targetSelector` 542 */ 543 hyva.replaceDomElement = (targetSelector, content) => { 544 // Parse the content and extract the DOM node using the `targetSelector` 545 const parser = new DOMParser(); 546 const doc = parser.parseFromString(content, 'text/html');
547 const contentNode = doc.querySelector(targetSelector); 548 549 // Bail if content or target can't be found 550 if (!contentNode || !document.querySelector(targetSelector)) { 551 return; 552 } 553 554 hyva.activateScripts(contentNode); 555 556 // Replace the old DOM node with the new content 557 document.querySelector(targetSelector).replaceWith(contentNode); 558 559 // Reload customerSectionData and display cookie-messages if present 560 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 561 hyva.initMessages(); 562 } 563 564 hyva.removeScripts = (contentNode) => { 565 const scripts = contentNode.getElementsByTagName('script'); 566 for (let i = 0; i < scripts.length; i++) { 567 scripts[i].parentNode.removeChild(scripts[i]); 568 } 569 const templates = contentNode.getElementsByTagName('template'); 570 for (let i = 0; i < templates.length; i++) { 571 const container = document.createElement('div'); 572 container.innerHTML = templates[i].innerHTML; 573 hyva.removeScripts(container); 574 templates[i].innerHTML = container.innerHTML; 575 } 576 } 577 578 hyva.activateScripts = (contentNode) => { 579 // Create new array from HTMLCollection to avoid mutation of collection while manipulating the DOM. 580 const scripts = Array.from(contentNode.getElementsByTagName('script')); 581 582 // Iterate over all script tags to duplicate+inject each into the head 583 for (const original of scripts) { 584 const script = document.createElement('script'); 585 original.type && (script.type = original.type); 586 script.innerHTML = original.innerHTML; 587 588 // Remove the original (non-executing) script from the contentNode 589 original.parentNode.removeChild(original) 590 591 // Add script to head 592 document.head.appendChild(script); 593 } 594 595 return contentNode; 596 } 597 598 const replace = {['+']: '-', ['/']: '_', ['=']: ','}; 599 hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); 600 601 let currentTrap; 602 603 const focusableElements = (rootElement) => { 604 const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]'; 605 return Array.from(rootElement.querySelectorAll(selector)) 606 .filter(el => { 607 return el.style.display !== 'none' 608 && !el.disabled 609 && el.tabIndex !== -1 610 && (el.offsetWidth || el.offsetHeight || el.getClientRects().length) 611 }) 612 } 613 614 const focusTrap = (e) => { 615 const isTabPressed = e.key === 'Tab' || e.keyCode === 9; 616 if (!isTabPressed) return; 617 618 const focusable = focusableElements(currentTrap) 619 const firstFocusableElement = focusable[0] 620 const lastFocusableElement = focusable[focusable.length - 1] 621 622 e.shiftKey 623 ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) 624 : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) 625 }; 626 627 hyva.releaseFocus = (rootElement) => { 628 if (currentTrap && (!rootElement || rootElement === currentTrap)) { 629 currentTrap.removeEventListener('keydown', focusTrap) 630 currentTrap = null 631 } 632 } 633 hyva.trapFocus = (rootElement) => { 634 if (!rootElement) return; 635 hyva.releaseFocus() 636 currentTrap = rootElement 637 rootElement.addEventListener('keydown', focusTrap) 638 const firstElement = focusableElements(rootElement)[0] 639 firstElement && firstElement.focus() 640 } 641 642 hyva.safeParseNumber = (rawValue) => { 643 const number = rawValue ? parseFloat(rawValue) : null; 644 645 return Array.isArray(number) || isNaN(number) ? rawValue : number; 646 } 647 648 const toCamelCase = s => s.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(''); 649 hyva.createBooleanObject = (name, value = false, additionalMethods = {}) => { 650 651 const camelCase = toCamelCase(name);
652 const key = '__hyva_bool_' + name 653 654 return new Proxy(Object.assign( 655 additionalMethods, 656 { 657 [key]: !!value, 658 [name]() {return !!this[key]}, 659 ['!' + name]() {return !this[key]}, // @deprecated This does not work with non-CSP Alpine 660 ['not' + camelCase]() {return !this[key]}, 661 ['toggle' + camelCase]() {this[key] = !this[key]}, 662 [`set${camelCase}True`]() {this[key] = true}, 663 [`set${camelCase}False`]() {this[key] = false}, 664 } 665 ), { 666 set(target, prop, value) { 667 return prop === name 668 ? (target[key] = !!value) 669 : Reflect.set(...arguments); 670 } 671 }) 672 } 673 674 hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true}) 675 window.addEventListener('alpine:init', () => Alpine.data('{}', () => ({})), {once: true}); 676 window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) 677 678 }( window.hyva = window.hyva || {} )); 679</script>
vendor: 1 bytes, line 679
679
680<script> 681 if (!window.IntersectionObserver) { 682 window.IntersectionObserver = function (callback) { 683 this.observe = el => el && callback(this.takeRecords()); 684 this.takeRecords = () => [{isIntersecting: true, intersectionRatio: 1}]; 685 this.disconnect = () => {}; 686 this.unobserve = () => {}; 687 } 688 } 689</script>
vendor: 1 bytes, line 689
689
690<script type="speculationrules"> 691{ 692 "prerender": [{ 693 "source": "document", 694 "where": { 695 "and": [ 696 { "href_matches": "/*" }, 697 { "not": { 698 "href_matches": [ 699 "*/customer/*", 700 "*/search/*", 701 "*/sales/*", 702 "*/checkout/*", 703 "*.pdf" 704 ] 705 }}, 706 { "not": { "selector_matches": ".do-not-prerender" } }, 707 { "not": { "selector_matches": "[download]" } }, 708 { "not": { "selector_matches": "[rel~=nofollow]" } } 709 710 ] 711 }, 712 "eagerness": "moderate" 713 }] 714} 715</script>
715 716 717
717<script>window.algoliaConfig = JSON.parse('\u007B\u0022instant\u0022\u003A\u007B\u0022enabled\u0022\u003Atrue,\u0022selector\u0022\u003A\u0022.columns\u0022,\u0022isAddToCartEnabled\u0022\u003Afalse,\u0022addToCartParams\u0022\u003A\u007B\u0022action\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fwww.mrhankeystoys.com\u005C\u002Fcheckout\u005C\u002Fcart\u005C\u002Fadd\u005C\u002F\u0022,\u0022formKey\u0022\u003A\u00229SFsreOEuib59vuZ\u0022,\u0022redirectUrlParam\u0022\u003A\u0022uenc\u0022\u007D,\u0022infiniteScrollEnabled\u0022\u003Afalse,\u0022urlTrackedParameters\u0022\u003A\u005B\u0022query\u0022,\u0022attribute\u003A\u002A\u0022,\u0022index\u0022,\u0022page\u0022\u005D,\u0022isSearchBoxEnabled\u0022\u003Afalse,\u0022isVisualMerchEnabled\u0022\u003Afalse,\u0022categorySeparator\u0022\u003A\u0022\u0020\u005C\u002F\u005C\u002F\u005C\u002F\u0020\u0022,\u0022categoryPageIdAttribute\u0022\u003A\u0022categoryPageId\u0022,\u0022isCategoryNavigationEnabled\u0022\u003Afalse,\u0022hidePagination\u0022\u003Atrue,\u0022isDynamicFacetsEnabled\u0022\u003Afalse,\u0022redirects\u0022\u003A\u007B\u0022enabled\u0022\u003Afalse,\u0022onPageLoad\u0022\u003Atrue,\u0022onSearchAsYouType\u0022\u003Afalse,\u0022showSelectableRedirect\u0022\u003Atrue,\u0022openInNewWindow\u0022\u003Afalse\u007D\u007D,\u0022autocomplete\u0022\u003A\u007B\u0022enabled\u0022\u003Atrue,\u0022selector\u0022\u003A\u0022.algolia\u002Dsearch\u002Dinput\u0022,\u0022sections\u0022\u003A\u005B\u007B\u0022name\u0022\u003A\u0022pages\u0022,\u0022label\u0022\u003A\u0022Pages\u0022,\u0022hitsPerPage\u0022\u003A\u00222\u0022\u007D\u005D,\u0022nbOfProductsSuggestions\u0022\u003A6,\u0022nbOfCategoriesSuggestions\u0022\u003A2,\u0022nbOfQueriesSuggestions\u0022\u003A0,\u0022isDebugEnabled\u0022\u003Afalse,\u0022isNavigatorEnabled\u0022\u003Atrue,\u0022debounceMilliseconds\u0022\u003A300,\u0022minimumCharacters\u0022\u003A2,\u0022redirects\u0022\u003A\u007B\u0022enabled\u0022\u003Atrue,\u0022showSelectableRedirect\u0022\u003Atrue,\u0022showHitsWithRedirect\u0022\u003Afalse,\u0022openInNewWindow\u0022\u003Afalse\u007D\u007D,\u0022landingPage\u0022\u003A\u007B\u0022query\u0022\u003A\u0022\u0022,\u0022configuration\u0022\u003A\u0022\u005B\u005D\u0022\u007D,\u0022recommend\u0022\u003A\u007B\u0022enabledFBT\u0022\u003Afalse,\u0022enabledRelated\u0022\u003Afalse,\u0022enabledFBTInCart\u0022\u003Afalse,\u0022enabledRelatedInCart\u0022\u003Afalse,\u0022enabledLookingSimilar\u0022\u003A0,\u0022limitFBTProducts\u0022\u003A6,\u0022limitRelatedProducts\u0022\u003A6,\u0022limitTrendingItems\u0022\u003A6,\u0022limitLookingSimilar\u0022\u003A6,\u0022enabledTrendItems\u0022\u003A0,\u0022trendItemFacetName\u0022\u003Anull,\u0022trendItemFacetValue\u0022\u003Anull,\u0022isTrendItemsEnabledInPDP\u0022\u003A0,\u0022isTrendItemsEnabledInCartPage\u0022\u003A0,\u0022isAddToCartEnabledInFBT\u0022\u003Afalse,\u0022isAddToCartEnabledInRelatedProduct\u0022\u003Afalse,\u0022isAddToCartEnabledInTrendsItem\u0022\u003Afalse,\u0022isAddToCartEnabledInLookingSimilar\u0022\u003Afalse,\u0022FBTTitle\u0022\u003A\u0022Frequently\u0020bought\u0020together\u0022,\u0022relatedProductsTitle\u0022\u003A\u0022Related\u0020products\u0022,\u0022trendingItemsTitle\u0022\u003A\u0022Trending\u0020items\u0022,\u0022addToCartParams\u0022\u003A\u007B\u0022action\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fwww.mrhankeystoys.com\u005C\u002Fcheckout\u005C\u002Fcart\u005C\u002Fadd\u005C\u002F\u0022,\u0022formKey\u0022\u003A\u00229SFsreOEuib59vuZ\u0022,\u0022redirectUrlParam\u0022\u003A\u0022uenc\u0022\u007D,\u0022isLookingSimilarEnabledInPDP\u0022\u003A0,\u0022isLookingSimilarEnabledInCartPage\u0022\u003A0,\u0022lookingSimilarTitle\u0022\u003A\u0022Looking\u0020Similar\u0022\u007D,\u0022extensionVersion\u0022\u003A\u00223.17.4\u0022,\u0022applicationId\u0022\u003A\u0022FV7NPLDQ20\u0022,\u0022indexName\u0022\u003A\u0022mrhankeystoys_default\u0022,\u0022baseIndexName\u0022\u003A\u0022mrhankeystoys_default\u0022,\u0022apiKey\u0022\u003A\u0022YTBmZDJmYmJhN2YwYTJjZGY1NjI2MDdmOWJkMDQyNDg5ZDE1NTExM2I0MGUzZjliNjA3N2FmODRiOWU5YmUwNXRhZ0ZpbHRlcnM9JnZhbGlkVW50aWw9MTc5MTEyMzQ0MQ\u003D\u003D\u0022,\u0022attributeFilter\u0022\u003A\u005B\u005D,\u0022facets\u0022\u003A\u005B\u007B\u0022attribute\u0022\u003A\u0022categories\u0022,\u0022type\u0022\u003A\u0022conjunctive\u0022,\u0022label\u0022\u003A\u0022Categories\u0022,\u0022searchable\u0022\u003A\u00222\u0022,\u0022create_rule\u0022\u003A\u00222\u0022\u007D,\u007B\u0022attribute\u0022\u003A\u0022size_filter\u0022,\u0022type\u0022\u003A\u0022conjunctive\u0022,\u0022label\u0022\u003A\u0022Size\u0022,\u0022searchable\u0022\u003A\u00222\u0022,\u0022create_rule\u0022\u003A\u00222\u0022\u007D,\u007B\u0022attribute\u0022\u003A\u0022insertable_length\u0022,\u0022type\u0022\u003A\u0022slider\u0022,\u0022label\u0022\u003A\u0022Insertable\u0020Length\u0022,\u0022searchable\u0022\u003A\u00221\u0022,\u0022create_rule\u0022\u003A\u00222\u0022\u007D,\u007B\u0022attribute\u0022\u003A\u0022max_circumference\u0022,\u0022type\u0022\u003A\u0022slider\u0022,\u0022label\u0022\u003A\u0022Circumference\u0022,\u0022searchable\u0022\u003A\u00221\u0022,\u0022create_rule\u0022\u003A\u00222\u0022\u007D,\u007B\u0022attribute\u0022\u003A\u0022price\u0022,\u0022type\u0022\u003A\u0022slider\u0022,\u0022label\u0022\u003A\u0022Price\u0022,\u0022searchable\u0022\u003A\u00222\u0022,\u0022create_rule\u0022\u003A\u00222\u0022\u007D\u005D,\u0022areCategoriesInFacets\u0022\u003Atrue,\u0022hitsPerPage\u0022\u003A18,\u0022sortingIndices\u0022\u003A\u005B\u007B\u0022attribute\u0022\u003A\u0022price\u0022,\u0022sort\u0022\u003A\u0022asc\u0022,\u0022sortLabel\u0022\u003A\u0022Lowest\u0020price\u0022,\u0022virtualReplica\u0022\u003A\u00220\u0022,\u0022name\u0022\u003A\u0022mrhankeystoys_default_products_price_group_0_asc\u0022,\u0022ranking\u0022\u003A\u005B\u0022asc\u0028price.USD.group_0\u0029\u0022,\u0022typo\u0022,\u0022geo\u0022,\u0022words\u0022,\u0022filters\u0022,\u0022proximity\u0022,\u0022attribute\u0022,\u0022exact\u0022,\u0022custom\u0022\u005D,\u0022label\u0022\u003A\u0022Lowest\u0020price\u0022\u007D,\u007B\u0022attribute\u0022\u003A\u0022price\u0022,\u0022sort\u0022\u003A\u0022desc\u0022,\u0022sortLabel\u0022\u003A\u0022Highest\u0020price\u0022,\u0022virtualReplica\u0022\u003A\u00220\u0022,\u0022name\u0022\u003A\u0022mrhankeystoys_default_products_price_group_0_desc\u0022,\u0022ranking\u0022\u003A\u005B\u0022desc\u0028price.USD.group_0\u0029\u0022,\u0022typo\u0022,\u0022geo\u0022,\u0022words\u0022,\u0022filters\u0022,\u0022proximity\u0022,\u0022attribute\u0022,\u0022exact\u0022,\u0022custom\u0022\u005D,\u0022label\u0022\u003A\u0022Highest\u0020price\u0022\u007D,\u007B\u0022attribute\u0022\u003A\u0022created_at\u0022,\u0022sort\u0022\u003A\u0022desc\u0022,\u0022sortLabel\u0022\u003A\u0022Newest\u0020first\u0022,\u0022virtualReplica\u0022\u003A\u00220\u0022,\u0022name\u0022\u003A\u0022mrhankeystoys_default_products_created_at_desc\u0022,\u0022ranking\u0022\u003A\u005B\u0022desc\u0028created_at\u0029\u
7170022,\u0022typo\u0022,\u0022geo\u0022,\u0022words\u0022,\u0022filters\u0022,\u0022proximity\u0022,\u0022attribute\u0022,\u0022exact\u0022,\u0022custom\u0022\u005D,\u0022label\u0022\u003A\u0022Newest\u0020first\u0022\u007D\u005D,\u0022isSearchPage\u0022\u003Afalse,\u0022isCategoryPage\u0022\u003Afalse,\u0022isLandingPage\u0022\u003Afalse,\u0022removeBranding\u0022\u003Atrue,\u0022productId\u0022\u003Anull,\u0022priceKey\u0022\u003A\u0022.USD.group_0\u0022,\u0022priceGroup\u0022\u003A\u0022group_0\u0022,\u0022origFormatedVar\u0022\u003A\u0022price.USD.group_0_original_formated\u0022,\u0022tierFormatedVar\u0022\u003A\u0022price.USD.group_0_tier_formated\u0022,\u0022currencyCode\u0022\u003A\u0022USD\u0022,\u0022currencySymbol\u0022\u003A\u0022\u0024\u0022,\u0022priceFormat\u0022\u003A\u007B\u0022pattern\u0022\u003A\u0022\u0024\u0025s\u0022,\u0022precision\u0022\u003A2,\u0022requiredPrecision\u0022\u003A2,\u0022decimalSymbol\u0022\u003A\u0022.\u0022,\u0022groupSymbol\u0022\u003A\u0022,\u0022,\u0022groupLength\u0022\u003A3,\u0022integerRequired\u0022\u003Afalse\u007D,\u0022maxValuesPerFacet\u0022\u003A10,\u0022autofocus\u0022\u003Atrue,\u0022resultPageUrl\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fwww.mrhankeystoys.com\u005C\u002Fcatalogsearch\u005C\u002Fresult\u005C\u002F\u0022,\u0022request\u0022\u003A\u007B\u0022query\u0022\u003A\u0022\u0022,\u0022refinementKey\u0022\u003A\u0022\u0022,\u0022refinementValue\u0022\u003A\u0022\u0022,\u0022categoryId\u0022\u003A\u0022\u0022,\u0022landingPageId\u0022\u003A\u0022\u0022,\u0022path\u0022\u003A\u0022\u0022,\u0022level\u0022\u003A\u0022\u0022,\u0022parentCategory\u0022\u003A\u0022\u0022,\u0022childCategories\u0022\u003A\u005B\u005D,\u0022url\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fwww.mrhankeystoys.com\u005C\u002Fblog\u0022\u007D,\u0022showCatsNotIncludedInNavigation\u0022\u003Afalse,\u0022showSuggestionsOnNoResultsPage\u0022\u003Atrue,\u0022baseUrl\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fwww.mrhankeystoys.com\u0022,\u0022popularQueries\u0022\u003A\u005B\u005D,\u0022useAdaptiveImage\u0022\u003Afalse,\u0022urls\u0022\u003A\u007B\u0022logo\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fwww.mrhankeystoys.com\u005C\u002Fstatic\u005C\u002Fversion1790675038\u005C\u002Ffrontend\u005C\u002FKrish\u005C\u002Fmrhankeytoys\u005C\u002Fen_US\u005C\u002FAlgolia_AlgoliaSearch\u005C\u002Fjs\u005C\u002Fimages\u005C\u002Falgolia\u002Dlogo\u002Dblue.svg\u0022\u007D,\u0022cookieConfiguration\u0022\u003A\u007B\u0022customerTokenCookie\u0022\u003A\u0022_ALGOLIA_MAGENTO_AUTH\u0022,\u0022consentCookieName\u0022\u003A\u0022user_allowed_save_cookie\u0022,\u0022cookieAllowButtonSelector\u0022\u003A\u0022\u0023btn\u002Dcookie\u002Dallow\u0022,\u0022cookieRestrictionModeEnabled\u0022\u003Afalse,\u0022cookieDuration\u0022\u003A\u002215552000000\u0022\u007D,\u0022ccAnalytics\u0022\u003A\u007B\u0022enabled\u0022\u003Afalse,\u0022ISSelector\u0022\u003A\u0022.ais\u002DHits\u002Ditem\u0020a.result,\u0020.ais\u002DInfiniteHits\u002Ditem\u0020a.result\u0022,\u0022conversionAnalyticsMode\u0022\u003Anull,\u0022addToCartSelector\u0022\u003A\u0022.action.primary.tocart\u0022,\u0022orderedProductIds\u0022\u003A\u005B\u005D\u007D,\u0022isPersonalizationEnabled\u0022\u003Afalse,\u0022personalization\u0022\u003A\u007B\u0022enabled\u0022\u003Afalse,\u0022viewedEvents\u0022\u003A\u007B\u0022viewProduct\u0022\u003A\u007B\u0022eventName\u0022\u003A\u0022Viewed\u0020Product\u0022,\u0022enabled\u0022\u003Afalse,\u0022method\u0022\u003A\u0022viewedObjectIDs\u0022\u007D\u007D,\u0022clickedEvents\u0022\u003A\u007B\u0022productClicked\u0022\u003A\u007B\u0022eventName\u0022\u003A\u0022Product\u0020Clicked\u0022,\u0022enabled\u0022\u003Afalse,\u0022selector\u0022\u003A\u0022.ais\u002DHits\u002Ditem\u0020a.result,\u0020.ais\u002DInfiniteHits\u002Ditem\u0020a.result\u0022,\u0022method\u0022\u003A\u0022clickedObjectIDs\u0022\u007D,\u0022productRecommended\u0022\u003A\u007B\u0022eventName\u0022\u003A\u0022Recommended\u0020Product\u0020Clicked\u0022,\u0022enabled\u0022\u003Afalse,\u0022selector\u0022\u003A\u0022.products\u002Dupsell\u0020.product\u
717002Ditem\u0022,\u0022method\u0022\u003A\u0022clickedObjectIDs\u0022\u007D\u007D,\u0022filterClicked\u0022\u003A\u007B\u0022eventName\u0022\u003A\u0022Filter\u0020Clicked\u0022,\u0022enabled\u0022\u003Afalse,\u0022method\u0022\u003A\u0022clickedFilters\u0022\u007D\u007D,\u0022analytics\u0022\u003A\u007B\u0022enabled\u0022\u003Afalse,\u0022delay\u0022\u003A\u00223000\u0022,\u0022triggerOnUiInteraction\u0022\u003A\u00221\u0022,\u0022pushInitialSearch\u0022\u003A\u00220\u0022\u007D,\u0022now\u0022\u003A1790985600,\u0022queue\u0022\u003A\u007B\u0022isEnabled\u0022\u003Afalse,\u0022nbOfJobsToRun\u0022\u003A5,\u0022retryLimit\u0022\u003A3,\u0022nbOfElementsPerIndexingJob\u0022\u003A300\u007D,\u0022isPreventBackendRenderingEnabled\u0022\u003Afalse,\u0022translations\u0022\u003A\u007B\u0022to\u0022\u003A\u0022to\u0022,\u0022or\u0022\u003A\u0022or\u0022,\u0022go\u0022\u003A\u0022Go\u0022,\u0022popularQueries\u0022\u003A\u0022You\u0020can\u0020try\u0020one\u0020of\u0020the\u0020popular\u0020search\u0020queries\u0022,\u0022seeAll\u0022\u003A\u0022See\u0020all\u0020products\u0022,\u0022allDepartments\u0022\u003A\u0022Search\u0020page\u0022,\u0022seeIn\u0022\u003A\u0022See\u0020products\u0020in\u0022,\u0022orIn\u0022\u003A\u0022or\u0020in\u0022,\u0022noProducts\u0022\u003A\u0022No\u0020products\u0020for\u0020query\u0022,\u0022noResults\u0022\u003A\u0022No\u0020results\u0022,\u0022refine\u0022\u003A\u0022Refine\u0022,\u0022selectedFilters\u0022\u003A\u0022Selected\u0020Filters\u0022,\u0022clearAll\u0022\u003A\u0022Clear\u0020all\u0022,\u0022previousPage\u0022\u003A\u0022Previous\u0020page\u0022,\u0022nextPage\u0022\u003A\u0022Next\u0020page\u0022,\u0022searchFor\u0022\u003A\u0022Search\u0020for\u0020products\u0022,\u0022relevance\u0022\u003A\u0022Relevance\u0022,\u0022categories\u0022\u003A\u0022Categories\u0022,\u0022products\u0022\u003A\u0022Products\u0022,\u0022suggestions\u0022\u003A\u0022Suggestions\u0022,\u0022searchBy\u0022\u003A\u0022Search\u0020by\u0022,\u0022redirectSearchPrompt\u0022\u003A\u0022Continue\u0020search\u0020for\u0022,\u0022searchForFacetValuesPlaceholder\u0022\u003A\u0022Search\u0020for\u0020other\u0020...\u0022,\u0022showMore\u0022\u003A\u0022Show\u0020more\u0020products\u0022,\u0022searchTitle\u0022\u003A\u0022Search\u0020results\u0020for\u0022,\u0022placeholder\u0022\u003A\u0022Search\u0020for\u0020products,\u0020categories,\u0020...\u0022,\u0022addToCart\u0022\u003A\u0022Add\u0020to\u0020Bag\u0022\u007D\u007D')</script>
717 718 719</head> 720<body class="pl-thm-krish pl-thm-krish-mrhankeytoys blog-page blog-page-list blog-index-index page-layout-2columns-right" id="html-body"> 721<style>@media (width:769px){[data-content-type=image] picture .pagebuilder-mobile-hidden{display:block}[data-content-type=image] picture .pagebuilder-mobile-only{display:none}}@media (width:768px){[data-content-type=image] picture .pagebuilder-mobile-hidden{display:none}[data-content-type=image] picture .pagebuilder-mobile-only{display:block}}</style>
722<script data-mfmofile="true"> 723 function mfGtmGetEcommPageType() { 724 var body = document.getElementsByTagName('body')[0]; 725 var ept = 'other'; 726 727 if (body.className.indexOf('cms-index-index') > -1) { 728 ept = 'home'; 729 } else if (body.className.indexOf('catalog-category-view') > -1) { 730 ept = 'category'; 731 } else if (body.className.indexOf('catalog-product-view') > -1) { 732 ept = 'product'; 733 } else if (body.className.indexOf('checkout-cart-index') > -1) { 734 ept = 'cart'; 735 } else if (body.className.indexOf('checkout-index-index') > -1) { 736 ept = 'checkout'; 737 } else if (body.className.indexOf('contact-index-index') > -1) { 738 ept = 'contact'; 739 } else if (body.className.indexOf('catalogsearch-result-index') > -1) { 740 ept = 'searchresults'; 741 } else if (body.className.indexOf('cms-page-view') > -1) { 742 ept = 'cmspage'; 743 }; 744 return ept; 745 }; 746</script>
746 747
747<script> 748 function mfHyvaGtmCustomerDataLayer(event) { 749 let data, eventFired, i, j, k; 750 let sections = event.detail.data; 751 for ( j in sections) { 752 data = sections[j]; 753 if (!data.mf_datalayer) continue; 754 755 for (i = 0; i < data.mf_datalayer.length; i++) { 756 window.dataLayer = window.dataLayer || []; 757 eventFired = false; 758 for (k = 0; k < window.dataLayer.length; k++) { 759 if (data.mf_datalayer[i].magefanUniqueEventId 760 && data.mf_datalayer[i].magefanUniqueEventId == window.dataLayer[k].magefanUniqueEventId 761 ) { 762 eventFired = true; 763 break; 764 } 765 } 766 if (!eventFired) { 767 /* 768 if (!data.mf_datalayer[i].customer_identifier 769 || (data.mf_datalayer[i].customer_identifier.indexOf('getMfGtmCustomerIdentifier') != -1) 770 ) { 771 data.mf_datalayer[i].customer_identifier = getMfGtmCustomerIdentifier(); 772 } 773 */ 774 775 var ept = data.mf_datalayer[i].ecomm_pagetype; 776 if ('other' === ept) { 777 ept = mfGtmGetEcommPageType(); 778 data.mf_datalayer[i].ecomm_pagetype = ept; 779 if (data.mf_datalayer[i].google_tag_params) { 780 data.mf_datalayer[i].google_tag_params.ecomm_pagetype = ept; 781 } 782 }; 783 window.dataLayer.push(data.mf_datalayer[i]); 784 } 785 } 786 787 delete event.detail.data[j].mf_datalayer; 788 let mcs = localStorage.getItem('mage-cache-storage'); 789 if (mcs) { 790 mcs = JSON.parse(mcs); 791 if (mcs && mcs[j] && mcs[j].mf_datalayer) { 792 delete mcs[j].mf_datalayer; 793 localStorage.setItem('mage-cache-storage', JSON.stringify(mcs)); 794 } 795 } 796 } 797 }; 798 window.addEventListener('private-content-loaded', mfHyvaGtmCustomerDataLayer); 799</script>
vendor: 1 bytes, line 799
799
800<script> 801 document.addEventListener("DOMContentLoaded", function() { 802 document.querySelectorAll("a").forEach(function(link) { 803 link.addEventListener("click", function(event) { 804 let url = link.href; 805 let items, j, x, newDataLayer, dli, index; 806 if (url && window.dataLayer && window.dataLayer.length) { 807 for (let i=0; i<window.dataLayer.length; i++) { 808 dli = window.dataLayer[i]; 809 if (dli.event == "view_item_list" 810 && dli.ecommerce 811 && dli.ecommerce.items 812 && dli.ecommerce.items.length 813 ) { 814 items = dli.ecommerce.items; 815 newDataLayer = false; 816 index = -1; 817 for (j=0; j<items.length; j++) { 818 index++; 819 if (items[j].item_url == url) { 820 newDataLayer = { 821 "event": "select_item", 822 "ecommerce": { 823 "item_list_id": dli.ecommerce.item_list_id, 824 "item_list_name": dli.ecommerce.item_list_name, 825 "items": [items[j]] 826 }, 827 "magefanUniqueEventId": "select_item_" + dli.magefanUniqueEventId, 828 "ecomm_pagetype": dli.ecomm_pagetype, 829 "google_tag_params": { 830 "ecomm_pagetype": dli.google_tag_params.ecomm_pagetype 831 } 832 }; 833 834 let dynamicKeys = ["customer_firstname","customer_lastname","customer_email","customer_dob","customer_gender","customer_telephone","customer_postcode","customer_city","customer_region","customer_country_id","customer_identifier","customerGroup"]; 835 for (x=0; x<dynamicKeys.length;x++) { 836 let key = dynamicKeys[x]; 837 newDataLayer[key] = dli[key]; 838 } 839 840 newDataLayer.ecommerce.items[0].index = index; 841 break; 842 }; 843 }; 844 845 if (newDataLayer) { 846 window.dataLayer.push(newDataLayer); 847 848 //window.location = url; 849 //return false; 850 } 851 } 852 } 853 } 854 }); 855 }); 856 }); 857</script>
857 <!-- Google Tag Manager (noscript) --> 858 <!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 858-859
858 859<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
859GTM-NW62S7VM
vendor: 85 bytes, lines 859-860
859" 860height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
861<!-- End Google Tag Manager (noscript) --> 862 863
863<script 864 src="https://js.squarecdn.com/square-marketplace.js" 865 data-min="1" 866 data-max="4000.00" 867 async></script>
vendor: 1 bytes, line 867
867
868<script> 869 document.addEventListener('DOMContentLoaded', function() { 870 'use strict'; 871 872 window.psloginLoginPath = "https\u003A\u002F\u002Fwww.mrhankeystoys.com\u002Fpslogin\u002Faccount\u002Flogin\u002F"; 873 window.customerLogoutPath = "https\u003A\u002F\u002Fwww.mrhankeystoys.com\u002Fcustomer\u002Faccount\u002Flogout\u002F"; 874 875 let url = document.URL.toLowerCase(); 876 if (url) { 877 let skip = false; 878 let paths = ["customer\/account","pslogin\/account"]; 879 880 for (let path of paths) { 881 if (url.indexOf(path) !== -1) { 882 skip = true; 883 break; 884 } 885 } 886 887 if (!skip) { 888 hyva.setCookie('pslogin_referer', document.URL, 'session', true); 889 } 890 } 891 892 893 }, false); 894 </script>
894 895<form style="display:none;" class="form" action="https://www.mrhankeystoys.com/pslogin/account/loginPost/" method="post" id="pslogin-login-form"> 896 <input id="pslogin-login-referer" name="referer" type="hidden" value=""> 897 <input id="pslogin-login-action" name="auth_action" type="hidden" value=""> 898 <input id="pslogin-login-submit" type="submit" value=""> 899</form> 900 901<div x-data="initPsloginBindEmailModal()"> 902 <div x-cloak data-dialog-ref-name="dialog" 903 x-bind="overlay" 904 class="fixed inset-0 bg-black bg-opacity-50 z-50"> 905 <div class="fixed flex justify-center items-center text-left z-40 inset-0"> 906 <div x-ref="dialog" role="dialog" aria-modal="true" 907 aria-labelledby="bind-email" 908 class="inline-block bg-white shadow-xl rounded-lg max-h-screen overflow-auto overscroll-y-contain border border-10 lg:max-w-xl relative p-5"> 909 910<button class="prpop-close-btn outline-none absolute top-4 right-4" @click="hide">✕</button> 911<div id="pslogin-bind-email-modal" :class="{['pslogin-state-step-' + step]: true, 'ps-no-linked': ! linkedNetworksHtml}"> 912 913 <div class="text-2xl font-light border-b border-gray-500 pb-4 mb-4 break-words" x-text="firstTitle"></div> 914 915 <div 916 class="z-50 fixed inset-0 grid place-items-center bg-white/70 text-primary" 917 x-cloak 918 x-show="isLoading" 919 x-transition.opacity.duration.200ms 920> 921 <div class="flex gap-10 items-center p-4"> 922 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 57 57" width="57" height="57" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"> 923 <style> 924 @keyframes spinner-ball-triangle1 { 925 0% { transform: translate(0%, 0%); } 926 33% { transform: translate(38%, -79%); } 927 66% { transform: translate(77%, 0%); } 928 100% { transform: translate(0%, 0%); } 929 } 930 931 @keyframes spinner-ball-triangle2 { 932 0% { transform: translate(0%, 0%); } 933 33% { transform: translate(38%, 79%); } 934 66% { transform: translate(-38%, 79%); } 935 100% { transform: translate(0%, 0%); } 936 } 937 938 @keyframes spinner-ball-triangle3 { 939 0% { transform: translate(0%, 0%); } 940 33% { transform: translate(-77%, 0%); } 941 66% { transform: translate(-38%, -79%); } 942 100% { transform: translate(0%, 0%); } 943 } 944 </style> 945 <circle cx="5" cy="50" r="5" style="animation: spinner-ball-triangle1 2.2s linear infinite"/> 946 <circle cx="27" cy="5" r="5" style="animation: spinner-ball-triangle2 2.2s linear infinite"/> 947 <circle cx="49" cy="50" r="5" style="animation: spinner-ball-triangle3 2.2s linear infinite"/> 948</svg> 949 <span class="text-xl select-none"> 950 Loading... </span> 951 </div> 952</div> 953 954 <template x-if="error"> 955 <div class="message error"> 956 <div x-html="error"></div> 957 </div> 958 </template> 959 <template x-if="1 === step"> 960 <div class="pslogin-form-title mb-3 break-words">Please provide your email</div> 961 </template> 962 <template x-if="2 === step"> 963 <div class="pslogin-form-title mb-3 break-words" x-text="alreadyRegisteredText"></div> 964 </template> 965 <template x-if="4 === step"> 966 <div class="pslogin-form-title mb-3 break-words">We couldn't find an account with your credentials. Are you already registered at our store?</div> 967 </template> 968 <template x-if="5 === step"> 969 <div class="pslogin-form-title mb-3 break-words">Please enter your store password to link your social account. Or login using previously used social networks.</div> 970 </template> 971 <template x-if="3 !== step"> 972 <div class="pslogin-authorization-wrapper"> 973 <form name="pslogin_bind" id="pslogin_bind"> 974 <fieldset class="fieldset"> 975 <div class="fieldset-wrapper mb-4"> 976 <template x-if="5 === step"> 977 <div class="field mb-3"> 978 <label class="label mb-0 font-semibold" for="pslogin_bind_email">Email</label> 979 <div class="control"> 980 <input type="email" id="pslogin_bind_email" name="pslogin_email" autocomplete="email" value="" title="Your Email Address" class="input-text required-entry w-full" data-validate='{"required": true}' aria-required="true" required> 981 </div> 982 </div> 983 </template> 984 <template x-if="1 === step || 2 === step"> 985 <div class="field mb-3"> 986 <label class="label mb-0 font-semibold" for="pslogin_bind_email">Email</label> 987 <div class="control"> 988 <input type="email" id="pslogin_bind_email" name="pslogin_email" autocomplete="email" :value="customer.email" x-model="customer.email" title="Your Email Address" :disabled="2 === step" class="input-text required-entry w-full" data-validate='{"required": true}' aria-required="true" required> 989 </div> 990 </div> 991 </template> 992 <template x-if="2 === step || 5 === step"> 993 <div class="field mb-3"> 994 <label class="label mb-0 font-semibold" for="pslogin_bind_pass">Password</label> 995 <div class="control"> 996 <input id="pslogin_bind_pass" type="password" name="pslogin_pass" title="Password" class="input-text w-full" data-validate='{"required": true, "password": true, "minlength": 8}' autocomplete="off" aria-required="true" aria-autocomplete="list" required> 997 </div> 998 </div> 999 </template> 1000 </div> 1001 </fieldset> 1002 <template x-if="3 !== step"> 1003 <div class="button-wrapper flex flex-wrap items-center justify-between gap-3"> 1004 <template x-if="1 === step || 2 === step || 5 === step"> 1005 <button class="action primary pslogin-bind-step-5 btn btn-primary" type="button" @click="loginDependOnStep">
1006 <span>Login</span> 1007 </button> 1008 </template> 1009 <template x-if="2 === step || 5 === step"> 1010 <div class="secondary"> 1011 <a class="action remind text-blue-700 hover:underline" target="_blank" :href="forgotPassUrl"> 1012 <span>Forgot Your Password?</span> 1013 </a> 1014 </div> 1015 </template> 1016 <template x-if="4 === step"> 1017 <div> 1018 <button class="action primary pslogin-bind-step-4 text-blue-700 hover:underline" type="button" @click="setFifthStep"> 1019 <span>Yes, I already have an account</span> 1020 </button> 1021 <button class="action primary pslogin-bind-step-4 text-blue-700 hover:underline" type="button" @click="registerWithEmail"> 1022 <span>No, I want to register a new account</span> 1023 </button> 1024 </div> 1025 </template> 1026 </div> 1027 </template> 1028 </form> 1029 <!-- <template x-if="linkedNetworksHtml"> 1030 <div> 1031 <span class="pslogin-or-border"> 1032 OR </span> 1033 <div class="ps-login-networks-container" x-html="linkedNetworksHtml"></div> 1034 </div> 1035 </template> --> 1036 <template x-if="loginNetworksButtonsHtml && 5 === step"> 1037 <div> 1038 <span class="pslogin-or-border"> 1039 OR </span> 1040 <div class="ps-login-networks-container" x-html="loginNetworksButtonsHtml"></div> 1041
1042<script> 1043 function initPsloginButtons_bindEmailPopup() { 1044 let buttons = [{"code":"apple","icon":"https:\/\/www.mrhankeystoys.com\/static\/version1790675038\/frontend\/Krish\/mrhankeytoys\/en_US\/Plumrocket_SocialLoginPro\/images\/networks\/apple_icon.svg","design":"default","height":650,"width":650,"visible":true,"textColor":"","backgroundColor":"#000","borderColor":"","openOnPage":false,"text":"Continue with Apple","image":"","url":"https:\/\/www.mrhankeystoys.com\/pslogin\/account\/douse\/type\/apple\/refresh\/1791037041\/customer_action\/login\/call\/pslogin.account_login.network\/"},{"code":"twitter","icon":"https:\/\/www.mrhankeystoys.com\/static\/version1790675038\/frontend\/Krish\/mrhankeytoys\/en_US\/Plumrocket_SocialLoginPro\/images\/networks\/twitter_icon.svg","design":"default","height":630,"width":650,"visible":true,"textColor":"#ffffff","backgroundColor":"#28a9e2","borderColor":"","openOnPage":true,"text":"Continue with X","image":"","url":"https:\/\/www.mrhankeystoys.com\/pslogin\/account\/douse\/type\/twitter\/refresh\/1791037041\/customer_action\/login\/call\/pslogin.account_login.network\/"},{"code":"google","icon":"https:\/\/www.mrhankeystoys.com\/static\/version1790675038\/frontend\/Krish\/mrhankeytoys\/en_US\/Plumrocket_SocialLoginPro\/images\/networks\/google_icon.svg","design":"default","height":450,"width":450,"visible":true,"textColor":"#1a1a1a","backgroundColor":"#fff","borderColor":"#d9d9d9","openOnPage":false,"text":"Continue with Google","image":"","url":"https:\/\/www.mrhankeystoys.com\/pslogin\/account\/douse\/type\/google\/refresh\/1791037041\/customer_action\/login\/call\/pslogin.account_login.network\/"},{"code":"amazon","icon":"https:\/\/www.mrhankeystoys.com\/static\/version1790675038\/frontend\/Krish\/mrhankeytoys\/en_US\/Plumrocket_SocialLoginPro\/images\/networks\/amazon_icon.svg","design":"default","height":500,"width":720,"visible":true,"textColor":"","backgroundColor":"#ff8e2e","borderColor":"","openOnPage":false,"text":"Continue with Amazon","image":"","url":"https:\/\/www.mrhankeystoys.com\/pslogin\/account\/douse\/type\/amazon\/refresh\/1791037041\/customer_action\/login\/call\/pslogin.account_login.network\/"}]; 1045 1046 return { 1047 buttons, 1048 show: false, 1049 title: 'show\u0020more', 1050 toggle() { 1051 this.show = !this.show; 1052 this.title = this.show ? 1053 'show\u0020less' : 1054 'show\u0020more'; 1055 }, 1056 hasHidden() { 1057 return this.buttons.filter(btn => !btn.visible).length > 0; 1058 }, 1059 login(btn) { 1060 if (! btn.url) { 1061 alert('The\u0020Login\u0020Application\u0020was\u0020not\u0020configured\u0020correctly.\u0020If\u0020your\u0020are\u0020the\u0020admin\u0020of\u0020store\u003A\u0020Please\u0020activate\u0020\u201CEnable\u0020Logging\u201D\u0020in\u0020Magento\u0020Login\u0020Extension\u0020and\u0020try\u0020again\u0020to\u0020see\u0020error\u0020details.'); 1062 return false; 1063 } 1064 1065 let href = btn.url, 1066 openOnPage = btn.openOnPage, 1067 width = btn.width, 1068 height = btn.height; 1069 1070 if (openOnPage) { 1071 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 1072 window.location.href = href; 1073 return; 1074 } 1075 1076 const bc = new BroadcastChannel('loginChannel'); 1077 bc.onmessage = (event) => { 1078 if (event.data.type === 'loginSuccess') { 1079 document.getElementById('pslogin-login-referer').value = event.data.referer; 1080 document.getElementById('pslogin-login-action').value = event.data.action; 1081 document.getElementById('pslogin-login-submit').click(); 1082 } 1083 bc.close(); 1084 }; 1085 1086 width = width ? width : 650; 1087 height = height ? height : 350; 1088 1089 if (href.indexOf('js_login_method') === 0) { 1090 // For Telegram 1091 // prCustomJsLoginMethod(href, width, height); 1092 return; 1093 } 1094 1095 const popup = this.openPopup(href, width, height); 1096 this.loadingMessage(popup); 1097 1098 return false;
1099 }, 1100 /** 1101 * Open OAuth window using Modal/InitOAuth action. 1102 * 1103 * @since 3.10.0 1104 * @param href 1105 * @param width 1106 * @param height 1107 * @returns {WindowProxy} 1108 */ 1109 openPopup(href, width, height) { 1110 const left = parseInt((window.innerWidth - width) / 2); 1111 const top = parseInt((window.innerHeight - height) / 2); 1112 1113 const params = [ 1114 'resizable=yes', 1115 'scrollbars=no', 1116 'toolbar=no', 1117 'menubar=no', 1118 'location=no', 1119 'directories=no', 1120 'status=yes', 1121 'width=' + width, 1122 'height=' + height, 1123 'left=' + left, 1124 'top=' + top 1125 ]; 1126 1127 const popup = window.open(href, 'pslogin_popup', params.join(',')); 1128 popup.focus(); 1129 1130 return popup; 1131 }, 1132 loadingMessage(popup) { 1133 const loaderText = 'Loading...'; 1134 let html = '<!DOCTYPE html><html style="height: 100%;"><head><meta name="viewport" content="width=device-width, initial-scale=1"><title>' + loaderText + '</title></head>'; 1135 html += '<body style="height: 100%; margin: 0; padding: 0;">'; 1136 html += '<div style="text-align: center; height: 100%;"><div id="loader" style="top: 50%; position: relative; margin-top: -50px; color: #646464; height:25px; font-size: 25px; text-align: center; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">' + loaderText + '</div></div>'; 1137 html += '</body></html>'; 1138 1139 popup.document.documentElement.innerHTML = html; 1140 } 1141 }; 1142 } 1143</script>
1143 1144 </div> 1145 </template> 1146 </div> 1147 </template> 1148 <template x-if="3 === step"> 1149 <div class="flex flex-col items-center"> 1150 <img class="pslogin-success-icon" :src="successIcon" alt="Success" width="92" height="92"> 1151 <div class="pslogin-thank-text"> 1152 THANK YOU! </div> 1153 </div> 1154 </template> 1155</div> 1156 </div> 1157 </div> 1158 </div> 1159</div> 1160
1161<script> 1162 function initPsloginBindEmailModal() { 1163 'use strict'; 1164 1165 return { 1166 ...hyva.modal(), 1167 ...{"components":{"pr-pslogin-email-popup":{"component":"Plumrocket_SocialLoginPro\/js\/view\/bind-email","storeName":"Magento Store","loginWithEmailUrl":"https:\/\/www.mrhankeystoys.com\/pslogin\/account\/register\/","loginWithPassUrl":"https:\/\/www.mrhankeystoys.com\/pslogin\/account_login\/password\/","forgotPassUrl":"https:\/\/www.mrhankeystoys.com\/customer\/account\/forgotpassword\/","login_networks_buttons_html":"","successIcon":"https:\/\/www.mrhankeystoys.com\/static\/version1790675038\/frontend\/Krish\/mrhankeytoys\/en_US\/Plumrocket_SocialLoginPro\/images\/success_icon.png","loaderIconSrc":"https:\/\/www.mrhankeystoys.com\/static\/version1790675038\/frontend\/Krish\/mrhankeytoys\/en_US\/images\/loader-2.gif"}}}['components']['pr-pslogin-email-popup'], 1168 1169 /** 1170 * Popup will change by this variable 1171 * 1172 * 1 - "Email Missing" Popup 1173 * 2 - "Email Exists" Popup 1174 * 3 - "Success" Popup 1175 * 4 - "Do you have an account?" Popup 1176 * 5 - "Link to existing account" Popup 1177 */ 1178 step: 1, 1179 isLoading: false, 1180 1181 customer: { 1182 name: '', 1183 email: '', 1184 }, 1185 success: { 1186 redirectUrl: '', 1187 message: '', 1188 }, 1189 error: '', 1190 1191 /** 1192 * Social network type 1193 */ 1194 type: '', 1195 1196 /** 1197 * Networks already linked to account 1198 */ 1199 linkedNetworksHtml: '', 1200 loginNetworksButtonsHtml: '', 1201 1202 firstTitlePatter: 'Welcome\u0020\u00251', 1203 firstTitle: '', 1204 secondTitlePatter: 'Hello\u0020\u00251', 1205 secondTitle: '', 1206 1207 alreadyRegisteredPattern: 'An\u0020email\u0020is\u0020already\u0020registered\u0020at\u0020Hankey\u0027s\u0020Toys.\u0020Enter\u0020your\u0020password\u0020to\u0020link\u0020your\u0020social\u0020account.', 1208 alreadyRegisteredText: '', 1209 1210 errorMessageLifetime: 4000, 1211 successRedirectDelay: 2000, 1212 1213 init() { 1214 document.pslogin = { 1215 bindEmail: this 1216 }; 1217 1218 this.$watch('step', this.afterSetStep.bind(this)); 1219 this.loginNetworksButtonsHtml = this.login_networks_buttons_html; 1220 this.autoOpen() 1221 1222 // Object.assign(this, hyva.formValidation(this.$refs.form)); 1223 }, 1224 1225 autoOpen: function () { 1226 var params = new URLSearchParams(location.search); 1227 if (! params.get('showPrBindEmailPopup')) { 1228 return; 1229 } 1230 1231 this.openPopup( 1232 String(params.get('firstname') ? params.get('firstname') : ''), 1233 String(params.get('email') ? params.get('email') : ''), 1234 String(params.get('networkCode') ? params.get('networkCode') : ''), 1235 Number(params.get('step')) 1236 ); 1237 this.removeBindEmailPopupParams(); 1238 }, 1239 1240 getBindEmailPopupParams() { 1241 return [ 1242 'showPrBindEmailPopup', 1243 'firstname', 1244 'email', 1245 'networkCode', 1246 'step', 1247 'noforce' 1248 ]; 1249 }, 1250 1251 cleanBindEmailPopupUrl(url) { 1252 if (!url) { 1253 return url; 1254 } 1255 1256 try { 1257 const parsedUrl = new URL(url, window.location.origin); 1258 this.getBindEmailPopupParams().forEach(param => parsedUrl.searchParams.delete(param)); 1259 1260 return parsedUrl.toString(); 1261 } catch (error) { 1262 return url; 1263 } 1264 }, 1265 1266 removeBindEmailPopupParams() { 1267 if (!window.history || !window.history.replaceState) { 1268 return; 1269 } 1270 1271 const cleanUrl = this.cleanBindEmailPopupUrl(window.location.href); 1272 if (cleanUrl && cleanUrl !== window.location.href) { 1273 window.history.replaceState({}, document.title, cleanUrl); 1274 } 1275 }, 1276 1277 /** 1278 * @param {string} name 1279 * @param {string} email 1280 * @param {string} type 1281 * @param {int} step 1282 */ 1283 openPopup(name, email, type, step) { 1284 this.setStep(step ? step : 1); 1285 1286 this.firstTitle = hyva.str(this.firstTitlePatter, name); 1287 this.alreadyRegisteredText = hyva.str(this.alreadyRegisteredPattern, email, this.storeName); 1288 1289 this.customer.name = name; 1290 this.customer.email = email; 1291 this.type = type; 1292 1293 this.renderError(''); 1294 1295 this.closePrPopupLogin(); 1296 1297 this.show('dialog'); 1298 }, 1299 1300 /** 1301 * Convert number into int 1302 * 1303 * @param stepNumber 1304 */ 1305 setStep(stepNumber) { 1306 this.step = +stepNumber; 1307 }, 1308 1309 /** 1310 * For bind click in template 1311 */ 1312 setFifthStep() { 1313 this.setStep(5); 1314 }, 1315 1316 afterSetStep(stepNumber) { 1317 if (3 === stepNumber) { 1318 this.renderError(''); 1319 this.renderSuccessRedirect(); 1320 } 1321 1322 if (1 === stepNumber || 4 === stepNumber) { 1323 this.firstTitle = hyva.str(this.firstTitlePatter, this.customer.name); 1324 } else { 1325 this.firstTitle = hyva.str(this.secondTitlePatter, this.customer.name); 1326 } 1327 1328 if (2 === stepNumber) { 1329 this.buildAlreadyRegisteredText(); 1330 } 1331 }, 1332 1333 setSuccessRedirect(redirectUrl) { 1334 this.success.redirectUrl = this.cleanBindEmailPopupUrl(redirectUrl); 1335 }, 1336 1337 buildAlreadyRegisteredText() { 1338 this.alreadyRegisteredText = hyva.str( 1339 this.alreadyRegisteredPattern, 1340 this.customer.email, 1341 this.storeName 1342 ); 1343 }, 1344 1345 registerWithEmail() { 1346 let email = (this.step === 4) ? 1347 this.customer.email : 1348 document.getElementById('pslogin_bind_email').value.trim(); 1349 1350 if (email) { 1351 let postData = { 1352 email: email, 1353 type: this.type, 1354 ajax: 1, 1355 step: this.step, 1356 form_key: hyva.getFormKey() 1357 }; 1358 1359 this.isLoading = true; 1360 fetch(this.loginWithEmailUrl, { 1361 method: 'POST', 1362 headers: { 1363 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 1364 }, 1365 body: new URLSearchParams(postData), 1366 }) 1367 .then(response => { 1368 this.isLoading = false;
1369 if (response.ok) { 1370 return response.json(); 1371 } else { 1372 console.warn('GET request failed', response); 1373 } 1374 }) 1375 .then(responseData => { 1376 if (responseData) { 1377 if (!this.validateResponse(responseData)) { 1378 console.error('Invalid response'); 1379 return; 1380 } 1381 1382 if (responseData.status) { 1383 if (responseData.data.exist) { 1384 this.customer.email = email; 1385 this.buildAlreadyRegisteredText(); 1386 1387 /* if (responseData.data.linked_networks) { 1388 this.linkedNetworksHtml = responseData.data.linked_networks; 1389 } */ 1390 1391 this.setStep(2); 1392 return; 1393 } 1394 1395 if (responseData.data.step) { 1396 this.customer.email = email; 1397 this.setStep(responseData.data.step); 1398 return; 1399 } 1400 1401 if (responseData.data.redirectUrl && responseData.data.message) { 1402 this.success.redirectUrl = responseData.data.redirectUrl; 1403 this.success.message = responseData.data.message; 1404 } else { 1405 console.error('Invalid data response'); 1406 } 1407 1408 this.setStep(3); 1409 } else { 1410 console.error(responseData.error); 1411 if (responseData.data.redirectUrl) { 1412 window.location.href = responseData.data.redirectUrl; 1413 } 1414 } 1415 } 1416 }) 1417 .catch(function name(params) { 1418 window.console && console.log(status + ': ' + error + '\nResponse text:\n' + jqXHR.responseText); 1419 }); 1420 } 1421 }, 1422 1423 loginDependOnStep() { 1424 switch (this.step) { 1425 case 1: 1426 this.registerWithEmail(); 1427 break; 1428 case 2: 1429 this.loginWithPass(); 1430 break; 1431 case 5: 1432 this.loginWithPassTakeEmail(); 1433 break; 1434 } 1435 }, 1436 1437 loginWithPassTakeEmail() { 1438 let email = document.getElementById('pslogin_bind_email').value.trim(); 1439 this.loginWithPass(email); 1440 }, 1441 1442 loginWithPass(email) { 1443 if (typeof email === 'object') { 1444 email = undefined; 1445 } 1446 1447 let password = document.getElementById('pslogin_bind_pass').value.trim(); 1448 1449 if (!password || (typeof email !== 'undefined' && !email)) { 1450 let form = document.getElementById('pslogin_bind'); 1451 if (typeof form.reportValidity === 'function') { 1452 form.reportValidity(); 1453 } 1454 1455 return; 1456 } 1457 1458 let postData = { 1459 password, 1460 type: this.type, 1461 ajax: 1, 1462 form_key: hyva.getFormKey() 1463 }; 1464 1465 if (email) { 1466 postData.email = email; 1467 } 1468 1469 this.isLoading = true; 1470 fetch(this.loginWithPassUrl, { 1471 method: 'POST', 1472 headers: { 1473 // contentType: 'application/json', 1474 // "X-Requested-With": "XMLHttpRequest", 1475 // "Accept": "application/json" 1476 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 1477 }, 1478 // body: JSON.stringify(postData), 1479 body: new URLSearchParams(postData), 1480 }) 1481 .then(response => { 1482 this.isLoading = false;
1483 if (response.ok) { 1484 return response.json(); 1485 } else { 1486 console.warn('GET request failed', response); 1487 } 1488 }) 1489 .then(responseData => { 1490 if (responseData) { 1491 if (!this.validateResponse(responseData)) { 1492 console.error('Invalid response'); 1493 return; 1494 } 1495 1496 if (responseData.status) { 1497 if (responseData.data.redirectUrl) { 1498 this.setSuccessRedirect(responseData.data.redirectUrl); 1499 this.setStep(3); 1500 } else { 1501 console.error('Invalid data response'); 1502 } 1503 } else { 1504 this.renderError(responseData.error); 1505 if (responseData.data.redirectUrl) { 1506 this.renderRedirect(responseData.data.redirectUrl, responseData.error); 1507 } 1508 } 1509 } 1510 }) 1511 .catch(function name(params) { 1512 window.console && console.log(status + ': ' + error + '\nResponse text:\n' + jqXHR.responseText); 1513 }); 1514 }, 1515 1516 /** 1517 * @param {{}} data 1518 */ 1519 validateResponse(data) { 1520 return typeof data === 'object' && 1521 data.hasOwnProperty('status') && 1522 data.hasOwnProperty('data') && 1523 data.hasOwnProperty('error') 1524 }, 1525 1526 renderRedirect(redirectUrl, message) { 1527 redirectUrl = this.cleanBindEmailPopupUrl(redirectUrl); 1528 1529 if (message) { 1530 setTimeout(() => window.location.href = redirectUrl, this.successRedirectDelay); 1531 } else { 1532 window.location.href = redirectUrl; 1533 } 1534 }, 1535 1536 renderError(message) { 1537 if (message) { 1538 this.error = message; 1539 setTimeout(() => this.error = '', this.errorMessageLifetime); 1540 } else { 1541 this.error = ''; 1542 } 1543 }, 1544 1545 renderSuccessRedirect() { 1546 this.renderRedirect(this.success.redirectUrl, true); 1547 }, 1548 1549 openForgotPassword() { 1550 window.open(this.forgotPassUrl); 1551 }, 1552 1553 closePrPopupLogin() { 1554 if (typeof window.plumrocket !== 'undefined' && 1555 typeof window.plumrocket.popupLoginControl !== 'undefined' 1556 ) { 1557 window.plumrocket.popupLoginControl.closeForm(); 1558 } 1559 } 1560 }; 1561 } 1562</script>
1562 1563<input name="form_key" type="hidden" value="9SFsreOEuib59vuZ" /> 1564 <noscript> 1565 <section class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal"> 1566 <div class="container text-center"> 1567 <p> 1568 <strong>JavaScript seems to be disabled in your browser.</strong> 1569 <span> 1570 For the best experience on our site, be sure to turn on Javascript in your browser. </span> 1571 </p> 1572 </div> 1573 </section> 1574 </noscript> 1575 1576
1577<script> 1578 document.body.addEventListener('touchstart', () => {}, {passive: true}) 1579</script>
1579 1580<div class="page-wrapper"><header class="page-header"><style>#html-body [data-pb-style=AE6294S]{display:none}</style><div class="header-top-part" data-content-type="html" data-appearance="default" data-element="main" data-pb-style="AE6294S" data-decoded="true"><div class="container flex justify-between"> 1581 <div style="font-size:20px !important" class="start-sale m-auto"> 1582 <span>See <a class="underline font-bold" href="/faq">FAQs</a> for sale rules</span> 1583 </div> 1584</div> 1585 1586<!-- <div class="container flex justify-between"> 1587 <div class="email-on"><label>Email Us: </label><a href="/contact-us">[email protected]</a></div> 1588 <div class="start-sale"> 1589 <span>Get a Head Start Sale</span> 1590 <span>-</span> 1591 <span>35h : 02m : 25s</span> 1592 <span>-</span> 1593 <span>30-70% Off Sitewide</span> 1594 </div> 1595 1596</div> --></div>
1596<script> 1597 function initHeader () { 1598 return { 1599 searchOpen: true, 1600 cart: {}, 1601 init() { 1602 this.checkHeaderSize(); 1603 }, 1604 checkHeaderSize() { 1605 const pageHeader = document.querySelector('.page-header'); 1606 if (!pageHeader) return; 1607 document.documentElement.style.setProperty("--page-header-height", `${pageHeader.offsetHeight}px`); 1608 }, 1609 summaryCount() { 1610 return this.cart.summary_count || 0; 1611 }, 1612 isCartOpen: false, 1613 getData() { 1614 const data = this.$event.detail.data; 1615 if (data.cart) { this.cart = data.cart } 1616 }, 1617 ariaLabel() { 1618 return 'Toggle\u0020minicart, ' + 1619 (this.isCartEmpty() ? 'Cart\u0020is\u0020empty' : ( 1620 Math.abs(this.summaryCount()) > 1 ? 1621 hyva.str('\u00251\u0020items', this.summaryCount()) : 1622 hyva.str('\u00251\u0020item', this.summaryCount()) 1623 )) 1624 }, 1625 isCartEmpty() { 1626 return !this.summaryCount() 1627 }, 1628 openCart() { 1629 this.$dispatch('toggle-cart', { 1630 isOpen: true 1631 }) 1632 }, 1633 toggleCart() { 1634 const event = this.$event; 1635 if (event.detail && event.detail.isOpen !== undefined) { 1636 this.isCartOpen = event.detail.isOpen 1637 if (!this.isCartOpen && this.$refs && this.$refs.cartButton) { 1638 this.$refs.cartButton.focus() 1639 } 1640 } else { 1641 this.isCartOpen = true 1642 } 1643 }, 1644 searchClosed() { 1645 return !this.searchOpen; 1646 }, 1647 toggleSearchForm() { 1648 this.searchOpen = !this.searchOpen; 1649 this.$dispatch('search-open'); 1650 }, 1651 searchClose() { 1652 this.searchOpen = false; 1653 }, 1654 searchEscape() { 1655 this.searchOpen = false; 1656 this.$refs.searchButton.focus(); 1657 } 1658 } 1659 } 1660 1661 function initCompareHeader() { 1662 return { 1663 compareProducts: null, 1664 itemCount: 0, 1665 hiddenIfEmpty() { 1666 return { 1667 'hidden': this.itemCount < 1 1668 } 1669 }, 1670 linkAriaLabel() { 1671 const countLabel = this.itemCount > 1 1672 ? hyva.str('\u00251\u0020Items', this.itemCount) 1673 : hyva.str('\u00251\u0020Item', this.itemCount); 1674 return `Compare\u0020Products (${countLabel})`; 1675 }, 1676 receiveCompareData() { 1677 const data = this.$event.detail.data; 1678 if (data['compare-products'] && data['compare-products'].count) { 1679 this.compareProducts = data['compare-products']; 1680 this.itemCount = this.compareProducts.count; 1681 } 1682 }, 1683 itemCountLabel() { 1684 return `(${this.itemCount})`; 1685 } 1686 } 1687 } 1688 1689 function initWishlistHeader() { 1690 return { 1691 wishlistProducts: null, 1692 itemCount: 0, 1693 linkAriaLabel() { 1694 const countLabel = this.itemCount > 1 1695 ? hyva.str('\u00251\u0020Items', this.itemCount) 1696 : hyva.str('\u00251\u0020Item', this.itemCount); 1697 return `Wishlist\u0020Products (${countLabel})`; 1698 }, 1699 receiveWishlistData() { 1700 const data = this.$event.detail.data; 1701 1702 this.itemCount = data.wishlist && data.wishlist.items 1703 ? data.wishlist.items.length 1704 : 0; 1705 } 1706 } 1707 } 1708 1709 window.addEventListener('alpine:init', () => { 1710 Alpine.data('initHeader', initHeader); 1711 Alpine.data('initCompareHeader', initCompareHeader); 1712 Alpine.data('initWishlistHeader', initWishlistHeader); 1713 }, { once: true }) 1714</script>
1714 1715<div 1716 id="header" 1717 class="z-30 relative bg-white s1200:border-b s1200:border-[#666]" 1718 x-data="initHeader" 1719 @private-content-loaded.window="getData" 1720 @resize.window.debounce="checkHeaderSize" 1721> 1722 <div class="container flex justify-between items-center py-2.5 s1400:gap-10 s1200:py-4"> 1723 <div class="flex items-center gap-2.5 shrink-0 s767:gap-5"> 1724 1725<div class="navigation hidden s1200:block mobile-menu" x-data="initMobileMenu" @sub-menu-state-change.window="hasActiveSubMenu"> 1726 <button 1727 type="button" 1728 class="align-middle" 1729 aria-label="Open menu" 1730 aria-controls="mobileMenu" 1731 @click="open" 1732 > 1733 <svg xmlns="http://www.w3.org/2000/svg" width="26" height="18" viewBox="0 0 26 18" fill="none"><path d="M17 16C17.5523 16 18 16.4477 18 17C18 17.5523 17.5523 18 17 18H1C0.447715 18 0 17.5523 0 17C0 16.4477 0.447715 16 1 16H17ZM25 8C25.5523 8 26 8.44771 26 9C26 9.55229 25.5523 10 25 10H1C0.447715 10 0 9.55229 0 9C0 8.44771 0.447715 8 1 8H25ZM25 0C25.5523 0 26 0.447715 26 1C26 1.55228 25.5523 2 25 2H1C0.447715 2 0 1.55228 0 1C0 0.447715 0.447715 0 1 0H25Z" fill="#0F0F0F"/></svg> 1734 </button> 1735 1736 <dialog 1737 id="mobileMenu" 1738 class="max-h-full h-screen w-full ml-0 open:flex flex-col transition ease-out duration-300 open:duration-500 black-white max-w-[420px] w-[calc(100%-54px)] s639:w-[calc(100%-54px)] s639:max-w-full backdrop:bg-black/25 backdrop:backdrop-blur-sm" 1739 x-show="isOpen" 1740 x-htmldialog.noscroll="close" 1741 > 1742 <div class="border-[#f4f4f4] border-b"> 1743 <div class="flex items-center gap-2 py-4 px-6 hidden"> 1744 <div></div> 1745 <button 1746 type="button" 1747 @click="close" 1748 class="btn btn-secondary ms-auto p-2 bg-slate-200 text-slate-700" 1749 aria-label="Close menu" 1750 > 1751 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 1752 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 1753</svg> 1754 </button> 1755 </div> 1756 <div class="flex px-5 items-center"> 1757 <div class="flex items-center border-b-2 border-goldColor w-full"> 1758 <div @click="close" class="cursor-pointer"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 1759 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 1760</svg> 1761</div> 1762 <button 1763 class="h-[62px] text-[#999] flex items-center justify-center w-full aria-expanded:text-baseColor aria-expanded:font-semibold jost relative text-[22px]" 1764 aria-controls="mobileMenuMain" 1765 :aria-expanded="tabIsMain" 1766 @click="setTabTo" 1767 > 1768 Menu </button> 1769 </div> 1770 </div> 1771 </div> 1772 <div class="grow relative text-white-black overflow-y-auto overflow-x-hidden"> 1773 <nav class="hidden w-full duration-150 ease-in-out transform transition-display" :class="{ 'hidden' : !open }" x-show="tabIsMain"> 1774 <div class="level-0 px-5"> 1775 <div class="level-0-div border-b border-[#f4f4f4] py-[18px] flex items-center"> 1776 <a class="level-0-link font-medium no-underline flex items-center w-full" href="/all">Shop All</a> 1777 </div> 1778 </div> 1779 <div class="level-0 px-5"> 1780 <div class="level-0-div border-b border-[#f4f4f4] py-[18px] flex items-center" id="controlsAccordionItemOne-category-node-3" :class="{ 'open bg-[#e6e6e6] -mx-5 px-5' : mobilePanelActiveId === 'category-node-3', 'not-open' : !mobilePanelActiveId}"> 1781 <a class="level-0-link font-medium no-underline flex items-center w-full" href="javascript:void(0);" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-3' ? 0 : 'category-node-3'"> 1782 Realistic Dildos </a> 1783 <a class="arrowBtn shrink-0" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-3' ? 0 : 'category-node-3'" :class="{'rotate-90' : mobilePanelActiveId !== 'category-node-3', '-rotate-90' : mobilePanelActiveId === 'category-node-3',}"> 1784 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="rightArrow" width="24" height="24" role="img"> 1785 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1786<title>chevron-right</title></svg> 1787 </a> 1788 </div> 1789 <div class="z-10 w-full h-full text-gray-500 bg-container-lighter" :class="{'hidden' : mobilePanelActiveId !== 'category-node-3', 'block' : mobilePanelActiveId === 'category-node-3',}"> 1790 <a href="https://www.mrhankeystoys.com/realistic" title="Realistic Dildos" class="view-all pl-5 border-b border-[#f4f4f4] py-3 font-medium no-underline flex items-center w-full">
1791 <span>View All</span> 1792 </a> 1793 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1794 <div class="level-1 px-5"> 1795 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1796 <a href="https://www.mrhankeystoys.com/realistic/small-dildos" title="XS/Small Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1797 <span>XS/Small Dildos</span> 1798 </a> 1799 </span> 1800 </div> 1801 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1802 <div class="level-1 px-5"> 1803 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1804 <a href="https://www.mrhankeystoys.com/realistic/huge-dildos" title="Huge Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1805 <span>Huge Dildos</span> 1806 </a> 1807 </span> 1808 </div> 1809 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1810 <div class="level-1 px-5"> 1811 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1812 <a href="https://www.mrhankeystoys.com/realistic/uncircumcised-dildos" title="Uncut Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1813 <span>Uncut Dildos</span> 1814 </a> 1815 </span> 1816 </div> 1817 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1818 <div class="level-1 px-5"> 1819 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1820 <a href="https://www.mrhankeystoys.com/realistic/bbc-dildos" title="BBC Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1821 <span>BBC Dildos</span> 1822 </a> 1823 </span> 1824 </div> 1825 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1826 <div class="level-1 px-5"> 1827 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1828 <a href="https://www.mrhankeystoys.com/realistic/lifecast" title="Lifecast Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1829 <span>Lifecast Dildos</span> 1830 </a> 1831 </span> 1832 </div> 1833 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1834 <div class="level-1 px-5"> 1835 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1836 <a href="https://www.mrhankeystoys.com/realistic/pornstar-dildos" title="Pornstar Dildos" class="level-1-link font-medium no-underline flex items-center w-full">
1837 <span>Pornstar Dildos</span> 1838 </a> 1839 </span> 1840 </div> 1841 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1842 <div class="level-1 px-5"> 1843 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1844 <a href="https://www.mrhankeystoys.com/realistic/hybrid-dildos" title="Hybrid Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1845 <span>Hybrid Dildos</span> 1846 </a> 1847 </span> 1848 </div> 1849 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1850 <div class="level-1 px-5"> 1851 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1852 <a href="https://www.mrhankeystoys.com/realistic/anal-trainers" title="Anal Trainers" class="level-1-link font-medium no-underline flex items-center w-full"> 1853 <span>Anal Trainers</span> 1854 </a> 1855 </span> 1856 </div> 1857 <div class="level-1 px-5"> 1858 <div class="level-1-div py-3 flex items-center"> 1859 <a href="https://www.mrhankeystoys.com/realistic" class="btn btn-primary w-full">Shop All Realistic Dildos</a> 1860 </div> 1861 </div> 1862 </div> 1863 </div> 1864 <div class="level-0 px-5"> 1865 <div class="level-0-div border-b border-[#f4f4f4] py-[18px] flex items-center" id="controlsAccordionItemOne-category-node-4" :class="{ 'open bg-[#e6e6e6] -mx-5 px-5' : mobilePanelActiveId === 'category-node-4', 'not-open' : !mobilePanelActiveId}"> 1866 <a class="level-0-link font-medium no-underline flex items-center w-full" href="javascript:void(0);" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-4' ? 0 : 'category-node-4'"> 1867 Fantasy Dildos </a> 1868 <a class="arrowBtn shrink-0" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-4' ? 0 : 'category-node-4'" :class="{'rotate-90' : mobilePanelActiveId !== 'category-node-4', '-rotate-90' : mobilePanelActiveId === 'category-node-4',}"> 1869 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="rightArrow" width="24" height="24" role="img"> 1870 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1871<title>chevron-right</title></svg> 1872 </a> 1873 </div> 1874 <div class="z-10 w-full h-full text-gray-500 bg-container-lighter" :class="{'hidden' : mobilePanelActiveId !== 'category-node-4', 'block' : mobilePanelActiveId === 'category-node-4',}"> 1875 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi" title="Fantasy Dildos" class="view-all pl-5 border-b border-[#f4f4f4] py-3 font-medium no-underline flex items-center w-full"> 1876 <span>View All</span> 1877 </a> 1878 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1879 <div class="level-1 px-5">
1880 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1881 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/small-dildos" title="XS/Small Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1882 <span>XS/Small Dildos</span> 1883 </a> 1884 </span> 1885 </div> 1886 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1887 <div class="level-1 px-5"> 1888 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1889 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/huge-dildos" title="Huge Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1890 <span>Huge Dildos</span> 1891 </a> 1892 </span> 1893 </div> 1894 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1895 <div class="level-1 px-5"> 1896 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1897 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/mythical-creatures" title="Mythical Creatures" class="level-1-link font-medium no-underline flex items-center w-full"> 1898 <span>Mythical Creatures</span> 1899 </a> 1900 </span> 1901 </div> 1902 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1903 <div class="level-1 px-5"> 1904 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1905 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/dragon-dildos" title="Dragon Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1906 <span>Dragon Dildos</span> 1907 </a> 1908 </span> 1909 </div> 1910 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1911 <div class="level-1 px-5"> 1912 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1913 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/dog-dildos" title="Dog Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1914 <span>Dog Dildos</span> 1915 </a> 1916 </span> 1917 </div> 1918 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1919 <div class="level-1 px-5"> 1920 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1921 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/horse-dildos" title="Horse Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1922 <span>Horse Dildos</span> 1923 </a> 1924 </span> 1925 </div> 1926 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1927 <div class="level-1 px-5">
1928 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1929 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/alien-dildos" title="Alien Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1930 <span>Alien Dildos</span> 1931 </a> 1932 </span> 1933 </div> 1934 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1935 <div class="level-1 px-5"> 1936 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1937 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/hentai-dildos" title="Hentai Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1938 <span>Hentai Dildos</span> 1939 </a> 1940 </span> 1941 </div> 1942 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1943 <div class="level-1 px-5"> 1944 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1945 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/tentacle-dildos" title="Tentacle Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1946 <span>Tentacle Dildos</span> 1947 </a> 1948 </span> 1949 </div> 1950 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1951 <div class="level-1 px-5"> 1952 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1953 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/anal-trainers" title="Anal Trainers" class="level-1-link font-medium no-underline flex items-center w-full"> 1954 <span>Anal Trainers</span> 1955 </a> 1956 </span> 1957 </div> 1958 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1959 <div class="level-1 px-5"> 1960 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1961 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/monster-dildos" title="Monster Dildos" class="level-1-link font-medium no-underline flex items-center w-full"> 1962 <span>Monster Dildos</span> 1963 </a> 1964 </span> 1965 </div> 1966 <div class="level-1 px-5"> 1967 <div class="level-1-div py-3 flex items-center"> 1968 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi" class="btn btn-primary w-full">Shop All Fantasy Dildos</a> 1969 </div> 1970 </div> 1971 </div> 1972 </div> 1973 <div class="level-0 px-5"> 1974 <div class="level-0-div border-b border-[#f4f4f4] py-[18px] flex items-center" id="controlsAccordionItemOne-category-node-5" :class="{ 'open bg-[#e
19746e6e6] -mx-5 px-5' : mobilePanelActiveId === 'category-node-5', 'not-open' : !mobilePanelActiveId}"> 1975 <a class="level-0-link font-medium no-underline flex items-center w-full" href="javascript:void(0);" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-5' ? 0 : 'category-node-5'"> 1976 Play Gear </a> 1977 <a class="arrowBtn shrink-0" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-5' ? 0 : 'category-node-5'" :class="{'rotate-90' : mobilePanelActiveId !== 'category-node-5', '-rotate-90' : mobilePanelActiveId === 'category-node-5',}"> 1978 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="rightArrow" width="24" height="24" role="img"> 1979 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1980<title>chevron-right</title></svg> 1981 </a> 1982 </div> 1983 <div class="z-10 w-full h-full text-gray-500 bg-container-lighter" :class="{'hidden' : mobilePanelActiveId !== 'category-node-5', 'block' : mobilePanelActiveId === 'category-node-5',}"> 1984 <a href="https://www.mrhankeystoys.com/accessories" title="Play Gear" class="view-all pl-5 border-b border-[#f4f4f4] py-3 font-medium no-underline flex items-center w-full"> 1985 <span>View All</span> 1986 </a> 1987 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1988 <div class="level-1 px-5"> 1989 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1990 <a href="https://www.mrhankeystoys.com/accessories/suction-cups" title="Suction Cups" class="level-1-link font-medium no-underline flex items-center w-full"> 1991 <span>Suction Cups</span> 1992 </a> 1993 </span> 1994 </div> 1995 <!-- Boucle pour le niveau 1 (sous-niveau) --> 1996 <div class="level-1 px-5"> 1997 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 1998 <a href="https://www.mrhankeystoys.com/accessories/lubricants" title="Lubricants" class="level-1-link font-medium no-underline flex items-center w-full"> 1999 <span>Lubricants</span> 2000 </a> 2001 </span> 2002 </div> 2003 <!-- Boucle pour le niveau 1 (sous-niveau) --> 2004 <div class="level-1 px-5"> 2005 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 2006 <a href="https://www.mrhankeystoys.com/accessories/strap-on-harnesses" title="Strap On Harnesses" class="level-1-link font-medium no-underline flex items-center w-full"> 2007 <span>Strap On Harnesses</span> 2008 </a> 2009 </span> 2010 </div> 2011 <!-- Boucle pour le niveau 1 (sous-niveau) --> 2012 <div class="level-1 px-5"> 2013 <span class="level-1-div border-b border-[#f4f4f4] py-3 flex items-center "> 2014 <a href="https://www.mrhankeystoys.com/accessories/customizations" title="Custom Colors/Firmness" class="level-1-link font-medium no-underline flex items-center w-full">
2015 <span>Custom Colors/Firmness</span> 2016 </a> 2017 </span> 2018 </div> 2019 <div class="level-1 px-5"> 2020 <div class="level-1-div py-3 flex items-center"> 2021 <a href="https://www.mrhankeystoys.com/accessories" class="btn btn-primary w-full">Shop All Play Gear</a> 2022 </div> 2023 </div> 2024 </div> 2025 </div> 2026 <div class="level-0 px-5"> 2027 <div class="level-0-div border-b border-[#f4f4f4] py-[18px] flex items-center"> 2028 <a class="level-0-link font-medium no-underline flex items-center w-full" href="/promo-offers">Sales & Offers</a> 2029 </div> 2030 </div> 2031 <div class="level-0 px-5"> 2032 <div class="level-0-div border-b border-[#f4f4f4] py-[18px] flex items-center"> 2033 <a class="level-0-link font-medium no-underline flex items-center w-full" href="/usage-and-safety">Usage & Safety</a> 2034 </div> 2035 </div> 2036 <div class="level-0 px-5"> 2037 <div class="level-0-div border-b border-[#f4f4f4] py-[18px] flex items-center"> 2038 <a class="level-0-link font-medium no-underline flex items-center w-full" href="/faq">FAQs</a> 2039 </div> 2040 </div> 2041 <div x-data="customerInfo()" @private-content-loaded.window="updateCustomerData($event.detail.data)"> 2042 <div x-show="customer.firstname"> 2043 <!-- My Account Link --> 2044 <div class="level-0 px-5"> 2045 <a href="https://www.mrhankeystoys.com/customer/account/index/" class="level-0-link font-medium no-underline flex items-center w-full py-[18px] border-b border-[#f4f4f4]"> 2046 My Account </a> 2047 </div> 2048 2049 <!-- My Wishlist Link --> 2050 <div class="level-0 px-5" x-data="wishlistInfo()" @private-content-loaded.window="updateWishlistData($event.detail.data)"> 2051 <a href="https://www.mrhankeystoys.com/wishlist/" class="level-0-link font-medium no-underline flex items-center w-full py-[18px] border-b border-[#f4f4f4] "> 2052 My Wishlist <span class="ml-1" x-text="`(${wishlist})`"></span> <!-- Wishlist Count --> 2053 </a> 2054 </div> 2055 2056 <!-- Sign Out Link --> 2057 <div class="level-0 px-5"> 2058 <a href="https://www.mrhankeystoys.com/customer/account/logout/" class="level-0-link font-medium no-underline flex items-center w-full py-[18px] border-b border-[#f4f4f4] "> 2059 Sign Out </a> 2060 </div> 2061 </div> 2062 2063 <!-- Sign In and Register Section --> 2064 <div x-show="!customer.firstname"> 2065 <div class="level-0 px-5"> 2066 <a href="https://www.mrhankeystoys.com/customer/account/login/" class="level-0-link font-medium no-underline flex items-center w-full py-[18px] border-b border-[#f4f4f4] " @click="close">Sign In</a> 2067 </div> 2068 <div class="level-0 px-5"> 2069 <a href="https://www.mrhankeystoys.com/customer/account/create/" class="level-0-link font-medium no-underline flex items-center w-full py-[18px] border-b border-[#f4f4f4] " @click="close">Register</a> 2070 </div> 2071 <div class="level-0 px-5"> 2072 <a href="/wishlist" class="level-0-link font-medium no-underline flex items-center w-full py-[18px] border-b border-[#f4f4f4] " @click="close">Wishlist</a> 2073 </div> 2074 </div> 2075 </div> 2076 <div class="level-0 px-5"> 2077 <div class="level-0-div border-b border-[#f4f4f4] py-[18px] flex items-center"> 2078 <a class="level-0-link font-medium no-underline flex items-center w-full" href="/contact-us">Contact Us</a> 2079 </div> 2080 </div> 2081 </nav> 2082 </div> 2083 </dialog> 2084</div> 2085
2086<script> 2087 document.addEventListener('alpine:init', () => { 2088 Alpine.data('initMobileMenu', () => ({ 2089 mobilePanelActiveId: null, 2090 mobilePanelActiveId2: null, 2091 open: false, 2092 isOpen: false, 2093 isSubMenuOpen: false, 2094 isOverflowing: false, 2095 openTab: 'mobileMenuMain', 2096 init() { 2097 Array.from(this.$root.querySelectorAll('a')).forEach(link => { 2098 if (link.href === `${window.location.origin}${window.location.pathname}`) { 2099 link.setAttribute('aria-current', 'page'); 2100 } 2101 }); 2102 }, 2103 open() { 2104 this.isOpen = true; 2105 }, 2106 close() { 2107 this.isOpen = false; 2108 }, 2109 setTabTo() { 2110 this.openTab = this.$el.getAttribute('aria-controls'); 2111 }, 2112 tabIsMain() { 2113 return this.openTab === 'mobileMenuMain'; 2114 }, 2115 tabIsExtra() { 2116 return this.openTab === 'mobileMenuExtra'; 2117 }, 2118 tabIsSettings() { 2119 return this.openTab === 'mobileMenuSettings'; 2120 }, 2121 lockWrapperScroll() { 2122 return this.isSubMenuOpen ? { overflow: 'hidden' } : {} 2123 }, 2124 hasActiveSubMenu() { 2125 this.isSubMenuOpen = !!this.$root.querySelector('[data-open]'); 2126 } 2127 })); 2128 2129 Alpine.data('initMobileSubMenu', () => ({ 2130 isOpen: false, 2131 open() { 2132 this.isOpen = true; 2133 this.$root.setAttribute('data-open', ''); 2134 this.$nextTick(() => { 2135 this.$dispatch('sub-menu-state-change'); 2136 this.$refs.closeSubMenuBtn.focus(); 2137 //this.toggleInert(); 2138 }) 2139 }, 2140 close() { 2141 this.isOpen = false; 2142 this.$root.removeAttribute('data-open'); 2143 this.toggleInert(); 2144 this.$nextTick(() => { 2145 this.$dispatch('sub-menu-state-change') 2146 this.$refs.openSubMenuBtn.focus(); 2147 }) 2148 }, 2149 toggleInert() { 2150 const items = this.$root.parentElement.children; 2151 2152 for (item of items) { 2153 if (item.hasAttribute('data-open')) continue; 2154 item.toggleAttribute('inert', this.isOpen); 2155 } 2156 } 2157 })); 2158 2159 Alpine.data('customerInfo', () => ({ 2160 customer: {}, 2161 updateCustomerData(data) { 2162 /*console.log("Customer Data Called");*/ 2163 if (data.customer) { 2164 this.customer = data.customer; 2165 } 2166 } 2167 })); 2168 2169 Alpine.data('wishlistInfo', () => ({ 2170 wishlist: 0, // Initialize wishlist count 2171 updateWishlistData(data) { 2172 /*console.log("Wishlist Data Called");*/ 2173 if (data.wishlist && typeof data.wishlist.counter !== 'undefined') { 2174 this.wishlist = data.wishlist.counter; // Set wishlist count 2175 } else { 2176 this.wishlist = 0; // Default to 0 if no wishlist data 2177 } 2178 } 2179 })); 2180 }); 2181</script>
2181 2182 <a href="javascript:void(0);" class="hidden s767:block mobileSearch" @click.outside="searchOpen = true" 2183 @keydown.escape="searchOpen = true; $refs.searchButton.focus()"> 2184 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none" class="fill-black" role="img"> 2185<path d="M8.04938 16.0928C9.83702 16.0928 11.5735 15.4963 12.9838 14.3977L18.3045 19.7191C18.7019 20.103 19.3353 20.092 19.7192 19.6945C20.0936 19.3067 20.0936 18.6919 19.7192 18.3042L14.3985 12.9828C17.1243 9.47344 16.4895 4.41858 12.9807 1.69241C9.47196 -1.03376 4.41791 -0.398932 1.69215 3.11039C-1.03361 6.61971 -0.398872 11.6746 3.10992 14.4007C4.52252 15.4983 6.26058 16.0937 8.04938 16.0928ZM3.77429 3.77179C6.13538 1.4103 9.96347 1.41025 12.3246 3.7717C14.6857 6.13315 14.6858 9.96181 12.3247 12.3233C9.9636 14.6848 6.13551 14.6848 3.77438 12.3234C3.77434 12.3234 3.77434 12.3234 3.77429 12.3233C1.4132 9.97906 1.39929 6.16436 3.74318 3.80291C3.75354 3.79251 3.76389 3.78215 3.77429 3.77179Z" fill="#0F0F0F"/> 2186<title>searchIcon</title></svg> 2187 </a> 2188 <div class="min1400:min-w-[400px] shrink-0 s1023:w-20 s767:hidden"> 2189<a 2190 class="inline-block align-middle" 2191 href="https://www.mrhankeystoys.com/" 2192 title="Go to Home page" 2193> 2194 <picture> 2195 2196 2197 <source type="image/webp" 2198 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/logo/default/Logo.webp"> 2199 2200 <source type="image/png" 2201 srcset="https://www.mrhankeystoys.com/media/logo/default/Logo.png"> 2202 2203 <img 2204 src="https://www.mrhankeystoys.com/media/logo/default/Logo.png" 2205 alt="HankeysToys" 2206 width="137" 2207 height="90" 2208 loading="eager" 2209 fetchpriority="high" 2210 ></picture> 2211 2212 </a> 2213</div> 2214 </div> 2215 <div class="hidden s767:block shrink-0 s1023:w-20"> 2216<a 2217 class="inline-block align-middle" 2218 href="https://www.mrhankeystoys.com/" 2219 title="Go to Home page" 2220> 2221 <picture> 2222 2223 2224 <source type="image/webp" 2225 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/logo/default/Logo.webp"> 2226 2227 <source type="image/png" 2228 srcset="https://www.mrhankeystoys.com/media/logo/default/Logo.png"> 2229 2230 <img 2231 src="https://www.mrhankeystoys.com/media/logo/default/Logo.png" 2232 alt="HankeysToys" 2233 width="137" 2234 height="90" 2235 loading="eager" 2236 fetchpriority="high" 2237 ></picture> 2238 2239 </a> 2240</div> 2241 <div class="w-full max-w-[850px] s767:hidden searchPopup"> 2242 <button type="button" id="menu-search-icon" class="hidden" 2243 aria-label="Toggle search form" aria-haspopup="true" 2244 x-ref="searchButton" :aria-expanded="searchOpen" 2245 @click="searchOpen = !searchOpen; $dispatch('search-open');" @keydown.escape="searchOpen = false"> 2246 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 2247 <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/> 2248</svg> 2249 </button> 2250 <div class="hidden s767:block closeSearch fixed top-1 right-1 z-[51]"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 2251 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 2252</svg> 2253</div> 2254 <div id="search-content" class="!block s767:hidden" x-cloak 2255 x-show="searchOpen" @click.outside="searchOpen = true" 2256 @keydown.escape="searchOpen = true; $refs.searchButton.focus()"> 2257
2257<script> 2258 //todo move result url to view model 2259const algoliaConfig = Object.assign( 2260 {"instant":{"enabled":true,"selector":".columns","isAddToCartEnabled":false,"addToCartParams":{"action":"https:\/\/www.mrhankeystoys.com\/checkout\/cart\/add\/","formKey":"9SFsreOEuib59vuZ","redirectUrlParam":"uenc"},"infiniteScrollEnabled":false,"urlTrackedParameters":["query","attribute:*","index","page"],"isSearchBoxEnabled":false,"isVisualMerchEnabled":false,"categorySeparator":" \/\/\/ ","categoryPageIdAttribute":"categoryPageId","isCategoryNavigationEnabled":false,"hidePagination":true,"isDynamicFacetsEnabled":false,"redirects":{"enabled":false,"onPageLoad":true,"onSearchAsYouType":false,"showSelectableRedirect":true,"openInNewWindow":false}},"autocomplete":{"enabled":true,"selector":".algolia-search-input","sections":[{"name":"pages","label":"Pages","hitsPerPage":"2"}],"nbOfProductsSuggestions":6,"nbOfCategoriesSuggestions":2,"nbOfQueriesSuggestions":0,"isDebugEnabled":false,"isNavigatorEnabled":true,"debounceMilliseconds":300,"minimumCharacters":2,"redirects":{"enabled":true,"showSelectableRedirect":true,"showHitsWithRedirect":false,"openInNewWindow":false}},"landingPage":{"query":"","configuration":"[]"},"recommend":{"enabledFBT":false,"enabledRelated":false,"enabledFBTInCart":false,"enabledRelatedInCart":false,"enabledLookingSimilar":0,"limitFBTProducts":6,"limitRelatedProducts":6,"limitTrendingItems":6,"limitLookingSimilar":6,"enabledTrendItems":0,"trendItemFacetName":null,"trendItemFacetValue":null,"isTrendItemsEnabledInPDP":0,"isTrendItemsEnabledInCartPage":0,"isAddToCartEnabledInFBT":false,"isAddToCartEnabledInRelatedProduct":false,"isAddToCartEnabledInTrendsItem":false,"isAddToCartEnabledInLookingSimilar":false,"FBTTitle":"Frequently bought together","relatedProductsTitle":"Related products","trendingItemsTitle":"Trending items","addToCartParams":{"action":"https:\/\/www.mrhankeystoys.com\/checkout\/cart\/add\/","formKey":"9SFsreOEuib59vuZ","redirectUrlParam":"uenc"},"isLookingSimilarEnabledInPDP":0,"isLookingSimilarEnabledInCartPage":0,"lookingSimilarTitle":"Looking Similar"},"extensionVersion":"3.17.4","applicationId":"FV7NPLDQ20","indexName":"mrhankeystoys_default","baseIndexName":"mrhankeystoys_default","apiKey":"YTBmZDJmYmJhN2YwYTJjZGY1NjI2MDdmOWJkMDQyNDg5ZDE1NTExM2I0MGUzZjliNjA3N2FmODRiOWU5YmUwNXRhZ0ZpbHRlcnM9JnZhbGlkVW50aWw9MTc5MTEyMzQ0MQ==","attributeFilter":[],"facets":[{"attribute":"categories","type":"conjunctive","label":"Categories","searchable":"2","create_rule":"2"},{"attribute":"size_filter","type":"conjunctive","label":"Size","searchable":"2","create_rule":"2"},{"attribute":"insertable_length","type":"slider","label":"Insertable Length","searchable":"1","create_rule":"2"},{"attribute":"max_circumference","type":"slider","label":"Circumference","searchable":"1","create_rule":"2"},{"attribute":"price","type":"slider","label":"Price","searchable":"2","create_rule":"2"}],"areCategoriesInFacets":true,"hitsPerPage":18,"sortingIndices":[{"attribute":"price","sort":"asc","sortLabel":"Lowest price","virtualReplica":"0","name":"mrhankeystoys_default_products_price_group_0_asc","ranking":["asc(price.USD.group_0)","typo","geo","words","filters","proximity","attribute","exact","custom"],"label":"Lowest price"},{"attribute":"price","sort":"desc","sortLabel":"Highest price","virtualReplica":"0","name":"mrhankeystoys_default_products_price_group_0_desc","ranking":["desc(price.USD.group_0)","typo","geo","words","filters","proximity","attribute","exact","custom"],"label":"Highest price"},{"attribute":"created_at","sort":"desc","sortLabel":"Newest first","virtualReplica":"0","name":"mrhankeystoys_default_products_created_at_desc","ranking":["desc(created_at)","typo","geo","words","filters","proximity","attribute","exact","custom"],"label":"Newest first"}],"isSearchPage":false,"isCategoryPage":false,"isLandingPage":false,"removeBranding":true,"productId":null,"priceKey":".USD.group_0","priceGroup":"group_0","origFormatedVar":"price.USD.group_0_original_formated","tierFormatedVar":"price.USD.group_0_tier_formated","currencyCode":"USD","currencySymbol":"$","priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"maxValuesPerFacet":10,"autofocus":true,"resultPageUrl":"https:\/\/www.mrhankeystoys.com\/catalogsearch\/result\/","request":{"query":"","refinementKey":"","refinementValue":"","categoryId":"","landingPageId":"","path":"","level":"","parentCategory":"","childCategories":[],"url":"https:\/\/www.mrhankeystoys.com\/blog"},"showCatsNotIncludedInNavigation":false,"showSuggestionsOnNoResultsPage":true,"baseUrl":"https:\/\/www.mrhankeystoys.com","popularQueries":[],"useAdaptiveImage":false,"urls":{"logo":"https:\/\/www.mrhankeystoys.com\/static\/version1790675038\/frontend\/Krish\/mrhankeytoys\/en_
2260US\/Algolia_AlgoliaSearch\/js\/images\/algolia-logo-blue.svg"},"cookieConfiguration":{"customerTokenCookie":"_ALGOLIA_MAGENTO_AUTH","consentCookieName":"user_allowed_save_cookie","cookieAllowButtonSelector":"#btn-cookie-allow","cookieRestrictionModeEnabled":false,"cookieDuration":"15552000000"},"ccAnalytics":{"enabled":false,"ISSelector":".ais-Hits-item a.result, .ais-InfiniteHits-item a.result","conversionAnalyticsMode":null,"addToCartSelector":".action.primary.tocart","orderedProductIds":[]},"isPersonalizationEnabled":false,"personalization":{"enabled":false,"viewedEvents":{"viewProduct":{"eventName":"Viewed Product","enabled":false,"method":"viewedObjectIDs"}},"clickedEvents":{"productClicked":{"eventName":"Product Clicked","enabled":false,"selector":".ais-Hits-item a.result, .ais-InfiniteHits-item a.result","method":"clickedObjectIDs"},"productRecommended":{"eventName":"Recommended Product Clicked","enabled":false,"selector":".products-upsell .product-item","method":"clickedObjectIDs"}},"filterClicked":{"eventName":"Filter Clicked","enabled":false,"method":"clickedFilters"}},"analytics":{"enabled":false,"delay":"3000","triggerOnUiInteraction":"1","pushInitialSearch":"0"},"now":1790985600,"queue":{"isEnabled":false,"nbOfJobsToRun":5,"retryLimit":3,"nbOfElementsPerIndexingJob":300},"isPreventBackendRenderingEnabled":false,"translations":{"to":"to","or":"or","go":"Go","popularQueries":"You can try one of the popular search queries","seeAll":"See all products","allDepartments":"Search page","seeIn":"See products in","orIn":"or in","noProducts":"No products for query","noResults":"No results","refine":"Refine","selectedFilters":"Selected Filters","clearAll":"Clear all","previousPage":"Previous page","nextPage":"Next page","searchFor":"Search for products","relevance":"Relevance","categories":"Categories","products":"Products","suggestions":"Suggestions","searchBy":"Search by","redirectSearchPrompt":"Continue search for","searchForFacetValuesPlaceholder":"Search for other ...","showMore":"Show more products","searchTitle":"Search results for","placeholder":"Search for products, categories, ...","addToCart":"Add to Bag"}}, { 2261 resultURL:'https\u003A\u002F\u002Fwww.mrhankeystoys.com\u002Fcatalogsearch\u002Fresult\u002F', 2262 placeholder: 'Search\u0020entire\u0020store\u0020here...' 2263 } 2264) 2265const instantsearchScripts = ["https:\/\/www.mrhankeystoys.com\/static\/version1790675038\/frontend\/Krish\/mrhankeytoys\/en_US\/Hyva_AlgoliaSearch\/js\/internals\/algoliaBundle.min.js","https:\/\/www.mrhankeystoys.com\/static\/version1790675038\/frontend\/Krish\/mrhankeytoys\/en_US\/Hyva_AlgoliaSearch\/js\/internals\/common.js","https:\/\/www.mrhankeystoys.com\/static\/version1790675038\/frontend\/Krish\/mrhankeytoys\/en_US\/Hyva_AlgoliaSearch\/js\/internals\/instantsearch.js"] 2266const autocompleteScripts = ["https:\/\/www.mrhankeystoys.com\/static\/version1790675038\/frontend\/Krish\/mrhankeytoys\/en_US\/Hyva_AlgoliaSearch\/js\/internals\/autocomplete-js.js","https:\/\/www.mrhankeystoys.com\/static\/version1790675038\/frontend\/Krish\/mrhankeytoys\/en_US\/Hyva_AlgoliaSearch\/js\/internals\/algoliasearch.js","https:\/\/www.mrhankeystoys.com\/static\/version1790675038\/frontend\/Krish\/mrhankeytoys\/en_US\/Hyva_AlgoliaSearch\/js\/internals\/algoliasearch-query-suggestion-plugin.js"] 2267function loadScript (url) { 2268 let script = document.createElement('script') 2269 script.setAttribute('type', 'text/javascript') 2270 script.setAttribute('src', url) 2271 document.head.append(script) 2272 2273 return new Promise((resolve) => script.addEventListener('load', resolve)) 2274} 2275 2276function loadScripts(scripts) { 2277 return Promise.all(scripts.map(loadScript)) 2278} 2279 2280let autocompleteInitialized = false 2281 2282async function initAlgoliaAutoComplete() { 2283 if (autocompleteInitialized) { 2284 return 2285 } 2286 2287 autocompleteInitialized = true 2288 2289 await loadScripts(autocompleteScripts) 2290 await loadScript('https\u003A\u002F\u002Fwww.mrhankeystoys.com\u002Fstatic\u002Fversion1790675038\u002Ffrontend\u002FKrish\u002Fmrhankeytoys\u002Fen_US\u002FHyva_AlgoliaSearch\u002Fjs\u002Finternals\u002FautocompleteConfig.js') 2291} 2292function initInstantSearch() { 2293 loadScripts(instantsearchScripts).then(() => { 2294 algoliaCommon() 2295 initAlgoliaInstantSearch() 2296 }) 2297} 2298 2299if (algoliaConfig.autocomplete.enabled) { 2300 document.getElementById('menu-search-icon').onclick = async () => { 2301 await initAlgoliaAutoComplete() 2302 // autocomplete library autoFocus configuration param doesn't work 2303 document.querySelector('#algolia-autocomplete-container input').focus() 2304 } 2305 document.getElementById('menu-search-icon').click(); 2306} 2307 2308if (algoliaConfig.instant.enabled && algoliaConfig.isSearchPage) { 2309 initInstantSearch() 2310} 2311</script>
2311 2312<div class="w-full flex justify-center"> 2313 <div class="w-full" > 2314 <div id="algolia-autocomplete-container"></div> 2315 </div> 2316</div> 2317 2318 </div> 2319 </div> 2320 <div class="flex shrink-0 gap-9 items-center min1400:min-w-[400px] lg:justify-end"> 2321 <div class="tarck-order border-r border-[#999] pr-9 hidden"> 2322 <a href="#" class="flex gap-2.5 leading-10 items-center hover:text-hoverColor transition"> 2323 <svg xmlns="http://www.w3.org/2000/svg" width="18" height="28" viewBox="0 0 18 28" fill="none" role="img"> 2324<path d="M8.75537 12.4688C10.7456 12.4688 12.3647 10.8373 12.3647 8.83201C12.3647 6.82671 10.7456 5.19531 8.75537 5.19531C6.76517 5.19531 5.146 6.82671 5.146 8.83201C5.146 10.8373 6.76517 12.4688 8.75537 12.4688ZM8.75537 6.4952C10.0342 6.4952 11.0746 7.54352 11.0746 8.83201C11.0746 10.1205 10.0343 11.1689 8.75537 11.1689C7.47649 11.1689 6.4361 10.1205 6.4361 8.83201C6.4361 7.54352 7.47653 6.4952 8.75537 6.4952Z" fill="currentColor"/> 2325<path d="M3.75777 17.0697C5.00109 18.7528 4.50158 18.0982 8.08279 23.2112C8.40829 23.6778 9.10047 23.68 9.42783 23.2119C13.0252 18.0747 12.5303 18.7253 13.7533 17.0696C14.9923 15.3922 16.2735 13.6578 16.9756 11.6253C17.9917 8.68301 17.5525 5.77183 15.7389 3.42792C15.7388 3.42792 15.7388 3.42787 15.7388 3.42787C14.0775 1.28144 11.4669 0 8.75556 0C6.0442 0 3.43364 1.28144 1.77229 3.42798C-0.0413133 5.77188 -0.480564 8.68312 0.53564 11.6254C1.23761 13.6578 2.51883 15.3923 3.75777 17.0697ZM3.0698 4.43182C4.42266 2.68395 6.5482 1.64041 8.75556 1.64041C10.9629 1.64041 13.0884 2.68395 14.4413 4.43182L14.4412 4.43177C15.905 6.32352 16.2543 8.6881 15.4248 11.0899C14.8047 12.8851 13.5993 14.517 12.4336 16.0951C11.526 17.3237 11.7977 16.9479 8.75556 21.3086C5.71662 16.9523 5.98481 17.3234 5.07749 16.0951C3.91183 14.517 2.70646 12.8851 2.08636 11.0899C1.25686 8.68804 1.60609 6.32352 3.0698 4.43182Z" fill="currentColor"/> 2326<path d="M4.43175 20.6263C4.18981 20.2434 3.68319 20.1289 3.30015 20.3709L0.967732 21.844C0.458919 22.1654 0.458427 22.9092 0.967732 23.2309L8.31773 27.8732C8.58532 28.0423 8.92635 28.0422 9.19388 27.8732L16.5439 23.2309C17.0528 22.9096 17.0532 22.1657 16.5439 21.844L14.2115 20.3709C13.8283 20.129 13.3217 20.2434 13.0799 20.6263C12.8379 21.0093 12.9523 21.5158 13.3353 21.7578L14.5698 22.5375L8.75578 26.2096L2.94179 22.5375L4.1763 21.7578C4.55933 21.5159 4.67369 21.0093 4.43175 20.6263Z" fill="currentColor"/> 2327<title>track-order</title></svg> 2328 <span class="font-semibold">Track Order</span> 2329 </a> 2330 </div> 2331 <div class="flex gap-7 items-center lg:order-2 s1023:gap-5"> 2332 2333<!-- <a href="javascript:void(0);" class="hidden s767:block mobileSearch">--> 2334<!-- <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M8.04938 16.0928C9.83702 16.0928 11.5735 15.4963 12.9838 14.3977L18.3045 19.7191C18.7019 20.103 19.3353 20.092 19.7192 19.6945C20.0936 19.3067 20.0936 18.6919 19.7192 18.3042L14.3985 12.9828C17.1243 9.47344 16.4895 4.41858 12.9807 1.69241C9.47196 -1.03376 4.41791 -0.398932 1.69215 3.11039C-1.03361 6.61971 -0.398872 11.6746 3.10992 14.4007C4.52252 15.4983 6.26058 16.
23340937 8.04938 16.0928ZM3.77429 3.77179C6.13538 1.4103 9.96347 1.41025 12.3246 3.7717C14.6857 6.13315 14.6858 9.96181 12.3247 12.3233C9.9636 14.6848 6.13551 14.6848 3.77438 12.3234C3.77434 12.3234 3.77434 12.3234 3.77429 12.3233C1.4132 9.97906 1.39929 6.16436 3.74318 3.80291C3.75354 3.79251 3.76389 3.78215 3.77429 3.77179Z" fill="#0F0F0F"/></svg>--> 2335<!-- </a>--> 2336 2337<a 2338 id="compare-link" 2339 class="relative hidden rounded p-1 hover:bg-primary/10 outline-offset-2 invisible" 2340 :class="hiddenIfEmpty" 2341 href="https://www.mrhankeystoys.com/catalog/product_compare/index/" 2342 title="Compare Products" 2343 x-data="initCompareHeader" 2344 @private-content-loaded.window="receiveCompareData" 2345 :aria-label="linkAriaLabel" 2346> 2347 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 2348 <path stroke-linecap="round" stroke-linejoin="round" d="M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3"/> 2349</svg> 2350 <span 2351 x-text="itemCount" 2352 class="absolute -top-1.5 -right-1.5 px-2 py-0.5 rounded-full bg-blue-200 text-blue-800 2353 text-xs font-semibold leading-none text-center uppercase tabular-nums" 2354 aria-hidden="true" 2355 ></span> 2356</a> 2357 2358 2359 2360 2361<a 2362 href="https://www.mrhankeystoys.com/wishlist/" 2363 class="relative hover:text-hoverColor transition md:inline-block hidden" 2364 x-data="initWishlistHeader" 2365 @private-content-loaded.window="receiveWishlistData" 2366 aria-label="My Wish List" 2367 :aria-label="linkAriaLabel" 2368> 2369 <svg xmlns="http://www.w3.org/2000/svg" width="30" height="26" viewBox="0 0 30 26" fill="none" class="s1023:w-[23px] s1023:h-5" role="img"> 2370<path d="M22.0312 0C19.4612 0 17.2274 1.18643 15.5715 3.43094C15.3588 3.71936 15.1687 4.0079 15 4.28781C14.8313 4.00784 14.6413 3.71936 14.4285 3.43094C12.7726 1.18643 10.5388 0 7.96875 0C3.20895 0 0 3.85586 0 8.58307C0 14.7525 5.81437 18.6367 14.2498 25.7261C14.467 25.9086 14.7335 26 15 26C15.2665 26 15.533 25.9087 15.7502 25.7261C24.1836 18.6386 30 14.7533 30 8.58307C30 3.85864 26.7938 0 22.0312 0ZM15 23.2821C7.2327 16.8016 2.34375 13.3672 2.34375 8.58307C2.34375 5.49244 4.27594 2.36364 7.96875 2.36364C9.77338 2.36364 11.3005 3.17915 12.5078 4.7876C13.4643 6.06202 13.8618 7.37732 13.8746 7.42034C14.0198 7.92521 14.4785 8.27273 15 8.27273C15.5223 8.27273 15.9816 7.92415 16.1261 7.41798C16.1405 7.36745 17.6206 2.36364 22.0312 2.36364C25.7241 2.36364 27.6562 5.49244 27.6562 8.58307C27.6562 13.3719 22.7426 16.8225 15 23.2821Z" fill="currentColor"/> 2371<title>wishlistIcon</title></svg> 2372 <template x-if="itemCount"> 2373 <span 2374 x-text="itemCount" 2375 class="absolute -top-2.5 -right-2.5 w-[22px] h-[22px] rounded-full bg-baseColor text-white text-xs font-medium leading-none text-center uppercase tabular-nums flex justify-center items-center" 2376 aria-hidden="true" 2377 ></span> 2378 </template> 2379</a> 2380 2381 <!-- BLOCK header.customer --> 2382<div 2383 class="relative inline-block" 2384 x-data="initCustomerMenu" 2385 @private-content-loaded.window="receiveCustomerData($event.detail.data)" 2386 @keyup.escape="setOpenFalse" 2387 @click.outside="setOpenFalse" 2388> 2389 <button 2390 type="button" 2391 id="customer-menu" 2392 class="block hover:text-hoverColor transition" 2393 @click="toggleOpen" 2394 :aria-expanded="ariaExpanded" 2395 aria-label="My Account" 2396 aria-haspopup="true" 2397 > 2398 <svg xmlns="http://www.w3.org/2000/svg" width="28" height="30" viewBox="0 0 28 30" fill="none" class="s1023:w-[22px] s1023:h-6" role="img"> 2399<path d="M14 16.1538C15.5962 16.1538 17.1566 15.6801 18.4838 14.7926C19.811 13.9051 20.8454 12.6437 21.4563 11.1678C22.0671 9.69194 22.2269 8.06794 21.9155 6.50118C21.6041 4.93441 20.8355 3.49525 19.7068 2.36567C18.5781 1.2361 17.14 0.466848 15.5745 0.155199C14.0089 -0.15645 12.3862 0.00349956 10.9115 0.614821C9.43679 1.22614 8.17633 2.26138 7.28952 3.58962C6.40271 4.91786 5.92937 6.47944 5.92937 8.0769C5.92937 10.219 6.77967 12.2734 8.2932 13.7881C9.80674 15.3028 11.8595 16.1538 14 16.1538ZM14 2.30769C15.1401 2.30769 16.2547 2.64605 17.2027 3.27998C18.1507 3.91391 18.8896 4.81493 19.3259 5.86912C19.7622 6.92331 19.8764 8.0833 19.6539 9.20242C19.4315 10.3215 18.8825 11.3495 18.0763 12.1564C17.2701 12.9632 16.2429 13.5127 15.1246 13.7353C14.0064 13.9579 12.8473 13.8436 11.7939 13.407C10.7406 12.9703 9.84023 12.2309 9.20679 11.2821C8.57336 10.3334 8.23526 9.21795 8.23526 8.0769C8.23526 6.54681 8.84262 5.07939 9.92371 3.99745C11.0048 2.91552 12.4711 2.30769 14 2.30769ZM27.8353 24.5999C27.2004 22.3906 25.867 20.4468 24.035 19.0599C22.203 17.6731 19.9711 16.9179 17.674 16.9076H10.3413C8.04487 16.9204 5.8142 17.6765 3.98268 19.063C2.15117 20.4495 0.817158 22.3919 0.18002 24.5999H0.164647C-0.0162512 25.2295 -0.0485994 25.8925 0.0701512 26.5367C0.188902 27.1809 0.455507 27.7887 0.848962 28.3122C1.24242 28.8358 1.75197 29.2607 2.33748 29.5536C2.92299 29.8464 3.56845 29.9992 4.22301 29.9999H23.7462C24.4034 30.004 25.0524 29.8547 25.6419 29.5639
2399C26.2313 29.2731 26.7449 28.8487 27.1418 28.3246C27.5387 27.8004 27.8081 27.1908 27.9285 26.5443C28.0489 25.8977 28.017 25.232 27.8353 24.5999ZM25.3142 26.923C25.1352 27.1618 24.9031 27.3557 24.6363 27.4892C24.3695 27.6227 24.0753 27.6922 23.777 27.6922H4.23839C3.9418 27.6915 3.64939 27.6222 3.38406 27.4895C3.11873 27.3569 2.88769 27.1646 2.70902 26.9276C2.53035 26.6907 2.40891 26.4156 2.3542 26.1239C2.29949 25.8322 2.313 25.5317 2.39367 25.2461C2.89223 23.5205 3.93618 22.0032 5.36904 20.9215C6.8019 19.8397 8.54649 19.2519 10.3413 19.2461H17.6587C19.4561 19.2504 21.2034 19.8395 22.637 20.9245C24.0706 22.0096 25.1128 23.5318 25.6063 25.2615C25.686 25.5434 25.6997 25.84 25.6464 26.1282C25.5931 26.4163 25.4742 26.6883 25.2989 26.923H25.3142Z" fill="currentColor"/> 2400<title>userIcon</title></svg> 2401 </button> 2402 <nav 2403 class="z-30 absolute -right-4 w-48 sm:w-56 mt-5 p-5 overflow-auto shadow-[0_0_10px_rgba(0,0,0,0.2)] bg-container-lighter [&_a]:uppercase [&_a]:font-semibold [&_a]:text-sm [&_a]:p-0 [&_a:hover]:bg-transparent flex flex-col gap-4 [&_.delimiter]:hidden [&_.signIn]:py-2.5 [&_.signIn:hover]:bg-black [&_.signIn:hover]:text-white [&_a:hover]:text-hoverColor s767:text-center" 2404 x-cloak 2405 x-show="open" 2406 x-transition 2407 aria-labelledby="customer-menu" 2408 > 2409 <div x-show="isLoggedIn()" class="flex flex-col gap-4"> 2410 2411 <a id="customer.header.dashboard.link" 2412 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" 2413 href="https://www.mrhankeystoys.com/customer/account/" 2414 title="My Account" 2415 > 2416 My Account </a> 2417 2418<a 2419 id="customer.header.wishlist.link" 2420 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100 relative" 2421 href="https://www.mrhankeystoys.com/wishlist/" 2422 title="My Wish List" 2423 x-data="{ itemCount: 0 }" 2424 @private-content-loaded.window="itemCount = parseInt($event.detail.data.wishlist.counter)" 2425> 2426 My Wish List <template x-if="itemCount"> 2427 <span class="tabular-nums" x-text="`(${itemCount})`"></span> 2428 </template> 2429</a> 2430 2431<a 2432 id="catalog.compare.link.logged.in" 2433 class="hidden" 2434 href="https://www.mrhankeystoys.com/catalog/product_compare/index/" 2435 title="Compare Products" 2436 x-data="initCompareHeader" 2437 @private-content-loaded.window="receiveCompareData" 2438> 2439 Compare Products <template x-if="itemCount"> 2440 <span class="tabular-nums" x-text="itemCountLabel"></span> 2441 </template> 2442</a> 2443 2444 <a id="customer.header.address.book.link" 2445 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" 2446 href="https://www.mrhankeystoys.com/customer/address/" 2447 title="Address Book" 2448 > 2449 Address Book </a> 2450 2451<span id="customer.header.sign.out.delimiter" 2452 class="delimiter block border-b border-container w-full my-2" 2453></span> 2454 2455 <a id="customer.header.sign.out.link" 2456 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" 2457 href="https://www.mrhankeystoys.com/customer/account/logout/" 2458 title="Sign Out" 2459 > 2460 Sign Out </a> 2461 </div> 2462 <div x-show="!isLoggedIn()" class="flex flex-col gap-4"> 2463 2464<a 2465 id="catalog.compare.link.logged.out" 2466 class="hidden" 2467 href="https://www.mrhankeystoys.com/catalog/product_compare/index/" 2468 title="Compare Products" 2469 x-data="initCompareHeader" 2470 @private-content-loaded.window="receiveCompareData" 2471> 2472 Compare Products <template x-if="itemCount"> 2473 <span class="tabular-nums" x-text="itemCountLabel"></span> 2474 </template> 2475</a> 2476 2477<a id="customer.header.sign.in.link" 2478 class="white-btn font-bold rounded-md border-2 text-center signIn" 2479 onclick="hyva.setCookie && hyva.setCookie( 2480 'login_redirect', 2481 window.location.href, 2482 1 2483 )" 2484 href="https://www.mrhankeystoys.com/customer/account/index/" 2485 title="Sign In" 2486> 2487 Sign In</a> 2488 2489 <a id="customer.header.register.link" 2490 class="" 2491 href="https://www.mrhankeystoys.com/customer/account/create/" 2492 title="Create an Account" 2493 > 2494 Create an Account </a> 2495 </div> 2496 </nav> 2497</div>
2498<script> 2499 function initCustomerMenu() { 2500 return hyva.createBooleanObject('open', false, { 2501 customer: {}, 2502 ariaExpanded() { 2503 return this.open() ? 'true' : 'false'; 2504 }, 2505 receiveCustomerData(data) { 2506 this.customer = data.customer || {}; 2507 }, 2508 isLoggedIn() { 2509 return !!this.customer.firstname; 2510 } 2511 }) 2512 } 2513 window.addEventListener('alpine:init', () => Alpine.data('initCustomerMenu', initCustomerMenu), {once: true}) 2514</script>
2514 2515<!-- /BLOCK header.customer --> 2516 <button 2517 id="menu-cart-icon" 2518 class="relative" 2519 x-ref="cartButton group" 2520 :aria-disabled="isCartEmpty" 2521 :aria-label="ariaLabel" 2522 @click.prevent="openCart" 2523 @toggle-cart.window="toggleCart" 2524 :aria-expanded="isCartOpen" 2525 aria-haspopup="dialog" 2526 > 2527 <svg xmlns="http://www.w3.org/2000/svg" width="28" height="30" viewBox="0 0 28 30" fill="none" class="fill-baseColor hover:fill-hoverColor transition s1023:w-[22px] s1023:h-6" role="img"> 2528<path d="M13.8452 0C16.93 0 19.4924 2.32193 19.9897 5.35742H22.1313C23.6759 5.35742 24.9716 6.49795 25.2123 8.06934L27.6274 23.8057C27.8648 25.3556 27.434 26.9289 26.4448 28.1221C25.456 29.3153 24.0154 29.9999 22.4926 30H5.19868C3.67584 29.9999 2.23536 29.3153 1.24653 28.1221C0.257284 26.9288 -0.173546 25.3556 0.0639096 23.8057L2.47895 8.07031C2.71957 6.49822 4.01525 5.35742 5.56 5.35742H7.7016C8.19888 2.32207 10.7605 0.000222374 13.8452 0ZM5.56 7.5C5.04532 7.5 4.61295 7.8802 4.53266 8.4043L2.11762 24.1396C1.97497 25.0698 2.23364 26.0143 2.82758 26.7305C3.42095 27.4464 4.28514 27.8573 5.19868 27.8574H22.4926C23.4061 27.8573 24.2704 27.4464 24.8637 26.7305C25.4577 26.0143 25.7163 25.0698 25.5737 24.1396L23.1586 8.4043C23.0784 7.88062 22.646 7.5 22.1313 7.5H5.56ZM19.7114 10.3848C20.2953 10.385 20.769 10.828 20.769 11.374C20.7688 14.6461 17.9216 17.3076 14.4223 17.3076C10.9232 17.3075 8.07684 14.646 8.0766 11.374C8.0766 10.8278 8.55013 10.3848 9.13422 10.3848C9.71831 10.3848 10.1918 10.8278 10.1918 11.374C10.1921 13.5551 12.0898 15.3299 14.4223 15.3301C16.7549 15.3301 18.6535 13.5552 18.6538 11.374C18.6538 10.8278 19.1273 10.3848 19.7114 10.3848ZM13.8452 2.14258C11.9134 2.14279 10.2994 3.51441 9.83442 5.35742H17.8569C17.3919 3.51427 15.7771 2.14258 13.8452 2.14258Z"/> 2529<title>ShoppingBagIcon</title></svg> 2530 <span 2531 x-text="summaryCount" 2532 x-show="summaryCount" 2533 x-cloak 2534 class="absolute -top-2.5 -right-2.5 w-[22px] h-[22px] rounded-full bg-baseColor text-white 2535 text-xs font-medium leading-none text-center uppercase tabular-nums flex justify-center items-center" 2536 aria-hidden="true" 2537 ></span> 2538 </button> 2539 </div> 2540 </div> 2541 </div> 2542 2543 <div class="bg-white hidden lg:block"> 2544 <div class="container"> 2545 2546<nav 2547 class="navigation hidden min1200:block justify-center border-b border-[#666]" 2548 aria-label="Main menu" 2549 x-data="initMenuDesktop" 2550 x-ref="nav-desktop" 2551 @load.window="setActiveMenu" 2552> 2553 <ul class="flex flex-wrap gap-x-2.5 justify-center"> 2554 <li class="level-0 px-8 relative group s1400:px-6"> 2555 <a 2556 href="/all" 2557 class="button level-0 group w-full flex justify-between items-center gap-1.5 pb-5 border-b-[3px] border-transparent group-hover:border-hoverColor text-baseColor group-hover:text-hoverColor font-semibold" 2558 > 2559 All Categories <svg class="transition group-hover:rotate-180" xmlns="http://www.w3.org/2000/svg" width="9" height="7" viewBox="0 0 9 7" fill="none"><path d="M5.13918 6.25072C4.7434 6.84483 3.87048 6.84483 3.4747 6.25072L0.346151 1.55441C-0.0965723 0.889837 0.379852 7.20878e-08 1.17839 1.44691e-07L7.43549 7.13585e-07C8.23404 7.86188e-07 8.71046 0.88984 8.26773 1.55442L5.13918 6.25072Z" fill="#666666"/></svg> 2560 </a> 2561 <div class="opacity-0 invisible group-hover:opacity-100 group-hover:visible"> 2562 <div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="all-cat-menu"> 2563 <div class="top-part"> 2564 <div class="first"> 2565 <ul> 2566 <li><a href="/realistic">Realistic Dildos</a></li> 2567 <li><a href="/fantasy-and-sci-fi">Fantasy Dildos</a></li> 2568 <li><a href="/accessories">Play Gear</a></li> 2569 <!-- <li><a href="/shop">Shop by Size</a></li> --> 2570 <li><a href="/all">Shop All</a></li> 2571 </ul> 2572 </div> 2573 <div class="second"> 2574 <div class="products"> 2575 <div class="product"> 2576 <div class="image"><a href="https://www.mrhankeystoys.com/realistic/lifecast"><img 2577 src="https://www.mrhankeystoys.com/media/wysiwyg/hankeys-toys-wade-wolfgar-dildo-natural-tan-side-angle-primary-thumbn
2577ail.jpg" 2578 alt="Shop Lifecast Dildos" /></a></div> 2579 <p><a href="https://www.mrhankeystoys.com/realistic/lifecast">Lifecast Dildos</a></p> 2580 </div> 2581 <div class="product"> 2582 <div class="image"> 2583 <a href="https://www.mrhankeystoys.com/realistic/small-dildos"><img 2584 src="https://www.mrhankeystoys.com/media/wysiwyg/xtra-small-dildo-series-iii-9-pack-mixed-colors-front-primary-thumbnail.jpg" 2585 alt="Shop Small Dildos" /></a> 2586 </div> 2587 <p><a href="https://www.mrhankeystoys.com/realistic/small-dildos">Small Dildos</a></p> 2588 </div> 2589 <div class="product"> 2590 <div class="image"><a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/dragon-dildos"><img 2591 src="https://www.mrhankeystoys.com/media/wysiwyg/hankeys-toys-dildos-dragons-fantasy-dildo-metallic-blood-red-front-view-primary-thumbnail.jpg" 2592 alt="Shop Dragon Dildos" /></a></div> 2593 <p><a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/dragon-dildos">Dragon Dildos</a></p> 2594 </div> 2595 <div class="product"> 2596 <div class="image"><a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/horse-dildos"><img 2597 src="https://www.mrhankeystoys.com/media/wysiwyg/hankeys-toys-horse-ii-fantasy-dildo-black-side-horizontal-view-primary-thumbnail.jpg" 2598 alt="Shop Horse Dildos" /></a></div> 2599 <p><a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/horse-dildos">Horse Dildos</a></p> 2600 </div> 2601 </div> 2602 </div> 2603 <div class="third"> 2604<a href="/promo-offers"> 2605 <div class="promo" style="background:url('https://www.mrhankeystoys.com/media/wysiwyg/menu-promo.jpg')"> 2606 <h3>Help spread the word, <br />get a FREE toy!</h3> 2607 <span class="hover-with-arrow">Know More <svg width="10" height="13" viewBox="0 0 10 13" 2608 fill="none" xmlns="http://www.w3.org/2000/svg"> 2609 <path 2610 d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" 2611 fill="#fff"></path> 2612 </svg></span> 2613 </div> 2614</a> 2615 </div> 2616 </div> 2617 2618<section class="relative container brand-slider" style="--size: clamp(10rem, 1rem + 40vmin, 30rem); --gap: calc(var(--size) / 14); --duration: 40s;" aria-label="Our favorite brands"> 2619<div class="bs-content after:content-[''] after:bg-[linear-gradient(90deg,_rgba(183,_94,_41,_0.20)_15.38%,_#B75E29_50%,_rgba(183,_94,_41,_0.20)_85.1%)] after:h-[1px] after:w-full after:absolute after:bottom-0 after:left-0 relative pb-10 pt-8 s1400:py-12 s767:pt-6 s767:pb-10"> 2620 <div class="inner-title">As Featured On</div> 2621 <div class="swiper-container swiper--top-menu"> 2622 <div class="swiper-wrapper"> 2623 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 2624 <img src="https://www.mrhankeystoys.com/media/wysiwyg/brands/attitude.png" alt="attitude" width="118" height="30" loading="lazy"> 2625 </div> 2626 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 2627 <img src="https://www.mrhankeystoys.com/media/wysiwyg/brands/avn.png" alt="attitude" width="63" height="45" loading="lazy"> 2628 </div> 2629 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 2630 <img src="https://www.mrhankeystoys.com/media/wysiwyg/brands/clav.png" alt="attitude" width="106" height="40" loading="lazy"> 2631 </div> 2632 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 2633 <img src="https://www.mrhankeystoys.com/media/wysiwyg/brands/folsom.png" alt="attitude" width="75" height="34" loading="lazy"> 2634 </div> 2635 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 2636 <img src="https://www.mrhankeystoys.com/media/wysiwyg/brands/iheart.png" alt="attitude" width="111" height="30" loading="lazy"> 2637 </div> 2638 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 2639 <img src="https://www.mrhankeystoys.com/media/wysiwyg/brands/laweekly.png" alt="attitude" width="117" height="30" loading="lazy"> 2640 </div> 2641 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 2642 <img src="https://www.mrhankeystoys.com/media/wysiwyg/brands/out.png" alt="attitude" width="89" height="28" loading="lazy"> 2643 </div> 2644 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 2645 <img src="https://www.mrhankeystoys.com/media/wysiwyg/brands/recon.png" alt="attitude" width="133" height="45" loading="lazy"> 2646 </div> 2647 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 2648 <img src="https://www.mrhankeystoys.com/media/wysiwyg/brands/vice.png" alt="attitude" width="95" height="30" loading="lazy"> 2649 </div> 2650 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 2651 <img src="https://www.mrhankeystoys.com/media/wysiwyg/brands/xbiz.png" alt="attitude" width="90" height="45" loading="lazy"> 2652 </div> 2653 </div> 2654 </div> 2655</div> 2656</section> 2657 2658 2659<style> 2660 .swiper--top-menu { overflow:hidden; } 2661 2662 .swiper--top-menu .swiper-wrapper { -webkit-transition-timing-function: linear !important; transition-timing-function: linear !important; position: relative; } 2663</style>
2664<script> 2665 var SwiperMenu = new Swiper('.navigation .swiper--top-menu', { 2666 spaceBetween: 0, 2667 centeredSlides: true, 2668 speed: 3500, 2669 autoplay: { 2670 delay: 1, 2671 }, 2672 loop: true, 2673 slidesPerView:'auto', 2674 allowTouchMove: false, 2675 disableOnInteraction: true 2676 }); 2677</script>
2677 2678 2679</div></div> </div> 2680 </li> 2681 <li 2682 class="level-0 px-8 relative s1400:px-6" 2683 x-data="initMenuDesktopItem" 2684 @click.outside="close" 2685 @keydown.escape="close" 2686 @mouseenter="canHoverOpen" 2687 @mouseleave="canHoverClose" 2688 > 2689 <a href="https://www.mrhankeystoys.com/realistic" 2690 type="button" 2691 class="level-0 group w-full flex justify-between items-center gap-1.5 pb-5 border-b-[3px] border-transparent hover:border-hoverColor transition aria-expanded:text-hoverColor aria-expanded:border-hoverColor data-[has-current]:aria-expanded:border-hoverColor data-[has-current]:border-hoverColor data-[has-current]:hover:border-hoverColor text-baseColor font-semibold data-[has-current]:text-hoverColor data-[has-current]:aria-expanded:text-hoverColor" 2692 @click="toggle" 2693 aria-expanded="false" 2694 :aria-expanded="open" 2695 aria-controls="desktop-menu-category-3" 2696 > 2697 Realistic Dildos <svg class="transition group-aria-expanded:rotate-180 group-aria-expanded:text-inherit" xmlns="http://www.w3.org/2000/svg" width="9" height="7" viewBox="0 0 9 7" fill="none"><path d="M5.13918 6.25072C4.7434 6.84483 3.87048 6.84483 3.4747 6.25072L0.346151 1.55441C-0.0965723 0.889837 0.379852 7.20878e-08 1.17839 1.44691e-07L7.43549 7.13585e-07C8.23404 7.86188e-07 8.71046 0.88984 8.26773 1.55442L5.13918 6.25072Z" fill="#666666"/></svg> 2698 </a> 2699 <div 2700 id="desktop-menu-category-3" 2701 class="z-30 absolute inset-x-0 flex p-7 bg-white overflow-auto w-[280px] shadow-[0_10px_20px_rgba(0,0,0,0.10)]" 2702 x-show="open" 2703 x-transition 2704 x-cloak 2705 > 2706 <div class="grow flex flex-col justify-between"> 2707 <ul class="border-b border-[#f4f4f4]"> 2708 <li class="border-t border-[#f4f4f4]"> 2709 <a 2710 href="https://www.mrhankeystoys.com/realistic/small-dildos" 2711 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2712 >XS/Small Dildos</a> 2713 </li> 2714 <li class="border-t border-[#f4f4f4]"> 2715 <a 2716 href="https://www.mrhankeystoys.com/realistic/huge-dildos" 2717 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2718 >Huge Dildos</a> 2719 </li> 2720 <li class="border-t border-[#f4f4f4]"> 2721 <a 2722 href="https://www.mrhankeystoys.com/realistic/uncircumcised-dildos" 2723 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2724 >Uncut Dildos</a> 2725 </li> 2726 <li class="border-t border-[#f4f4f4]"> 2727 <a 2728 href="https://www.mrhankeystoys.com/realistic/bbc-dildos" 2729 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2730 >BBC Dildos</a> 2731 </li> 2732 <li class="border-t border-[#f4f4f4]"> 2733 <a 2734 href="https://www.mrhankeystoys.com/realistic/lifecast" 2735 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2736 >Lifecast Dildos</a> 2737 </li> 2738 <li class="border-t border-[#f4f4f4]"> 2739 <a 2740 href="https://www.mrhankeystoys.com/realistic/pornstar-dildos" 2741 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2742 >Pornstar Dildos</a> 2743 </li> 2744 <li class="border-t border-[#f4f4f4]"> 2745 <a 2746 href="https://www.mrhankeystoys.com/realistic/hybrid-dildos" 2747 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2748 >Hybrid Dildos</a> 2749 </li> 2750 <li class="border-t border-[#f4f4f4]"> 2751 <a 2752 href="https://www.mrhankeystoys.com/realistic/anal-trainers" 2753 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2754 >Anal Trainers</a> 2755 </li> 2756 <li class="border-t border-[#f4f4f4]"> 2757 <a 2758 href="https://www.mrhankeystoys.com/realistic" 2759 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2760 >Shop All Realistic Dildos</a> 2761 </li> 2762 </ul> 2763 </div> 2764 </div> 2765 </li> 2766 <li 2767 class="level-0 px-8 relative s1400:px-6" 2768 x-data="initMenuDesktopItem" 2769 @click.outside="close" 2770 @keydown.escape="close" 2771 @mouseenter="canHoverOpen" 2772 @mouseleave="canHoverClose" 2773 > 2774 <a href="https://www.mrhankeystoys.com/fantasy-and-sci-fi" 2775 type="button" 2776 class="level-0 group w-full flex justify-between items-center gap-1.5 pb-5 border-b-[3px] border-transparent hover:border-hoverColor transition aria-expanded:text-hoverColor aria-expanded:border-hoverColor data-[has-current]:aria-expanded:border-hoverColor data-[has-current]:border-hoverColor data-[has-current]:hover:border-hoverColor text-baseColor font-semibold data-[has-current]:text-hoverColor data-[has-current]:aria-expanded:text-hoverColor" 2777 @click="toggle" 2778 aria-expanded="false" 2779 :aria-expanded="open" 2780 aria-controls="desktop-menu-category-4" 2781 > 2782 Fantasy Dildos <svg class="transition group-aria-expanded:rotate-180 group-aria-expanded:text-inherit" xmlns="http://www.w3.org/2000/svg" width="9" height="7" viewB
2782ox="0 0 9 7" fill="none"><path d="M5.13918 6.25072C4.7434 6.84483 3.87048 6.84483 3.4747 6.25072L0.346151 1.55441C-0.0965723 0.889837 0.379852 7.20878e-08 1.17839 1.44691e-07L7.43549 7.13585e-07C8.23404 7.86188e-07 8.71046 0.88984 8.26773 1.55442L5.13918 6.25072Z" fill="#666666"/></svg> 2783 </a> 2784 <div 2785 id="desktop-menu-category-4" 2786 class="z-30 absolute inset-x-0 flex p-7 bg-white overflow-auto w-[280px] shadow-[0_10px_20px_rgba(0,0,0,0.10)]" 2787 x-show="open" 2788 x-transition 2789 x-cloak 2790 > 2791 <div class="grow flex flex-col justify-between"> 2792 <ul class="border-b border-[#f4f4f4]"> 2793 <li class="border-t border-[#f4f4f4]"> 2794 <a 2795 href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/small-dildos" 2796 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2797 >XS/Small Dildos</a> 2798 </li> 2799 <li class="border-t border-[#f4f4f4]"> 2800 <a 2801 href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/huge-dildos" 2802 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2803 >Huge Dildos</a> 2804 </li> 2805 <li class="border-t border-[#f4f4f4]"> 2806 <a 2807 href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/mythical-creatures" 2808 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2809 >Mythical Creatures</a> 2810 </li> 2811 <li class="border-t border-[#f4f4f4]"> 2812 <a 2813 href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/dragon-dildos" 2814 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2815 >Dragon Dildos</a> 2816 </li> 2817 <li class="border-t border-[#f4f4f4]"> 2818 <a 2819 href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/dog-dildos" 2820 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2821 >Dog Dildos</a> 2822 </li> 2823 <li class="border-t border-[#f4f4f4]"> 2824 <a 2825 href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/horse-dildos" 2826 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2827 >Horse Dildos</a> 2828 </li> 2829 <li class="border-t border-[#f4f4f4]"> 2830 <a 2831 href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/alien-dildos" 2832 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2833 >Alien Dildos</a> 2834 </li> 2835 <li class="border-t border-[#f4f4f4]"> 2836 <a 2837 href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/hentai-dildos" 2838 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2839 >Hentai Dildos</a> 2840 </li> 2841 <li class="border-t border-[#f4f4f4]"> 2842 <a 2843 href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/tentacle-dildos" 2844 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2845 >Tentacle Dildos</a> 2846 </li> 2847 <li class="border-t border-[#f4f4f4]"> 2848 <a 2849 href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/anal-trainers" 2850 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2851 >Anal Trainers</a> 2852 </li> 2853 <li class="border-t border-[#f4f4f4]"> 2854 <a 2855 href="https://www.mrhankeystoys.com/fantasy-and-sci-fi/monster-dildos" 2856 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2857 >Monster Dildos</a> 2858 </li> 2859 <li class="border-t border-[#f4f4f4]"> 2860 <a 2861 href="https://www.mrhankeystoys.com/fantasy-and-sci-fi" 2862 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2863 >Shop All Fantasy Dildos</a> 2864 </li> 2865 </ul> 2866 </div> 2867 </div> 2868 </li> 2869 <li 2870 class="level-0 px-8 relative s1400:px-6" 2871 x-data="initMenuDesktopItem" 2872 @click.outside="close" 2873 @keydown.escape="close" 2874 @mouseenter="canHoverOpen" 2875 @mouseleave="canHoverClose" 2876 > 2877 <a href="https://www.mrhankeystoys.com/accessories" 2878 type="button" 2879 class="level-0 group w-full flex justify-between items-center gap-1.5 pb-5 border-b-[3px] border-transparent hover:border-hoverColor transition aria-expanded:text-hoverColor aria-expanded:border-hoverColor data-[has-current]:aria-expanded:border-hoverColor data-[has-current]:border-hoverColor data-[has-current]:hover:border-hoverColor text-baseColor font-semibold data-[has-current]:text-hoverColor data-[has-current]:aria-expanded:text-hoverColor" 2880 @click="toggle" 2881 aria-expanded="false" 2882 :aria-expanded="open" 2883 aria-controls="desktop-menu-category-5" 2884 > 2885 Play Gear <svg class="transition group-aria-expanded:rotate-180 group-aria-expanded:text-inherit" xmlns="http://www.w3.org/2000/svg" width="9" height="7" viewB
2885ox="0 0 9 7" fill="none"><path d="M5.13918 6.25072C4.7434 6.84483 3.87048 6.84483 3.4747 6.25072L0.346151 1.55441C-0.0965723 0.889837 0.379852 7.20878e-08 1.17839 1.44691e-07L7.43549 7.13585e-07C8.23404 7.86188e-07 8.71046 0.88984 8.26773 1.55442L5.13918 6.25072Z" fill="#666666"/></svg> 2886 </a> 2887 <div 2888 id="desktop-menu-category-5" 2889 class="z-30 absolute inset-x-0 flex p-7 bg-white overflow-auto w-[280px] shadow-[0_10px_20px_rgba(0,0,0,0.10)]" 2890 x-show="open" 2891 x-transition 2892 x-cloak 2893 > 2894 <div class="grow flex flex-col justify-between"> 2895 <ul class="border-b border-[#f4f4f4]"> 2896 <li class="border-t border-[#f4f4f4]"> 2897 <a 2898 href="https://www.mrhankeystoys.com/accessories/suction-cups" 2899 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2900 >Suction Cups</a> 2901 </li> 2902 <li class="border-t border-[#f4f4f4]"> 2903 <a 2904 href="https://www.mrhankeystoys.com/accessories/lubricants" 2905 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2906 >Lubricants</a> 2907 </li> 2908 <li class="border-t border-[#f4f4f4]"> 2909 <a 2910 href="https://www.mrhankeystoys.com/accessories/strap-on-harnesses" 2911 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2912 >Strap On Harnesses</a> 2913 </li> 2914 <li class="border-t border-[#f4f4f4]"> 2915 <a 2916 href="https://www.mrhankeystoys.com/accessories/customizations" 2917 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2918 >Custom Colors/Firmness</a> 2919 </li> 2920 <li class="border-t border-[#f4f4f4]"> 2921 <a 2922 href="https://www.mrhankeystoys.com/accessories" 2923 class="level-1 block p-4 font-medium aria-[current=page]:underline aria-[current=page]:text-hoverColor hover:text-hoverColor" 2924 >Shop All Play Gear</a> 2925 </li> 2926 </ul> 2927 </div> 2928 </div> 2929 </li> 2930 <li class="level-0 px-8 relative s1400:px-6"> 2931 <a href="/promo-offers" class="level-0 w-full pb-5 border-b-[3px] border-transparent hover:border-hoverColor text-baseColor hover:text-hoverColor font-semibold inline-block align-top">Sales & Offers</a> 2932 </li> 2933 <li class="level-0 px-8 relative s1400:px-6"> 2934 <a class="level-0 w-full pb-5 border-b-[3px] border-transparent hover:border-hoverColor text-baseColor hover:text-hoverColor font-semibold inline-block align-top" href="/usage-and-safety">Usage & Safety</a> 2935 </li> 2936 <li class="level-0 px-8 relative s1400:px-6"> 2937 <a class="level-0 w-full pb-5 border-b-[3px] border-transparent hover:border-hoverColor text-baseColor hover:text-hoverColor font-semibold inline-block align-top" href="/faq">FAQs</a> 2938 </li> 2939 <li class="level-0 px-8 relative s1400:px-6"> 2940 <a class="level-0 w-full pb-5 border-b-[3px] border-transparent hover:border-hoverColor text-baseColor hover:text-hoverColor font-semibold inline-block align-top" href="/contact-us">Contact Us</a> 2941 </li> 2942 </ul> 2943</nav>
2944<script> 2945 function initMenuDesktop() { 2946 return { 2947 setActiveMenu() { 2948 Array.from(this.$root.querySelectorAll('a')) 2949 .filter(link => link.href === window.location.href.split('?')[0]) 2950 .forEach(item => { 2951 item.setAttribute('aria-current', 'page'); 2952 2953 for (let level = 0; level < 3; level++) { 2954 const closestMenu = item.closest(`.level-${level}`); 2955 2956 if (closestMenu) { 2957 const button = closestMenu.querySelector('button'); 2958 if (button) { 2959 button.setAttribute('data-has-current', ''); 2960 } 2961 } 2962 } 2963 } 2964 ); 2965 } 2966 } 2967 } 2968 2969 function initMenuDesktopItem() { 2970 return { 2971 open: false, 2972 canHover(func) { 2973 return window.matchMedia('(hover: hover) and (pointer: fine)').matches; 2974 }, 2975 canHoverOpen() { 2976 if (!this.canHover()) return; 2977 this.open = true; 2978 }, 2979 canHoverClose() { 2980 if (!this.canHover()) return; 2981 this.open = false; 2982 }, 2983 toggle() { 2984 this.open = !this.open; 2985 }, 2986 close() { 2987 this.open = false; 2988 } 2989 } 2990 } 2991 2992 window.addEventListener('alpine:init', () => { 2993 Alpine.data('initMenuDesktop', initMenuDesktop); 2994 Alpine.data('initMenuDesktopItem', initMenuDesktopItem); 2995 }, { once: true }) 2996</script>
2996 2997 </div> 2998 </div> 2999 3000
3001<script> 3002 function initCartDrawer() { 3003 return { 3004 open: false, 3005 isLoading: false, 3006 checkoutLoading: false, 3007 cart: {}, 3008 afterpayObserver: null, 3009 maxItemsToDisplay: 10, 3010 itemsCount: 0, 3011 showSku: true, 3012 init() { 3013 this.initAfterpayObserver(); 3014 this.$nextTick(() => this.syncMiniCartAfterpayVisibility()); 3015 }, 3016 getData(data) { 3017 if (data.cart) { 3018 this.cart = data.cart; 3019 this.itemsCount = data.cart.items && data.cart.items.length || 0; 3020 this.setCartItems(); 3021 this.$nextTick(() => this.syncMiniCartAfterpayVisibility()); 3022 } 3023 this.isLoading = false; 3024 }, 3025 cartItems: [], 3026 getItemCountTitle() { 3027 return this.itemsCount === 1 3028 ? hyva.str('\u0028\u00251\u0020Item\u0029', this.itemsCount) 3029 : hyva.str('\u0028\u00251\u0020Items\u0029', this.itemsCount) 3030 }, 3031 setCartItems() { 3032 this.cartItems = this.cart.items && this.cart.items.sort((a, b) => b.item_id - a.item_id) || []; 3033 3034 if (this.maxItemsToDisplay > 0) { 3035 this.cartItems = this.cartItems.slice(0, parseInt(this.maxItemsToDisplay, 10)); 3036 } 3037 }, 3038 updateItemQty(form) { 3039 if (!form.action) return; 3040 this.isLoading = true; 3041 const action = form.action; 3042 const formData = new FormData(form); 3043 formData.append('form_key', hyva.getFormKey()); 3044 3045 if (!formData.uenc) { 3046 formData.append('uenc', hyva.getUenc()); 3047 } 3048 3049 fetch(action, { 3050 body: formData, 3051 method: 'POST', 3052 mode: "cors", 3053 credentials: "include" 3054 }).then((result) => { 3055 return result.text() 3056 }).then((content) => { 3057 hyva.replaceDomElement('#maincontent', content); 3058 }).catch((error) => { 3059 window.dispatchMessages && window.dispatchMessages([{ 3060 type: 'error', 3061 text: 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again.' 3062 }]); 3063 }).finally(() => { 3064 this.isLoading = false; 3065 }) 3066 }, 3067 deleteItemFromCart(itemId) { 3068 this.isLoading = true; 3069 3070 const formKey = hyva.getFormKey(); 3071 const postUrl = BASE_URL + 'checkout/sidebar/removeItem/'; 3072 3073 fetch(postUrl, { 3074 headers: { 3075 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 3076 }, 3077 body: "form_key=" + formKey + "&item_id=" + itemId, 3078 method: "POST", 3079 mode: "cors", 3080 credentials: "include" 3081 }).then(response => { 3082 if (response.redirected) { 3083 window.location.href = response.url; 3084 } else if (response.ok) { 3085 return response.json(); 3086 } else { 3087 window.dispatchMessages && window.dispatchMessages([{ 3088 type: 'warning', 3089 text: 'Could\u0020not\u0020remove\u0020item\u0020from\u0020quote.' 3090 }]); 3091 this.isLoading = false; 3092 } 3093 }).then(result => { 3094 window.dispatchMessages && window.dispatchMessages([{ 3095 type: result.success ? 'success' : 'error', 3096 text: result.success 3097 ? 'You\u0020removed\u0020the\u0020item.' 3098 : result.error_message 3099 }], result.success ? 5000 : 0) 3100 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 3101 }); 3102 }, 3103 scrollLock(use = true) { 3104 document.documentElement.style.scrollbarGutter = use ? "stable" : ""; 3105 document.body.style.overflow = use ? "hidden" : ""; 3106 }, 3107 toggleCartDrawer(event) { 3108 if (event.detail.isOpen) { 3109 this.open = event.detail.isOpen; 3110 } else { 3111 this.open = !this.open; 3112 } 3113 3114 if (this.open) { 3115 this.$root.showModal(); 3116 } else { 3117 this.$root.close(); 3118 } 3119 3120 this.scrollLock(this.open); 3121 }, 3122 openCartDrawer() { 3123 this.$root.showModal(); 3124 this.open = true; 3125 this.scrollLock(true); 3126 }, 3127 closeCartDrawer() { 3128 this.$root.close(); 3129 this.open = false;
3130 this.scrollLock(false); 3131 }, 3132 getSectionDataExtraActions() { 3133 if (!this.cart.extra_actions) { 3134 return ''; 3135 } 3136 3137 const contentNode = document.createElement('div'); 3138 contentNode.innerHTML = this.cart.extra_actions; 3139 3140 hyva.activateScripts(contentNode); 3141 3142 return contentNode.innerHTML; 3143 }, 3144 initAfterpayObserver() { 3145 this.afterpayObserver = new MutationObserver(() => { 3146 this.syncMiniCartAfterpayVisibility(); 3147 }); 3148 3149 this.afterpayObserver.observe(this.$root, { 3150 childList: true, 3151 subtree: true 3152 }); 3153 }, 3154 syncMiniCartAfterpayVisibility() { 3155 const afterpayPlacement = this.$root.querySelector('#afterpay-cta-mini-cart'); 3156 const shouldHideAfterpay = Boolean(this.cart.cart_has_giftcard); 3157 3158 if (!afterpayPlacement) { 3159 return; 3160 } 3161 3162 if (shouldHideAfterpay) { 3163 afterpayPlacement.style.display = 'none'; 3164 afterpayPlacement.setAttribute('aria-hidden', 'true'); 3165 return; 3166 } 3167 3168 afterpayPlacement.style.removeProperty('display'); 3169 afterpayPlacement.removeAttribute('aria-hidden'); 3170 }, 3171 onDialogBackdropClickHelper(event, target) { 3172 const rect = target.getBoundingClientRect(); 3173 const isInDialog = 3174 rect.top <= event.clientY && 3175 event.clientY <= rect.top + rect.height && 3176 rect.left <= event.clientX && 3177 event.clientX <= rect.left + rect.width; 3178 return isInDialog; 3179 }, 3180 cartListeners: { 3181 ['@private-content-loaded.window'](event) { 3182 this.getData(event.detail.data); 3183 }, 3184 ['@click'](event) { 3185 if (this.onDialogBackdropClickHelper(event, this.$root)) return; 3186 this.closeCartDrawer(); 3187 }, 3188 ['@toggle-cart.window'](event) { 3189 this.toggleCartDrawer(event); 3190 }, 3191 ['@keydown.window.escape']() { 3192 this.closeCartDrawer(); 3193 } 3194 } 3195 } 3196 } 3197</script>
3197 3198 3199<dialog 3200 id="cart-drawer" 3201 aria-labelledby="cart-drawer-title" 3202 class="z-30 fixed inset-0 flex flex-col max-h-screen max-w-full h-full mr-0 w-[460px] transition ease-in-out backdrop:bg-black/25 px-7 pb-0 pt-5 s767:px-5" 3203 x-show="open" 3204 x-transition:enter="duration-700" 3205 x-transition:enter-start="translate-x-full" 3206 x-transition:enter-end="translate-x-0" 3207 x-transition:leave="duration-500" 3208 x-transition:leave-start="translate-x-0" 3209 x-transition:leave-end="translate-x-full" 3210 x-ref="cartDialogContent" 3211 x-data="initCartDrawer()" 3212 x-init="init()" 3213 x-bind="cartListeners" 3214 x-cloak 3215> 3216 3217 <div class="flex gap-2 items-center border-b border-goldColor pb-3"> 3218 <p id="cart-drawer-title" class="text-2xl flex items-center gap-2"> 3219 Shopping Bag <span class="items-total text-sm" x-text="getItemCountTitle()"></span> 3220 </p> 3221 <a 3222 href="https://www.mrhankeystoys.com/checkout/cart/" 3223 class="mx-auto text-sm text-[#344FA4] underline" 3224 > 3225 View Bag </a> 3226 <button 3227 type="button" 3228 class="p-1 -m-1" 3229 @click="closeCartDrawer" 3230 aria-label="Close minicart" 3231 > 3232 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 18 18" fill="none" role="img"> 3233<path d="M11.1211 9L17.5605 2.56055C18.1465 1.97461 18.1465 1.02539 17.5605 0.439453C16.9746 -0.146484 16.0254 -0.146484 15.4395 0.439453L9 6.87891L2.56055 0.439453C1.97461 -0.146484 1.02539 -0.146484 0.439453 0.439453C-0.146484 1.02539 -0.146484 1.97461 0.439453 2.56055L6.87891 9L0.439453 15.4395C-0.146484 16.0254 -0.146484 16.9746 0.439453 17.5605C0.732422 17.8535 1.11621 18 1.5 18C1.88379 18 2.26758 17.8535 2.56055 17.5605L9 11.1211L15.4395 17.5605C15.7324 17.8535 16.1162 18 16.5 18C16.8838 18 17.2676 17.8535 17.5605 17.5605C18.1465 16.9746 18.1465 16.0254 17.5605 15.4395L11.1211 9Z" fill="#999999"/> 3234<title>cross</title></svg> 3235 </button> 3236 </div> 3237 3238 3239 <template x-if="!itemsCount"> 3240 <div class="grow grid place-items-center"> 3241 <div class="text-center"> 3242 <div class="max-w-full max-h-full aspect-square w-44 h-44 inline-flex items-center justify-center rounded-full 3243 bg-[#f4f4f4] text-black outline-2 outline-dashed outline-black outline-offset-8"> 3244 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="120" height="120" aria-hidden="true"> 3245 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"/> 3246</svg> 3247 </div> 3248 <p class="mt-10 text-xl"> 3249 <strong>Your bag is empty</strong> 3250 </p> 3251 <p class="text-slate-500"> 3252 Looks like you haven't made your choice yet. </p> 3253 </div> 3254 </div> 3255 </template> 3256 3257 <template x-if="itemsCount"> 3258 <ul class="grow flex flex-col overflow-y-auto overscroll-y-contain md:-mr-7 md:pr-7 s767:-mr-5 s767:pr-5"> 3259 <template x-for="item in cartItems"> 3260 <li class="flex items-start py-5 border-b border-[#ddd]"> 3261 <a 3262 class="block shrink-0 border border-[#eee] w-[90px] h-[90px] relative flex items-center justify-center" 3263 :href="item.product_url" 3264 :title="hyva.str('Product\u0020\u0022\u00251\u0022', item.product_name)" 3265 > 3266 3267<!-- Render picture tag when webp or avif existed --> 3268<picture> 3269 <source type="image/webp" :srcset="item.product_image.src_webp"> 3270 <source :srcset="item.product_image.src"> 3271 <img 3272 :src="item.product_image.src" 3273 :width="item.product_image.width" 3274 :height="item.product_image.height" 3275 loading="lazy" 3276 :alt="hyva.str('Product\u0020\u0022\u00251\u0022', item.product_name)" 3277 class="max-w-[70px] max-h-[57px]" 3278 /></picture> 3279 3280 </a> 3281 <div class="w-full max-w-[calc(100%-90px)] pl-4 flex flex-col gap-2.5"> 3282 <p class="text-sm font-medium">
3283 <span x-html="item.product_name"></span> 3284 </p> 3285 <template x-if="item.options && item.options.length"> 3286 <div x-data="{ open: false }"> 3287 <div @click="open = ! open" class="text-sm text-[#666] flex items-center gap-1.5 cursor-pointer"> 3288 View Details 3289 <svg :class="{'rotate-180':open, '':!open}" xmlns="http://www.w3.org/2000/svg" width="10" height="8" viewBox="0 0 10 8" fill="none"><path d="M5.83224 7.45072C5.43646 8.04483 4.56354 8.04483 4.16776 7.45071L0.839357 2.45441C0.396633 1.78984 0.873058 0.899998 1.6716 0.899998L8.3284 0.899997C9.12694 0.899997 9.60337 1.78984 9.16064 2.45441L5.83224 7.45072Z" fill="#666666"/></svg> 3290 </div> 3291 <div class="flex flex-col mt-1" x-show="open"> 3292 <template x-for="option in item.options"> 3293 <div class="flex items-center gap-1 text-sm mt-1 flex-wrap"> 3294 <p class="font-semibold" x-text="option.label + ':'"></p> 3295 <p class="text-[#666]" x-html="option.value"></p> 3296 </div> 3297 </template> 3298 </div> 3299 </div> 3300 </template> 3301 <div class="flex items-center justify-between mt-2.5"> 3302 <div class="price-qty flex gap-2.5 items-center"> 3303 <span class="[&_.price]:font-medium [&_.price]:text-lg" x-html="item.product_price"></span> 3304 <form 3305 action="https://www.mrhankeystoys.com/checkout/cart/updatePost/" 3306 x-data="{ 3307 initQty: item.qty, 3308 itemQty: item.qty, 3309 prevQty: item.qty, 3310 updateQty() { 3311 const submitEvent = new Event('submit', { cancelable: true }); 3312 this.$root.dispatchEvent(submitEvent); 3313 } 3314 }" 3315 @submit.prevent="updateItemQty($event.target);" 3316 x-init="$watch('isLoading', isLoading => { 3317 if (!isLoading) return; 3318 initQty = itemQty; 3319 prevQty = itemQty; 3320 })" 3321 method="post" 3322 class="form form-cart flex gap-1" 3323 ><div class="border border-[#999] flex items-center"> 3324 <input name="form_key" type="hidden" value="9SFsreOEuib59vuZ" /> <button 3325 type="button" 3326 @click="itemQty <= 0 ? itemQty = 0 : itemQty--" 3327 @click.debounce.1000ms="updateQty($event);" 3328 class="w-8 h-8 flex items-center justify-center hover:bg-black group transition" 3329 > 3330 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-[#999] group-hover:stroke-white w-4 h-4 transition" width="12" height="12" role="img"> 3331 <path stroke-linecap="round" stroke-linejoin="round" d="M20 12H4"/> 3332<title>minus</title></svg> 3333 </button> 3334 <label class="mb-0">
3335 <span class="sr-only">Qty</span> 3336 <input 3337 type="number" 3338 class="qty p-0 w-8 h-8 text-center border-none text-sm" 3339 required 3340 min="0" 3341 step="any" 3342 x-model.number="itemQty" 3343 :id="`minicart-${item.item_id}-qty`" 3344 :name="`cart[${item.item_id}][qty]`" 3345 @change.debounce.1000ms="updateQty($event)" 3346 > 3347 </label> 3348 <button 3349 type="button" 3350 @click="itemQty++" 3351 @click.debounce.1000ms="updateQty($event);" 3352 class="w-8 h-8 flex items-center justify-center hover:bg-black group transition" 3353 > 3354 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-[#999] group-hover:stroke-white w-4 h-4 transition" width="14" height="14" role="img"> 3355 <path stroke-linecap="round" stroke-linejoin="round" d="M12 4v16m8-8H4"/> 3356<title>plus</title></svg> 3357 </button> 3358 </div></form> 3359 </div> 3360 <div class="flex flex-wrap gap-2 justify-between items-center"> 3361 3362 <div class="flex flex-wrap items-center gap-4"> 3363 <button 3364 type="button" 3365 class="text-[#666] hover:text-hoverColor" 3366 @click="deleteItemFromCart(item.item_id)" 3367 :aria-label="hyva.str( 3368 'Remove\u0020product\u0020\u0022\u00251\u0022\u0020from\u0020cart', 3369 item.product_name 3370 )" 3371 > 3372 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 15 16" fill="none" role="img"> 3373<path d="M9.66992 0C9.94924 0.00704125 10.2151 0.122139 10.4102 0.321289C10.6053 0.520517 10.7139 0.788163 10.7139 1.06641V2.13379H14.4639C14.6058 2.13379 14.7423 2.18927 14.8428 2.28906C14.9432 2.38908 15 2.52554 15 2.66699C14.9999 2.80832 14.9432 2.944 14.8428 3.04395C14.7423 3.14384 14.6059 3.2002 14.4639 3.2002H13.3926V14.123C13.3911 14.6167 13.1953 15.0903 12.8467 15.4414C12.498 15.7925 12.0243 15.993 11.5283 16H3.49316C2.99348 15.9986 2.51446 15.8 2.16113 15.4482C1.80796 15.0966 1.60894 14.6203 1.60742 14.123V3.2002H0.536133C0.394166 3.2002 0.257669 3.14382 0.157227 3.04395C0.0568383 2.944 8.64848e-05 2.80832 0 2.66699C0 2.52554 0.0567612 2.38908 0.157227 2.28906C0.257653 2.18929 0.394243 2.13379 0.536133 2.13379H4.28613V1.06641C4.2862 0.783603 4.39874 0.512477 4.59961 0.3125C4.80054 0.11247 5.07327 0 5.35742 0H9.66992ZM2.67871 14.123C2.67874 14.3342 2.76124 14.5372 2.90918 14.6885C3.05728 14.8399 3.25945 14.928 3.47168 14.9336H11.5068C11.7227 14.9336 11.9303 14.8482 12.083 14.6963C12.2356 14.5443 12.3212 14.3379 12.3213 14.123V3.2002H2.67871V14.123ZM5.72168 5.33301C5.86343 5.33312 5.99928 5.38957 6.09961 5.48926C6.19997 5.58917 6.25672 5.72492 6.25684 5.86621V12.2666C6.25684 12.4081 6.20007 12.5435 6.09961 12.6436C5.99925 12.7434 5.86355 12.7997 5.72168 12.7998C5.57962 12.7998 5.44323 12.7435 5.34277 12.6436C5.24231 12.5435 5.18555 12.4081 5.18555 12.2666V5.86621C5.18567 5.72492 5.24241 5.58917 5.34277 5.48926C5.44321 5.38942 5.57974 5.33301 5.72168 5.33301ZM9.27832 5.33301C9.42031 5.33301 9.55678 5.38936 9.65723 5.48926C9.75759 5.58917 9.81433 5.72492 9.81445 5.86621V12.2666C9.81445 12.408 9.75765 12.5435 9.65723 12.6436C9.55676 12.7436 9.4204 12.7998 9.27832 12.7998C9.13631 12.7998 8.99983 12.7435 8.89941 12.6436C8.79912 12.5436 8.74316 12.4079 8.74316 12.2666V5.86621C8.74328 5.72493 8.79906 5.58917 8.89941 5.48926C8.99983 5.38928 9.13631 5.33306 9.27832 5.33301ZM5.35742 2.13379H9.64258V1.06641H5.35742V2.13379Z" fill="currentColor"/> 3374<title>delete</title></svg> 3375 </button> 3376 </div> 3377 </div> 3378 </div> 3379 </div> 3380 </li> 3381 </template> 3382 </ul> 3383 </template> 3384 3385 3386 <template x-if="itemsCount"> 3387 <div class="bg-[#f4f4f4] -mx-7 py-4 px-7 gap-4 flex flex-col s767:-mx-5 s767:px-5"> 3388 3389 <dl class="flex flex-col"> 3390 <dt class="">Subtotal</dt> 3391 <dd class="text-[22px] font-semibold minicart-subtotal" x-html="cart.subtotal"></dd> 3392 </dl> 3393 3394 <template x-if="cart.giftcard_checkout_restricted"> 3395 <div class="rounded border border-red-300 bg-red-50 px-4 py-3 text-sm text-red-700" 3396 x-text="cart.giftcard_checkout_restriction_message"></div> 3397 </template> 3398 3399 <div class="minicart-extra-actions empty:hidden" x-html="get
3399SectionDataExtraActions()"></div> 3400 3401 <div class="flex gap-3 text-center"> 3402 <a 3403 x-show="cart.possible_onepage_checkout" 3404 @click.prevent.stop="if (checkoutLoading) return; 3405 checkoutLoading = true; 3406 $dispatch('toggle-authentication', { url: 'https://www.mrhankeystoys.com/checkout/' }); 3407 setTimeout(() => checkoutLoading = false, 4000);" 3408 :class="checkoutLoading && 'pointer-events-none opacity-60'" 3409 href="https://www.mrhankeystoys.com/checkout/" 3410 class="btn btn-primary h-[40px] w-full gap-2.5 rounded-[4px]" 3411 > 3412 <span x-show="checkoutLoading"><svg xmlns="http://www.w3.org/2000/svg" fill="hsl(228, 97%, 42%)" viewBox="0 0 24 24" class="w-6 h-6 fill-hoverColor" width="24" height="24" role="img"><path d="M12,4a8,8,0,0,1,7.89,6.7A1.53,1.53,0,0,0,21.38,12h0a1.5,1.5,0,0,0,1.48-1.75,11,11,0,0,0-21.72,0A1.5,1.5,0,0,0,2.62,12h0a1.53,1.53,0,0,0,1.49-1.3A8,8,0,0,1,12,4Z"><animateTransform attributeName="transform" type="rotate" dur="0.75s" values="0 12 12;360 12 12" repeatCount="indefinite"/></path><title>loader</title></svg> 3413</span> 3414 <span x-show="!checkoutLoading">Proceed to Checkout</span> 3415 </a> 3416 </div> 3417 3418 <div class="flex flex-col gap-1 text-[#2C2E2F] [--messaging-font-size:15px] [&_square-placement]:m-0 [&_square-placement]:[zoom:0.8]"> 3419 <div class="afterpay_minicart_container empty:hidden" x-show="!cart.cart_has_giftcard"></div> 3420 <div class="hyva-adobe-payments"> 3421 <div class="pay-later-message-minicart"></div> 3422 </div> 3423 </div> 3424 </div> 3425 </template> 3426 3427 <template x-if="!itemsCount"> 3428 <div class="flex flex-col pb-7"> 3429 <button 3430 type="button" 3431 @click="closeCartDrawer" 3432 class="btn btn-primary" 3433 >Continue shopping</button> 3434 </div> 3435 </template> 3436 3437 3438 <div 3439 class="z-50 fixed inset-0 grid place-items-center bg-white/70 text-primary" 3440 x-cloak 3441 x-show="isLoading" 3442 x-transition.opacity.duration.200ms 3443> 3444 <div class="flex gap-10 items-center p-4"> 3445 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 57 57" width="57" height="57" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"> 3446 <style> 3447 @keyframes spinner-ball-triangle1 { 3448 0% { transform: translate(0%, 0%); } 3449 33% { transform: translate(38%, -79%); } 3450 66% { transform: translate(77%, 0%); } 3451 100% { transform: translate(0%, 0%); } 3452 } 3453 3454 @keyframes spinner-ball-triangle2 { 3455 0% { transform: translate(0%, 0%); } 3456 33% { transform: translate(38%, 79%); } 3457 66% { transform: translate(-38%, 79%); } 3458 100% { transform: translate(0%, 0%); } 3459 } 3460 3461 @keyframes spinner-ball-triangle3 { 3462 0% { transform: translate(0%, 0%); } 3463 33% { transform: translate(-77%, 0%); } 3464 66% { transform: translate(-38%, -79%); } 3465 100% { transform: translate(0%, 0%); } 3466 } 3467 </style> 3468 <circle cx="5" cy="50" r="5" style="animation: spinner-ball-triangle1 2.2s linear infinite"/> 3469 <circle cx="27" cy="5" r="5" style="animation: spinner-ball-triangle2 2.2s linear infinite"/> 3470 <circle cx="49" cy="50" r="5" style="animation: spinner-ball-triangle3 2.2s linear infinite"/> 3471</svg> 3472 <span class="text-xl select-none"> 3473 Loading... </span> 3474 </div> 3475</div> 3476</dialog> 3477 <!-- BLOCK authentication-popup -->
3477<script> 3478 function initAuthentication() { 3479 return { 3480 open: false, 3481 close() { 3482 this.open = false; 3483 }, 3484 forceAuthentication: false, 3485 checkoutUrl: 'https://www.mrhankeystoys.com/checkout/index/', 3486 errors: 0, 3487 hasCaptchaToken: 0, 3488 displayErrorMessage: false, 3489 errorMessages: [], 3490 setErrorMessages(message) { 3491 this.errorMessages = [message]; 3492 this.displayErrorMessage = true; 3493 }, 3494 submitForm() { 3495 // Do not rename $form, the variable is expected to be declared in the recaptcha output 3496 const $form = document.querySelector('#login-form'); 3497 if (!this.hasCaptchaToken) { 3498 this.errors = 1; 3499 3500 3501 const executeGreCaptcha = () => { 3502 grecaptcha.ready(() => { 3503 grecaptcha.execute( 3504 '6LeoIcUrAAAAAJYfHQM4lGMaUcmcjlQaBgv49EZy', 3505 {action: 'submit'} 3506 ).then((token) => { 3507 const tokenElement = $form['g\u002Drecaptcha\u002Dresponse']; 3508 3509 if (tokenElement && token && token.length > 0) { 3510 $form['g\u002Drecaptcha\u002Dresponse'].value = token; 3511 this.errors = 0; 3512 this.hasCaptchaToken = 1; 3513 (this.submitForm || $form.submit).call(this); 3514 } else { 3515 this.errors = 1; 3516 const error = tokenElement 3517 ? 'ReCaptcha\u0020validation\u0020failed,\u0020please\u0020try\u0020again' 3518 : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020trying\u0020again.'; 3519 if (this.setErrorMessages) { 3520 this.setErrorMessages([error]) 3521 this.displayErrorMessage = true; 3522 } else { 3523 window.dispatchMessages && window.dispatchMessages([{type: "error", text: error}], 5000); 3524 } 3525 } 3526 }).catch(exception => { 3527 console.error(exception || `An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?`) 3528 }); 3529 }) 3530 } 3531 3532 if (window.grecaptcha) { 3533 executeGreCaptcha(); 3534 } else { 3535 const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LeoIcUrAAAAAJYfHQM4lGMaUcmcjlQaBgv49EZy"; 3536 const script = document.createElement('script'); 3537 script.setAttribute('type', 'text/javascript'); 3538 script.setAttribute('src', recaptchaUrl); 3539 document.head.appendChild(script); 3540 3541 script.addEventListener("load", executeGreCaptcha, false); 3542 } 3543 } 3544 3545 if (this.errors === 0) { 3546 this.dispatchLoginRequest($form); 3547 } 3548 }, 3549 onPrivateContentLoaded() { 3550 const data = this.$event.detail.data; 3551 const isLoggedIn = data.customer && data.customer.firstname; 3552 if (data.cart && !isLoggedIn) { 3553 this.forceAuthentication = !data.cart.isGuestCheckoutAllowed; 3554 } 3555 }, 3556 redirectIfAuthenticated() { 3557 const event = this.$event; 3558 this.open = this.forceAuthentication; 3559 3560 if (event.detail && event.detail.url) { 3561 this.checkoutUrl = event.detail.url; 3562 } 3563 if (!this.forceAuthentication) { 3564 window.location.href = this.checkoutUrl; 3565 } 3566 }, 3567 resetErrors() { 3568 this.errors = 0; 3569 }, 3570 dispatchLoginRequest(form) { 3571 this.isLoading = true; 3572 const username = this.$refs['customer-email'].value; 3573 const password = this.$refs['customer-password'].value; 3574 const formKey = hyva.getFormKey(); 3575 const bodyFields = { 3576 'username': username, 3577 'password': password, 3578 'formKey': formKey 3579 }; 3580 const fieldName = 'g\u002Drecaptcha\u002Dresponse'; 3581 const recaptchaField = fieldName && form[fieldName]; 3582 if (recaptchaField) { 3583 bodyFields[fieldName] = recaptchaField.value; 3584 } 3585 fetch('https://www.mrhankeystoys.com/customer/ajax/login/', { 3586 method: 'POST', 3587 headers: { 3588 'Content-Type': 'application/json', 3589 'X-Requested-With': 'XMLHttpRequest' 3590 }, 3591 body: JSON.stringify(bodyFields) 3592 } 3593 ).then(response => { 3594 return response.json() 3595 } 3596 ).then(data => { 3597 this.isLoading = false;
3598 if (data.errors) { 3599 this.setErrorMessages(data.message); 3600 this.errors = 1; 3601 this.hasCaptchaToken = 0; 3602 } else { 3603 window.location.href = this.checkoutUrl; 3604 } 3605 }); 3606 } 3607 } 3608 } 3609 3610 window.addEventListener('alpine:init', () => Alpine.data('initAuthentication', initAuthentication), {once: true}) 3611</script>
3611 3612<section id="authentication-popup" 3613 x-data="initAuthentication" 3614 @private-content-loaded.window="onPrivateContentLoaded" 3615 @toggle-authentication.window="redirectIfAuthenticated" 3616 @keydown.window.escape="close" 3617> 3618 <div 3619 class="backdrop" 3620 aria-hidden="true" 3621 x-cloak 3622 x-show="open" 3623 x-transition:enter="ease-in-out duration-500" 3624 x-transition:enter-start="opacity-0" 3625 x-transition:enter-end="opacity-100" 3626 x-transition:leave="ease-in-out duration-500" 3627 x-transition:leave-start="opacity-100" 3628 x-transition:leave-end="opacity-0" 3629 @click="close" 3630 ></div> 3631 <div role="dialog" 3632 aria-modal="true" 3633 @click.outside="close" 3634 class="inset-y-0 right-0 z-30 flex max-w-full fixed" 3635 x-cloak 3636 x-show="open" 3637 > 3638 <div class="relative w-screen max-w-md pt-16 bg-container-lighter" 3639 x-show="open" 3640 x-cloak 3641 x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" 3642 x-transition:enter-start="translate-x-full" 3643 x-transition:enter-end="translate-x-0" 3644 x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" 3645 x-transition:leave-start="translate-x-0" 3646 x-transition:leave-end="translate-x-full" 3647 > 3648 <div 3649 x-show="open" 3650 x-cloak 3651 x-transition:enter="ease-in-out duration-500" 3652 x-transition:enter-start="opacity-0" 3653 x-transition:enter-end="opacity-100" 3654 x-transition:leave="ease-in-out duration-500" 3655 x-transition:leave-start="opacity-100" 3656 x-transition:leave-end="opacity-0" class="absolute top-0 right-2 flex p-2 mt-2"> 3657 <button 3658 type="button" 3659 @click="close" 3660 aria-label="Close panel" 3661 class="p-2 text-gray-300 transition duration-150 ease-in-out hover:text-black" 3662 > 3663 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 3664 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 3665</svg> 3666 </button> 3667 </div> 3668 <template x-if="open"> 3669 <div class="flex flex-col h-full py-6 space-y-6 bg-white shadow-xl overflow-y-auto"> 3670 <div class="mx-4"> 3671 <div class="message error mb-0" x-show="errors" x-cloak> 3672 <template x-for="(message, index) in errorMessages" :key="index"> 3673 <div> 3674 <template x-if="message"> 3675 <span x-html="message"></span> 3676 </template> 3677 </div> 3678 </template> 3679 </div> 3680 </div> 3681 <div class="block-customer-login bg-container border border-container mx-4 p-4 shadow-sm"> 3682 <p id="authenticate-customer-login" class="text-lg leading-7 text-gray-900"> 3683 <strong class="font-medium">Checkout using your account</strong> 3684 </p> 3685 3686 <form class="form form-login" 3687 method="post" 3688 @submit.prevent="submitForm" 3689 id="login-form" 3690 > 3691 <div class="control"> 3692 <input type="hidden" 3693 value="" 3694 name="g-recaptcha-response" 3695 /> 3696</div> 3697 <div class="fieldset login"> 3698 <div class="field email required"> 3699 <label class="label" for="form-login-username" form="login-form" >
3700 <span>Email Address</span> 3701 </label> 3702 <div class="control"> 3703 <input name="username" 3704 id="form-login-username" 3705 x-ref="customer-email" 3706 @change="resetErrors" 3707 type="email" 3708 required 3709 autocomplete="off" 3710 class="form-input" 3711 > 3712 </div> 3713 </div> 3714 <div class="field password required"> 3715 <label for="form-login-password" class="label" form="login-form"> 3716 <span>Password</span> 3717 </label> 3718 <div class="control"> 3719 <input name="password" 3720 id="form-login-password" 3721 type="password" 3722 class="form-input" 3723 required 3724 x-ref="customer-password" 3725 autocomplete="off" 3726 @change="resetErrors" 3727 > 3728 </div> 3729 </div> 3730 3731 <input name="context" type="hidden" value="checkout" /> 3732 <div class="actions-toolbar pt-6 pb-2"> 3733 <button type="submit" class="inline-flex btn btn-primary disabled:opacity-75" 3734 > 3735 Sign In </button> 3736 <a href="https://www.mrhankeystoys.com/customer/account/forgotpassword/" 3737 > 3738 Forgot Your Password? </a> 3739 </div> 3740 3741 </div> 3742 </form> 3743 </div> 3744 <div class="mx-4"> 3745 <p class="my-4 text-xs [&_a]:text-hoverColor"> 3746This form is protected by reCAPTCHA - the <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">Google Privacy Policy</a> and <a class="underline" href="https://policies.google.com/terms" target="_blank" rel="noopener">Terms of Service</a> apply.</p> 3747 </div> 3748 <div class="block-new-customer bg-container border border-container mx-4 p-4 shadow-sm"> 3749 <p id="authenticate-new-customer" class="text-lg mb-2 leading-7 text-gray-900"> 3750 <strong class="font-medium">Checkout as a new customer</strong> 3751 </p> 3752 3753 <div class="block-content"> 3754 <p class="mb-1"> 3755 Creating an account has many benefits: </p> 3756 <ul class="list-disc pl-5"> 3757 <li> See order and shipping status</li> 3758 <li> Track order history</li> 3759 <li> Check out faster</li> 3760 </ul> 3761 <div class="actions-toolbar mt-6 mb-2"> 3762 <a href="https://www.mrhankeystoys.com/customer/account/create/" 3763 class="inline-flex btn btn-primary"> 3764 Create an Account </a> 3765 </div> 3766 </div> 3767 </div> 3768 </div> 3769 </template> 3770 </div> 3771 </div> 3772</section> 3773<!-- /BLOCK authentication-popup --></div> 3774
3775<script> 3776 setInterval(()=> { 3777 var aaPanel = document.querySelector('.aa-Panel'); 3778 if(aaPanel) { 3779 document.body.classList.add('openSearch'); 3780 } else { 3781 document.body.classList.remove('openSearch'); 3782 } 3783 },1000); 3784 3785 var mobileSearch = document.querySelectorAll('.mobileSearch'); 3786 var searchPopup = document.querySelector('.searchPopup'); 3787 var closeSearch = document.querySelectorAll('.closeSearch'); 3788 3789 mobileSearch.forEach(button => { 3790 button.addEventListener('click', () => { 3791 searchPopup.classList.add('active'); 3792 document.body.classList.add('overflow-hidden'); 3793 document.body.classList.add('bodyAaPanel'); 3794 }); 3795 }); 3796 closeSearch.forEach(button => { 3797 button.addEventListener('click', () => { 3798 searchPopup.classList.remove('active'); 3799 document.body.classList.remove('overflow-hidden'); 3800 document.body.classList.remove('bodyAaPanel'); 3801 document.body.classList.remove('openSearch'); 3802 }); 3803 }); 3804</script>
3804 3805</header><main id="maincontent" class="page-main"><div id="contentarea" tabindex="-1"></div> 3806<div class="page messages">
3806<script> 3807 function initMessages() { 3808 "use strict"; 3809 return { 3810 messages: window.mageMessages || [], 3811 isEmpty() { 3812 return this.messages.reduce( 3813 function (isEmpty, message) { 3814 return isEmpty && message === undefined 3815 }, true 3816 ) 3817 }, 3818 hasMessages() { 3819 return !this.isEmpty(); 3820 }, 3821 hasMessage() { 3822 return !!this.message; 3823 }, 3824 removeMessage() { 3825 this.messages[this.index] = undefined; 3826 }, 3827 addMessages(messages, hideAfter) { 3828 messages.map((message) => { 3829 this.messages = this.messages.concat(message); 3830 if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) { 3831 hideAfter = window.defaultSuccessMessageTimeout; 3832 } 3833 if (hideAfter) { 3834 this.setHideTimeOut(this.messages.length -1, hideAfter); 3835 } 3836 }); 3837 }, 3838 setHideTimeOut(messageIndex, hideAfter) { 3839 setTimeout((messageIndex) => { 3840 this.messages[messageIndex] = undefined; 3841 }, hideAfter, messageIndex); 3842 }, 3843 eventListeners: { 3844 ['@messages-loaded.window'](event) { 3845 this.addMessages(event.detail.messages, event.detail.hideAfter) 3846 }, 3847 ['@private-content-loaded.window'](event) { 3848 const data = event.detail.data; 3849 if ( 3850 data.messages && 3851 data.messages.messages && 3852 data.messages.messages.length 3853 ) { 3854 this.addMessages(data.messages.messages); 3855 } 3856 }, 3857 ['@clear-messages.window']() { 3858 this.messages = []; 3859 } 3860 }, 3861 getMessageUiId() { 3862 return 'message-' + this.message.type; 3863 } 3864 } 3865 } 3866 3867 window.addEventListener('alpine:init', () => Alpine.data('initMessages', initMessages), {once: true}) 3868</script>
3868 3869<section id="messages" 3870 x-data="initMessages" 3871 x-bind="eventListeners" 3872 aria-live="assertive" 3873 role="alert" 3874> 3875 <template x-if="hasMessages"> 3876 <div class="w-full"> 3877 <div class="messages container mx-auto py-3"> 3878 <template x-for="(message, index) in messages" :key="index"> 3879 <div> 3880 <template x-if="hasMessage"> 3881 <div class="message" 3882 :class="message.type" 3883 :ui-id="getMessageUiId" 3884 > 3885 <span x-html="message.text"></span> 3886 <button 3887 type="button" 3888 class="text-gray-600 hover:text-black" 3889 aria-label="Close message" 3890 @click.prevent="removeMessage" 3891 > 3892 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="18" height="18" aria-hidden="true"> 3893 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 3894</svg> 3895 </button> 3896 </div> 3897 </template> 3898 </div> 3899 </template> 3900 </div> 3901 </div> 3902 </template> 3903</section> 3904</div><div class="columns"><div class="column main"><style> 3905 .smart-button--applepay apple-pay-button { 3906 --apple-pay-button-width: 100%; 3907 --apple-pay-button-height: 40px; 3908 --apple-pay-button-border-radius: 4px; 3909 --apple-pay-button-box-sizing: border-box; 3910 --apple-pay-button-padding: 0; 3911 display: block; 3912 width: 100%; 3913 cursor: pointer; 3914 } 3915 3916 .smart-button--applepay > * { 3917 width: 100%; 3918 } 3919</style>
3920<script> 3921 (function () { 3922 'use strict'; 3923 3924 if (window.ktplPaymentSdk) { 3925 return; 3926 } 3927 3928 const BUTTON_LOCALE = 'en\u002DUS'; 3929 3930 const MESSAGE_REQUEST_FAILED = 'Something\u0020went\u0020wrong\u0020with\u0020your\u0020request.\u0020Please\u0020try\u0020again\u0020later.'; 3931 const MESSAGE_PAYMENT_INVALID = 'Your\u0020payment\u0020was\u0020not\u0020successful.\u0020Please\u0020try\u0020again\u0020later.'; 3932 3933 const SDK_ERROR_MESSAGES = { 3934 APPLE_PAY_ZERO_AMOUNT: 'Apple\u0020Pay\u0020is\u0020not\u0020available\u0020when\u0020the\u0020order\u0020total\u0020is\u00200.\u0020Please\u0020choose\u0020a\u0020different\u0020payment\u0020method.', 3935 GOOGLE_PAY_ZERO_AMOUNT: 'Google\u0020Pay\u0020is\u0020not\u0020available\u0020when\u0020the\u0020order\u0020total\u0020is\u00200.\u0020Please\u0020choose\u0020a\u0020different\u0020payment\u0020method.', 3936 GOOGLE_PAY_THREE_DS_FAILED: 'Unable\u0020to\u0020validate\u0020payment\u0020with\u00203DS.\u0020Please\u0020choose\u0020a\u0020different\u0020payment\u0020method.' 3937 }; 3938 3939 function mapPaymentSdkErrorMessage(error) { 3940 if (!error || !error.code) { 3941 return null; 3942 } 3943 3944 return SDK_ERROR_MESSAGES[error.code] || null; 3945 } 3946 3947 function mapLocationToPageType(location) { 3948 switch (location) { 3949 case 'PRODUCT_DETAIL': 3950 return 'product'; 3951 case 'MINICART': 3952 return 'minicart'; 3953 case 'CART': 3954 return 'cart'; 3955 case 'CHECKOUT': 3956 case 'START_OF_CHECKOUT': 3957 case 'ADMIN': 3958 return undefined; 3959 default: 3960 throw new Error('Unknown location: "' + location + '".'); 3961 } 3962 } 3963 3964 const loadMemo = {}; 3965 const initializeSdkMemo = {}; 3966 let cachedPullScriptResult = null; 3967 3968 function objToSortedJsonString(obj) { 3969 return JSON.stringify(obj, Object.keys(obj).sort()); 3970 } 3971 3972 function doPullScript(params) { 3973 const preferredUrl = params.preferredUrl; 3974 const fallbackUrl = params.fallbackUrl; 3975 3976 const promise = window.paypalLoadCustomScript({url: preferredUrl}) 3977 .catch((error) => { 3978 console.warn( 3979 'Failed to load Payment Services SDK script from preferred URL ' 3980 + preferredUrl + '. Retrying with ' 3981 + (fallbackUrl ? 'fallback URL ' + fallbackUrl : 'the same URL as no fallback URL was provided') 3982 + '.', 3983 error 3984 ); 3985 3986 return window.paypalLoadCustomScript({url: fallbackUrl || preferredUrl}); 3987 }) 3988 .then(() => { 3989 if ('PaymentServicesSDK' in window) { 3990 return {PaymentServicesSDK: window.PaymentServicesSDK}; 3991 } 3992 3993 throw new Error('Script loaded, but Payment Services SDK not found.'); 3994 }); 3995 3996 return {preferredUrl: preferredUrl, fallbackUrl: fallbackUrl, promise: promise}; 3997 } 3998 3999 function pullScript(params) { 4000 if (!cachedPullScriptResult) { 4001 cachedPullScriptResult = doPullScript(params); 4002 } 4003 4004 if (params.preferredUrl !== cachedPullScriptResult.preferredUrl 4005 || params.fallbackUrl !== cachedPullScriptResult.fallbackUrl) { 4006 const urls = (data) => 'urls(preferred = ' + data.preferredUrl + ', fallback = ' + data.fallbackUrl + ')'; 4007 4008 console.warn( 4009 'Ignoring request to pull Payment Services SDK script from ' + urls(params) + ', as loading ' 4010 + 'multiple versions of the Payment Services SDK script on the same page is not supported, and ' 4011 + 'the Payment Services SDK script was already loaded from ' 4012 + urls(cachedPullScriptResult) + '.' 4013 ); 4014 } 4015 4016 return cachedPullScriptResult.promise; 4017 } 4018 4019 function constructSdkConfig(params) { 4020 const sdkConfig = {}; 4021 4022 if (params.gqlEndpoint) { 4023 sdkConfig.gqlApiUrl = params.gqlEndpoint; 4024 } 4025 if (params.customerToken) { 4026 sdkConfig.getCustomerToken = () => params.customerToken; 4027 } 4028 if (params.storeViewCode) { 4029 sdkConfig.storeViewCode = params.storeViewCode; 4030 } 4031 if (params.commerceVersion) { 4032 sdkConfig.commerceVersion = params.commerceVersion; 4033 } 4034 if (params.isGuestCustomer !== null) { 4035 sdkConfig.isGuestCustomer = () => params.isGuestCustomer; 4036 } 4037 4038 return sdkConfig; 4039 } 4040 4041 function doInitializeSdk(script, params) { 4042 const sdk = new script.PaymentServicesSDK(constructSdkConfig(params)); 4043 const namespaceInitFutures = []; 4044 4045 if (params.paymentLocation) { 4046 namespaceInitFutures.push(sdk.Payment.init({location: params.paymentLocation})); 4047 } 4048 4049 return Promise.all(namespaceInitFutures).then(() => sdk); 4050 } 4051 4052 function initializeSdk(script, params) {
4053 const memoKey = objToSortedJsonString(params); 4054 4055 if (!(memoKey in initializeSdkMemo)) { 4056 initializeSdkMemo[memoKey] = doInitializeSdk(script, params); 4057 } 4058 4059 return initializeSdkMemo[memoKey]; 4060 } 4061 4062 /** 4063 * @param {Object} sdkParams the paymentSdkParams array from 4064 * SmartButtons::getPaymentSDKBasedComponentParams() 4065 * @param {String} location a PaymentLocation enum value, e.g. "CART" 4066 * @return {Promise<Object>} the initialised Payment Services SDK 4067 */ 4068 function loadSdk(sdkParams, location) { 4069 if (!sdkParams || !sdkParams.paymentsSDKUrl) { 4070 return Promise.reject(new Error("Missing required argument: 'preferredUrl'.")); 4071 } 4072 4073 const pullScriptParams = { 4074 preferredUrl: sdkParams.paymentsSDKUrl, 4075 fallbackUrl: sdkParams.paymentsSDKFallbackUrl || null 4076 }; 4077 const initializeSdkParams = { 4078 gqlEndpoint: sdkParams.graphQLEndpointUrl || null, 4079 customerToken: sdkParams.oauthToken || null, 4080 commerceVersion: sdkParams.commerceVersion || null, 4081 isGuestCustomer: sdkParams.isGuestCustomer ?? null, 4082 storeViewCode: sdkParams.storeViewCode || null, 4083 paymentLocation: location || null, 4084 shouldInitVault: false 4085 }; 4086 4087 const memoKey = '{pullScriptParams:' + objToSortedJsonString(pullScriptParams) 4088 + ',initializeSdkParams:' + objToSortedJsonString(initializeSdkParams) + '}'; 4089 4090 if (!(memoKey in loadMemo)) { 4091 loadMemo[memoKey] = pullScript(pullScriptParams) 4092 .then((script) => initializeSdk(script, initializeSdkParams)); 4093 } 4094 4095 return loadMemo[memoKey]; 4096 } 4097 4098 class ApplePayButton { 4099 /** 4100 * @param {Object} config 4101 * @param {String} config.location a PaymentLocation enum value, e.g. "CART" 4102 * @param {String} config.buttonContainerId id of the element to render into 4103 * @param {String} config.placeOrderUrl 4104 * @param {String} config.cancelUrl 4105 * @param {Object} config.paymentSdkParams 4106 * @param {Function} [config.getCartId] resolves the masked quote id 4107 * @param {Function} [config.validate] return false to suppress the payment sheet 4108 * @param {Function} [config.showLoader] 4109 * @param {Function} [config.logCustomerErrorMessage] 4110 * @param {Function} [config.refreshCustomerMessages] 4111 * @param {Function} [config.onOrderPlaced] 4112 */ 4113 constructor(config) { 4114 Object.assign(this, { 4115 location: '', 4116 buttonContainerId: '', 4117 placeOrderUrl: '', 4118 cancelUrl: '', 4119 paymentSdkParams: {}, 4120 getCartId: () => Promise.reject(new Error('No cart id getter provided.')), 4121 validate: () => true, 4122 showLoader: () => {}, 4123 logCustomerErrorMessage: () => {}, 4124 refreshCustomerMessages: () => {}, 4125 onOrderPlaced: () => {} 4126 }, config); 4127 4128 this.hasCustomerInteracted = false; 4129 4130 this.paymentSdkReady = loadSdk(this.paymentSdkParams, this.location); 4131 } 4132 4133 /** 4134 * Renders the Apple Pay button, or rejects if Apple Pay is unavailable. 4135 * 4136 * @return {Promise<void>} 4137 */ 4138 async renderApplePayButton() { 4139 const sdk = await this.paymentSdkReady; 4140 4141 if (!sdk.Payment.ApplePay.isAvailable()) { 4142 throw new Error('Apple Pay is not available.'); 4143 } 4144 4145 if (!document.getElementById(this.buttonContainerId)) { 4146 return; 4147 } 4148 4149 await sdk.Payment.ApplePay.render({ 4150 container: '#' + this.buttonContainerId, 4151 buttonLanguage: {locale: BUTTON_LOCALE}
4151, 4152 useApplePayCouponCodes: this.location !== 'CHECKOUT' && this.location !== 'CART', 4153 useApplePayShippingAddress: this.location !== 'CHECKOUT', 4154 useApplePayBillingAddress: this.location !== 'CHECKOUT', 4155 getCartId: () => this.getCartId(), 4156 onButtonClick: (showPaymentSheet) => this.onButtonClick(showPaymentSheet), 4157 onSuccess: () => this.onSuccess().catch((error) => this.onError(error)), 4158 onError: (error) => this.onError(error), 4159 onCancel: () => this.onCancel(), 4160 disabled: false 4161 }); 4162 } 4163 4164 onButtonClick(showPaymentSheet) { 4165 this.hasCustomerInteracted = true; 4166 4167 if (!this.validate()) { 4168 return; 4169 } 4170 4171 this.showLoader(true); 4172 this.refreshCustomerMessages(); 4173 showPaymentSheet(); 4174 } 4175 4176 async onSuccess() { 4177 const body = new FormData(); 4178 4179 body.append('form_key', hyva.getFormKey()); 4180 body.append('location', mapLocationToPageType(this.location) || 'undefined'); 4181 4182 const response = await fetch(this.placeOrderUrl, { 4183 method: 'POST', 4184 body: body, 4185 credentials: 'same-origin' 4186 }); 4187 const result = await response.json(); 4188 4189 if (result.error) { 4190 this.refreshCustomerMessages(); 4191 4192 throw this.createResponseError(result.error); 4193 } 4194 4195 this.onOrderPlaced(); 4196 4197 if (result.redirectUrl) { 4198 window.location.replace(result.redirectUrl); 4199 } 4200 } 4201 4202 onError(error) { 4203 this.showLoader(false); 4204 4205 if (!this.hasCustomerInteracted) { 4206 console.error('Apple Pay set-up failed before any customer interaction:', error); 4207 4208 return; 4209 } 4210 4211 const localizedSdkMessage = mapPaymentSdkErrorMessage(error); 4212 4213 if (this.isResponseError(error)) { 4214 this.logCustomerErrorMessage(error.message); 4215 } else if (localizedSdkMessage) { 4216 this.logCustomerErrorMessage(localizedSdkMessage); 4217 } else if (error && error.debug_id) { 4218 this.logCustomerErrorMessage(MESSAGE_PAYMENT_INVALID); 4219 } else { 4220 this.logCustomerErrorMessage(MESSAGE_REQUEST_FAILED); 4221 } 4222 } 4223 4224 onCancel() { 4225 this.showLoader(false); 4226 4227 if (this.cancelUrl) { 4228 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 4229 window.location = this.cancelUrl; 4230 } 4231 } 4232 4233 adobePaymentsStore() { 4234 return typeof Alpine === 'undefined' ? null : Alpine.store('adobe_payments'); 4235 } 4236 4237 createResponseError(message) { 4238 const store = this.adobePaymentsStore(); 4239 4240 return store ? store.createResponseErrorInstance(message) : new Error(message); 4241 } 4242 4243 isResponseError(error) { 4244 const store = this.adobePaymentsStore(); 4245 4246 return store ? error instanceof store.ResponseError : false; 4247 } 4248 } 4249 4250 window.ktplPaymentSdk = { 4251 loadSdk: loadSdk, 4252 ApplePayButton: ApplePayButton, 4253 mapLocationToPageType: mapLocationToPageType, 4254 mapPaymentSdkErrorMessage: mapPaymentSdkErrorMessage 4255 }; 4256 }()); 4257</script>
vendor: 1 bytes, line 4257
4257
4258<script> 4259 class GooglePayWrapper 4260 { 4261 /** TODO: Worth downloading this and hosting it as part of the module? */ 4262 static googleSDKSrc = 'https://pay.google.com/gp/p/js/pay.js'; 4263 static PRODUCTION_MODE = 'PRODUCTION'; 4264 static TEST_MODE = 'TEST'; 4265 4266 instance = null; 4267 paypalSdk = null; 4268 merchantInfo = null; 4269 allowedPaymentMethods = null; 4270 4271 baseRequest = { 4272 apiVersion: 2, 4273 apiVersionMinor: 0, 4274 callbackIntents: ['PAYMENT_AUTHORIZATION'], 4275 emailRequired: true, 4276 shippingAddressParameters: {phoneNumberRequired: true} 4277 }; 4278 4279 constructor(paypalSdk, mode, performAuthorization, isVirtual = false) 4280 { 4281 if (mode !== GooglePayWrapper.PRODUCTION_MODE) { 4282 mode = GooglePayWrapper.TEST_MODE; 4283 } 4284 4285 this.paypalSdk = paypalSdk; 4286 this.isVirtual = isVirtual; 4287 this.instance = new google.payments.api.PaymentsClient({ 4288 environment: mode, 4289 paymentDataCallbacks: { 4290 onPaymentAuthorized: performAuthorization 4291 } 4292 }); 4293 } 4294 4295 getClient() { 4296 if (this.instance == null) { 4297 throw new Error('GoogleClient should be initialized before the first use'); 4298 } 4299 4300 return this.instance; 4301 } 4302 4303 createButton(props) 4304 { 4305 return this.getClient().createButton(props); 4306 } 4307 4308 async showPopup(paymentData) 4309 { 4310 try { 4311 let googlePayConfig = await this.getGooglePayConfig(); 4312 const data = await this.getGooglePaymentDataRequest(paymentData); 4313 4314 await this.getClient().loadPaymentData(data); 4315 } catch (e) { 4316 this.onError(e); 4317 } 4318 } 4319 4320 async getGooglePayConfig() 4321 { 4322 if (this.allowedPaymentMethods === null || this.merchantInfo === null) { 4323 const googlePayConfig = await this.paypalSdk.Googlepay().config(); 4324 4325 this.allowedPaymentMethods = googlePayConfig.allowedPaymentMethods; 4326 this.merchantInfo = googlePayConfig.merchantInfo; 4327 } 4328 4329 return { 4330 allowedPaymentMethods: this.allowedPaymentMethods, 4331 merchantInfo: this.merchantInfo 4332 }; 4333 } 4334 4335 async isReadyToPay() 4336 { 4337 let googlePayConfig = await this.getGooglePayConfig(); 4338 const isReadyToPayRequest = this.getGoogleIsReadyToPayRequest(googlePayConfig.allowedPaymentMethods); 4339 const response = await this.getClient().isReadyToPay(isReadyToPayRequest); 4340 4341 return response; 4342 } 4343 4344 getGoogleIsReadyToPayRequest(allowedPaymentMethods) 4345 { 4346 return Object.assign({}, this.baseRequest, { 4347 allowedPaymentMethods: allowedPaymentMethods 4348 }); 4349 } 4350 4351 async getGooglePaymentDataRequest(transactionInfo) 4352 { 4353 const paymentDataRequest = Object.assign({}, this.baseRequest), 4354 {allowedPaymentMethods, merchantInfo} = await this.getGooglePayConfig(); 4355 4356 paymentDataRequest.allowedPaymentMethods = allowedPaymentMethods; 4357 paymentDataRequest.transactionInfo = transactionInfo; 4358 paymentDataRequest.merchantInfo = merchantInfo; 4359 paymentDataRequest.shippingAddressRequired = !this.isVirtual; 4360 4361 return paymentDataRequest; 4362 } 4363 4364 onError(e) 4365 { 4366 console.log(e); 4367 } 4368 4369 /** 4370 * Create order request. 4371 * 4372 * @param {String} url 4373 * @param {Object} payPalOrderData 4374 * @param {FormData} orderData 4375 * @return {Promise<Object>} 4376 */ 4377 static performCreateOrder(url, payPalOrderData, orderData) 4378 { 4379 orderData = orderData || new FormData(); 4380 orderData.append('form_key', hyva.getFormKey()); 4381 orderData.append('payment_source', payPalOrderData['paymentSource']); 4382 4383 return fetch(url, { 4384 method: 'POST', 4385 headers: {}, 4386 body: orderData || new FormData(), 4387 credentials: 'same-origin' 4388 }).then(function (response) { 4389 return response.json(); 4390 }); 4391 } 4392 4393 /** 4394 * Payment authorization request. 4395 * 4396 * @return {Promise<Object>} 4397 */ 4398 static performOnAuthorize(url, data) 4399 { 4400 const orderData = new FormData(); 4401 4402 orderData.append('form_key', hyva.getFormKey()); 4403 orderData.append('paypal_order_id', data.orderID); 4404 4405 return fetch(url, { 4406 method: 'POST', 4407 headers: {}, 4408 body: orderData, 4409 credentials: 'same-origin' 4410 }).then(function (response) { 4411 return response.json(); 4412 }); 4413 } 4414 4415 static async loadGoogleSDK() 4416 { 4417 try { 4418 await window.paypalLoadCustomScript({url: GooglePayWrapper.googleSDKSrc}); 4419 } catch (e) { 4420 console.log('Error while loading google sdk: ', e); 4421 } 4422 } 4423 4424 static async initGooglePayButtons(smartButtonsInstance, googleAbstract, containerId, isVirtual) 4425 { 4426 const googlePayButton = new GooglePayButton(smartButtonsInstance, googleAbstract, containerId, isVirtual); 4427 await googlePayButton.sdkLoaded; 4428 await googlePayButton.initGoogleSDK(); 4429 } 4430 } 4431 4432 /** 4433 * Init this object in GooglePayButton when paypal sdk is loaded 4434 */ 4435 window.googlePayWrapper = null; 4436</script>
vendor: 1 bytes, line 4436
4436
4437<script> 4438 /** 4439 * GooglePay button wrapper 4440 */ 4441 class GooglePayButton 4442 { 4443 constructor(smartButtonsInstance, googleAbstract, containerId, isVirtual = false) 4444 { 4445 this.smartButtonsInstance = smartButtonsInstance; 4446 this.isVirtual = isVirtual; 4447 /** 4448 * TODO: We need to check here these object dupes. We need to make sure the remove where not needed 4449 * At best we would want to leave the dynamic values to avoid errors. We need to recheck this code 4450 * and make sure we are not removing any needed values. We need to add comments to the code to make sure 4451 * we know what each value is doing. 4452 */ 4453 4454 /** 4455 * TODO: resolve duplicate properties 4456 */ 4457 const defaults = { 4458 sdkNamespace: 'paypalGooglePay', 4459 paypal: null, 4460 paymentSource: 'googlepay', 4461 updateQuoteUrl: '/paymentservicespaypal/smartbuttons/updatequote/', 4462 instance: null, 4463 allowedPaymentMethods: null, 4464 merchantInfo: null, 4465 paypalOrderId: null, 4466 eligible: false, 4467 mode: smartButtonsInstance.componentParams.googlePayMode, 4468 shippingAddressRequired: true, 4469 buttonContainerId: containerId, 4470 scriptParams: googleAbstract.sdkParams, 4471 styles: smartButtonsInstance.componentParams.styles, 4472 createOrderUrl: smartButtonsInstance.componentParams.createOrderUrl, 4473 authorizeOrderUrl: smartButtonsInstance.componentParams.authorizeOrderUrl, 4474 beforeCreateOrder: smartButtonsInstance.beforeCreateOrder.bind(smartButtonsInstance), 4475 catchCreateOrder: smartButtonsInstance.catchError.bind(smartButtonsInstance), 4476 finallyCreateOrder: smartButtonsInstance.showLoader.bind(smartButtonsInstance), 4477 beforeOnAuthorize: smartButtonsInstance.beforeOnAuthorize.bind(smartButtonsInstance), 4478 catchOnAuthorize: smartButtonsInstance.catchError.bind(smartButtonsInstance), 4479 finallyOnAuthorize: smartButtonsInstance.showLoader.bind(smartButtonsInstance), 4480 onError: smartButtonsInstance.catchError.bind(smartButtonsInstance), 4481 onCancel: smartButtonsInstance.onCancel.bind(smartButtonsInstance) 4482 }; 4483 4484 Object.assign(this, defaults); 4485 4486 // Binding methods if not already bound 4487 [ 4488 'beforeCreateOrder', 4489 'catchCreateOrder', 4490 'beforeOnAuthorize', 4491 'afterOnAuthorize', 4492 'onError', 4493 'onCancel' 4494 ].forEach(method => { 4495 if (this[method] instanceof Function) { 4496 this[method] = this[method].bind(this); 4497 } 4498 }); 4499 4500 this.sdkLoaded = Promise.all([this.loadPayPalSDK(), GooglePayWrapper.loadGoogleSDK()]); 4501 } 4502 4503 async loadPayPalSDK() 4504 { 4505 try { 4506 const sdkScript = await Alpine.store('adobe_payments') 4507 .scriptLoaderWrapper 4508 .returnSdk(this.scriptParams, this.sdkNamespace); 4509 4510 this.paypal = sdkScript; 4511 } catch (e) { 4512 this.onError(e); 4513 } 4514 } 4515 4516 async initGoogleSDK() 4517 { 4518 try { 4519 window.googlePayWrapper = new GooglePayWrapper( 4520 this.paypal, 4521 this.mode, 4522 this.performAuthorization.bind(this), 4523 this.isVirtual 4524 ); 4525 4526 const response = await window.googlePayWrapper.isReadyToPay(); 4527 4528 if (response.result) { 4529 this.renderGooglePayButton(); 4530 } 4531 } catch (e) { 4532 this.onError({hidden: true, error: e}); 4533 } 4534 } 4535 4536 renderGooglePayButton() 4537 { 4538 const buttonContainer = document.getElementById(this.buttonContainerId); 4539 4540 if (!buttonContainer) { 4541 console.error('Google Pay button container not found.'); 4542 4543 return; 4544 } 4545 4546 let buttonProps = { 4547 onClick: this.onClick.bind(this), 4548 buttonColor: this.styles.button_color, 4549 buttonType: this.styles.button_type, 4550 buttonSizeMode: 'fill' 4551 }; 4552 4553 if (this.styles.button_custom_height) { 4554 buttonContainer.style.height = this.styles.button_custom_height + 'px'; 4555 } 4556 4557 buttonContainer.innerHTML = ''; 4558 4559 buttonContainer.append( 4560 window.googlePayWrapper.createButton(buttonProps) 4561 ); 4562 4563 this.eligible = true; 4564 } 4565 4566 onCancel() 4567 { 4568 this.onError(); 4569 } 4570 4571 enableButton() 4572 { 4573 document.querySelector(`#${this.buttonContainerId} button`).disable = false;
4574 } 4575 4576 disableButton() 4577 { 4578 document.querySelector(`#${this.buttonContainerId} button`).disable = true; 4579 } 4580 4581 performAuthorization(paymentData) 4582 { 4583 return new Promise(function (resolve) { 4584 this.processPayment(paymentData) 4585 .then(resolve) 4586 .catch(function () { 4587 this.onError(new Error('couldn\'t process payment')); 4588 resolve({transactionState: 'ERROR'}); 4589 }.bind(this)); 4590 }.bind(this)); 4591 } 4592 4593 async processPayment(paymentData) 4594 { 4595 try { 4596 const {status} = await this.paypal.Googlepay().confirmOrder({ 4597 orderId: this.paypalOrderId, 4598 paymentMethodData: paymentData.paymentMethodData, 4599 shippingAddress: paymentData.shippingAddress, 4600 email: paymentData.email 4601 }); 4602 4603 if (status === 'APPROVED') { 4604 this.onApprove(paymentData); 4605 return {transactionState: 'SUCCESS'}; 4606 } 4607 4608 this.onError(new Error('couldn\'t approve order')); 4609 4610 return {transactionState: 'ERROR'}; 4611 } catch (err) { 4612 this.onError(err); 4613 4614 return { 4615 transactionState: 'ERROR', 4616 error: { 4617 message: err.message 4618 } 4619 }; 4620 } 4621 } 4622 4623 onClick() 4624 { 4625 if (this.smartButtonsInstance) { 4626 this.smartButtonsInstance.showLoader(true); 4627 } 4628 4629 this.createOrder(); 4630 } 4631 4632 /** 4633 * Calls before create order. 4634 * 4635 * @return {Promise} 4636 */ 4637 beforeCreateOrder() 4638 { 4639 return Promise.resolve(); 4640 } 4641 4642 /** 4643 * Create order. 4644 * 4645 * @return {Promise} 4646 */ 4647 createOrder() 4648 { 4649 let data = {'paymentSource': this.paymentSource}; 4650 4651 return this.beforeCreateOrder() 4652 .then(GooglePayWrapper.performCreateOrder.bind(this, this.createOrderUrl, data)) 4653 .then(function (orderData) { 4654 this.paypalOrderId = this.afterCreateOrder(orderData); 4655 return this.paypalOrderId; 4656 }.bind(this)).catch(function (error) { 4657 return this.catchCreateOrder(error); 4658 }.bind(this) 4659 ).catch(e => { 4660 console.log(e); 4661 }); 4662 } 4663 4664 /** 4665 * After order created. 4666 * 4667 * @param {Object} data 4668 * @return {String} 4669 */ 4670 afterCreateOrder(data) 4671 { 4672 if (data.response['paypal-order'] && data.response['paypal-order']['mp_order_id']) { 4673 this.paymentsOrderId = data.response['paypal-order']['mp_order_id']; 4674 this.paypalOrderId = data.response['paypal-order'].id; 4675 4676 window.googlePayWrapper.showPopup({ 4677 displayItems: [], 4678 currencyCode: data.response['paypal-order']['currency_code'], 4679 totalPriceStatus: 'FINAL', 4680 totalPrice: Number(data.response['paypal-order']['amount']).toString(), 4681 totalPriceLabel: 'Total' 4682 }); 4683 4684 return this.paypalOrderId; 4685 } 4686 4687 throw new Error(); 4688 } 4689 4690 /** 4691 * Catch error on order creation. 4692 */ 4693 catchCreateOrder() 4694 { 4695 4696 } 4697 4698 /** 4699 * On payment approve. 4700 * 4701 * @param {Object} data 4702 * @param {Object} actions 4703 * @return {Promise} 4704 */ 4705 async onApprove() 4706 { 4707 const data = {orderID: this.paypalOrderId}; 4708 4709 try { 4710 await this.beforeOnAuthorize(); 4711 const response = await GooglePayWrapper.performOnAuthorize(this.updateQuoteUrl, data); 4712 4713 this.afterOnAuthorize(response); 4714 } catch (e) { 4715 this.onError(e); 4716 } 4717 } 4718 4719 beforeOnAuthorize() 4720 { 4721 return Promise.resolve(); 4722 } 4723 4724 afterOnAuthorize(res) 4725 { 4726 if (res.success) { 4727 return window.location = res.redirectUrl; 4728 } 4729 4730 if (this.smartButtonsInstance) { 4731 throw smartButtonsInstance.store.adobe_payments.createResponseErrorInstance(res.error); 4732 } 4733 } 4734 4735 /** 4736 * Calls when error happened on paypal side. 4737 * 4738 * @param {Error} error 4739 */ 4740 onError(error) 4741 { 4742 console.log('Error: ', error.message); 4743 } 4744 4745 isEligible() 4746 { 4747 return this.eligible; 4748 } 4749 } 4750 4751 /** 4752 * End of GooglePay button wrapper 4753 */ 4754</script>
4754 4755
4756<script> 4757 document.addEventListener('alpine:init', () => { 4758 Alpine.store('adobe_payments', { 4759 PaypalAbstract: class { 4760 constructor(sdkParamsKey = 'paypal') { 4761 this.sdkParamsKey = sdkParamsKey; // 'paypal' or 'applepay' or 'googlepay' 4762 this.sdkParams = []; 4763 this.cacheTtl = 30000; 4764 } 4765 4766 /** 4767 * Get SDK parameters. 4768 * @param {Object} customerData - The customer data. 4769 * @return {Promise<Object>} A promise that resolves to the SDK parameters. 4770 */ 4771 getSdkParams(customerData) { 4772 return Alpine.store('adobe_payments') 4773 .getSdkParams 4774 .promiseReturn(this.cacheTtl, customerData) 4775 .then(sdkParams => { 4776 this.sdkParams = sdkParams[this.sdkParamsKey]; 4777 }); 4778 } 4779 }, 4780 4781 4782 getSdkParams: { 4783 promise: null, 4784 timeoutKey: 'payments-sdk-params-timeout', 4785 paymentsKey: 'payments', 4786 sdkParamsKey: 'sdkParams', 4787 4788 promiseReturn(cacheTtl, customerData) { 4789 if (!this.promise) { 4790 this.promise = new Promise((resolve, reject) => { 4791 let dateNow = Date.now(); 4792 let dateTo = dateNow + cacheTtl; 4793 let timeout = localStorage.getItem(this.timeoutKey); 4794 4795 if (timeout < dateNow || !timeout) { 4796 localStorage.setItem(this.timeoutKey, dateTo); 4797 4798 return resolve(customerData[this.paymentsKey][this.sdkParamsKey]); 4799 } 4800 4801 // Check if the nested key exists in the customerData object. 4802 if (customerData 4803 && customerData[this.paymentsKey] 4804 && this.sdkParamsKey in customerData[this.paymentsKey] 4805 ) { 4806 return resolve(customerData[this.paymentsKey][this.sdkParamsKey]); 4807 } 4808 4809 if (customerData && customerData[this.paymentsKey]) { 4810 customerData[this.paymentsKey].subscribe((payments) => { 4811 resolve(payments[this.sdkParamsKey]); 4812 }); 4813 } 4814 }); 4815 } 4816 4817 return this.promise; 4818 } 4819 }, 4820 4821 4822 scriptLoaderWrapper: { 4823 promises: {}, 4824 defaultNamespace: 'paypal', 4825 4826 /** 4827 * Parse src query string and move all params to object 4828 * 4829 * @param {Object} params 4830 * @return {Object} 4831 */ 4832 processParamsSrc(params) { 4833 let processedParams = {...params}; 4834 let url = new URL(params.src); 4835 let queryString = url.search.substring(1); 4836 let urlParams = JSON.parse( 4837 '{"' 4838 + decodeURI(queryString).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') 4839 + '"}' 4840 ); 4841 4842 Object.assign(processedParams, urlParams); 4843 delete processedParams.src; 4844 4845 return processedParams; 4846 }, 4847 4848 /** 4849 * Convert params to object key => value format 4850 * 4851 * @param {Object} params 4852 * @return {Object} 4853 */ 4854 convertToParamsObject(params) { 4855 let processedParams = {}; 4856
4857 params.forEach(function (param) { 4858 processedParams[param.name] = param.value; 4859 }); 4860 4861 return processedParams; 4862 }, 4863 4864 /** 4865 * Load PayPal sdk with params. 4866 * 4867 * @param {Array} params 4868 * @param {String} sdkNamespace 4869 * @return {Promise} 4870 */ 4871 returnSdk(params, sdkNamespace) { 4872 let src; 4873 4874 if (!params || !params.length) { 4875 return Promise.reject(); 4876 } 4877 4878 params = this.convertToParamsObject(params); 4879 params['data-namespace'] = sdkNamespace || this.defaultNamespace; 4880 4881 if (!params || !params.src) { 4882 return Promise.reject(); 4883 } 4884 4885 src = params.src; 4886 4887 if (!this.promises[src]) { 4888 params = this.processParamsSrc(params); 4889 4890 this.promises[src] = window.paypalLoadScript(params); 4891 } 4892 4893 return this.promises[src]; 4894 } 4895 }, 4896 4897 4898 Message: class { 4899 constructor( 4900 { 4901 sdkNamespace = 'paypal', 4902 scriptParams = null, 4903 renderContainer = null, 4904 amountAttribute = 'data-pp-amount', 4905 styles = '', 4906 placement = 'cart', 4907 amount = null 4908 } = {} 4909 ) { 4910 this.sdkNamespace = sdkNamespace; 4911 this.scriptParams = scriptParams; 4912 this.renderContainer = renderContainer; 4913 this.amountAttribute = amountAttribute; 4914 this.styles = styles; 4915 this.placement = placement; 4916 this.amount = amount; 4917 4918 // Load the payment SDK (e.g., PayPal, Apple Pay, etc.) 4919 this.sdkLoaded = this.loadSdk(); 4920 } 4921 4922 async loadSdk() { 4923 try { 4924 const sdkScript = await Alpine.store('adobe_payments') 4925 .scriptLoaderWrapper 4926 .returnSdk(this.scriptParams, this.sdkNamespace); 4927 4928 return sdkScript; // Assuming all SDKs provide a similar interface 4929 } catch (error) { 4930 console.error('Failed to load payment SDK:', error); 4931 } 4932 } 4933 4934 updateAmount(amount) { 4935 document.querySelectorAll(this.renderContainer).forEach((element) => { 4936 element.setAttribute(this.amountAttribute, amount); 4937 }); 4938 } 4939 4940 render() { 4941 return this.sdkLoaded.then((sdkScript) => { 4942 sdkScript.Messages({ 4943 amount: parseFloat(this.amount).toFixed(2), 4944 placement: this.placement, 4945 style: this.styles 4946 }).render(this.renderContainer); 4947 }).catch(() => { 4948 console.error('Error: Failed to load PayPal SDK script!'); 4949 }); 4950 } 4951 }, 4952 4953 createMessageInstance(parameters) { 4954 return new this.Message(parameters); 4955 }, 4956 4957 4958 ProductDataProvider: class { 4959 constructor(options = {}) { 4960 this.qtyFieldSelector = options.qtyFieldSelector || 'input[name="qty"]'; 4961 this.priceBoxSelector = options.priceBoxSelector || '.price-wrapper'; 4962 this.priceBoxContextSelector = options.priceBoxContextSelector || '.price-box'; 4963 this.finalPriceSelector = options.finalPriceSelector || '.price'; 4964 this.price = document.querySelector( 4965 this.priceBoxContextSelector + ' ' + this.finalPriceSelector 4966 ).innerHTML.replace(/[^\d.]/g, ''); 4967 this.qty = document.querySelector(this.qtyFieldSelector).value; 4968 4969 // Handle providerOptions here as well 4970 if (options && options.updateAmount) { 4971 this.updateAmount = options.updateAmount; 4972 } 4973 4974 if (options && options.productId) { 4975 this.productId = options.productId; 4976 } 4977 4978 this.setupCommon(); 4979 } 4980 4981 /** @inheritdoc */ 4982 setupCommon() {
4983 this.quantitySubscribe(); 4984 this.priceSubscribe(); 4985 } 4986 4987 /** 4988 * Subscribe for quantity changes. 4989 */ 4990 quantitySubscribe() { 4991 document.querySelectorAll(this.qtyFieldSelector).forEach(element => { 4992 element.addEventListener('change', () => { 4993 this.qty = element.value; 4994 this.updateAmount(this.getAmount()); 4995 }); 4996 }); 4997 } 4998 4999 /** 5000 * Subscribe for price change. 5001 */ 5002 priceSubscribe() { 5003 window.addEventListener('update-prices-' + this.productId, (event) => { 5004 const prices = event.detail; 5005 this.price = prices.finalPrice.amount; 5006 this.updateAmount(this.getAmount()); 5007 }); 5008 } 5009 5010 /** 5011 * Trigger price update. 5012 */ 5013 updatePrice() { 5014 document.querySelector(this.priceBoxSelector).dispatchEvent(new Event('updatePrice')); 5015 } 5016 5017 /** 5018 * Get product amount. 5019 * 5020 * @return {Number} 5021 */ 5022 getAmount() { 5023 return this.qty * this.price; 5024 } 5025 }, 5026 5027 createProductDataProviderInstance(parameters) { 5028 return new this.ProductDataProvider(parameters); 5029 }, 5030 5031 GroupedProductDataProvider: class { 5032 constructor(options = {}) { 5033 this.tableWrapperSelector = options.tableWrapperSelector || '.table-wrapper.grouped'; 5034 this.qtyFieldSelector = options.qtyFieldSelector || 'input.qty'; 5035 this.priceBoxSelector = options.priceBoxSelector || '.price-box'; 5036 this.priceInfo = {}; 5037 5038 if (options && options.updateAmount) { 5039 this.updateAmount = options.updateAmount; 5040 } 5041 5042 if (options && options.productId) { 5043 this.productId = options.productId; 5044 } 5045 5046 this.initialize(); 5047 } 5048 5049 initialize() { 5050 document.querySelectorAll(`${this.tableWrapperSelector} .grouped-products`).forEach((element, i) => { 5051 const priceBox = element.querySelector(this.priceBoxSelector); 5052 const qtyElement = element.querySelector(this.qtyFieldSelector); 5053 const productId = priceBox.getAttribute('data-product-id'); 5054 const priceElement = document.getElementById(`product-price-${productId}-1`); 5055 5056 this.priceInfo[productId] = { 5057 qty: this.getQuantity(qtyElement), 5058 price: parseFloat(priceElement.getAttribute('data-price-amount')) 5059 }; 5060 5061 /** TODO: This does not appear to be used? */ 5062 i++; 5063 }); 5064 5065 this.quantitySubscribe(); 5066 } 5067 5068 quantitySubscribe() { 5069 document.querySelectorAll(this.qtyFieldSelector).forEach((element) => { 5070 element.addEventListener('change', (event) => { 5071 const qtyElement = event.target; 5072 const parent = this.findParentWithClass(qtyElement, 'grouped-products'); 5073 const priceBox = parent.querySelector(this.priceBoxSelector); 5074 const productId = priceBox.getAttribute('data-product-id'); 5075 5076 if (this.priceInfo[productId]) { 5077 this.priceInfo[productId].qty = this.getQuantity(qtyElement); 5078 this.updateAmount(); 5079 } 5080 }); 5081 }); 5082 } 5083 5084 getAmount() { 5085 let amount = 0; 5086
5087 Object.values(this.priceInfo).forEach((info) => { 5088 amount += info.price * info.qty; 5089 }); 5090 5091 return amount; 5092 } 5093 5094 getQuantity(element) { 5095 const qty = parseFloat(element.value); 5096 5097 return isNaN(qty) ? 0 : qty; 5098 } 5099 5100 // Assuming there's additional functionality for subscribing to price changes and triggering price updates 5101 priceSubscribe() { 5102 // Implement functionality if needed 5103 } 5104 5105 updatePrice() { 5106 // Trigger price update functionality if needed 5107 } 5108 5109 findParentWithClass(element, className) { 5110 while (element && !element.classList.contains(className)) { 5111 element = element.parentElement; 5112 } 5113 5114 return element; // This will be null if no parent with the specified class name is found 5115 } 5116 }, 5117 5118 createGroupedProductDataProviderInstance(parameters) { 5119 return new this.GroupedProductDataProvider(parameters); 5120 }, 5121 5122 createBundleProductDataProviderInstance(parameters) { 5123 class BundleProductDataProvider extends Alpine.store('adobe_payments').ProductDataProvider { 5124 constructor(options = {}) { 5125 //fix here check setupCommon from parent class. We need to find where Hyva broke the change logic. Works on main Qty. Hyva html does not have consistency. 5126 super(options); 5127 5128 this.priceBoxContextSelector = options.priceBoxContextSelector || '#bundleSummary'; 5129 this.initialize(); 5130 } 5131 5132 /** @inheritdoc */ 5133 initialize() { 5134 this.updateAmount(this.getAmount()); 5135 5136 return this; 5137 } 5138 } 5139 5140 return new BundleProductDataProvider(parameters); 5141 }, 5142 5143 5144 SmartButtons: class { 5145 constructor(config) { 5146 const defaults = { 5147 sdkNamespace: 'defaultNamespace', 5148 scriptParams: {}, 5149 styles: {}, 5150 paymentRequest: { 5151 applepay: { 5152 requiredShippingContactFields: [] 5153 } 5154 }, 5155 createOrderUrl: '', 5156 authorizeOrderUrl: '', 5157 onClick: null, 5158 beforeCreateOrder: null, 5159 afterCreateOrder: null, 5160 catchCreateOrder: null, 5161 finallyCreateOrder: null, 5162 beforeOnAuthorize: null, 5163 afterOnAuthorize: null, 5164 catchOnAuthorize: null, 5165 finallyOnAuthorize: null, 5166 onError: null, 5167 onCancel: null, 5168 fundingSource: null, 5169 isVirtual: false, // Additional flags like 'isVirtual' can be setup here 5170 virtualContactFields: [], 5171 contactFields: [] 5172 }; 5173 5174 Object.assign(this, defaults, config); 5175 5176 // Binding methods if not already bound 5177 [ 5178 'beforeCreateOrder', 5179 'afterCreateOrder', 5180 'catchCreateOrder', 5181 'finallyCreateOrder', 5182 'beforeOnAuthorize', 5183 'afterOnAuthorize', 5184 'catchOnAuthorize', 5185 'finallyOnAuthorize', 5186 'onError', 5187 'onCancel' 5188 ].forEach(method => { 5189 if (this[method] instanceof Function) { 5190 this[method] = this[method].bind(this); 5191 } 5192 }); 5193
5194 // Load the payment SDK (e.g., PayPal, Apple Pay, etc.) 5195 this.sdkLoaded = this.loadSdk(); 5196 } 5197 5198 async loadSdk() { 5199 try { 5200 const sdkScript = await Alpine.store('adobe_payments') 5201 .scriptLoaderWrapper 5202 .returnSdk(this.scriptParams, this.sdkNamespace); 5203 5204 this.paypal = sdkScript; // Assuming all SDKs provide a similar interface 5205 } catch (error) { 5206 console.error('Failed to load payment SDK:', error); 5207 } 5208 } 5209 5210 /** 5211 * Create order request. 5212 * 5213 * @param {String} url 5214 * @param {Object} payPalOrderData 5215 * @param {FormData} orderData 5216 * @return {Promise<Object>} 5217 */ 5218 performCreateOrder = (url, payPalOrderData, orderData) => { 5219 orderData = orderData || new FormData(); 5220 orderData.append('form_key', this.cookieGetter('form_key')); 5221 orderData.append('payment_source', payPalOrderData['paymentSource']); 5222 5223 return fetch(url, { 5224 method: 'POST', headers: {}, body: orderData 5225 || new FormData(), credentials: 'same-origin' 5226 }).then(function (response) { 5227 return response.json(); 5228 }); 5229 } 5230 5231 cookieGetter = (name) => { 5232 const value = `; ${document.cookie}`; 5233 const parts = value.split(`; ${name}=`); 5234 5235 if (parts.length === 2) { 5236 return parts.pop().split(';').shift(); 5237 } 5238 } 5239 5240 /** 5241 * Payment authorization request. 5242 * 5243 * @return {Promise<Object>} 5244 */ 5245 performAuthorization = (url, data) => { 5246 let orderData = new FormData(); 5247 5248 orderData.append('form_key', this.cookieGetter('form_key')); 5249 orderData.append('paypal_order_id', data.orderID); 5250 orderData.append('paypal_payer_id', data.payerID); 5251 5252 return fetch(url, { 5253 method: 'POST', 5254 headers: {}, 5255 body: orderData, 5256 credentials: 'same-origin' 5257 }).then(function (response) { 5258 return response.json(); 5259 }); 5260 }; 5261 5262 /** 5263 * In the case where the button color is not supported by Apple (black or white) 5264 * Map the button color to black (same behavior as PayPal SDK script) 5265 * 5266 * @param buttonStyles 5267 * @returns {(*&{color: string})|*} 5268 */ 5269 mapButtonColorForApplePay = (buttonStyles) => { 5270 let buttonColor = buttonStyles.color; 5271 5272 if (buttonColor === 'black' || buttonColor === 'white') { 5273 return buttonStyles; 5274 } 5275 5276 return { 5277 ...buttonStyles, 5278 color: 'black' 5279 }; 5280 } 5281 5282 /** 5283 * Render Smart Buttons. 5284 * 5285 * @param {HTMLElement} element 5286 * @return {*} 5287 */ 5288 render = (element) => { 5289 let buttonsConfig; 5290 5291 if (typeof this.paypal === 'undefined' || !this.paypal.Buttons) { 5292 return null; 5293 } 5294 5295 if (element) { 5296 this.element = element; 5297 } 5298 5299 buttonsConfig = { 5300 element: this.element, 5301 paymentRequest: this.paymentRequest, 5302 style: this.styles, 5303 onClick: this.onClick, 5304 createOrder: this.createOrder, 5305 onApprove: this.onApprove, 5306 onError: this.onError, 5307 onCancel: this.onCancel, 5308 onInit: this.onInit 5309 }; 5310 5311 if (this.onShippingChange) { 5312 buttonsConfig.onShippingChange = this.onShippingChange.bind(this); 5313 } 5314 5315 if (this.fundingSource) { 5316 buttonsConfig.fundingSource = this.fundingSource; 5317 5318 if (this.fundingSource === 'applepay') { 5319 buttonsConfig.style = this.mapButtonColorForApplePay(this.styles); 5320 } 5321 } 5322 5323 this.instance = this.paypal.Buttons(buttonsConfig); 5324 5325 if (this.instance.isEligible()) { 5326 this.instance.render(this.element); 5327 } 5328 5329 return this.instance; 5330 } 5331 5332 /** 5333 * Calls when smart buttons initializing 5334 */ 5335 onInit = () => { 5336 } 5337 5338 /** 5339 * Calls when user click paypal button. 5340 */ 5341 onClick = () => { 5342 } 5343 5344 /** 5345 * Calls before create order. 5346 * 5347 * @return {Promise} 5348 */ 5349 5350 /** TODO: Looks like there may be a missing function here given the doc block above? */ 5351 5352 /** 5353 * Create order. 5354 * 5355 * @return {Promise} 5356 */ 5357 createOrder = (data) => { 5358 this.paymentSource = data['paymentSource']; 5359 return this.beforeCreateOrder() 5360 .then(this.performCreateOrder.bind(this, this.createOrderUrl, data)) 5361 .then(function (orderData) { 5362 return this.afterCreateOrder(orderData); 5363 }.bind(this)).catch(function (error) { 5364 return this.catchCreateOrder(error); 5365 }.bind(this)).finally(function (error) { 5366 return this.finallyCreateOrder(error); 5367 }.bind(this)); 5368 } 5369 5370 /**
5371 * After order created. 5372 * 5373 * @param {Object} data 5374 * @return {*} 5375 */ 5376 afterCreateOrder(data) { 5377 return data.orderId; 5378 } 5379 5380 /** 5381 * Catch error on order creation. 5382 */ 5383 catchCreateOrder() { 5384 5385 } 5386 5387 /** 5388 * Finally for order creation. 5389 * 5390 */ 5391 finallyCreateOrder() { 5392 5393 } 5394 5395 /** 5396 * Before authorization call. 5397 * 5398 * @return {Promise} 5399 */ 5400 beforeOnAuthorize(data) { 5401 return Promise.resolve(data); 5402 } 5403 5404 /** 5405 * On payment approve. 5406 * 5407 * @param {Object} data 5408 * @param {Object} actions 5409 * @return {Promise} 5410 */ 5411 onApprove = (data, actions) => { 5412 return this.beforeOnAuthorize(data, actions) 5413 .then(this.performAuthorization.bind(this, this.authorizeOrderUrl)) 5414 .then(function (authData) { 5415 return this.afterOnAuthorize(authData, actions); 5416 }.bind(this)).catch(function (error) { 5417 return this.catchOnAuthorize(error); 5418 }.bind(this)).finally(function (error) { 5419 return this.finallyOnAuthorize(error); 5420 }.bind(this)); 5421 } 5422 5423 /** 5424 * Calls after successful payment authorization. 5425 * 5426 * @param {Object} authData 5427 * @return {*} 5428 */ 5429 afterOnAuthorize = (authData) => { 5430 return authData; 5431 } 5432 5433 /** 5434 * Catch payment authorization errors. 5435 */ 5436 catchOnAuthorize = () => { 5437 } 5438 5439 /** 5440 * Finally for payment authorization. 5441 */ 5442 finallyOnAuthorize = () => { 5443 } 5444 5445 /** 5446 * Calls when shipping address chenges.. 5447 * 5448 * @param {Object} data 5449 */ 5450 onShippingChange = undefined; 5451 5452 /** 5453 * Calls when error happened on paypal side. 5454 * 5455 * @param {Error} error 5456 */ 5457 onError = (error) => { 5458 console.log('Error: ', error.message); 5459 } 5460 5461 /** 5462 * Calls when user canceled payment. 5463 */ 5464 onCancel = () => { 5465 } 5466 }, 5467 5468 createSmartButtonsInstance(parameters) { 5469 return new this.SmartButtons(parameters); 5470 }, 5471 5472 5473 ResponseError: class extends Error { 5474 /** 5475 * Constructs a new ResponseError instance. 5476 * 5477 * @param {String} message - The error message. 5478 */ 5479 constructor(message) { 5480 super(message); // Call the parent constructor with the message 5481 this.name = 'ResponseError'; // Overriding the name property 5482 // The stack property is inherited from Error 5483 } 5484 5485 /** 5486 * Return a string representation of the error. 5487 * 5488 * @returns {String} The error message. 5489 */ 5490 toString() { 5491 return this.message; 5492 } 5493 }, 5494 5495 createResponseErrorInstance(parameters) { 5496 return new this.ResponseError(parameters); 5497 }, 5498 5499 CheckoutReview: class { 5500 constructor(config = {}) { 5501 this.element = null; 5502 this.placeOrderButtonSelector = '#review-button'; 5503 this.shippingMethodFormSelector = '#shipping-method-form'; 5504 this.shippingMethodInputSelector = '#shipping-method'; 5505 this.updateContainerSelector = '#details-reload'; 5506 this.waitLoadingContainer = '#review-please-wait'; 5507 this.orderFormSelector = '#order-review-form'; 5508 this.editShoppingCartSelector = '.magento-payments-review-items .edit'; 5509 this.updateShippingMethodUrl = null; 5510 this.placeOrderUrl = null; 5511 this.canEditShippingMethod = false;
5512 this.isVirtual = false; 5513 5514 Object.assign(this, config); 5515 } 5516 5517 initialize(element) { 5518 this.element = element; 5519 5520 document.querySelector(this.placeOrderButtonSelector).addEventListener('click', this.submitOrder.bind(this)); 5521 document.querySelector(this.editShoppingCartSelector).addEventListener('click', this.invalidateCustomerData.bind(this)); 5522 5523 if (!this.isVirtual && this.canEditShippingMethod) { 5524 document.querySelector(this.shippingMethodInputSelector).addEventListener('change', this.selectShippingMethod.bind(this)); 5525 this.setPlaceOrderButtonActive(!!document.querySelector(this.shippingMethodInputSelector).value); 5526 } 5527 } 5528 5529 invalidateCustomerData() { 5530 // Implementation depends on how customer data is managed in your application 5531 console.log('Invalidate customer data'); 5532 } 5533 5534 beforeRequestStart() { 5535 document.querySelector(this.waitLoadingContainer).style.display = 'block'; 5536 } 5537 5538 onRequestComplete() { 5539 document.querySelector(this.waitLoadingContainer).style.display = 'none'; 5540 } 5541 5542 submitOrder() { 5543 if (this.validateForm()) { 5544 this.beforeRequestStart(); 5545 const form = document.querySelector(this.orderFormSelector); 5546 5547 // Ensure the form has the correct action URL 5548 form.action = this.placeOrderUrl; 5549 5550 // Submit the form 5551 form.submit(); 5552 5553 this.setPlaceOrderButtonActive(false); 5554 } 5555 } 5556 5557 validateForm() { 5558 if (this.element.dataset.mageValidation) { 5559 return this.element.checkValidity(); 5560 } 5561 return true; 5562 } 5563 5564 setPlaceOrderButtonActive(isActive) { 5565 const button = document.querySelector(this.placeOrderButtonSelector); 5566 button.disabled = !isActive; 5567 button.classList.toggle('no-checkout', !isActive); 5568 } 5569 5570 selectShippingMethod() { 5571 if (document.querySelector(this.waitLoadingContainer).style.display === 'block') { 5572 return false; 5573 } 5574 let shippingMethod = document.querySelector(this.shippingMethodInputSelector).value.trim(); 5575 this.setPlaceOrderButtonActive(false); 5576 5577 if (shippingMethod) { 5578 let formData = new FormData(document.querySelector(this.shippingMethodFormSelector)); 5579 formData.append('isAjax', 'true'); 5580 5581 console.log(this.updateShippingMethodUrl); 5582 5583 fetch(this.updateShippingMethodUrl, { 5584 method: 'POST', 5585 body: formData 5586 }) 5587 .then(response => response.json()) 5588 .then(data => { 5589 if (typeof data.redirectUrl === 'undefined') { 5590 document.querySelector(this.updateContainerSelector).innerHTML = data.html; 5591 } else { 5592 window.location = data.redirectUrl; 5593 } 5594 this.setPlaceOrderButtonActive(true); 5595 this.onRequestComplete(); 5596 }) 5597 .catch(error => { 5598 console.error('Error:', error); 5599 this.onRequestComplete(); 5600 }); 5601 5602 this.beforeRequestStart(); 5603 } 5604 } 5605 }, 5606 5607 createCheckoutReviewInstance(config) { 5608 return new this.CheckoutReview(config); 5609 } 5610 5611 }); 5612 }); 5613</script>
5613 5614<style>#html-body [data-pb-style=CXIHOC6]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=YUMPRLX]{border-style:none}#html-body [data-pb-style=B9WEYUB],#html-body [data-pb-style=C6S41IT]{max-width:100%;height:auto}@media only screen and (max-width: 767px) { #html-body [data-pb-style=YUMPRLX]{border-style:none} }</style><div class="cms-banner blog-list-banner" data-content-type="row" data-appearance="full-bleed" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="false" data-element="main" data-pb-style="CXIHOC6"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="YUMPRLX"><picture> 5615 <source media="(max-width: 768px)" srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" > 5616 5617 <source type="image/webp" 5618 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/wysiwyg/blog_1.webp"> 5619 5620 <source type="image/jpg" 5621 srcset="https://www.mrhankeystoys.com/media/wysiwyg/blog_1.jpg"> 5622 5623 <img width="1920" height="483" class="pagebuilder-mobile-hidden" src="https://www.mrhankeystoys.com/media/wysiwyg/blog_1.jpg" alt="Realistic & Fantasy Sex Toys – Expert Blog by Mr. Hankey’s Toys" title="" loading="lazy" data-element="desktop_image" data-pb-style="C6S41IT"decoding="async" ></picture> 5624<picture> 5625 <source media="(min-width: 769px)" srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" > 5626 5627 <source type="image/webp" 5628 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/wysiwyg/blog_1.webp"> 5629 5630 <source type="image/jpg" 5631 srcset="https://www.mrhankeystoys.com/media/wysiwyg/blog_1.jpg"> 5632 5633 <img width="1920" height="483" class="pagebuilder-mobile-only" src="https://www.mrhankeystoys.com/media/wysiwyg/blog_1.jpg" alt="Realistic & Fantasy Sex Toys – Expert Blog by Mr. Hankey’s Toys" title="" loading="lazy" data-element="mobile_image" data-pb-style="B9WEYUB"decoding="async" ></picture> 5634</figure><div class="testimonial-bg" data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="testimonial-bg-content"> 5635<h1 class="inner-title hide-for-mobile"><span>Hankey's Toys</span>Realistic & Fantasy Sex Toys â Expert Blog by Mr. Hankeyâs Toys</h1> 5636<div class="inner-title hide-for-desktop"><span>Hankey's Toys</span>Blogs</div> 5637<p class="sub-heading">Handcrafted Platinum-Cured Silicone</br>Custom Sizes, Colors & Firmness</p> 5638<p>Discover expert advice, wellness tips, and product reviews on realistic lifecast dildos and bold fantasy creationsâall hand-poured in the USA from 100% platinum-cured, hypoallergenic, phthalate-free silicone. Our custom toys are lab-tested for safety and made one at a time for your perfect fit. Learn from our cleaning guides, explore buying tips, and enjoy discreet worldwide shipping.</p> 5639</div></div></div> 5640 5641 5642<div class="block-categories mb-10"> 5643 <ul class="accordion flex flex-wrap gap-5 s767:gap-3"> 5644 <li><a class="all-blog active" href="/blog">All</a></li> 5645 <li> 5646 <a class="" href="https://www.mrhankeystoys.com/blog/reviews-and-comparisons"> 5647 Reviews & Comparisons <span class="hidden">(15)</span> 5648 </a> 5649 </li> <li> 5650 <a class="" href="https://www.mrhankeystoys.com/blog/size-and-xl-play"> 5651 Size & XL Play <span class="hidden">(11)</span> 5652 </a> 5653 </li> <li> 5654 <a class="" href="https://www.mrhankeystoys.com/blog/care-safety-and-materials"> 5655 Care, Safety &
5655 Materials <span class="hidden">(18)</span> 5656 </a> 5657 </li> <li> 5658 <a class="" href="https://www.mrhankeystoys.com/blog/customization-guides"> 5659 Customization Guides <span class="hidden">(3)</span> 5660 </a> 5661 </li> <li> 5662 <a class="" href="https://www.mrhankeystoys.com/blog/fantasy-and-sci-fi"> 5663 Fantasy & Sci-Fi <span class="hidden">(35)</span> 5664 </a> 5665 </li> <li> 5666 <a class="" href="https://www.mrhankeystoys.com/blog/realistic-and-lifecast"> 5667 Realistic & Lifecast <span class="hidden">(9)</span> 5668 </a> 5669 </li> <li> 5670 <a class="" href="https://www.mrhankeystoys.com/blog/sexual-wellness"> 5671 Sexual Wellness <span class="hidden">(20)</span> 5672 </a> 5673 </li> <li> 5674 <a class="" href="https://www.mrhankeystoys.com/blog/tips-and-guides"> 5675 Tips & Guides <span class="hidden">(58)</span> 5676 </a> 5677 </li> <li> 5678 <a class="" href="https://www.mrhankeystoys.com/blog/strap-on-harnesses-and-more"> 5679 Strap On Harnesses & More <span class="hidden">(6)</span> 5680 </a> 5681 </li> <li> 5682 <a class="" href="https://www.mrhankeystoys.com/blog/kinky"> 5683 Kinky <span class="hidden">(6)</span> 5684 </a> 5685 </ul> 5686</div> 5687
5688<script> 5689 document.addEventListener("DOMContentLoaded", (event) => { 5690 5691 let curUrl = window.location.href; 5692 5693 document.querySelectorAll('.block-categories li a').forEach(function(getHref){ 5694 let catUrl = getHref.getAttribute("href"); 5695 5696 if (catUrl === curUrl) { 5697 document.querySelectorAll('.block-categories li a').forEach(function(notActive){ 5698 notActive.classList.remove('active'); 5699 }); 5700 getHref.classList.add('active'); 5701 } 5702 }); 5703 }); 5704</script>
5704 5705
5705<script> 5706 /* e.g. hyva theme */ 5707 document.addEventListener('DOMContentLoaded', function(){ 5708 var items = document.getElementsByClassName('mfblogunveil'); 5709 var el, url; 5710 if (items.length) { 5711 for (var i=0; i<items.length;i++) { 5712 el = items[i]; 5713 url = el.getAttribute('data-original'); 5714 if (!url) { 5715 continue; 5716 }; 5717 if ('IMG' == el.tagName) { 5718 el.src = url; 5719 } else { 5720 el.style.backgroundImage = "url('" + url + "')"; 5721 } 5722 } 5723 } 5724 }); 5725 </script>
5725<span data-mage-init='{"emailCapture": {"url": "https://www.mrhankeystoys.com/event/action/capture/"}}'></span> 5726 5727 <div class="post-list-wrapper 123"> 5728 <ol class="post-list modern grid grid-cols-4 s1400:grid-cols-3 s1023:grid-cols-2 s767:grid-cols-1 s1400:gap-6 gap-10"> 5729 <li class="post-item post-holder post-holder-287 block"> 5730 5731 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 5732 <!-- post image --> 5733 <div class="post-image grow-0 shrink-0 order-none"> 5734 <!-- img container --> 5735 <div class="image-container relative"> 5736 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 5737 href="https://www.mrhankeystoys.com/blog/plus-size-strap-on-harness-giant-dildos" 5738 title="Beyond the Hook: How Fantasy Shapes Change Prostate Stimulation" 5739 > 5740 <picture> 5741 5742 5743 <source type="image/webp" 5744 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/ChatGPT_Image_Sep_30_2026_06_00_09_PM.webp"> 5745 5746 <source type="image/png" 5747 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/ChatGPT_Image_Sep_30_2026_06_00_09_PM.png"> 5748 5749 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/ChatGPT_Image_Sep_30_2026_06_00_09_PM.png" alt="A body-inclusive, non-explicit product setup showing an adjustable harness laid flat beside a large silicone dildo" width="499" height="281" decoding="async" /></picture> 5750 5751 </a> 5752 5753 <!-- post category--> 5754 <span class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 5755 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/size-and-xl-play" 5756 title="Size & XL Play"> 5757 Size & XL Play </a> 5758 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/care-safety-and-materials" 5759 title="Care, Safety & Materials"> 5760 Care, Safety & Materials </a> 5761 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/sexual-wellness" 5762 title="Sexual Wellness"> 5763 Sexual Wellness </a> 5764 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 5765 title="Tips & Guides"> 5766 Tips & Guides </a> 5767 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/strap-on-harnesses-and-more" 5768 title="Strap On Harnesses & More"> 5769 Strap On Harnesses & More </a> 5770 </span> 5771 <!-- end post category--> 5772 </div> 5773 </div> 5774 5775 <!-- block info --> 5776 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 5777 5778 <!-- block data --> 5779 <div class="post-data-wrap text-sm font-medium mb-3"> 5780 <!-- post author --> 5781 <sp
5781an class="post-author-name">Author: Mister Hankey </span> 5782 <span> | </span> 5783 5784 <!-- post date --> 5785 <span class="post-date">September 29, 2026</span> 5786 5787 <!-- post view --> 5788 </div> 5789 5790 <!-- post title --> 5791 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 5792 <h3 class="post-title"> 5793 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/plus-size-strap-on-harness-giant-dildos">Beyond the Hook: How Fantasy Shapes Change Prostate Stimulation</a> 5794 </h3> 5795 </div> 5796 5797 5798 5799 <!-- post description --> 5800 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 5801 <style>#html-body [data-pb-style=OIYURYP]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="OIYURYP"><div data-content-type="text" data-appearance="default" data-element="main"><h3 class="MsoNormal"><strong><span style="font-size: 11.0pt; mso-bidi-font-size: 12.0pt; line-height: 115%;">TL;DR</span></strong></h3> 5802<p class="MsoNormal"><span style="font-size: 11.0pt; mso-bidi-font-size: 12.0pt; line-height: 115%;">A good plus-size strap-on harness should fit where you actually wear it, stay stable as you move, and support the specific toy and attachment system you plan to use. Measure your body instead of relying on clothing size, confirm the exact toy-and-harness compatibility, and test the full setup before penetration. With a large dildo, weight distribution, base geometry, attachment hardware, and firmness can all change how controllable the setup feels.</span></p> 5803<p class="MsoNormal"><span style="font-size: 11.0pt; mso-bidi-font-size: 12.0pt; line-height: 115%;">There is no correct body for strap-on play. Awkward angles usually come from a poor harness fit, a heavy toy that overwhelms the front panel, or a position that makes both partners work around the equipment. Fix the setup and the experience can feel steadier, easier, and more connected.</span></p> 5804<h3 class="MsoNormal"><strong><span style="font-size: 11.0pt; mso-bidi-font-size: 12.0pt; line-height: 115%;">How to Measure for a Plus-Size Strap-On Harness</span></strong></h3> 5805<p class="MsoNormal"><span style="font-size: 11.0pt; mso-bidi-font-size: 12.0pt; line-height: 115%;">One waist measurement does not reveal where a harness will sit or how its straps behave when you bend, kneel, or sit. Body shape, hip width, thigh circumference, and mobility can all change where straps rest,</span></p></div></div></div> </div> 5806 5807 <!-- read more --> 5808 <div class="flex"> 5809 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/plus-size-strap-on-harness-giant-dildos" title="Beyond the Hook: How Fantasy Shapes Change Prostate Stimulation"> 5810 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 5811 </a> 5812 </div> 5813 </div> 5814 </div> 5815 </li> 5816 <li class="post-item post-holder post-holder-286 block"> 5817 5818 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 5819 <!-- post image --> 5820 <div class="post-image grow-0 shrink-0 order-none"> 5821 <!-- img container --> 5822 <div class="image-container relative"> 5823 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 5824 href="https://www.mrhankeystoys.com/blog//surprise-pour-custom-dildos" 5825 title="The Art of the Surprise Pour: Embracing the Chaos of Custom Silicone" 5826 > 5827 <picture> 5828 5829 5830 <source type="image/webp" 5831 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/The_Art_of_the_Surprise_Pour_Embracing_the_Chaos_of_Custom_Silicone2.webp"> 5832 5833 <source type="image/png" 5834 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/The_Art_of_the_Surprise_Pour_Embracing_the_Chaos_of_Custom_Silicone2.png"> 5835 5836 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/The_Art_of_the_Surprise_Pour_Embracing_the_Chaos_of_Custom_Silicone2.png" alt="The Art of the Surprise Pour Embracing the Chaos of Custom Silicone" width="500" height="281" decoding="async" /></picture> 5837 5838 </a> 5839 5840 <!-- post category--> 5841 <sp
5841an class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 5842 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/care-safety-and-materials" 5843 title="Care, Safety & Materials"> 5844 Care, Safety & Materials </a> 5845 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 5846 title="Tips & Guides"> 5847 Tips & Guides </a> 5848 </span> 5849 <!-- end post category--> 5850 </div> 5851 </div> 5852 5853 <!-- block info --> 5854 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 5855 5856 <!-- block data --> 5857 <div class="post-data-wrap text-sm font-medium mb-3"> 5858 <!-- post author --> 5859 <span class="post-author-name">Author: Mister Hankey </span> 5860 <span> | </span> 5861 5862 <!-- post date --> 5863 <span class="post-date">September 22, 2026</span> 5864 5865 <!-- post view --> 5866 </div> 5867 5868 <!-- post title --> 5869 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 5870 <h3 class="post-title"> 5871 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog//surprise-pour-custom-dildos">The Art of the Surprise Pour: Embracing the Chaos of Custom Silicone</a> 5872 </h3> 5873 </div> 5874 5875 5876 5877 <!-- post description --> 5878 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 5879 <style>#html-body [data-pb-style=HT6MU8U]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="HT6MU8U"><h2 data-content-type="heading" data-appearance="default" data-element="main">The 5880Art of the Surprise Pour: Embracing the Chaos of Custom Silicone</h2><div data-content-type="text" data-appearance="default" data-element="main"><div align="center"> 5881<table class="MsoNormalTable" style="border-collapse: collapse; mso-table-layout-alt: fixed; border: none; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-border-insideh: cell-none; mso-border-insidev: cell-none;" border="1" cellspacing="0" cellpadding="0"> 5882<tbody> 5883<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes; page-break-inside: avoid;"> 5884<td style="width: 6.6in; border: none; border-left: solid #4B2E83 3.0pt; background: #F3EFF8; padding: 6.75pt 8.5pt 6.75pt 9.5pt;" width="634"> 5885<p class="MsoNormal" style="margin-bottom: 3.0pt;"><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 11.0pt; line-height: 115%; color: #4b2e83;">TL;DR</span></strong></p> 5886<p class="MsoNormal" style="margin-bottom: 0in; line-height: 107%;"><span style="font-size: 10.0pt; mso-bidi-font-size: 11.0pt; line-height: 107%;">A Surprise Pour, sometimes called Dealer's Choice, turns the color design over to our California pour team. You still choose the toy, size, and firmness, and
5886you may flag a few colors you absolutely do not want. Because every pigment batch is mixed by hand, the finished pattern is naturally one of a kind. The piece is made with the same 100% platinum-cured silicone and production controls as any other made-to-order piece.</span></p> 5887</td> 5888</tr> 5889</tbody> 5890</table> 5891<p>Â </p> 5892</div> 5893<p>Building a custom toy can be almost too open-ended. Once you have chosen a shape, size, and Shore firmness, you may still be looking at solids, marbles, metallic effects, contrasting accents, and more color combinations than anyone should have to compare in one sitting.</p> 5894<p>For some collectors, making every one of those decisions is the best part. For others, it turns a fantasy purchase into a design exam.</p> 5895<p>That is where the Surprise Pour comes in. Also known as Dealer's Choice, it lets a custom dildo</p></div></div></div> </div> 5896 5897 <!-- read more --> 5898 <div class="flex"> 5899 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog//surprise-pour-custom-dildos" title="The Art of the Surprise Pour: Embracing the Chaos of Custom Silicone"> 5900 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 5901 </a> 5902 </div> 5903 </div> 5904 </div> 5905 </li> 5906 <li class="post-item post-holder post-holder-284 block"> 5907 5908 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 5909 <!-- post image --> 5910 <div class="post-image grow-0 shrink-0 order-none"> 5911 <!-- img container --> 5912 <div class="image-container relative"> 5913 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 5914 href="https://www.mrhankeystoys.com/blog/from-drew-sebastian-to-dragons-should-you-choose-a-realistic-or-fantasy-sculpt" 5915 title="From 'Drew Sebastian' to Dragons: Should You Choose a Realistic or Fantasy Sculpt? " 5916 > 5917 <picture> 5918 5919 5920 <source type="image/webp" 5921 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/From_Drew_Sebastian_to_Dragons_Should_You_Choose_a_Realistic_or_Fantasy_Sculpt.webp"> 5922 5923 <source type="image/png" 5924 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/From_Drew_Sebastian_to_Dragons_Should_You_Choose_a_Realistic_or_Fantasy_Sculpt.png"> 5925 5926 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/From_Drew_Sebastian_to_Dragons_Should_You_Choose_a_Realistic_or_Fantasy_Sculpt.png" alt="Realistic Drew Sebastian lifecast dildo beside a textured dragon fantasy dildo comparing realistic and fantasy silicone toys" width="500" height="281" decoding="async" /></picture> 5927 5928 </a> 5929 5930 <!-- post category--> 5931 <span class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 5932 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/fantasy-and-sci-fi" 5933 title="Fantasy & Sci-Fi"> 5934 Fantasy & Sci-Fi </a> 5935 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/realistic-and-lifecast" 5936 title="Realistic & Lifecast"> 5937 Realistic & Lifecast </a> 5938 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 5939 title="Tips & Guides"> 5940 Tips & Guides </a> 5941 </span> 5942 <!-- end post category--> 5943 </div> 5944 </div> 5945 5946 <!-- block info --> 5947 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 5948 5949 <!-- block data --> 5950 <div class="post-data-wrap text-sm font-medium mb-3"> 5951 <!-- post author --> 5952 <sp
5952an class="post-author-name">Author: Mister Hankey </span> 5953 <span> | </span> 5954 5955 <!-- post date --> 5956 <span class="post-date">August 11, 2026</span> 5957 5958 <!-- post view --> 5959 </div> 5960 5961 <!-- post title --> 5962 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 5963 <h3 class="post-title"> 5964 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/from-drew-sebastian-to-dragons-should-you-choose-a-realistic-or-fantasy-sculpt">From 'Drew Sebastian' to Dragons: Should You Choose a Realistic or Fantasy Sculpt? </a> 5965 </h3> 5966 </div> 5967 5968 5969 5970 <!-- post description --> 5971 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 5972 <style>#html-body [data-pb-style=AKXLDUD]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="AKXLDUD"><div data-content-type="text" data-appearance="default" data-element="main"><div class="SCXW57652787 BCX0"> 5973<div class="OutlineElement Ltr SCXW57652787 BCX0"> 5974<p class="Paragraph SCXW57652787 BCX0"><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0">When you decide to invest in high-end, hand-poured silicone, you are </span><span class="NormalTextRun SCXW57652787 BCX0">immediately</span><span class="NormalTextRun SCXW57652787 BCX0"> faced with the ultimate collectorâs dilemma: </span></span><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0">Familiarity or Exploration?</span></span><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0"> Do you go with a meticulously crafted human replica, or do you venture into the wildly textured world of mythical creatures?</span></span><span class="EOP Selected SCXW57652787 BCX0" data-ccp-props="{}"> </span></p> 5975</div> 5976<div class="OutlineElement Ltr SCXW57652787 BCX0"> 5977<p class="Paragraph SCXW57652787 BCX0"><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0">At </span></span><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><a tabindex="-1" href="https://www.mrhankeystoys.com/"><span class="NormalTextRun SCXW57652787 BCX0">Mr. Hankeyâs </span></a><span class="NormalTextRun SCXW57652787 BCX0"><a tabindex="-1" href="https://www.mrhankeystoys.com/">Toys</a> we</span></span><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0"> specialize in both. We understand that what turns you on visually might be completely different from what feels best internally. If you are struggling to choose between the </span></span><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0">best realistic dildos</span></span><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0"> and our wilder fantasy creations, it comes down to understanding the difference between <
5977/span></span><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0">visual stimulation</span></span><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0"> and </span></span><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0">engineered sensation</span></span><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0">.</span></span><span class="EOP Selected SCXW57652787 BCX0" data-ccp-props="{}"> </span></p> 5978</div> 5979<div class="OutlineElement Ltr SCXW57652787 BCX0"> 5980<p class="Paragraph SCXW57652787 BCX0"><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0">Here is the definitive guide to choosing between a realistic and a fantasy sculpt for your next session.</span></span><span class="EOP Selected SCXW57652787 BCX0" data-ccp-props="{}"> </span></p> 5981</div> 5982<div class="OutlineElement Ltr SCXW57652787 BCX0"> 5983<h3 class="Paragraph SCXW57652787 BCX0"><strong><span style="font-size: 16px;"><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0">1. The Case for Realism: Visual and Psychological Immersion</span></span><span class="EOP Selected SCXW57652787 BCX0" data-ccp-props="{}"> </span></span></strong></h3> 5984</div> 5985<div class="OutlineElement Ltr SCXW57652787 BCX0"> 5986<p class="Paragraph SCXW57652787 BCX0"><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0">For many users, solo play is heavily tied to visual arousal and roleplay. A </span></span><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0">realistic male dildo</span></span><span class="TextRun SCXW57652787 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW57652787 BCX0"> provides a psychological connection that abstract shapes simply cannot</span></span></p></div></div></div></div></div> </div> 5987 5988 <!-- read more --> 5989 <div class="flex"> 5990 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/from-drew-sebastian-to-dragons-should-you-choose-a-realistic-or-fantasy-sculpt" title="From 'Drew Sebastian' to Dragons: Should You Choose a Realistic or Fantasy Sculpt? "> 5991 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 5992 </a> 5993 </div> 5994 </div> 5995 </div> 5996 </li> 5997 <li class="post-item post-holder post-holder-282 block"> 5998 5999 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 6000 <!-- post image --> 6001 <div class="post-image grow-0 shrink-0 order-none"> 6002 <!-- img container --> 6003 <div class="image-container relative"> 6004 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 6005 href="https://www.mrhankeystoys.com/blog/texture-weight-and-deep-pressure-a-sensory-guide-to-silicone-toys" 6006 title="Texture, Weight, and Deep Pressure: A Sensory Guide to Silicone Toys " 6007 > 6008 <picture> 6009 6010 6011 <source type="image/webp" 6012 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/Texture_Weight_and_Deep_Pressure_A_Sensory_Guide_to_Silicone_Toys_1_.webp"> 6013 6014 <source type="image/png" 6015 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Texture_Weight_and_Deep_Pressure_A_Sensory_Guide_to_Silicone_Toys_1_.png"> 6016 6017 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Texture_Weight_and_Deep_Pressure_A_Sensory_Guide_to_Silicone_Toys_1_.png" alt="Sensory guide to silicone sex toys focusing on texture, weight, and deep pressure" width="500" height="281" decoding="async" /></picture> 6018 6019 </a> 6020 6021 <!-- post category--> 6022 <sp
6022an class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 6023 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/sexual-wellness" 6024 title="Sexual Wellness"> 6025 Sexual Wellness </a> 6026 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 6027 title="Tips & Guides"> 6028 Tips & Guides </a> 6029 </span> 6030 <!-- end post category--> 6031 </div> 6032 </div> 6033 6034 <!-- block info --> 6035 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 6036 6037 <!-- block data --> 6038 <div class="post-data-wrap text-sm font-medium mb-3"> 6039 <!-- post author --> 6040 <span class="post-author-name">Author: Mister Hankey </span> 6041 <span> | </span> 6042 6043 <!-- post date --> 6044 <span class="post-date">July 28, 2026</span> 6045 6046 <!-- post view --> 6047 </div> 6048 6049 <!-- post title --> 6050 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 6051 <h3 class="post-title"> 6052 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/texture-weight-and-deep-pressure-a-sensory-guide-to-silicone-toys">Texture, Weight, and Deep Pressure: A Sensory Guide to Silicone Toys </a> 6053 </h3> 6054 </div> 6055 6056 6057 6058 <!-- post description --> 6059 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 6060 <style>#html-body [data-pb-style=VT8T83G]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="VT8T83G"><div data-content-type="text" data-appearance="default" data-element="main"><div class="SCXW46100187 BCX0"> 6061<div class="OutlineElement Ltr SCXW46100187 BCX0"> 6062<h3 class="Paragraph SCXW46100187 BCX0"><span style="font-size: 16px;"><strong><span class="TextRun SCXW46100187 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW46100187 BCX0">TL; DR</span></span><span class="EOP Selected SCXW46100187 BCX0" data-ccp-props='{"335559738":240,"335559739":120}'> </span></strong></span></h3> 6063</div> 6064<div class="ListContainerWrapper SCXW46100187 BCX0"> 6065<ul class="BulletListStyle1 SCXW46100187 BCX0" role="list"> 6066<li class="OutlineElement Ltr SCXW46100187 BCX0" role="listitem" aria-setsize="-1" data-leveltext="â¢" data-font="" data-listid="2" data-list-defn-props='{"335552541":1,"335559685":720,"335559991":360,"469769242":[8226],"469777803":"left","469777804":"â¢","469777815":"hybridMultilevel"}' data-aria-posinset="1" data-aria-level="1"> 6067<p class="Paragraph SCXW46100187 BCX0"><span class="TextRun SCXW46100187 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW46100187 BCX0">Texture, weight, and firmness shape your experience just as much as size or visual design â especially if </span><span class="NormalTextRun SCXW46100187 BCX0">you're</span><span class="NormalTextRun SCXW46100187 BCX0"> neurodivergent or sensory-sensitive.</span></span><span class="EOP Selected SCXW46100187 BCX0" data-ccp-props='{"335559739":120}'> </span></p> 6068</li> 6069</ul> 6070</div> 6071<div class="ListContainerWrapper SCXW46100187 BCX0"> 6072<ul class="BulletListStyle1 SCXW46100187 BCX0" role="list"> 6073<li class="OutlineElement Ltr SCXW46100187 BCX0" role="listitem" aria-setsize="-1" data-leveltext="â¢" data-font="" data-listid="2" data-list-defn-props='{"335552541":1,"335559685":720,"335559991":360,"469769242":[8226],"469777803":"left","469777804":"â¢","469777815":"hybridMultilevel"}' data-aria-posinset="2" data-aria-level="1"> 6074<p class="Paragraph SCXW46100187 BCX0"><span class="TextRun SCXW46100187 BCX0" data-contrast="auto"><span class="NormalTextRun SCXW46100187 BCX0">Solid, heavy-pour platinum-cured silicone delivers deep pressure stimulation: the same grounding, nervous-system-regulating input as a weighted blanket.</span></span><span class="EOP Selected SCXW46100187 BCX0" data-ccp-props='{"335559739":120}'> </span></p> 6075</li> 6076</ul> 6077</div> 6078<div class="ListContainerWrapper SCXW46100187 BCX0"> 6079<ul class="BulletListStyle1 SCXW46100187 BCX0" role="list"> 6080<li class="OutlineElement Ltr SCXW46100187 BCX0" role="listitem" aria-setsize="-1" data-leveltext="â¢" data-font="" data-listid="2" data-list-defn-props='{"335552541":1,"335559685":720,"335559991":360,"469769242":[8226],"469777803":"left","469777804":"â¢","469777815":"hybridMultilevel"}' data-aria-posinset="3" data-aria-level="1"> 6081<p class="Paragraph SCXW46100187 BCX0"><span class="TextRun SCXW46100187 BCX0" data-contrast="auto"><span class="NormalTextRun SCXW46100187 BCX0">Sensory seekers thrive on complex textures (scales, ridges, knots); sensory avoiders do best with smooth, tapered, predictable shapes.</span></span><span class="EOP Selected SCXW46100187 BCX0" data-ccp-props='{"335559739":120}'> </span></p> 6082</li> 6083</ul> 6084</div> 6085<div class="ListContainerWrapper SCXW46100187 BCX0"> 6086<ul class="BulletListStyle1 SCXW46100187 BCX0" role="list"> 6087<li class="OutlineElement Ltr SCXW46100187 BCX0" role="listitem" aria-setsize="-1" data-leveltext="â¢" data-font="" data-listid="2" data-list-defn-props='{"335552541":1,"335559685":720,"335559991":360,"469769242":[8226],"469777803":"left","469777804":"â¢","469777815":"hybridMultilevel"}' data-aria-posinset="4" data-aria-level="1"> 6088<p class="Paragraph SCXW46100187 BCX0"><span class="TextRun SCXW46100187 BCX0" data-contrast="auto"><span class="NormalTextRun SCXW46100187 BCX0">Firmness is measured on the Shore hardness scale â and because we hand-pour every piece in our C
6088alifornia workshop, you choose the density that matches your body.</span></span><span class="EOP Selected SCXW46100187 BCX0" data-ccp-props='{"335559739":120}'> </span></p> 6089</li> 6090</ul> 6091</div> 6092<div class="ListContainerWrapper SCXW46100187 BCX0"> 6093<ul class="BulletListStyle1 SCXW46100187 BCX0" role="list"> 6094<li class="OutlineElement Ltr SCXW46100187 BCX0" role="listitem" aria-setsize="-1" data-leveltext="â¢" data-font="" data-listid="2" data-list-defn-props='{"335552541":1,"335559685":720,"335559991":360,"469769242":[8226],"469777803":"left","469777804":"â¢","469777815":"hybridMultilevel"}' data-aria-posinset="5" data-aria-level="1"> 6095<p class="Paragraph SCXW46100187 BCX0"><span class="TextRun SCXW46100187 BCX0" data-contrast="auto"><span class="NormalTextRun SCXW46100187 BCX0">Non-negotiables for any silicone toy: 100% platinum-cured, non-porous, hypoallergenic material; water-based lubricant only; and proper sterilization between uses.</span></span><span class="EOP Selected SCXW46100187 BCX0" data-ccp-props='{"335559739":120}'> </span></p> 6096</li> 6097</ul> 6098</div> 6099<div class="OutlineElement Ltr SCXW46100187 BCX0"> 6100<h3 class="Paragraph SCXW46100187 BCX0"><strong><span style="font-size: 16px;"><span class="TextRun SCXW46100187 BCX0" data-contrast="auto"><span class="NormalTextRun SCXW46100187 BCX0">Introduction: Beyond the Visual Fantasy</span></span><span class="EOP Selected SCXW46100187 BCX0" data-ccp-props='{"335559738":240,"335559739":120}'> </span></span></strong></h3> 6101</div> 6102<div class="OutlineElement Ltr SCXW46100187 BCX0"> 6103<p class="Paragraph SCXW46100187 BCX0"><span class="TextRun SCXW46100187 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW46100187 BCX0">When we talk about sex toys, the conversation usually revolves around shape and visual appeal. But for many people â especially those in the neurodivergent community living</span></span></p></div></div></div></div></div> </div> 6104 6105 <!-- read more --> 6106 <div class="flex"> 6107 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/texture-weight-and-deep-pressure-a-sensory-guide-to-silicone-toys" title="Texture, Weight, and Deep Pressure: A Sensory Guide to Silicone Toys "> 6108 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 6109 </a> 6110 </div> 6111 </div> 6112 </div> 6113 </li> 6114 <li class="post-item post-holder post-holder-281 block"> 6115 6116 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 6117 <!-- post image --> 6118 <div class="post-image grow-0 shrink-0 order-none"> 6119 <!-- img container --> 6120 <div class="image-container relative"> 6121 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 6122 href="https://www.mrhankeystoys.com/blog/chasing-the-knot-the-physiology-of-the-âpop-in-fantasy-play" 6123 title="Chasing the Knot: The Physiology of the âPopâ in Fantasy Play " 6124 > 6125 <picture> 6126 6127 6128 <source type="image/webp" 6129 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/Chasing_the_Knot_The_Physiology_of_the_Pop_in_Fantasy_Play.webp"> 6130 6131 <source type="image/png" 6132 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Chasing_the_Knot_The_Physiology_of_the_Pop_in_Fantasy_Play.png"> 6133 6134 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Chasing_the_Knot_The_Physiology_of_the_Pop_in_Fantasy_Play.png" alt="Two silicone knotted fantasy dildos illustrating canine-inspired knot shapes and textures" width="500" height="281" decoding="async" /></picture> 6135 6136 </a> 6137 6138 <!-- post category--> 6139 <sp
6139an class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 6140 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/fantasy-and-sci-fi" 6141 title="Fantasy & Sci-Fi"> 6142 Fantasy & Sci-Fi </a> 6143 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 6144 title="Tips & Guides"> 6145 Tips & Guides </a> 6146 </span> 6147 <!-- end post category--> 6148 </div> 6149 </div> 6150 6151 <!-- block info --> 6152 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 6153 6154 <!-- block data --> 6155 <div class="post-data-wrap text-sm font-medium mb-3"> 6156 <!-- post author --> 6157 <span class="post-author-name">Author: Mister Hankey </span> 6158 <span> | </span> 6159 6160 <!-- post date --> 6161 <span class="post-date">July 21, 2026</span> 6162 6163 <!-- post view --> 6164 </div> 6165 6166 <!-- post title --> 6167 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 6168 <h3 class="post-title"> 6169 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/chasing-the-knot-the-physiology-of-the-âpop-in-fantasy-play">Chasing the Knot: The Physiology of the âPopâ in Fantasy Play </a> 6170 </h3> 6171 </div> 6172 6173 6174 6175 <!-- post description --> 6176 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 6177 <style>#html-body [data-pb-style=LYT8Q63]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="LYT8Q63"><div data-content-type="text" data-appearance="default" data-element="main"><div class="SCXW222811201 BCX0"> 6178<div class="OutlineElement Ltr SCXW222811201 BCX0"> 6179<p class="Paragraph SCXW222811201 BCX0" lang="EN-US"><span class="TextRun SCXW222811201 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW222811201 BCX0">If </span><span class="NormalTextRun SCXW222811201 BCX0">youâre</span><span class="NormalTextRun SCXW222811201 BCX0"> familiar with the fantasy toy community, </span><span class="NormalTextRun SCXW222811201 BCX0">youâve</span><span class="NormalTextRun SCXW222811201 BCX0"> </span><span class="NormalTextRun SCXW222811201 BCX0">probably noticed</span><span class="NormalTextRun SCXW222811201 BCX0"> that </span></span><span class="TextRun SCXW222811201 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW222811201 BCX0">canine-inspired shapes are among the most popular designsâand often a first introduction to non-human sculpts.</span></span><span class="EOP Selected SCXW222811201 BCX0" data-ccp-props='{"335559739":160}'> </span></p> 6180</div> 6181<div class="OutlineElement Ltr SCXW222811201 BCX0"> 6182<p class="Paragraph SCXW222811201 BCX0"><span class="TextRun SCXW222811201 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW222811201 BCX0">While the visual aesthetic and the primal roleplay elements are certainly a massive draw, the true appeal of a </span></span><span class="TextRun SCXW222811201 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW222811201 BCX0">dog knot dildo</span></span><span class="TextRun SCXW222811201 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW222811201 BCX0"> goes far beyond surface-level fantasy. The secret to its enduring popularity lies in its masterful physical engineering â something we have </span><span class="NormalTextRun SCXW222811201 BCX0">observed</span><span class="NormalTextRun SCXW222811201 BCX0">, tested, and refined firsthand on our California studio floor for more than a decade.</sp
6182an></span><span class="EOP Selected SCXW222811201 BCX0" data-ccp-props='{"335559739":160}'> </span></p> 6183</div> 6184<div class="OutlineElement Ltr SCXW222811201 BCX0"> 6185<p class="Paragraph SCXW222811201 BCX0"><span class="TextRun SCXW222811201 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW222811201 BCX0">The canine sculpt offers a sensory journey of progressive stretching that culminates in a highly specific, intense physiological event known as the âpop.â Here is a deep dive into the internal mechanics of a </span></span><span class="TextRun SCXW222811201 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW222811201 BCX0">dog dick sex toy</span></span><span class="TextRun SCXW222811201 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW222811201 BCX0">, how it interacts with human anatomy, and why proper sizing and material safety are critical for achieving the perfect lock-in sensation.</span></span><span class="EOP Selected SCXW222811201 BCX0" data-ccp-props='{"335559739":160}'> </span></p> 6186</div> 6187<div class="OutlineElement Ltr SCXW222811201 BCX0"> 6188<h3 class="Paragraph SCXW222811201 BCX0"><strong><span class="TextRun SCXW222811201 BCX0" lang="EN-US" style="font-size: 16px;" xml:lang="EN-US" data-contrast="none"><span class="NormalTextRun SCXW222811201 BCX0">Key Takeaways</span></span></strong><span class="EOP Selected SCXW222811201 BCX0" data-ccp-props='{"335559738":280,"335559739":120}'> </span></h3> 6189</div> 6190<div class="ListContainerWrapper SCXW222811201 BCX0"> 6191<ul class="BulletListStyle1 SCXW222811201 BCX0" role="list"> 6192<li class="OutlineElement Ltr SCXW222811201 BCX0" role="listitem" aria-setsize="-1" data-leveltext="ï·" data-font="Symbol" data-listid="1" data-list-defn-props='{"335552541":1,"335559685":360,"335559991":360,"469769226":"Symbol","469769242":[8226],"469777803":"left","469777804":"ï·","469777815":"singleLevel"}' data-aria-posinset="5" data-aria-level="1"> 6193<p class="Paragraph SCXW222811201 BCX0"><span class="TextRun SCXW222811201 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW222811201 BCX0" data-ccp-parastyle="List Bullet"><strong>The Progressive Taper</strong>:</span></span><span class="TextRun SCXW222811201 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW222811201 BCX0" data-ccp-parastyle="List Bullet"> Canine shapes begin</span></span></p></li></ul></div></div></div></div></div> </div> 6194 6195 <!-- read more --> 6196 <div class="flex"> 6197 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/chasing-the-knot-the-physiology-of-the-âpop-in-fantasy-play" title="Chasing the Knot: The Physiology of the âPopâ in Fantasy Play "> 6198 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 6199 </a> 6200 </div> 6201 </div> 6202 </div> 6203 </li> 6204 <li class="post-item post-holder post-holder-280 block"> 6205 6206 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 6207 <!-- post image --> 6208 <div class="post-image grow-0 shrink-0 order-none"> 6209 <!-- img container --> 6210 <div class="image-container relative"> 6211 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 6212 href="https://www.mrhankeystoys.com/blog/ditching-the-disposables-why-platinum-silicone-is-a-lifetime-investment" 6213 title="Ditching the Disposables: Why Platinum Silicone is a Lifetime Investment " 6214 > 6215 <picture> 6216 6217 6218 <source type="image/webp" 6219 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/Ditching_the_Disposables_Why_Platinum_Silicone_is_a_
6219Lifetime_Investment.webp"> 6220 6221 <source type="image/png" 6222 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Ditching_the_Disposables_Why_Platinum_Silicone_is_a_Lifetime_Investment.png"> 6223 6224 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Ditching_the_Disposables_Why_Platinum_Silicone_is_a_Lifetime_Investment.png" alt="Mr. Hankey's Toys platinum-cured silicone dildos in vibrant colors-a lifetime investment" width="500" height="281" decoding="async" /></picture> 6225 6226 </a> 6227 6228 <!-- post category--> 6229 <span class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 6230 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 6231 title="Tips & Guides"> 6232 Tips & Guides </a> 6233 </span> 6234 <!-- end post category--> 6235 </div> 6236 </div> 6237 6238 <!-- block info --> 6239 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 6240 6241 <!-- block data --> 6242 <div class="post-data-wrap text-sm font-medium mb-3"> 6243 <!-- post author --> 6244 <span class="post-author-name">Author: Mister Hankey </span> 6245 <span> | </span> 6246 6247 <!-- post date --> 6248 <span class="post-date">July 07, 2026</span> 6249 6250 <!-- post view --> 6251 </div> 6252 6253 <!-- post title --> 6254 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 6255 <h3 class="post-title"> 6256 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/ditching-the-disposables-why-platinum-silicone-is-a-lifetime-investment">Ditching the Disposables: Why Platinum Silicone is a Lifetime Investment </a> 6257 </h3> 6258 </div> 6259 6260 6261 6262 <!-- post description --> 6263 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 6264 <style>#html-body [data-pb-style=U61XD9A]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="U61XD9A"><div data-content-type="text" data-appearance="default" data-element="main"><div class="SCXW183889390 BCX0"> 6265<div class="OutlineElement Ltr SCXW183889390 BCX0"> 6266<p class="Paragraph SCXW183889390 BCX0"><span class="TextRun SCXW183889390 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW183889390 BCX0">Look</span><span class="NormalTextRun SCXW183889390 BCX0"> inside the average nightstand, and you will </span><span class="NormalTextRun SCXW183889390 BCX0">likely find</span><span class="NormalTextRun SCXW183889390 BCX0"> a graveyard of degraded products. There is a deeply ingrained "fast fashion" problem in the adult toy industry. For years, massive overseas factories have flooded the market with cheap, mass-produced novelties designed to look good in a box but </span><span class="NormalTextRun SCXW183889390 BCX0">failed</span><span class="NormalTextRun SCXW183889390 BCX0"> after a few months of use.</span></span><span class="EOP Selected SCXW183889390 BCX0" data-ccp-props="{}"> </span></p> 6267</div> 6268<div class="OutlineElement Ltr SCXW183889390 BCX0"> 6269<p class="Paragraph SCXW183889390 BCX0"><span class="TextRun SCXW183889390 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW183889390 BCX0">At </span></span><span class="TextRun SCXW183889390 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW183889390 BCX0">Mr. Hankeyâs Toys</span></span><span class="TextRun SCXW183889390 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW183889390 BCX0">, we </span><span class="NormalTextRun SCXW183889390 BCX0">operate</span><span class="NormalTextRun SCXW183889390 BCX0"> on a completely different philosophy. Inside our California studio, we </span><span class="NormalTextRun SCXW183889390 BCX0">
6269don't</span><span class="NormalTextRun SCXW183889390 BCX0"> believe in disposable pleasure. As one of the </span></span><span class="TextRun SCXW183889390 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW183889390 BCX0">best dildo companies</span></span><span class="TextRun SCXW183889390 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW183889390 BCX0"> in the world, we approach manufacturing with the mindset of a bespoke artisan: if you are going to put something inside your body, it should be a flawless, body-safe masterpiece designed to last a lifetime.</span></span><span class="EOP Selected SCXW183889390 BCX0" data-ccp-props="{}"> </span></p> 6270</div> 6271<div class="OutlineElement Ltr SCXW183889390 BCX0"> 6272<p class="Paragraph SCXW183889390 BCX0"><span class="TextRun SCXW183889390 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW183889390 BCX0">Here is a deep dive into the material science behind our workshop, the hidden dangers of cheap materials, and why upgrading to premium </span></span><span class="TextRun SCXW183889390 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW183889390 BCX0">medical grade silicone sex toys</span></span><span class="TextRun SCXW183889390 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW183889390 BCX0"> is the ultimate "buy it for life" investment.</span></span><span class="EOP Selected SCXW183889390 BCX0" data-ccp-props="{}"> </span></p> 6273</div> 6274<div class="OutlineElement Ltr SCXW183889390 BCX0"> 6275<h3 class="Paragraph SCXW183889390 BCX0"><span style="font-size: 16px;"><strong><span class="TextRun SCXW183889390 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW183889390 BCX0">Key Takeaways</span></span><span class="EOP Selected SCXW183889390 BCX0" data-ccp-props="{}"> </span></strong></span></h3> 6276</div> 6277<div class="ListContainerWrapper SCXW183889390 BCX0"> 6278<ul class="BulletListStyle1 SCXW183889390 BCX0" role="list"> 6279<li class="OutlineElement Ltr SCXW183889390 BCX0" role="listitem" aria-setsize="-1" data-leveltext="ï·" data-font="Symbol" data-listid="1" data-list-defn-props='{"335552541":1,"335559685":720,"335559991":360,"469769226":"Symbol","469769242":[8226],"469777803":"left","469777804":"ï·","469777815":"multilevel"}' data-aria-posinset="1" data-aria-level="1"> 6280<p class="Paragraph SCXW183889390 BCX0"><span class="TextRun SCXW183889390 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW183889390 BCX0"><strong>The Danger of</strong></span></span></p></li></ul></div></div></div></div></div> </div> 6281 6282 <!-- read more --> 6283 <div class="flex"> 6284 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/ditching-the-disposables-why-platinum-silicone-is-a-lifetime-investment" title="Ditching the Disposables: Why Platinum Silicone is a Lifetime Investment "> 6285 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 6286 </a> 6287 </div> 6288 </div> 6289 </div> 6290 </li> 6291 <li class="post-item post-holder post-holder-279 block"> 6292 6293 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 6294 <!-- post image --> 6295 <div class="post-image grow-0 shrink-0 order-none"> 6296 <!-- img container --> 6297 <div class="image-container relative"> 6298 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 6299 href="https://www.mrhankeystoys.com/blog/from-the-nightstand-to-the-bookshelf-the-rise-of-silicone-sculptures-as-art" 6300 title="From the Nightstand to the Bookshelf: The Rise of Silicone Sculptures as Art " 6301 > 6302 <picture> 6303 6304 6305 <source type="image/webp" 6306 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/From_the_Nightstand_to_the_Bookshelf_The_Rise_of_Silicone_Sculptures_as_Art.webp"> 6307 6308 <source type="image/png" 6309 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/From_the_Nightstand_to_the_Bookshelf_The_Rise_of_Silicone_Sculptures_as_Art.png"> 6310 6311 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/From_the_Nightstand_to_the_Bookshelf_The_Rise_of_Silicone_Sculptures_as_Art.png" alt="A beautifully marbled, custom-poured octopus dildo by Mr. Hankeyâs Toys, displayed proudly on a wooden bookshelf as a piece of vibrant, functional pop-art." width="500" height="281" decoding="async" /></picture> 6312 6313 </a> 6314 6315 <!-- post category--> 6316 <sp
6316an class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 6317 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/kinky" 6318 title="Kinky"> 6319 Kinky </a> 6320 </span> 6321 <!-- end post category--> 6322 </div> 6323 </div> 6324 6325 <!-- block info --> 6326 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 6327 6328 <!-- block data --> 6329 <div class="post-data-wrap text-sm font-medium mb-3"> 6330 <!-- post author --> 6331 <span class="post-author-name">Author: Mister Hankey </span> 6332 <span> | </span> 6333 6334 <!-- post date --> 6335 <span class="post-date">June 30, 2026</span> 6336 6337 <!-- post view --> 6338 </div> 6339 6340 <!-- post title --> 6341 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 6342 <h3 class="post-title"> 6343 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/from-the-nightstand-to-the-bookshelf-the-rise-of-silicone-sculptures-as-art">From the Nightstand to the Bookshelf: The Rise of Silicone Sculptures as Art </a> 6344 </h3> 6345 </div> 6346 6347 6348 6349 <!-- post description --> 6350 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 6351 <style>#html-body [data-pb-style=W1IE2P5]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="W1IE2P5"><div data-content-type="text" data-appearance="default" data-element="main"><div class="SCXW189596288 BCX0"> 6352<div class="OutlineElement Ltr SCXW189596288 BCX0"> 6353<p class="Paragraph SCXW189596288 BCX0"><span class="TextRun SCXW189596288 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189596288 BCX0">For decades, the cultural rule surrounding the adult industry was </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW189596288 BCX0">absolute secrecy</span><span class="NormalTextRun SCXW189596288 BCX0">. Personal massagers and toys were viewed as purely utilitarian objects, hastily shoved into the back of a </span><span class="NormalTextRun SCXW189596288 BCX0">drawer</span><span class="NormalTextRun SCXW189596288 BCX0"> or hidden away in a locked shoebox the moment they were clean.</span></span><span class="EOP Selected SCXW189596288 BCX0" data-ccp-props='{"335559739":160}'> </span></p> 6354</div> 6355<div class="OutlineElement Ltr SCXW189596288 BCX0"> 6356<p class="Paragraph SCXW189596288 BCX0"><span class="TextRun SCXW189596288 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189596288 BCX0">But the landscape of sex-positivity has fundamentally shifted. </span><span class="NormalTextRun SCXW189596288 BCX0">As the stigma surrounding sexual wellness and fantasy play dissolves, high-end collectors are completely changing the way they interact with their purchases.</span><span class="NormalTextRun SCXW189596288 BCX0"> Today, premium </span></span><span class="TextRun SCXW189596288 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189596288 BCX0">dildo adult toys</span></span><span class="TextRun SCXW189596288 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189596288 BCX0"> are no longer just bedroom accessories to be hidden away â they are vibrant, highly coveted pieces of functional pop-art.</sp
6356an></span><span class="EOP Selected SCXW189596288 BCX0" data-ccp-props='{"335559739":160}'> </span></p> 6357</div> 6358<div class="OutlineElement Ltr SCXW189596288 BCX0"> 6359<p class="Paragraph SCXW189596288 BCX0"><span class="TextRun SCXW189596288 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189596288 BCX0">At </span></span><span class="TextRun SCXW189596288 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189596288 BCX0">Mr. Hankeyâs Toys</span></span><span class="TextRun SCXW189596288 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189596288 BCX0">, we have watched this evolution firsthand from our California studio, where our </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW189596288 BCX0">artisans</span><span class="NormalTextRun SCXW189596288 BCX0"> hand-pour and hand-pigment every single piece. Our buyers are no longer hiding our work. They are proudly displaying their curated </span></span><span class="TextRun SCXW189596288 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189596288 BCX0">dildo collections</span></span><span class="TextRun SCXW189596288 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189596288 BCX0"> on living room bookshelves, lit glass display cabinets, and bedroom vanity tables.</span></span></p></div></div></div></div></div> </div> 6360 6361 <!-- read more --> 6362 <div class="flex"> 6363 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/from-the-nightstand-to-the-bookshelf-the-rise-of-silicone-sculptures-as-art" title="From the Nightstand to the Bookshelf: The Rise of Silicone Sculptures as Art "> 6364 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 6365 </a> 6366 </div> 6367 </div> 6368 </div> 6369 </li> 6370 <li class="post-item post-holder post-holder-274 block"> 6371 6372 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 6373 <!-- post image --> 6374 <div class="post-image grow-0 shrink-0 order-none"> 6375 <!-- img container --> 6376 <div class="image-container relative"> 6377 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 6378 href="https://www.mrhankeystoys.com/blog/beyond-the-hook-why-fantasy-shapes-are-the-ultimate-prostate-hack" 6379 title="Beyond the Hook: Why Fantasy Shapes are the Ultimate Prostate Hack " 6380 > 6381 <picture> 6382 6383 6384 <source type="image/webp" 6385 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/Beyond_the_Hook_Why_Fantasy_Shapes_are_the_Ultimate_Prostate_Hack.webp"> 6386 6387 <source type="image/png" 6388 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Beyond_the_Hook_Why_Fantasy_Shapes_are_the_Ultimate_Prostate_Hack.png"> 6389 6390 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Beyond_the_Hook_Why_Fantasy_Shapes_are_the_Ultimate_Prostate_Hack.png" alt="A highly ergonomic, medical-grade silicone prostate toy from Mr. Hankeyâs Toys, showcasing the sweeping curve designed for precise anatomical stimulation." width="500" height="281" decoding="async" /></picture> 6391 6392 </a> 6393 6394 <!-- post category--> 6395 <sp
6395an class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 6396 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/fantasy-and-sci-fi" 6397 title="Fantasy & Sci-Fi"> 6398 Fantasy & Sci-Fi </a> 6399 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 6400 title="Tips & Guides"> 6401 Tips & Guides </a> 6402 </span> 6403 <!-- end post category--> 6404 </div> 6405 </div> 6406 6407 <!-- block info --> 6408 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 6409 6410 <!-- block data --> 6411 <div class="post-data-wrap text-sm font-medium mb-3"> 6412 <!-- post author --> 6413 <span class="post-author-name">Author: Mister Hankey </span> 6414 <span> | </span> 6415 6416 <!-- post date --> 6417 <span class="post-date">June 23, 2026</span> 6418 6419 <!-- post view --> 6420 </div> 6421 6422 <!-- post title --> 6423 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 6424 <h3 class="post-title"> 6425 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/beyond-the-hook-why-fantasy-shapes-are-the-ultimate-prostate-hack">Beyond the Hook: Why Fantasy Shapes are the Ultimate Prostate Hack </a> 6426 </h3> 6427 </div> 6428 6429 6430 6431 <!-- post description --> 6432 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 6433 <style>#html-body [data-pb-style=UQXV0YM]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="UQXV0YM"><div data-content-type="text" data-appearance="default" data-element="main"><p><span class="TextRun SCXW51522485 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW51522485 BCX0">The cultural destigmatization of male-focused anal play has finally reached a tipping point. More men and couples than ever are openly exploring the incredible physical benefits of prostate stimulation. However, if you look at the mainstream market, the product offerings </span><span class="NormalTextRun SCXW51522485 BCX0">remain</span><span class="NormalTextRun SCXW51522485 BCX0"> shockingly uninspired.</span></span><span class="EOP Selected SCXW51522485 BCX0" data-ccp-props='{"335559739":160}'> </span></p></div></div></div> </div> 6434 6435 <!-- read more --> 6436 <div class="flex"> 6437 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/beyond-the-hook-why-fantasy-shapes-are-the-ultimate-prostate-hack" title="Beyond the Hook: Why Fantasy Shapes are the Ultimate Prostate Hack "> 6438 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 6439 </a> 6440 </div> 6441 </div> 6442 </div> 6443 </li> 6444 <li class="post-item post-holder post-holder-277 block"> 6445 6446 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 6447 <!-- post image --> 6448 <div class="post-image grow-0 shrink-0 order-none"> 6449 <!-- img container --> 6450 <div class="image-container relative"> 6451 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 6452 href="https://www.mrhankeystoys.com/blog/the-anatomy-of-the-flare-why-the-equine-shape-is-a-fantasy-staple" 6453 title="The Anatomy of the Flare: Why the Equine Shape is a Fantasy Staple" 6454 > 6455 <picture> 6456 6457 6458 <source type="image/webp" 6459 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/The_Anatomy_of_the_Flare_Why_the_Equine_Shape_is_a_Fantasy_Staple_1__1.webp"> 6460 6461 <source type="image/png" 6462 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/The_Anatomy_of_the_Flare_Why_the_Equine_Shape_is_a_Fantasy_Staple_1__1.png"> 6463 6464 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/The_Anatomy_of_the_Flare_Why_the_Equine_Shape_is_a_Fantasy_Staple_1__1.png" alt="Black silicone horse dildo showing the pronounced equine flare and textured shaft" width="500" height="281" decoding="async" /></picture> 6465 6466 </a> 6467 6468 <!-- post category--> 6469 <sp
6469an class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 6470 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/fantasy-and-sci-fi" 6471 title="Fantasy & Sci-Fi"> 6472 Fantasy & Sci-Fi </a> 6473 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 6474 title="Tips & Guides"> 6475 Tips & Guides </a> 6476 </span> 6477 <!-- end post category--> 6478 </div> 6479 </div> 6480 6481 <!-- block info --> 6482 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 6483 6484 <!-- block data --> 6485 <div class="post-data-wrap text-sm font-medium mb-3"> 6486 <!-- post author --> 6487 <span class="post-author-name">Author: Mister Hankey </span> 6488 <span> | </span> 6489 6490 <!-- post date --> 6491 <span class="post-date">June 15, 2026</span> 6492 6493 <!-- post view --> 6494 </div> 6495 6496 <!-- post title --> 6497 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 6498 <h3 class="post-title"> 6499 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/the-anatomy-of-the-flare-why-the-equine-shape-is-a-fantasy-staple">The Anatomy of the Flare: Why the Equine Shape is a Fantasy Staple</a> 6500 </h3> 6501 </div> 6502 6503 6504 6505 <!-- post description --> 6506 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 6507 <style>#html-body [data-pb-style=XV9UX4T]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="XV9UX4T"><div data-content-type="text" data-appearance="default" data-element="main"><h3 dir="ltr"><strong><span style="font-size: 16px;">Written by the Hankeyâs Toys Design Team</span></strong></h3> 6508<p dir="ltr">Weâre a passionate group of sculptors, designers, and testers who love turning fantasy into reality. After more than a decade crafting equine shapes in our California workshop, weâve seen firsthand why the flare remains one of the most beloved features in the entire fantasy toy world. This guide shares what weâve learned so you can enjoy these iconic shapes safely and with maximum pleasure.</p> 6509<p>Â </p></div></div></div> </div> 6510 6511 <!-- read more --> 6512 <div class="flex"> 6513 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/the-anatomy-of-the-flare-why-the-equine-shape-is-a-fantasy-staple" title="The Anatomy of the Flare: Why the Equine Shape is a Fantasy Staple"> 6514 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 6515 </a> 6516 </div> 6517 </div> 6518 </div> 6519 </li> 6520 <li class="post-item post-holder post-holder-275 block"> 6521 6522 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 6523 <!-- post image --> 6524 <div class="post-image grow-0 shrink-0 order-none"> 6525 <!-- img container --> 6526 <div class="image-container relative"> 6527 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 6528 href="https://www.mrhankeystoys.com/blog/crossing-the-threshold-the-best-dildos-for-beginners-entering-the-fantasy-world" 6529 title="Crossing the Threshold: The Best Dildos for Beginners Entering the Fantasy World" 6530 > 6531 <picture> 6532 6533 6534 <source type="image/webp" 6535 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/Crossing_the_Threshold_The_Best_Dildos_for_Beginners_Entering_the_Fantasy_World_2_.webp"> 6536 6537 <source type="image/png" 6538 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Crossing_the_Threshold_The_Best_Dildos_for_Beginners_Entering_the_Fantasy_World_2_.png"> 6539 6540 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Crossing_the_Threshold_The_Best_Dildos_for_Beginners_Entering_the_Fantasy_World_2_.png" alt="Crossing the Threshold beginner fantasy dildo guide featuring three colorful fantasy silicone dildos from Hankeyâs Toys." width="500" height="281" decoding="async" /></picture> 6541 6542 </a> 6543 6544 <!-- post category--> 6545 <sp
6545an class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 6546 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/fantasy-and-sci-fi" 6547 title="Fantasy & Sci-Fi"> 6548 Fantasy & Sci-Fi </a> 6549 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 6550 title="Tips & Guides"> 6551 Tips & Guides </a> 6552 </span> 6553 <!-- end post category--> 6554 </div> 6555 </div> 6556 6557 <!-- block info --> 6558 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 6559 6560 <!-- block data --> 6561 <div class="post-data-wrap text-sm font-medium mb-3"> 6562 <!-- post author --> 6563 <span class="post-author-name">Author: Mister Hankey </span> 6564 <span> | </span> 6565 6566 <!-- post date --> 6567 <span class="post-date">June 08, 2026</span> 6568 6569 <!-- post view --> 6570 </div> 6571 6572 <!-- post title --> 6573 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 6574 <h3 class="post-title"> 6575 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/crossing-the-threshold-the-best-dildos-for-beginners-entering-the-fantasy-world">Crossing the Threshold: The Best Dildos for Beginners Entering the Fantasy World</a> 6576 </h3> 6577 </div> 6578 6579 6580 6581 <!-- post description --> 6582 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 6583 <style>#html-body [data-pb-style=GY0DOK1]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="GY0DOK1"><div data-content-type="text" data-appearance="default" data-element="main"><h3 dir="ltr"><strong><span style="font-size: 16px;">Written by the Hankeyâs Toys Design Team</span></strong></h3> 6584<p dir="ltr">Weâre a group of designers, sculptors, and testers dedicated to bringing pleasure to the world through thoughtful sizes, shapes, and textures that work for real bodies. After years of creating and refining fantasy toys in our California workshop, weâve helped thousands of people take their first step from realistic toys into the exciting world of fantasy. This guide is based on what weâve learned from real beginners.</p> 6585<p>Â </p></div></div></div> </div> 6586 6587 <!-- read more --> 6588 <div class="flex"> 6589 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/crossing-the-threshold-the-best-dildos-for-beginners-entering-the-fantasy-world" title="Crossing the Threshold: The Best Dildos for Beginners Entering the Fantasy World"> 6590 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 6591 </a> 6592 </div> 6593 </div> 6594 </div> 6595 </li> 6596 <li class="post-item post-holder post-holder-271 block"> 6597 6598 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 6599 <!-- post image --> 6600 <div class="post-image grow-0 shrink-0 order-none"> 6601 <!-- img container --> 6602 <div class="image-container relative"> 6603 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 6604 href="https://www.mrhankeystoys.com/blog/from-2d-to-3d-how-anime-culture-inspires-our-wildest-silicone-sculpts" 6605 title="From 2D to 3D: How Anime Culture Inspires Our Wildest Silicone Sculpts" 6606 > 6607 <picture> 6608 6609 6610 <source type="image/webp" 6611 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/From_2D_to_3D_How_Anime_Culture_Inspires_Our_Wildest_Silicone_Sculpts.webp"> 6612 6613 <source type="image/png" 6614 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/From_2D_to_3D_How_Anime_Culture_Inspires_Our_Wildest_Silicone_Sculpts.png"> 6615 6616 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/From_2D_to_3D_How_Anime_Culture_Inspires_Our_Wildest_Silicone_Sculpts.png" alt="From 2D to 3D: Green anime-style dragon with fantasy dildo and black tentacle silicone sculpture by Hankey's Toys" width="500" height="281" decoding="async" /></picture> 6617 6618 </a> 6619 6620 <!-- post category--> 6621 <sp
6621an class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 6622 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/fantasy-and-sci-fi" 6623 title="Fantasy & Sci-Fi"> 6624 Fantasy & Sci-Fi </a> 6625 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 6626 title="Tips & Guides"> 6627 Tips & Guides </a> 6628 </span> 6629 <!-- end post category--> 6630 </div> 6631 </div> 6632 6633 <!-- block info --> 6634 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 6635 6636 <!-- block data --> 6637 <div class="post-data-wrap text-sm font-medium mb-3"> 6638 <!-- post author --> 6639 <span class="post-author-name">Author: Mister Hankey </span> 6640 <span> | </span> 6641 6642 <!-- post date --> 6643 <span class="post-date">June 02, 2026</span> 6644 6645 <!-- post view --> 6646 </div> 6647 6648 <!-- post title --> 6649 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 6650 <h3 class="post-title"> 6651 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/from-2d-to-3d-how-anime-culture-inspires-our-wildest-silicone-sculpts">From 2D to 3D: How Anime Culture Inspires Our Wildest Silicone Sculpts</a> 6652 </h3> 6653 </div> 6654 6655 6656 6657 <!-- post description --> 6658 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 6659 <style>#html-body [data-pb-style=V0QJX2Y]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="V0QJX2Y"><div data-content-type="text" data-appearance="default" data-element="main"><h3 dir="ltr"><strong>Written by the Hankeyâs Toys Design Team</strong></h3> 6660<p dir="ltr">Weâre a passionate group of sculptors, designers, and testers dedicated to turning wild 2D fantasies into safe, functional 3D reality. Drawing inspiration from anime, manga, and hentai, weâve spent years refining exaggerated shapes and textures in our California workshop. This guide shares what weâve learned from creating and testing these designs with real users.</p> 6661<p>Â </p></div></div></div> </div> 6662 6663 <!-- read more --> 6664 <div class="flex"> 6665 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/from-2d-to-3d-how-anime-culture-inspires-our-wildest-silicone-sculpts" title="From 2D to 3D: How Anime Culture Inspires Our Wildest Silicone Sculpts"> 6666 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 6667 </a> 6668 </div> 6669 </div> 6670 </div> 6671 </li> 6672 <li class="post-item post-holder post-holder-273 block"> 6673 6674 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 6675 <!-- post image --> 6676 <div class="post-image grow-0 shrink-0 order-none"> 6677 <!-- img container --> 6678 <div class="image-container relative"> 6679 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 6680 href="https://www.mrhankeystoys.com/blog/curating-the-cabinet-how-to-build-and-maintain-a-premium-silicone-dildo-collection" 6681 title="Curating the Cabinet: How to Build and Maintain a Premium Silicone Dildo Collection" 6682 > 6683 <picture> 6684 6685 6686 <source type="image/webp" 6687 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/Curating_the_Cabinet_How_to_Build_and_Maintain_a_Premium_Silicone_C
6687ollection_1.webp"> 6688 6689 <source type="image/png" 6690 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Curating_the_Cabinet_How_to_Build_and_Maintain_a_Premium_Silicone_Collection_1.png"> 6691 6692 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Curating_the_Cabinet_How_to_Build_and_Maintain_a_Premium_Silicone_Collection_1.png" alt="Curating the Cabinet: How to Build and Maintain a Premium Silicone Collection - Assortment of colorful Hankey's Toys silicone dildos" width="500" height="281" decoding="async" /></picture> 6693 6694 </a> 6695 6696 <!-- post category--> 6697 <span class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 6698 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/care-safety-and-materials" 6699 title="Care, Safety & Materials"> 6700 Care, Safety & Materials </a> 6701 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 6702 title="Tips & Guides"> 6703 Tips & Guides </a> 6704 </span> 6705 <!-- end post category--> 6706 </div> 6707 </div> 6708 6709 <!-- block info --> 6710 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 6711 6712 <!-- block data --> 6713 <div class="post-data-wrap text-sm font-medium mb-3"> 6714 <!-- post author --> 6715 <span class="post-author-name">Author: Mister Hankey </span> 6716 <span> | </span> 6717 6718 <!-- post date --> 6719 <span class="post-date">May 26, 2026</span> 6720 6721 <!-- post view --> 6722 </div> 6723 6724 <!-- post title --> 6725 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 6726 <h3 class="post-title"> 6727 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/curating-the-cabinet-how-to-build-and-maintain-a-premium-silicone-dildo-collection">Curating the Cabinet: How to Build and Maintain a Premium Silicone Dildo Collection</a> 6728 </h3> 6729 </div> 6730 6731 6732 6733 <!-- post description --> 6734 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 6735 <style>#html-body [data-pb-style=K2YH777]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="K2YH777"><div data-content-type="text" data-appearance="default" data-element="main"><p dir="ltr">Owning one great silicone toy is awesome, but curating a proper collection? Thatâs next-level fun. Some days you want that warm, familiar feeling of a realistic partner. Other days youâre craving wild texture that makes your toes curl or that deep, satisfying stretch that leaves you blissed out. A thoughtfully built âpleasure wardrobeâ means you always have the right toy for your mood.</p> 6736<p dir="ltr">Letâs walk through how to do it right without wasting money on duplicates or ruining your investment.</p> 6737<h3 dir="ltr"><span style="font-size: 16px;"><strong>Why a Balanced Collection Makes Everything Better</strong></span></h3> 6738<p dir="ltr">Buying randomly often leads to a drawer full of âkinda similarâ toys. The secret sauce? Contrast. We recommend building around three foundational pillars that cover the main types of sensations most people crave.</p> 6739<h3 dir="ltr"><strong><span style="font-size: 16px;">The Three Pillars of a Killer Collection</span></strong></h3> 6740<div dir="ltr" align="left"> 6741<table style="border-collapse: collapse; background-color: rgb(236, 240, 241); border-color: rgb(0, 0, 0); border-style: solid;" border="1"><colgroup><col width="90"><col width="121"><col width="138"><col width="160"><col width="116"></colgroup> 6742<tbody> 6743<tr> 6744<td style="text-align: center; border-color: rgb(0, 0, 0);"> 6745<p dir="ltr"><strong>Pillar</strong></p> 6746</td> 6747<td style="text-align: center; border-color: rgb(0, 0, 0);"> 6748<p dir="ltr"><strong>What It Feels Like</strong></p> 6749</td> 6750<td style="text-align: center; border-color: rgb(0, 0, 0);"> 6751<p dir="ltr"><strong>Best For</strong></p> 6752</td> 6753<td style="text-align: center; border-color: rgb(0, 0, 0);"> 6754<p dir="ltr"><strong>Popular Picks at Hankeyâs</strong></p> 6755</td> 6756<td style="text-align: center; border-color: rgb(0, 0, 0);"> 6757<p dir="ltr"><strong>Firmness Sweet Spot</strong></p> 6758</td> 6759</tr> 6760<tr> 6761<td style="border-color: rgb(0, 0, 0);"> 6762<p dir="ltr"><strong>1. Realistic</strong></p> 6763</td> 6764<td style="border-color: rgb(0, 0, 0);"> 6765<p dir="ltr">Familiar, intimate, lifelike glide</p> 6766</td> 6767<td style="border-color: rgb(0, 0, 0);"> 6768<p dir="ltr">Roleplay, visual satisfaction, everyday comfort</p> 6769</td> 6770<td style="border-color: rgb(0, 0, 0);"> 6771<p dir="ltr">Lance Woods, Roxas Caelum, Atlas,</p></td></tr></tbody></table></div></div></div></div> </div> 6772 6773 <!-- read more --> 6774 <div class="flex"> 6775 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/curating-the-cabinet-how-to-build-and-maintain-a-premium-silicone-dildo-collection" title="Curating the Cabinet: How to Build and Maintain a Premium Silicone Dildo Collection"> 6776 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 6777 </a> 6778 </div> 6779 </div> 6780 </div> 6781 </li> 6782 <li class="post-item post-holder post-holder-272 block"> 6783 6784 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 6785 <!-- post image --> 6786 <div class="post-image grow-0 shrink-0 order-none"> 6787 <!-- img container --> 6788 <div class="image-container relative"> 6789 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 6790 href="https://www.mrhankeystoys.com/blog/the-goliath-and-beyond-safe-alternatives-to-fisting-with-giant-silicone" 6791 title="The Goliath and Beyond: Safe Alternatives to Fisting with Giant Silicone" 6792 > 6793 <picture> 6794 6795 6796 <source type="image/webp" 6797 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/The_Goliath_and_Beyond_Safe_Alternatives_to_Fisting_with_Giant_Silicone_1_.webp"> 6798 6799 <source type="image/png" 6800 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/The_Goliath_and_Beyond_Safe_Alternatives_to_Fisting_with_Giant_Silicone_1_.png"> 6801 6802 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/The_Goliath_and_Beyond_Safe_Alternatives_to_Fisting_with_Giant_Silicone_1_.png" alt="The Goliath and Beyond: Safe Alternatives to Fisting with Giant Silicone - Large black Hankey's Toys Goliath dildo" width="500" height="281" decoding="async" /></picture> 6803 6804 </a> 6805 6806 <!-- post category--> 6807 <sp
6807an class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 6808 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/size-and-xl-play" 6809 title="Size & XL Play"> 6810 Size & XL Play </a> 6811 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/care-safety-and-materials" 6812 title="Care, Safety & Materials"> 6813 Care, Safety & Materials </a> 6814 </span> 6815 <!-- end post category--> 6816 </div> 6817 </div> 6818 6819 <!-- block info --> 6820 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 6821 6822 <!-- block data --> 6823 <div class="post-data-wrap text-sm font-medium mb-3"> 6824 <!-- post author --> 6825 <span class="post-author-name">Author: Mister Hankey </span> 6826 <span> | </span> 6827 6828 <!-- post date --> 6829 <span class="post-date">May 19, 2026</span> 6830 6831 <!-- post view --> 6832 </div> 6833 6834 <!-- post title --> 6835 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 6836 <h3 class="post-title"> 6837 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/the-goliath-and-beyond-safe-alternatives-to-fisting-with-giant-silicone">The Goliath and Beyond: Safe Alternatives to Fisting with Giant Silicone</a> 6838 </h3> 6839 </div> 6840 6841 6842 6843 <!-- post description --> 6844 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 6845 <style>#html-body [data-pb-style=A6AL8S1]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="A6AL8S1"><div data-content-type="text" data-appearance="default" data-element="main"><h3 dir="ltr"><span style="font-size: 16px;"><strong>Written by the Hankeyâs Toys Design Team</strong></span></h3> 6846<p dir="ltr">Weâre a group of sculptors, testers, and size-play enthusiasts who love helping people explore their limits safely and joyfully. After more than a decade designing and hand-pouring extreme-size fantasy toys in our California workshop, weâve worked with thousands of size queens and kings chasing that incredible feeling of absolute fullness. This guide shares what weâve learned so you can push your boundaries with confidence and excitement.</p> 6847<p dir="ltr">Reaching the point where regular toys no longer give you that thrilling stretch is a huge milestone. Many people then start thinking about fisting. But finding a trusted partner, dealing with unpredictable movements, and managing safety can be challenging.</p> 6848<p dir="ltr">A well-engineered giant silicone dildo can deliver that same overwhelming fullness, often more safely and controllably in the comfort of solo play.</p> 6849<p dir="ltr">Hereâs how to do it right.</p> 6850<h3 dir="ltr"><span style="font-size: 16px;"><strong>Key Takeaways</strong></span></h3> 6851<ul> 6852<li dir="ltr" aria-level="1"> 6853<p dir="ltr" role="presentation">Giant silicone toys provide consistent, predictable pressure unlike</p></li></ul></div></div></div> </div> 6854 6855 <!-- read more --> 6856 <div class="flex"> 6857 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/the-goliath-and-beyond-safe-alternatives-to-fisting-with-giant-silicone" title="The Goliath and Beyond: Safe Alternatives to Fisting with Giant Silicone"> 6858 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 6859 </a> 6860 </div> 6861 </div> 6862 </div> 6863 </li> 6864 <li class="post-item post-holder post-holder-270 block"> 6865 6866 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 6867 <!-- post image --> 6868 <div class="post-image grow-0 shrink-0 order-none"> 6869 <!-- img container --> 6870 <div class="image-container relative"> 6871 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 6872 href="https://www.mrhankeystoys.com/blog/player-two-has-entered-how-to-integrate-fantasy-sculptures-into-partnered-play" 6873 title="Player Two Has Entered: How to Integrate Fantasy Sculptures into Partnered Play" 6874 > 6875 <picture> 6876 6877 6878 <source type="image/webp" 6879 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/Player_Two_Has_Entered_How_to_Integrate_Fantasy_Sculptures_into_Partnered_Play.webp"> 6880 6881 <source type="image/png" 6882 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Player_Two_Has_Entered_How_to_Integrate_Fantasy_Sculptures_into_Partnered_Play.png"> 6883 6884 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Player_Two_Has_Entered_How_to_Integrate_Fantasy_Sculptures_into_Partnered_Play.png" alt="Player Two Has Entered: How to Integrate Fantasy Sculptures into Partnered Play - Couple in bed with red fantasy dildo by Hankey's Toys" width="500" height="281" decoding="async" /></picture> 6885 6886 </a> 6887 6888 <!-- post category--> 6889 <sp
6889an class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 6890 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/fantasy-and-sci-fi" 6891 title="Fantasy & Sci-Fi"> 6892 Fantasy & Sci-Fi </a> 6893 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 6894 title="Tips & Guides"> 6895 Tips & Guides </a> 6896 </span> 6897 <!-- end post category--> 6898 </div> 6899 </div> 6900 6901 <!-- block info --> 6902 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 6903 6904 <!-- block data --> 6905 <div class="post-data-wrap text-sm font-medium mb-3"> 6906 <!-- post author --> 6907 <span class="post-author-name">Author: Mister Hankey </span> 6908 <span> | </span> 6909 6910 <!-- post date --> 6911 <span class="post-date">May 12, 2026</span> 6912 6913 <!-- post view --> 6914 </div> 6915 6916 <!-- post title --> 6917 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 6918 <h3 class="post-title"> 6919 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/player-two-has-entered-how-to-integrate-fantasy-sculptures-into-partnered-play">Player Two Has Entered: How to Integrate Fantasy Sculptures into Partnered Play</a> 6920 </h3> 6921 </div> 6922 6923 6924 6925 <!-- post description --> 6926 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 6927 <style>#html-body [data-pb-style=FMVR63U]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="FMVR63U"><div data-content-type="text" data-appearance="default" data-element="main"><p>When most people think of an adult fantasy store, they imagine products designed exclusively for solo exploration. The massive sizes, intricate textures, and non-human shapes are often viewed as personal, intimate challenges. But keeping these incredible sculpts confined to solo sessions means you are missing out on one of the most thrilling experiences the hobby has to offer.</p></div></div></div> </div> 6928 6929 <!-- read more --> 6930 <div class="flex"> 6931 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/player-two-has-entered-how-to-integrate-fantasy-sculptures-into-partnered-play" title="Player Two Has Entered: How to Integrate Fantasy Sculptures into Partnered Play"> 6932 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 6933 </a> 6934 </div> 6935 </div> 6936 </div> 6937 </li> 6938 <li class="post-item post-holder post-holder-269 block"> 6939 6940 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 6941 <!-- post image --> 6942 <div class="post-image grow-0 shrink-0 order-none"> 6943 <!-- img container --> 6944 <div class="image-container relative"> 6945 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 6946 href="https://www.mrhankeystoys.com/blog/the-back-door-to-fantasy-a-safety-guide-to-anal-play-with-sculpted-toys" 6947 title="The Back Door to Fantasy: A Safety Guide to Anal Play with Sculpted Toys" 6948 > 6949 <picture> 6950 6951 6952 <source type="image/webp" 6953 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/The_Back_Door_to_Fantasy_A_Safety_Guide_to_Anal_Play_with_Sculpted_Toys_1.webp"> 6954 6955 <source type="image/png" 6956 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/The_Back_Door_to_Fantasy_A_Safety_Guide_to_Anal_Play_with_Sculpted_Toys_1.png"> 6957 6958 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/The_Back_Door_to_Fantasy_A_Safety_Guide_to_Anal_Play_with_Sculpted_Toys_1.png" alt="Safety Guide to Anal Play with Sculpted Toys - The Back Door to Fantasy by Hankey's Toys" width="500" height="281" decoding="async" /></picture> 6959 6960 </a> 6961 6962 <!-- post category--> 6963 <sp
6963an class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 6964 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/sexual-wellness" 6965 title="Sexual Wellness"> 6966 Sexual Wellness </a> 6967 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 6968 title="Tips & Guides"> 6969 Tips & Guides </a> 6970 </span> 6971 <!-- end post category--> 6972 </div> 6973 </div> 6974 6975 <!-- block info --> 6976 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 6977 6978 <!-- block data --> 6979 <div class="post-data-wrap text-sm font-medium mb-3"> 6980 <!-- post author --> 6981 <span class="post-author-name">Author: Mister Hankey </span> 6982 <span> | </span> 6983 6984 <!-- post date --> 6985 <span class="post-date">May 05, 2026</span> 6986 6987 <!-- post view --> 6988 </div> 6989 6990 <!-- post title --> 6991 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 6992 <h3 class="post-title"> 6993 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/the-back-door-to-fantasy-a-safety-guide-to-anal-play-with-sculpted-toys">The Back Door to Fantasy: A Safety Guide to Anal Play with Sculpted Toys</a> 6994 </h3> 6995 </div> 6996 6997 6998 6999 <!-- post description --> 7000 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 7001 <style>#html-body [data-pb-style=IJHN438]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="IJHN438"><div data-content-type="text" data-appearance="default" data-element="main"><p dir="ltr"><strong>Written by the Hankeyâs Toys Design Team</strong></p> 7002<p dir="ltr">Weâre a bunch of sculptors, testers, and pleasure enthusiasts who love helping people explore safely and joyfully. After years of designing wild fantasy toys in our California workshop and chatting with thousands of adventurous users, weâve put together this guide to help you enjoy anal play with textured and fantasy toys; with excitement, confidence, and zero regrets.</p> 7003<p>Â </p></div></div></div> </div> 7004 7005 <!-- read more --> 7006 <div class="flex"> 7007 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/the-back-door-to-fantasy-a-safety-guide-to-anal-play-with-sculpted-toys" title="The Back Door to Fantasy: A Safety Guide to Anal Play with Sculpted Toys"> 7008 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 7009 </a> 7010 </div> 7011 </div> 7012 </div> 7013 </li> 7014 <li class="post-item post-holder post-holder-268 block"> 7015 7016 <div class="post-container flex flex-col border border-[#eee] p-1 h-full hover:shadow-[0_0_5px_rgba(0,0,0,0.2)] group"> 7017 <!-- post image --> 7018 <div class="post-image grow-0 shrink-0 order-none"> 7019 <!-- img container --> 7020 <div class="image-container relative"> 7021 <a class="image-wrap flex justify-center items-center overflow-hidden relative" 7022 href="https://www.mrhankeystoys.com/blog/suction-swirls-and-scales-navigating-the-textures-of-octopus-tentacle-sex-toys" 7023 title="Suction, Swirls, and Scales: Navigating the Textures of Octopus Tentacle Sex Toys" 7024 > 7025 <picture> 7026 7027 7028 <source type="image/webp" 7029 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/blog/cache/500x_0/magefan_blog/Suction_Swirls_and_Scales_Navigating_the_Textures_of_Octopus_Tentacle_Sex_Toys.webp"> 7030 7031 <source type="image/png" 7032 srcset="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Suction_Swirls_and_Scales_Navigating_the_Textures_of_Octopus_Tentacle_Sex_Toys.png"> 7033 7034 <img class="w-full group-hover:scale-110 transition duration-500 ease-in-out" src="https://www.mrhankeystoys.com/media/blog/cache/500x_0/magefan_blog/Suction_Swirls_and_Scales_Navigating_the_Textures_of_Octopus_Tentacle_Sex_Toys.png" alt="Colorful silicone octopus tentacle dildos with prominent suction cups, swirls, and scales displayed in a deep blue underwater scene for the blog 'Suction, Swirls, and Scales: Navigating the Textures of Octopus Tentacle Sex Toys' by Mr. Hankey's Toys" width="500" height="281" decoding="async" /></picture> 7035 7036 </a> 7037 7038 <!-- post category--> 7039 <sp
7039an class="post-category block absolute left-0 bottom-0 leading-none hidden md:block"> 7040 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/fantasy-and-sci-fi" 7041 title="Fantasy & Sci-Fi"> 7042 Fantasy & Sci-Fi </a> 7043 <a class="category-name inline-block bg-black hover:bg-[#4db2ec] duration-300 text-white text-xs font-medium leading-none px-2 py-2 mr-1 mt-1" href="https://www.mrhankeystoys.com/blog/tips-and-guides" 7044 title="Tips & Guides"> 7045 Tips & Guides </a> 7046 </span> 7047 <!-- end post category--> 7048 </div> 7049 </div> 7050 7051 <!-- block info --> 7052 <div class="post-info grow-0 shrink-0 order-1 px-6 py-5 s767:p-4"> 7053 7054 <!-- block data --> 7055 <div class="post-data-wrap text-sm font-medium mb-3"> 7056 <!-- post author --> 7057 <span class="post-author-name">Author: Mister Hankey </span> 7058 <span> | </span> 7059 7060 <!-- post date --> 7061 <span class="post-date">April 28, 2026</span> 7062 7063 <!-- post view --> 7064 </div> 7065 7066 <!-- post title --> 7067 <div class="post-title-wrap mb-3 h-14 overflow-hidden"> 7068 <h3 class="post-title"> 7069 <a class="text-lg font-semibold inline-block align-top line-clamp-2" href="https://www.mrhankeystoys.com/blog/suction-swirls-and-scales-navigating-the-textures-of-octopus-tentacle-sex-toys">Suction, Swirls, and Scales: Navigating the Textures of Octopus Tentacle Sex Toys</a> 7070 </h3> 7071 </div> 7072 7073 7074 7075 <!-- post description --> 7076 <div class="post-description mb-4 [&_img]:hidden line-clamp-4 hidden"> 7077 <style>#html-body [data-pb-style=HGRCTRD]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="HGRCTRD"><div data-content-type="text" data-appearance="default" data-element="main"><p dir="ltr">Written by Hankeyâs Toys Senior Product Designer at Mr. Hankeyâs Toys</p> 7078<p dir="ltr">With over 12 years crafting and personally testing hundreds of fantasy silicone toys, including dozens of tentacle prototypes.</p> 7079<p><strong>Â </strong></p> 7080<p dir="ltr">When many people move from smooth, realistic dildos to fantasy shapes, an octopus-style tentacle dildo is often their first choice. These toys stand out not just for their sci-fi or hentai-inspired look, but for the unique way their textures interact with the body.</p></div></div></div> </div> 7081 7082 <!-- read more --> 7083 <div class="flex"> 7084 <a class="hover-with-arrow" href="https://www.mrhankeystoys.com/blog/suction-swirls-and-scales-navigating-the-textures-of-octopus-tentacle-sex-toys" title="Suction, Swirls, and Scales: Navigating the Textures of Octopus Tentacle Sex Toys"> 7085 Read more <svg width="10" height="13" viewBox="0 0 10 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.75071 5.66776C9.34483 6.06354 9.34483 6.93646 8.75072 7.33224L1.80442 11.9597C1.13984 12.4024 0.249999 11.926 0.249999 11.1274L0.25 1.87256C0.25 1.07402 1.13984 0.597596 1.80442 1.04032L8.75071 5.66776Z" fill="#B75E29"></path></svg> 7086 </a> 7087 </div> 7088 </div> 7089 </div> 7090 </li> 7091 <li class="hidden"> 7092
7092<script type="text/javascript"> 7093 if (window.addthis) { 7094 addthis.toolbox('.addthis_toolbox'); 7095 } 7096 </script>
7096 7097 </li> 7098 </ol> 7099 </div> 7100 7101 <div class="toolbar toolbar-blog-posts"> 7102 7103 7104 7105 <div class="flex justify-center"> 7106 <nav class="pages" aria-label="pagination"> 7107 <ol class="relative z-0 inline-flex shadow-sm items pages-items"> 7108 <li class="item pages-item-previous"> 7109 <a 7110 role="link" 7111 class="previous relative inline-flex items-center text-sm font-medium leading-5 bg-white border border-gray-300 rounded-l-md px-3 py-2 text-gray-400 7112 border-gray-200" 7113 aria-disabled="true" 7114 aria-label="Previous" 7115 > 7116 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" aria-hidden="true"> 7117 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 7118</svg> 7119 </a> 7120 </li> 7121 7122 7123 7124 <li class="item -ml-px"> 7125 <a 7126 href="https://www.mrhankeystoys.com/blog" 7127 class="page relative inline-flex items-center text-sm font-medium leading-5 bg-white border border-gray-300 transition duration-150 ease-in-out hover:text-gray-400 focus:z-10 focus:outline-none focus:border-primary-lighter focus:shadow-outline-blue active:bg-gray-100 active:text-gray-500 z-10 px-4 py-2 text-gray-700 bg-gray-100 border-primary" 7128 aria-current="page" 7129 > 7130 <span class="sr-only label"> 7131 You're currently reading page </span> 7132 1 </a> 7133 </li> 7134 <li class="item -ml-px"> 7135 <a 7136 href="https://www.mrhankeystoys.com/blog?page=2" 7137 class="page relative inline-flex items-center text-sm font-medium leading-5 bg-white border border-gray-300 transition duration-150 ease-in-out hover:text-gray-400 focus:z-10 focus:outline-none focus:border-primary-lighter focus:shadow-outline-blue active:bg-gray-100 active:text-gray-500 px-4 py-2 text-gray-700" 7138 > 7139 <span class="sr-only label">Page</span> 7140 <span>2</span> 7141 </a> 7142 </li> 7143 <li class="item -ml-px"> 7144 <a 7145 href="https://www.mrhankeystoys.com/blog?page=3" 7146 class="page relative inline-flex items-center text-sm font-medium leading-5 bg-white border border-gray-300 transition duration-150 ease-in-out hover:text-gray-400 focus:z-10 focus:outline-none focus:border-primary-lighter focus:shadow-outline-blue active:bg-gray-100 active:text-gray-500 px-4 py-2 text-gray-700" 7147 > 7148 <span class="sr-only label">Page</span> 7149 <span>3</span> 7150 </a> 7151 </li> 7152 <li class="item -ml-px"> 7153 <a 7154 href="https://www.mrhankeystoys.com/blog?page=4" 7155 class="page relative inline-flex items-center text-sm font-medium leading-5 bg-white border border-gray-300 transition duration-150 ease-in-out hover:text-gray-400 focus:z-10 focus:outline-none focus:border-primary-lighter focus:shadow-outline-blue active:bg-gray-100 active:text-gray-500 px-4 py-2 text-gray-700" 7156 >
7157 <span class="sr-only label">Page</span> 7158 <span>4</span> 7159 </a> 7160 </li> 7161 <li class="item -ml-px"> 7162 <a 7163 href="https://www.mrhankeystoys.com/blog?page=5" 7164 class="page relative inline-flex items-center text-sm font-medium leading-5 bg-white border border-gray-300 transition duration-150 ease-in-out hover:text-gray-400 focus:z-10 focus:outline-none focus:border-primary-lighter focus:shadow-outline-blue active:bg-gray-100 active:text-gray-500 px-4 py-2 text-gray-700" 7165 > 7166 <span class="sr-only label">Page</span> 7167 <span>5</span> 7168 </a> 7169 </li> 7170 7171 7172 7173 <li class="item pages-item-next -ml-px"> 7174 <a 7175 href="https://www.mrhankeystoys.com/blog?page=2" 7176 class="action next relative inline-flex items-center text-sm font-medium leading-5 bg-white border border-gray-300 transition duration-150 ease-in-out hover:text-gray-400 focus:z-10 focus:outline-none focus:border-primary-lighter focus:shadow-outline-blue active:bg-gray-100 active:text-gray-500 rounded-r-md px-3 py-2 text-gray-500" 7177 aria-label="Next" 7178 > 7179 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" aria-hidden="true"> 7180 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 7181</svg> 7182 </a> 7183 </li> 7184 </ol> 7185 </nav> 7186 </div> 7187 7188 7189 7190 </div> 7191
7191<script> 7192 function mfShareWindowOpen(url, type) { 7193 function reverse(s){ 7194 return s.split('').reverse().join(''); 7195 } 7196 7197 var u; 7198 switch (type) { 7199 case 'facebook': 7200 u = reverse('=u?php.rerahs/rerahs/moc.koobecaf.www//:sptth') + url; 7201 break; 7202 case 'pinterest': 7203 u = reverse('=lru?/nottub/etaerc/nip/moc.tseretnip//:sptth') + url; 7204 break; 7205 case 'twitter': 7206 u =reverse('=lru?erahs/moc.rettiwt//:ptth') + url; 7207 break; 7208 case 'linkedin': 7209 u =reverse('=lru?/etisffo-erahs/gnirahs/moc.nideknil.www//:sptth') + url; 7210 break; 7211 } 7212 if (u) { 7213 window.open (u, null, 'width=600,height=400'); 7214 } 7215 } 7216</script>
7216 7217<style> 7218 .post-view { 7219 display: block; 7220 background: #000; 7221 color: #fff; 7222 font-size: 10px; 7223 font-weight: 600; 7224 text-align: center; 7225 line-height: 11px; 7226 position: relative; 7227 top: -5px; 7228 padding: 4px 6px; 7229 } 7230 .post-view:after { 7231 position: absolute; 7232 bottom: -3px; 7233 left: 0; 7234 content: ''; 7235 width: 0; 7236 height: 0; 7237 border-style: solid; 7238 border-width: 3px 3px 0 0; 7239 border-color: #000 transparent transparent; 7240 } 7241</style> 7242</div></div></main><footer class="page-footer"><div class="footer content">
7242<script> 7243 addEventListener('DOMContentLoaded', () => { 7244 for (const [selector, label] of Object.entries({"aside.sidebar-main":"Sidebar Main"})) { 7245 const target = document.querySelector(selector); 7246 target && target.setAttribute('aria-label', label); 7247 } 7248 }, {once: true}) 7249</script>
7249 7250 7251 7252<section 7253 class="relative container brand-slider" 7254 style="--size: clamp(10rem, 1rem + 40vmin, 30rem); --gap: calc(var(--size) / 14); --duration: 40s;" 7255 aria-label="Our favorite brands" 7256> 7257<div class="bs-content after:content-[''] after:bg-[linear-gradient(90deg,_rgba(183,_94,_41,_0.20)_15.38%,_#B75E29_50%,_rgba(183,_94,_41,_0.20)_85.1%)] after:h-[1px] after:w-full after:absolute after:bottom-0 after:left-0 relative pb-10 pt-8 s1400:py-12 s767:pt-6 s767:pb-10"> 7258 <div class="inner-title">As Featured On</div> 7259 <div class="swiper-container swiper--top"> 7260 <div class="swiper-wrapper"> 7261 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 7262 <picture> 7263 7264 7265 <source type="image/webp" 7266 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/wysiwyg/brands/attitude.webp"> 7267 7268 <source type="image/png" 7269 srcset="https://www.mrhankeystoys.com/media/wysiwyg/brands/attitude.png"> 7270 7271 <img 7272 src="https://www.mrhankeystoys.com/media/wysiwyg/brands/attitude.png" 7273 alt="attitude" 7274 width="118" 7275 height="30" 7276 loading="lazy" 7277 decoding="async" ></picture> 7278 7279 </div> 7280 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 7281 <picture> 7282 7283 7284 <source type="image/webp" 7285 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/wysiwyg/brands/avn.webp"> 7286 7287 <source type="image/png" 7288 srcset="https://www.mrhankeystoys.com/media/wysiwyg/brands/avn.png"> 7289 7290 <img 7291 src="https://www.mrhankeystoys.com/media/wysiwyg/brands/avn.png" 7292 alt="attitude" 7293 width="63" 7294 height="45" 7295 loading="lazy" 7296 decoding="async" ></picture> 7297 7298 </div> 7299 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 7300 <picture> 7301 7302 7303 <source type="image/webp" 7304 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/wysiwyg/brands/clav.webp"> 7305 7306 <source type="image/png" 7307 srcset="https://www.mrhankeystoys.com/media/wysiwyg/brands/clav.png"> 7308 7309 <img 7310 src="https://www.mrhankeystoys.com/media/wysiwyg/brands/clav.png" 7311 alt="attitude" 7312 width="106" 7313 height="40" 7314 loading="lazy" 7315 decoding="async" ></picture> 7316 7317 </div> 7318 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 7319 <picture> 7320 7321 7322 <source type="image/webp" 7323 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/wysiwyg/brands/folsom.webp"> 7324 7325 <source type="image/png" 7326 srcset="https://www.mrhankeystoys.com/media/wysiwyg/brands/folsom.png"> 7327 7328 <img 7329 src="https://www.mrhankeystoys.com/media/wysiwyg/brands/folsom.png" 7330 alt="attitude" 7331 width="75" 7332 height="34" 7333 loading="lazy" 7334 decoding="async" ></picture> 7335 7336 </div> 7337 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 7338 <picture> 7339 7340 7341 <source type="image/webp" 7342 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/wysiwyg/brands/iheart.webp"> 7343 7344 <source type="image/png" 7345 srcset="https://www.mrhankeystoys.com/media/wysiwyg/brands/iheart.png"> 7346 7347 <img 7348 src="https://www.mrhankeystoys.com/media/wysiwyg/brands/iheart.png" 7349 alt="attitude" 7350 width="111" 7351 height="30" 7352 loading="lazy" 7353 decoding="async" ></picture> 7354 7355 </div> 7356 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 7357 <picture> 7358 7359 7360 <source type="image/webp" 7361 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/wysiwyg/brands/laweekly.webp"> 7362 7363 <source type="image/png" 7364 srcset="https://www.mrhankeystoys.com/media/wysiwyg/brands/laweekly.png"> 7365 7366 <img 7367 src="https://www.mrhankeystoys.com/media/wysiwyg/brands/laweekly.png" 7368 alt="attitude" 7369 width="117" 7370 height="30" 7371 loading="lazy" 7372 decoding="async" ></picture> 7373 7374 </div> 7375 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 7376 <picture> 7377 7378 7379 <source type="image/webp" 7380 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/wysiwyg/brands/out.webp"> 7381 7382 <source type="image/png" 7383 srcset="https://www.mrhankeystoys.com/media/wysiwyg/brands/out.png"> 7384 7385 <img 7386 src="https://www.mrhankeystoys.com/media/wysiwyg/brands/out.png" 7387 alt="attitude" 7388 width="89" 7389 height="28" 7390 loading="lazy" 7391 decoding="async" ></picture> 7392 7393 </div> 7394 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 7395 <picture> 7396 7397 7398 <source type="image/webp" 7399 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/wysiwyg/brands/recon.webp"> 7400 7401 <source type="image/png" 7402 srcset="https://www.mrhankeystoys.com/media/wysiwyg/brands/recon.png"> 7403 7404 <img 7405 src="https://www.mrhankeystoys.com/media/wysiwyg/brands/recon.png" 7406 alt="attitude" 7407 width="133" 7408 height="45" 7409 loading="lazy" 7410 decoding="async" ></picture> 7411 7412 </div> 7413 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 7414 <picture> 7415 7416 7417 <source type="image/webp" 7418 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/wysiwyg/brands/vice.webp"> 7419 7420 <source type="image/png" 7421 srcset="https://www.mrhankeystoys.com/media/wysiwyg/brands/vice.png"> 7422 7423 <img 7424 src="https://www.mrhankeystoys.com/media/wysiwyg/brands/vice.png" 7425 alt="attitude" 7426 width="95" 7427 height="30" 7428 loading="lazy" 7429 decoding="async" ></picture> 7430 7431 </div> 7432 <div class="swiper-slide text-center bg-white flex justify-center items-center relatoive px-10 s767:px-5 !w-auto !h-auto"> 7433 <picture> 7434 7435 7436 <source type="image/webp" 7437 srcset="https://www.mrhankeystoys.com/media/opti_image/webp/wysiwyg/brands/xbiz.webp"> 7438 7439 <source type="image/png" 7440 srcset="https://www.mrhankeystoys.com/media/wysiwyg/brands/xbiz.png"> 7441 7442 <img 7443 src="https://www.mrhankeystoys.com/media/wysiwyg/brands/xbiz.png" 7444 alt="attitude" 7445 width="90" 7446 height="45" 7447 loading="lazy" 7448 decoding="async" ></picture> 7449 7450 </div> 7451 </div> 7452 </div> 7453</div> 7454</section> 7455 7456 7457<style> 7458 .swiper--top { overflow:hidden; } 7459 7460 .swiper--top .swiper-wrapper { -webkit-transition-timing-function: linear !important; transition-timing-function: linear !important; position: relative; } 7461</style>
7462<script> 7463 var SwiperTop = new Swiper('.page-footer .swiper--top', { 7464 spaceBetween: 0, 7465 centeredSlides: true, 7466 speed: 3500, 7467 autoplay: { 7468 delay: 1, 7469 }, 7470 loop: true, 7471 slidesPerView:'auto', 7472 allowTouchMove: false, 7473 disableOnInteraction: true 7474 }); 7475</script>
7475 7476<div class="newsletter-block"> 7477 <div class="container"> 7478 <form 7479 id="newsletter-validate-detail" 7480 class="form subscribe" 7481 action="https://www.mrhankeystoys.com/newsletter/subscriber/new/" 7482 method="post" 7483 x-data="initNewsletterForm" 7484 @submit.prevent="submitForm" 7485 aria-label="Subscribe to Newsletter" 7486 > 7487 <div class="flex items-center gap-5 justify-center py-10 s1200:flex-col s1023:gap-0 s767:items-start for-page-only"> 7488 <strong class="jost text-[30px] font-medium s1023:text-2xl s767:text-[22px] shrink-0 s767:text-center s767:w-full">Stay in the Loop!</strong> 7489 <p class="s1023:text-sm s1023:mb-4 max-w-[620px] s1200:max-w-full text-center"> 7490 Be the first to know about new releases, exclusive promotions, and insider tips!<br/> 7491 We respect your privacy and your email is never shared or sold. </p> 7492 <div class="flex relative max-w-lg w-full shrink-0 flex-wrap"> 7493 <label class="grow m-0"> 7494 <input 7495 type="email" 7496 id="newsletter-subscribe" 7497 name="email" 7498 class="form-input w-full border-baseColor pr-[120px] h-[53px] focus:!ring-baseColor focus:!border-baseColor s1023:h-11" 7499 required 7500 placeholder="Enter email address..." 7501 x-on:input="validateEmail($event.target.value)" 7502 x-bind:class="{ 'border-red-500 focus:border-red-500': displayErrorMessage }" 7503 > 7504 <input name="form_key" type="hidden" value="9SFsreOEuib59vuZ" /> <div class="control"> 7505 <input type="hidden" 7506 value="" 7507 name="g-recaptcha-response" 7508 /> 7509</div> 7510 </label> 7511 <button 7512 class="shrink-0 absolute right-0 text-sm font-semibold top-0 h-[53px] px-5 s1023:h-11" 7513 type="submit" 7514 x-bind:disabled="displayErrorMessage" 7515 x-bind:class="{ 'opacity-50 cursor-not-allowed': displayErrorMessage }" 7516 > 7517 Sign Up Now </button> 7518 <template x-if="displayErrorMessage"> 7519 <p class="flex items-center text-[#FF0000] mt-1 text-xs absolute top-full left-0"> 7520 <template x-for="errorMessage in errorMessages"> 7521 <span x-html="errorMessage"></span> 7522 </template> 7523 </p> 7524 </template> 7525 </div> 7526 </div> 7527 7528 </form> 7529 </div> 7530
7530<script> 7531 function initNewsletterForm() { 7532 return { 7533 errors: 0, 7534 hasCaptchaToken: 0, 7535 displayErrorMessage: false, 7536 errorMessages: [], 7537 7538 // List of blocked email patterns and domains 7539 blockedEmails: [ 7540 '[email protected]', 7541 '[email protected]', 7542 '[email protected]', 7543 '[email protected]', 7544 '[email protected]' 7545 ], 7546 7547 blockedDomains: [ 7548 'test.com', 7549 'example.com', 7550 'tempmail.com', 7551 '10minutemail.com', 7552 'guerrillamail.com', 7553 'mailinator.com', 7554 'yopmail.com' 7555 ], 7556 7557 blockedPatterns: [ 7558 /^test[\d]*@/i, 7559 /^admin[\d]*@/i, 7560 /^noreply[\d]*@/i, 7561 /^no-reply[\d]*@/i, 7562 /^dummy[\d]*@/i, 7563 /^fake[\d]*@/i, 7564 /^spam[\d]*@/i, 7565 /^trash[\d]*@/i 7566 ], 7567 7568 setErrorMessages(messages) { 7569 this.errorMessages = Array.isArray(messages) ? messages : [messages]; 7570 this.displayErrorMessage = this.errorMessages.length > 0; 7571 }, 7572 7573 clearErrorMessages() { 7574 this.errorMessages = []; 7575 this.displayErrorMessage = false; 7576 }, 7577 7578 isValidEmail(email) { 7579 // Basic email format validation 7580 const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; 7581 return emailRegex.test(email); 7582 }, 7583 7584 isBlockedEmail(email) { 7585 const emailLower = email.toLowerCase().trim(); 7586 7587 // Check exact matches 7588 if (this.blockedEmails.includes(emailLower)) { 7589 return true; 7590 } 7591 7592 // Check domain 7593 const domain = emailLower.split('@')[1]; 7594 if (domain && this.blockedDomains.includes(domain)) { 7595 return true; 7596 } 7597 7598 // Check patterns 7599 for (let pattern of this.blockedPatterns) { 7600 if (pattern.test(emailLower)) { 7601 return true; 7602 } 7603 } 7604 7605 return false; 7606 }, 7607 7608 validateEmail(email) { 7609 this.clearErrorMessages(); 7610 7611 if (!email) { 7612 return true; // Don't show error for empty field 7613 } 7614 7615 // Check basic email format 7616 if (!this.isValidEmail(email)) { 7617 this.setErrorMessages('Please enter a valid email address.'); 7618 return false; 7619 } 7620 7621 // Check if email is blocked 7622 if (this.isBlockedEmail(email)) { 7623 this.setErrorMessages('Please enter a valid email address. Test emails are not allowed.'); 7624 return false; 7625 } 7626 7627 // Additional validations 7628 const emailLower = email.toLowerCase().trim(); 7629 7630 // Check for too many consecutive dots 7631 if (emailLower.includes('..')) { 7632 this.setErrorMessages('Please enter a valid email address.'); 7633 return false; 7634 } 7635 7636 // Check for very short domains 7637 const domain = emailLower.split('@')[1]; 7638 if (domain && domain.length < 4) { 7639 this.setErrorMessages('Please enter a valid email address.'); 7640 return false; 7641 } 7642 7643 // Check for suspicious patterns 7644 if (emailLower.includes('+test') || emailLower.includes('+spam')) { 7645 this.setErrorMessages('Please enter a valid email address.'); 7646 return false;
7647 } 7648 7649 return true; 7650 }, 7651 7652 submitForm() { 7653 // Do not rename $form, the variable is expected to be declared in the recaptcha output 7654 const $form = document.querySelector('#newsletter-validate-detail'); 7655 const emailInput = $form.querySelector('input[name="email"]'); 7656 7657 // Clear previous errors 7658 this.errors = 0; 7659 this.clearErrorMessages(); 7660 7661 // Validate email before submission 7662 if (!emailInput.value.trim()) { 7663 this.errors++; 7664 this.setErrorMessages('Email address is required.'); 7665 return; 7666 } 7667 7668 if (!this.validateEmail(emailInput.value)) { 7669 this.errors++; 7670 return; // Error message already set by validateEmail 7671 } 7672 7673 // ReCAPTCHA validation 7674 if (!this.hasCaptchaToken) { 7675 this.errors = 1; 7676 7677 7678 const executeGreCaptcha = () => { 7679 grecaptcha.ready(() => { 7680 grecaptcha.execute( 7681 '6LeoIcUrAAAAAJYfHQM4lGMaUcmcjlQaBgv49EZy', 7682 {action: 'submit'} 7683 ).then((token) => { 7684 const tokenElement = $form['g\u002Drecaptcha\u002Dresponse']; 7685 7686 if (tokenElement && token && token.length > 0) { 7687 $form['g\u002Drecaptcha\u002Dresponse'].value = token; 7688 this.errors = 0; 7689 this.hasCaptchaToken = 1; 7690 (this.submitForm || $form.submit).call(this); 7691 } else { 7692 this.errors = 1; 7693 const error = tokenElement 7694 ? 'ReCaptcha\u0020validation\u0020failed,\u0020please\u0020try\u0020again' 7695 : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020trying\u0020again.'; 7696 if (this.setErrorMessages) { 7697 this.setErrorMessages([error]) 7698 this.displayErrorMessage = true; 7699 } else { 7700 window.dispatchMessages && window.dispatchMessages([{type: "error", text: error}], 5000); 7701 } 7702 } 7703 }).catch(exception => { 7704 console.error(exception || `An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?`) 7705 }); 7706 }) 7707 } 7708 7709 if (window.grecaptcha) { 7710 executeGreCaptcha(); 7711 } else { 7712 const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LeoIcUrAAAAAJYfHQM4lGMaUcmcjlQaBgv49EZy"; 7713 const script = document.createElement('script'); 7714 script.setAttribute('type', 'text/javascript'); 7715 script.setAttribute('src', recaptchaUrl); 7716 document.head.appendChild(script); 7717 7718 script.addEventListener("load", executeGreCaptcha, false); 7719 } 7720 } 7721 7722 if (this.errors === 0) { 7723 $form.submit(); 7724 } 7725 } 7726 } 7727 } 7728 7729 window.addEventListener('alpine:init', () => Alpine.data('initNewsletterForm', initNewsletterForm), { once: true }) 7730 </script>
7730 7731 </div> 7732<div class="bg-[#F4F4F4] py-10 s1400:py-12 s767:py-6"> 7733 <div class="container"> 7734 <div class="flex gap-10 justify-between ipad:flex-wrap s767:flex-col s767:gap-5"> 7735 <div class="flex gap-5 first-block max-w-[470px] w-full s1400:max-w-[300px] s1400:flex-col ipad:-order-1 ipad:max-w-[calc(100%-310px)] ipad:flex-row s767:max-w-full s767:gap-2.5 s767:border-b s767:border-[#ccc] s767:pb-8 s767:mb-2"> 7736 <div class="shrink-0"><img src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/images/logo-footer.png" width="108" height="70" alt="HankeysToys" /></div> 7737 <div class="flex gap-8 flex-col ipad:gap-5 s767:gap-6"> 7738 <p class="text-sm">Handcrafted in California with platinum-cured silicone, we create real legends and outrageous fantasiesâbuilt to order, shipped discreetly, and tailored to you.</p> 7739 <div class="email flex flex-col gap-1"> 7740 <span class="text-sm flex gap-2.5 items-center"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="13" viewBox="0 0 18 13" fill="none" class="shrink-0" role="img"> 7741<path d="M16.418 0H1.58203C0.707941 0 0 0.731683 0 1.625V11.375C0 12.2736 0.713145 13 1.58203 13H16.418C17.2847 13 18 12.2767 18 11.375V1.625C18 0.733272 17.2949 0 16.418 0ZM16.1964 1.08333C15.8732 1.41357 10.3107 7.09703 10.1187 7.29325C9.81984 7.6002 9.42258 7.7692 9 7.7692C8.57742 7.7692 8.18016 7.60016 7.88034 7.29224C7.75118 7.16026 2.25011 1.53956 1.80359 1.08333H16.1964ZM1.05469 11.1545V1.84618L5.61227 6.50289L1.05469 11.1545ZM1.80425 11.9167L6.36005 7.26689L7.13556 8.05928C7.63358 8.57083 8.29571 8.85253 9 8.85253C9.70429 8.85253 10.3664 8.57083 10.8635 8.06029L11.64 7.26689L16.1957 11.9167H1.80425ZM16.9453 11.1545L12.3877 6.50289L16.9453 1.84618V11.1545Z" fill="#0F0F0F"/> 7742<title>email</title></svg> 7743 Email Now</span> 7744 <a class="text-sm hover:text-blueColor" href="/contact-us">[email protected]</a> 7745 </div> 7746 <ul class="flex items-center gap-2 flex-wrap"> 7747 <li><img src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/images/visa.svg" alt="visa" width="49" height="24" /></li> 7748 <li><img src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/images/mastercard.svg" alt="mastercard" width="49" height="24" /></li> 7749 <li><img src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/images/amex.svg" alt="amex" width="49" height="24" /></li> 7750 <li><img src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/images/discover.svg" alt="discover" width="49" height="24" /></li> 7751 <li><img src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/images/paypal.svg" alt="paypal" width="49" height="24" /></li> 7752 <li><img src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/images/applepay.svg" alt="applepay" width="49" height="24" /></li> 7753 </ul> 7754 </div> 7755 </div> 7756 <div x-data="{ isExpanded: false }" class="s767:flex s767:flex-col s767:gap-3"> 7757 <div class="group text-base font-semibold md:mb-[14px] s767:flex s767:justify-between s767:items-center" id="controlsAccordionItemOne" aria-controls="accordionItemOne" x-on:click="isExpanded = ! isExpanded" x-bind:aria-expanded="isExpanded ? 'true' : 'false'"> 7758 Shop by Desire <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke="currentColor" aria-hidden="true" class="hide-desktop transition-transform group-aria-expanded:rotate-180" width="20" height="20" role="img"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"/><title>downArrow</title></svg> 7759 </div> 7760 <div class="show-desktop" x-cloak x-show="isExpanded" id="accordionItemOne" role="region" aria-labelledby="controlsAccordionItemOne" x-collapse> 7761 <ul class="flex gap-3 flex-col text-sm [&_a:hover]:text-hoverColor [&_a:after]:bg-hoverColor [&_a:after]:absolute [&_a:after]:h-[1px] [&_a:after]:w-0 [&_a:after]:bottom-0 [&_a:after]:left-0 [&_a:hover:after]:w-full [&_a:after]:transition-all [&_a:after]:duration-300 [&_a]:relative [&_a:after]:content-['']"> 7762 <li><a href="/all">All Categories</a></li> 7763 <li><a href="/realistic">Realistic Dildos</a></li> 7764 <li><a href="/fantasy-and-sci-fi">Fantasy Dildos</a></li> 7765 <li><a href="/accessories">Play Gear</a></li> 7766 <li><a href="/promo-offers">Sales & Offers</a></li> 7767 <li><a href="https://www.amazon.com/stores/page/6B30C514-4476-4C7E-9C03-8EE5D377B673/search?terms=dildo">Amazon</a></li> 7768 </ul> 7769 </div> 7770 </div> 7771 <div x-data="{ isExpanded: false }" class="s767:flex s767:flex-col s767:gap-3"> 7772 <div class="group text-base font-semibold md:mb-[14px] s767:flex s767:justify-between s767:items-center" id="controlsaccordionItemTwo" aria-controls="accordionItemTwo" x-on:click="isExpanded = ! isExpanded" x-bind:aria-expanded="isExpanded ? 'true' : 'false'"> 7773 Inside the Workshop <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke="currentColor" aria-hidden="true" class="hide-desktop transition-transform group-aria-expanded:rotate-180" width="20" height="20" role="img"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"/><title>downArrow</title></svg> 7774 </div> 7775 <div class="show-desktop" x-cloak x-show="isExpanded" id="accordionItemTwo" role="region" aria-labelledby="controlsaccordionItemTwo" x-collapse> 7776 <ul class="flex gap-3 flex-col text-sm [&_a:hover]:text-hoverColor [&_a:after]:bg-hoverColor [&_a:after]:absolute [&_a:after]:h-[1px] [&_a:after]:w-0 [&_a:after]:bottom-0 [&_a:after]:left-0 [&_a:hover:after]:w-full [&_a:after]:transition-all [&_a:after]:duration-300 [&_a]:relative [&_a:after]:content-['']"> 7777 <li><a href="/contact-us">Contact Us</a></li> 7778 <li><a href="/about">About</a></li> 7779 <li><a href="/testimonials">Testimonials</a></li> 7780 <li><a href="/retailers">Find Retailer</a></li> 7781 <li><a href="/affiliate-program">Become an Affiliate</a></li> 7782 <li><a href="/blog">Blogs</a></li> 7783 </ul> 7784 </div> 7785 </div> 7786 <div x-data="{ isExpanded: false }" class="s767:flex s767:flex-col s767:gap-3"> 7787 <div class="group text-base font-semibold md:mb-[14px] s767:flex s767:justify-between s767:items-center" id="controlsAccordionItemThree" aria-controls="accordionItemThree" x-on:click="isExpanded = ! isExpanded" x-bind:aria-expanded="isExpanded ? 'true' : 'false'"> 7788 Policies & Terms <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke="currentColor" aria-hidden="true" class="hide-desktop transition-transform group-aria-expanded:rotate-180" width="20" height="20" role="img"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"/><title>downArrow</title></svg> 7789 </div> 7790 <div class="show-desktop" x-cloak x-show="isExpanded" id="accordionItemThree" role="region" aria-labelledby="controlsAccordionItemThree" x-collapse> 7791 <ul class="flex gap-3 flex-col text-sm [&_a:hover]:text-hoverColor [&_a:after]:bg-hoverColor [&_a:after]:absolute [&_a:after]:h-[1px] [&_a:after]:w-0 [&_a:after]:bottom-0 [&_a:after]:left-0 [&_a:hover:after]:w-full [&_a:after]:transition-all [&_a:after]:duration-300 [&_a]:relative [&_a:after]:content-['']"> 7792 <li><a href="/privacy-policy">Privacy Policy</a></li> 7793 <li><a href="/terms-of-services">Terms of Service</a></li> 7794 <li><a href="/usage-and-safety">Usage & Safety</a></li> 7795 <li><a href="/faq">FAQs</a></li> 7796 <li><button><span id="userAccessibilityWidget">Accessibility</span></button></li> 7797 </ul> 7798 </div> 7799 </div> 7800 <div x-data="{ isExpanded: false }" class="s767:flex s767:flex-col s767:gap-3"> 7801 <div class="group text-base font-semibold md:mb-[14px] s767:flex s767:justify-between s767:items-center" id="controlsaccordionItemFour" aria-controls="accordionItemFour" x-on:click="isExpanded = ! isExpanded" x-bind:aria-expanded="isExpanded ? 'true' : 'false'"> 7802 Watch Online <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke="currentColor" aria-hidden="true" class="hide-desktop transition-transform group-aria-expanded:rotate-180" width="20" height="20" role="img"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"/><title>downArrow</title></svg> 7803 </div> 7804 <div class="show-desktop" x-cloak x-show="isExpanded" id="accordionItemFour" role="region" aria-labelledby="controlsaccordionItemFour" x-collapse> 7805 <ul class="flex gap-3 flex-col text-sm [&_a:hover]:text-hoverColor [&_a:after]:bg-hoverColor [&_a:after]:absolute [&_a:after]:h-[1px] [&_a:after]:w-0 [&_a:after]:bottom-0 [&_a:after]:left-0 [&_a:hover:after]:w-full [&_a:after]:transition-all [&_a:after]:duration-300 [&_a]:relative [&_a:after]:content-['']"> 7806 <li><a href="https://twitter.com/hankeystoys" target="_blank">X</a></li> 7807 <li><a href="https://www.youtube.com/channel/UCUgwLSc7t6ozBh04CsHHDNA/vi
7807deos" target="_blank">YouTube</a></li> 7808 <li><a href="https://www.reddit.com/r/MrHankeyToys/" target="_blank">Reddit</a></li> 7809 <li><a href="https://www.instagram.com/hankeys_toys/?igshid=1wl63tdw6f9ci" target="_blank">Instagram</a></li> 7810 <li><a href="https://bsky.app/profile/hankeystoys.bsky.social" target="_blank">Bluesky</a></li> 7811 <li><a href="https://fetlife.com/users/6140563" target="_blank">Fetlife</a></li> 7812 <!--<li><a href="https://www.tiktok.com/@mrhankeystoys.com" target="_blank">Tiktok</a></li> 7813 <li><a href="https://www.threads.net/@hankeys_toys" target="_blank">Threads</a></li> 7814 <li><a href="https://www.facebook.com/people/Mr-Hankeys-Toys/61550497480822" target="_blank">Facebook</a></li> 7815 <li><a href="https://mrhankeystube.com" target="_blank">mrhankeystube.com</a></li>--> 7816 </ul> 7817 </div> 7818 </div> 7819 <div class="linkTree third-block shrink-0 ipad:-order-1"> 7820 <div class="gap-5 flex flex-col justify-center items-center max-w-[270px] w-full text-center s767:max-w-full s767:p-5 s767:flex-row s767:text-left"> 7821 <div class="icon"><a target="_blank" href="https://linktr.ee/hankeystoys"><svg xmlns="http://www.w3.org/2000/svg" width="69" height="84" viewBox="0 0 70 84" fill="none" role="img"> 7822<g clip-path="url(#clip0_6002_594)"> 7823<path d="M0.6725 28.4585H21.545L6.62375 14.3582L14.8175 6.1044L28.9625 20.4626V0H41.21V20.4626L55.355 6.1044L63.5487 14.3582L48.6275 28.3726H69.5V39.9795H48.5413L63.4625 54.3378L55.2687 62.4197L35 42.2149L14.7312 62.5056L6.5375 54.3378L21.4587 39.9795H0.5V28.4585H0.6725ZM29.0487 56.5732H41.2962V84.086H29.0487V56.5732Z" fill="black"/> 7824</g> 7825<defs> 7826<clipPath id="clip0_6002_594"> 7827<rect width="69" height="84" fill="white" transform="translate(0.5)"/> 7828</clipPath> 7829</defs> 7830<title>Linktree</title></svg> 7831</a></div> 7832 <p class="text-sm">Click the <a class="font-semibold underline hover:text-hoverColor" target="_blank" href="https://linktr.ee/hankeystoys">Linktr.ee</a> Logo to view and subscribe to our social media content.</p> 7833 </div> 7834 <div class="mt-8 s767:mt-6"> 7835 <ul class="flex gap-6 items-center flex-wrap justify-center"> 7836 <li><a href="https://x.com/hankeystoys" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="19" height="18" viewBox="0 0 20 19" fill="none" role="img"> 7837<path d="M0.919872 0.55127L8.30257 10.423L0.873535 18.4485H2.54514L9.04987 11.421L14.3047 18.4485H19.9944L12.1959 8.02189L19.1117 0.55127H17.4401L11.4498 7.02272L6.60958 0.55127H0.919872ZM3.3792 1.78329H5.99295L17.5363 17.2176H14.9226L3.3792 1.78329Z" fill="#0F0F0F"/> 7838<title>twitter</title></svg> 7839</a></li> 7840 <li><a href="https://www.instagram.com/hankeys_toys/?igshid=1wl63tdw6f9ci" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 19" fill="none" role="img"> 7841<path d="M4.9613 18.5C3.64495 18.4972 2.38327 17.9731 1.45238 17.0424C0.521493 16.1117 -0.00282459 14.8502 -0.00585938 13.5338V5.46711C-0.00307738 4.1506 0.521115 2.88875 1.45203 1.95784C2.38295 1.02692 3.64479 0.502782 4.9613 0.5H13.027C14.3435 0.502782 15.6053 1.02692 16.5362 1.95784C17.4671 2.88875 17.9914 4.1506 17.9941 5.46711V13.5338C17.9911 14.8502 17.4668 16.1117 16.5359 17.0424C15.605 17.9731 14.3433 18.4972 13.027 18.5H4.9613ZM1.58986 5.46711V13.5338C1.59138 14.4274 1.9471 15.2839 2.57906 15.9157C3.21102 16.5475 4.0677 16.903 4.9613 16.9043H13.027C13.9206 16.9033 14.7773 16.5478 15.4092 15.916C16.041 15.2841 16.3964 14.4274 16.3974 13.5338V5.46711C16.3964 4.57352 16.041 3.71685 15.4092 3.08498C14.7773 2.45312 13.9206 2.09767 13.027 2.09666H4.9613C4.06712 2.09792 3.20998 2.45398 2.57806 3.08662C1.94615 3.71926 1.5911 4.57668 1.59085 5.47085L1.58986 5.46711ZM4.35344 9.50082C4.35344 8.58335 4.62551 7.68663 5.13523 6.92378C5.64495 6.16093 6.36941 5.56628 7.21704 5.21518C8.06467 4.86408 8.99735 4.77211 9.89719 4.9511C10.797 5.13009 11.6236 5.57205 12.2724 6.2208C12.9211 6.86955 13.3629 7.69608 13.5419 8.59592C13.7209 9.49576 13.629 10.4284 13.2779 11.276C12.9268 12.1237 12.3322 12.8481 11.5694 13.3578C10.8065 13.8676 9.90971 14.1398 8.99224 14.1398C7.76237 14.1393 6.583 13.6505 5.71335 12.7808C4.84369 11.9112 4.35488 10.7316 4.35437 9.50175L4.35344 9.50082ZM5.95108 9.50082C5.95108 10.1023 6.12942 10.6904 6.46359 11.1905C6.79776 11.6906 7.27271 12.0804 7.82841 12.3106C8.38411 12.5408 8.99557 12.6009 9.58549 12.4836C10.1754 12.3662 10.7173 12.0767 11.1426 11.6513C11.568 11.226 11.8576 10.6841 11.9749 10.0942C12.0923 9.50426 12.032 8.89268 11.8019 8.33698C11.5717 7.78128 11.1819 7.30632 10.6818 6.97216C10.1817 6.63799 9.59373 6.45965 8.99224 6.45965C8.59287 6.45977 8.19739 6.53853 7.82847 6.69148C7.45954 6.84443 7.12438 7.06873 6.84207 7.35122C6.55976 7.63371 6.33586 7.96889 6.18315 8.33791C6.03043 8.70693 5.95189 9.10238 5.95202 9.50175L5.95108 9.50082ZM13.3792 5.76088C13.1112 5.64982 12.8941 5.4431 12.7701 5.18083C12.6461 4.91856 12.624 4.61946 12.7082 4.34184C12.7924 4.06421 12.9769 3.828 13.2257 3.67882C13.4745 3.52964 13.7699 3.47831 14.0545 3.53486C14.339 3.59141 14.5924 3.75176 14.7653 3.98474C14.9381 4.21772 15.0182 4.50649 14.9898 4.79522C14.9615 5.08395 14.8268 5.35188 14.612 5.54681C14.3971 5.74173 14.1174 5.84977 13.8272 5.84992C13.674 5.85043 13.5221 5.82077 13.3802 5.76275L13.3792 5.76088Z" fill="#0F0F0F"/> 7842<title>Instagram</title></svg> 7843</a></li> 7844 <li><a href="https://www.youtube.com/channel/UCUgwLSc7t6ozBh04CsHHDNA/vi
7844deos" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="19" height="14" viewBox="0 0 19 15" fill="none" role="img"> 7845<path d="M9.49464 14.5C9.47868 14.5 7.98469 14.5 6.34011 14.4477C5.37071 14.4163 4.53495 14.3754 3.86176 14.3231C3.26026 14.2941 2.66275 14.2133 2.07655 14.0815C1.65895 13.9507 1.28418 13.7185 0.989043 13.4079C0.693903 13.0972 0.488527 12.7187 0.39307 12.3095C0.18207 11.3251 0.0652361 10.3245 0.0440068 9.32003C-0.00585938 8.32512 -0.00585938 7.50713 -0.00585938 7.49953C-0.00585938 7.49192 -0.00585938 6.67488 0.0440068 5.67902C0.0723949 4.67486 0.185457 3.67451 0.382099 2.68765C0.489021 2.2689 0.702024 1.88156 1.00243 1.55958C1.28775 1.25548 1.65623 1.03317 2.06658 0.917556C2.65438 0.78721 3.25311 0.706683 3.85577 0.676914C4.53495 0.624601 5.36971 0.581799 6.33911 0.552313C7.98569 0.5 9.47968 0.5 9.49464 0.5C9.5096 0.5 11.0026 0.5 12.6472 0.552313C13.6176 0.581799 14.4523 0.624601 15.1275 0.676914C15.7283 0.706803 16.325 0.787653 16.9107 0.918507C17.3284 1.04845 17.7035 1.27993 17.9988 1.59015C18.2942 1.90037 18.4997 2.27862 18.5952 2.68765C18.8068 3.67255 18.9233 4.67385 18.9433 5.67902C18.9941 6.67488 18.9941 7.49192 18.9941 7.49953C18.9941 7.50713 18.9941 8.32417 18.9453 9.32003C18.9163 10.3236 18.8029 11.3233 18.6062 12.3095C18.4988 12.7279 18.2862 13.1151 17.9868 13.4376C17.7015 13.7432 17.3322 13.9666 16.9207 14.0824C16.3338 14.2141 15.7356 14.295 15.1335 14.324C14.4543 14.3764 13.6176 14.4192 12.6492 14.4486C11.0026 14.5 9.5086 14.5 9.49464 14.5ZM7.55185 4.54049V10.4576L12.5175 7.50048L7.55185 4.54049Z" fill="#0F0F0F"/> 7846<title>youtube</title></svg> 7847</a></li> 7848 <li><a href="https://www.reddit.com/r/MrHankeyToys/" target="_blank"><?xml version="1.0" encoding="utf-8"?> 7849<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools --> 7850<svg xmlns="http://www.w3.org/2000/svg" fill="#000000" width="24" height="24" viewBox="0 0 32 32" role="img"><path d="M 18.65625 4 C 16.558594 4 15 5.707031 15 7.65625 L 15 11.03125 C 12.242188 11.175781 9.742188 11.90625 7.71875 13.0625 C 6.945313 12.316406 5.914063 12 4.90625 12 C 3.816406 12 2.707031 12.355469 1.9375 13.21875 L 1.9375 13.25 L 1.90625 13.28125 C 1.167969 14.203125 0.867188 15.433594 1.0625 16.65625 C 1.242188 17.777344 1.898438 18.917969 3.03125 19.65625 C 3.023438 19.769531 3 19.882813 3 20 C 3 22.605469 4.574219 24.886719 6.9375 26.46875 C 9.300781 28.050781 12.488281 29 16 29 C 19.511719 29 22.699219 28.050781 25.0625 26.46875 C 27.425781 24.886719 29 22.605469 29 20 C 29 19.882813 28.976563 19.769531 28.96875 19.65625 C 30.101563 18.917969 30.757813 17.777344 30.9375 16.65625 C 31.132813 15.433594 30.832031 14.203125 30.09375 13.28125 L 30.0625 13.25 C 29.292969 12.386719 28.183594 12 27.09375 12 C 26.085938 12 25.054688 12.316406 24.28125 13.0625 C 22.257813 11.90625 19.757813 11.175781 17 11.03125 L 17 7.65625 C 17 6.675781 17.558594 6 18.65625 6 C 19.175781 6 19.820313 6.246094 20.8125 6.59375 C 21.65625 6.890625 22.75 7.21875 24.15625 7.3125 C 24.496094 8.289063 25.414063 9 26.5 9 C 27.875 9 29 7.875 29 6.5 C 29 5.125 27.875 4 26.5 4 C 25.554688 4 24.738281 4.535156 24.3125 5.3125 C 23.113281 5.242188 22.246094 4.992188 21.46875 4.71875 C 20.566406 4.402344 19.734375 4 18.65625 4 Z M 16 13 C 19.152344 13 21.964844 13.867188 23.9375 15.1875 C 25.910156 16.507813 27 18.203125 27 20 C 27 21.796875 25.910156 23.492188 23.9375 24.8125 C 21.964844 26.132813 19.152344 27 16 27 C 12.847656 27 10.035156 26.132813 8.0625 24.8125 C 6.089844 23.492188 5 21.796875 5 20 C 5 18.203125 6.089844 16.507813 8.0625 15.1875 C 10.035156 13.867188 12.847656 13 16 13 Z M 4.90625 14 C 5.285156 14 5.660156 14.09375 5.96875 14.25 C 4.882813 15.160156 4.039063 16.242188 3.53125 17.4375 C 3.277344 17.117188 3.125 16.734375 3.0625 16.34375 C 2.953125 15.671875 3.148438 14.976563 3.46875 14.5625 C 3.472656 14.554688 3.464844 14.539063 3.46875 14.53125 C 3.773438 14.210938 4.3125 14 4.90625 14 Z M 27.09375 14 C 27.6875 14 28.226563 14.210938 28.53125 14.53125 C 28.535156 14.535156 28.527344 14.558594 28.53125 14.5625 C 28.851563 14.976563 29.046875 15.671875 28.9375 16.34375 C 28.875 16.734375 28.722656 17.117188 28.46875 17.4375 C 27.960938 16.242188 27.117188 15.160156 26.03125 14.25 C 26.339844 14.09375 26.714844 14 27.09375 14 Z M 11 16 C 9.894531 16 9 16.894531 9 18 C 9 19.105469 9.894531 20 11 20 C 12.105469 20 13 19.105469 13 18 C 13 16.894531 12.105469 16 11 16 Z M 21 16 C 19.894531 16 19 16.894531 19 18 C 19 19.105469 19.894531 20 21 20 C 22.105469 20 23 19.105469 23 18 C 23 16.894531 22.105469 16 21 16 Z M 21.25 21.53125 C 20.101563 22.597656 18.171875 23.28125 16 23.28125 C 13.828125 23.28125 11.898438 22.589844 10.75 21.65625 C 11.390625 23.390625 13.445313 25 16 25 C 18.554688 25 20.609375 23.398438 21.25 21.53125 Z"/><title>reddit</title></svg> 7851</a></li> 7852 </ul> 7853 </div> 7854 </div> 7855 </div> 7856 </div> 7857</div> 7858<div class="text-center py-4 s767:w-[70%] s767:mx-auto"> 7859 <small class="text-sm"> 7860 ©Copyright 2026, Safewayz LLC & Hankey's Toys®, All Rights Reserved. 7861</small> 7862</div> 7863</div></footer> 7864<div 7865 x-data="initNewsletterPopup({"enabled":true,"cookieLifetime":168,"delayTime":30,"excludedPages":["\/checkout","\/cart"],"subscribeUrl":"https:\/\/www.mrhankeystoys.com\/newsletterpopup\/ajax\/subscribe\/","formKey":"9SFsreOEuib59vuZ"})" 7866 x-show="showPopup" 7867 x-cloak 7868 class="fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50" 7869 @keydown.escape="closePopup()"
7870 style="display: none;" 7871> 7872 <div class="bg-white rounded-lg shadow-xl max-w-md w-full mx-4 p-6 relative"> 7873 <button 7874 @click="closePopup()" 7875 class="absolute top-4 right-4 transition-colors" 7876 aria-label="Close" 7877 > 7878 <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"> 7879 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> 7880 </svg> 7881 </button> 7882 <div class="text-center flex flex-col"> 7883 <div class="pop-img flex justify-center items-center mb-4"><img src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/images/Logo-popup.png" width="137" height="90" alt="HankeysToys" /></div> 7884 <strong class="mb-2">Why Hello There, ENJOY</strong> 7885 <div class="text-5xl font-bold uppercase mb-2">15% OFF</div> 7886 <h2 class="text-2xl font-bold mb-4"> 7887 Stay Updated! </h2> 7888 <p class="mb-6"> 7889 Subscribe to our newsletter and get the latest updates on new products and exclusive offers. </p> 7890 7891 <form 7892 @submit.prevent="submitNewsletter()" 7893 class="space-y-4" 7894 > 7895 <input type="hidden" name="form_key" :value="getFormKey()"> 7896 <div class="control relative"> 7897 <input 7898 type="email" 7899 x-model="email" 7900 placeholder="" 7901 required 7902 class="form-input peer h-12 bg-transparent relative z-[1]" 7903 > 7904 <label class="label text-sm bg-white px-1 absolute duration-300 transform -translate-y-6 top-3 origin-[0] start-2.5 peer-placeholder-shown:translate-y-0 peer-focus:-translate-y-6 rtl:peer-focus:translate-x-1/4 rtl:peer-focus:left-auto peer-placeholder-shown:mt-0 peer-focus:z-[11] peer-focus:bg-white" for="email"> 7905 <span>Enter your email address</span> 7906 </label> 7907 </div> 7908 7909 <button 7910 type="submit" 7911 :disabled="loading" 7912 class="btn btn-primary disabled:opacity-75 text-lg font-bold w-full" 7913 > 7914 <span x-show="!loading">Get My 15% Off</span> 7915 <span x-show="loading">Subscribing...</span> 7916 </button> 7917 </form> 7918 7919 <button 7920 @click="closePopup()" 7921 class="mt-4 text-sm transition-colors" 7922 > 7923 No thanks, maybe later </button> 7924 </div> 7925 </div> 7926</div> 7927
7928<script> 7929 function initNewsletterPopup(config) { 7930 return { 7931 showPopup: false, 7932 email: '', 7933 loading: false, 7934 config: config, 7935 cookieName: 'ktpl_newsletter_popup_shown', 7936 7937 init() { 7938 if (this.config.enabled && this.shouldShowPopup()) { 7939 setTimeout(() => { 7940 this.showPopup = true; 7941 }, this.config.delayTime * 1000); 7942 } 7943 }, 7944 7945 shouldShowPopup() { 7946 // Check excluded pages 7947 const currentPath = window.location.pathname; 7948 if (this.config.excludedPages.some(path => currentPath.includes(path))) { 7949 return false; 7950 } 7951 7952 // Check cookie 7953 return !this.getCookie(this.cookieName); 7954 }, 7955 7956 closePopup() { 7957 this.showPopup = false; 7958 this.setCookie(); 7959 }, 7960 7961 getFormKey() { 7962 const footerNewsletterFormKey = document.querySelector( 7963 '#newsletter-validate-detail input[name="form_key"]' 7964 ); 7965 7966 if (footerNewsletterFormKey && footerNewsletterFormKey.value) { 7967 return footerNewsletterFormKey.value; 7968 } 7969 7970 const formKeyInput = document.querySelector('input[name="form_key"]'); 7971 if (formKeyInput && formKeyInput.value) { 7972 return formKeyInput.value; 7973 } 7974 7975 return this.config.formKey || ''; 7976 }, 7977 7978 async submitNewsletter() { 7979 if (!this.email) return; 7980 7981 this.loading = true; 7982 7983 try { 7984 const formData = new FormData(); 7985 const formKey = this.getFormKey(); 7986 7987 formData.append('email', this.email); 7988 formData.append('form_key', formKey); 7989 7990 const response = await fetch(this.config.subscribeUrl, { 7991 method: 'POST', 7992 body: formData, 7993 credentials: 'same-origin', 7994 headers: { 7995 'Accept': 'application/json', 7996 'X-Requested-With': 'XMLHttpRequest' 7997 } 7998 }); 7999 8000 const result = await response.json(); 8001 8002 if (response.ok && result.success) { 8003 this.showSuccessMessage(result.message || 'Thank\u0020you\u0020for\u0020subscribing\u0020to\u0020our\u0020newsletter\u0021'); 8004 this.closePopup(); 8005 } else { 8006 throw new Error(result.message || 'Subscription failed'); 8007 } 8008 } catch (error) { 8009 this.showErrorMessage(error.message || 'There\u0020was\u0020an\u0020error\u0020subscribing.\u0020Please\u0020try\u0020again.'); 8010 } finally { 8011 this.loading = false; 8012 } 8013 }, 8014 8015 setCookie() { 8016 const date = new Date(); 8017 date.setTime(date.getTime() + (this.config.cookieLifetime * 60 * 60 * 1000)); 8018 const expires = "expires=" + date.toUTCString(); 8019 document.cookie = `${this.cookieName}=true;${expires};path=/;SameSite=Lax`; 8020 }, 8021 8022 getCookie(name) { 8023 const nameEQ = name + "="; 8024 const ca = document.cookie.split(';'); 8025 for (let i = 0; i < ca.length; i++) { 8026 let c = ca[i]; 8027 while (c.charAt(0) === ' ') c = c.substring(1, c.length); 8028 if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length); 8029 } 8030 return null; 8031 }, 8032 8033 showSuccessMessage(message) { 8034 if (typeof window.dispatchMessages !== "undefined") { 8035 window.dispatchMessages([{ 8036 text: message, 8037 type: 'success' 8038 }], 5000); 8039 } 8040 }, 8041 8042 showErrorMessage(message) { 8043 if (typeof window.dispatchMessages !== "undefined") { 8044 window.dispatchMessages([{ 8045 text: message, 8046 type: 'error' 8047 }], 5000); 8048 } 8049 } 8050 } 8051 } 8052 8053 window.addEventListener('alpine:init', () => { 8054 Alpine.data('initNewsletterPopup', initNewsletterPopup); 8055 }, { once: true }); 8056</script>
vendor: 1 bytes, line 8056
8056
8057<script nonce="cHZoYWFqaG9hNHVmNDZuMjE5ZWN5MTRnamRuM3kzcnk=">window.psloginButtons = "\n \u003Cdiv class=\u0022pslogin-block pslogin-login\u0022\u003E\n\n \u003Cdiv class=\u0022pslogin-title text-sm text-center mb-8\u0022\u003E\n Sign In with your social account \u003C\/div\u003E\n\n \u003Cdiv x-data=\u0022initPsloginButtons()\u0022 class=\u0022pslogin-buttons\u0022\u003E\n \u003Cul class=\u0022flex flex-wrap gap-5 items-center justify-center\u0022\u003E\n \u003Ctemplate x-for=\u0022btn in buttons\u0022\u003E\n \u003Cli x-show=\u0022btn.visible || show\u0022 x-transition.duration.500ms class=\u0022pslogin-button md:w-auto\u0022 :class=\u0022{[btn.code]: true, \u0027w-full md:min-w-[215px]\u0027: btn.design === \u0027default\u0027}\u0022 :title=\u0022btn.text\u0022\u003E\n \u003Ca @click.prevent=\u0022login(btn)\u0022 class=\u0022pslogin-button-link pslogin-button-click\u0022 rel=\u0022nofollow\u0022 href=\u0022#\u0022\u003E\n \u003Ctemplate x-if=\u0022btn.design === \u0027default\u0027\u0022\u003E\n \u003Cspan class=\u0022block\u0022\u003E\n \u003Ctemplate x-if=\u0022btn.image\u0022\u003E\n \u003Cspan class=\u0022block btn white-btn overflow-hidden hover:opacity-90\u0022\u003E\n \u003Cimg class=\u0022max-w-[200px] mx-auto\u0022 :src=\u0022btn.image\u0022 :alt=\u0022\u0027Icon \u0027 + btn.code\u0022 \/\u003E\n \u003C\/span\u003E\n \u003C\/template\u003E\n \u003Ctemplate x-if=\u0022! btn.image\u0022\u003E\n \u003Cspan class=\u0022flex items-center gap-2 px-3 py-1 btn white-btn overflow-hidden hover:opacity-90\u0022\n \u003E\n \u003Cspan class=\u0022w-8 h-8 shrink-0 block content-center\u0022\u003E\n \u003Cimg\n class=\u0022max-w-40\u0022\n :src=\u0022btn.icon\u0022\n :alt=\u0022\u0027Icon \u0027 + btn.code\u0022\n width=\u002232\u0022\n height=\u002232\u0022\n \/\u003E\n\n \u003C\/span\u003E\n \u003Cspan class=\u0022font-semibold text-sm leading-none text-left\u0022 x-text=\u0022btn.text\u0022\u003E\u003C\/span\u003E\n \u003C\/span\u003E\n \u003C\/template\u003E\n \u003C\/span\u003E\n \u003C\/template\u003E\n\n \u003Ctemplate x-if=\u0022btn.design !== \u0027default\u0027\u0022\u003E\n \u003Cspan class=\u0022w-14 h-14 block\u0022\u003E\n \u003Ctemplate x-if=\u0022btn.image\u0022\u003E\n \u003Cspan class=\u0022w-full h-full block overflow-hidden shadow-lg\u0022\n :class=\u0022btn.design === \u0027square\u0027 ? \u0027rounded-lg\u0027 : \u0027rounded-full\u0027\u0022\n \u003E\n \u003Cimg class=\u0022w-full h-full object-cover\u0022 :src=\u0022btn.image\u0022 :alt=\u0022\u0027Icon \u0027 + btn.code\u0022 \/\u003E\n \u003C\/span\u003E\n \u003C\/template\u003E\n \u003Ctemplate x-if=\u0022! btn.image\u0022\u003E\n \u003Cspan class=\u0022w-full h-full block overflow-hidden shadow-lg\u0022\n :class=\u0022btn.design === \u0027square\u0027 ? \u0027rounded-lg\u0027 : \u0027rounded-full\u0027\u0022\n :style=\u0022{\n background: btn.backgroundColor ? btn.backgroundColor : \u0027#1a1a1a\u0027,\n color: btn.textColor ? btn.textColor : \u0027#fff\u0027,\n border: btn.backgroundColor ? `1px solid ${btn.borderColor ? btn.borderColor : btn.backgroundColor}` : \u0027transparent\u0027\n }\u0022\n \u003E\n \u003Cimg class=\u0022w-full h-full object-cover\u0022\n :src=\u0022btn.icon\u0022\n :alt=\u0022\u0027Icon \u0027 + btn.code\u0022\n width=\u002232\u0022\n height=\u002232\u0022\n \/\u003E\n \u003C\/span\u003E\n \u003C\/template\u003E\n \u003C\/span\u003E\n \u003C\/template\u003E\n\n \u003C\/a\u003E\n \u003C\/li\u003E\n \u003C\/template\u003E\n \u003C\/ul\u003E\n\n \u003C\/div\u003E\n\n \u003C\/div\u003E\n \u003Cdiv style=\u0022clear: both;\u0022\u003E\u003C\/div\u003E\n\n \n\u003Cscript\u003E\n function initPsloginButtons() {\n let buttons = [{\u0022code\u0022:\u0022apple\u0022,\u0022icon\u0022:\u0022https:\\\/\\\/www.mrhankeystoys.com\\\/static\\\/version1790675038\\\/frontend\\\/Krish\\\/mrhankeytoys\\\/en_US\\\/Plumrocket_SocialLoginPro\\\/images\\\/networks\\\/apple_icon.svg\u0022,\u0022design\u0022:\u0022default\u0022,\u0022height\u0022:650,\u
80570022width\u0022:650,\u0022visible\u0022:true,\u0022textColor\u0022:\u0022\u0022,\u0022backgroundColor\u0022:\u0022#000\u0022,\u0022borderColor\u0022:\u0022\u0022,\u0022openOnPage\u0022:false,\u0022text\u0022:\u0022Continue with Apple\u0022,\u0022image\u0022:\u0022\u0022,\u0022url\u0022:\u0022https:\\\/\\\/www.mrhankeystoys.com\\\/pslogin\\\/account\\\/douse\\\/type\\\/apple\\\/refresh\\\/1791037041\\\/customer_action\\\/login\\\/\u0022},{\u0022code\u0022:\u0022twitter\u0022,\u0022icon\u0022:\u0022https:\\\/\\\/www.mrhankeystoys.com\\\/static\\\/version1790675038\\\/frontend\\\/Krish\\\/mrhankeytoys\\\/en_US\\\/Plumrocket_SocialLoginPro\\\/images\\\/networks\\\/twitter_icon.svg\u0022,\u0022design\u0022:\u0022default\u0022,\u0022height\u0022:630,\u0022width\u0022:650,\u0022visible\u0022:true,\u0022textColor\u0022:\u0022#ffffff\u0022,\u0022backgroundColor\u0022:\u0022#28a9e2\u0022,\u0022borderColor\u0022:\u0022\u0022,\u0022openOnPage\u0022:true,\u0022text\u0022:\u0022Continue with X\u0022,\u0022image\u0022:\u0022\u0022,\u0022url\u0022:\u0022https:\\\/\\\/www.mrhankeystoys.com\\\/pslogin\\\/account\\\/douse\\\/type\\\/twitter\\\/refresh\\\/1791037041\\\/customer_action\\\/login\\\/\u0022},{\u0022code\u0022:\u0022google\u0022,\u0022icon\u0022:\u0022https:\\\/\\\/www.mrhankeystoys.com\\\/static\\\/version1790675038\\\/frontend\\\/Krish\\\/mrhankeytoys\\\/en_US\\\/Plumrocket_SocialLoginPro\\\/images\\\/networks\\\/google_icon.svg\u0022,\u0022design\u0022:\u0022default\u0022,\u0022height\u0022:450,\u0022width\u0022:450,\u0022visible\u0022:true,\u0022textColor\u0022:\u0022#1a1a1a\u0022,\u0022backgroundColor\u0022:\u0022#fff\u0022,\u0022borderColor\u0022:\u0022#d9d9d9\u0022,\u0022openOnPage\u0022:false,\u0022text\u0022:\u0022Continue with Google\u0022,\u0022image\u0022:\u0022\u0022,\u0022url\u0022:\u0022https:\\\/\\\/www.mrhankeystoys.com\\\/pslogin\\\/account\\\/douse\\\/type\\\/google\\\/refresh\\\/1791037041\\\/customer_action\\\/login\\\/\u0022},{\u0022code\u0022:\u0022amazon\u0022,\u0022icon\u0022:\u0022https:\\\/\\\/www.mrhankeystoys.com\\\/static\\\/version1790675038\\\/frontend\\\/Krish\\\/mrhankeytoys\\\/en_US\\\/Plumrocket_SocialLoginPro\\\/images\\\/networks\\\/amazon_icon.svg\u0022,\u0022design\u0022:\u0022default\u0022,\u0022height\u0022:500,\u0022width\u0022:720,\u0022visible\u0022:true,\u0022textColor\u0022:\u0022\u0022,\u0022backgroundColor\u0022:\u0022#ff8e2e\u0022,\u0022borderColor\u0022:\u0022\u0022,\u0022openOnPage\u0022:false,\u0022text\u0022:\u0022Continue with Amazon\u0022,\u0022image\u0022:\u0022\u0022,\u0022url\u0022:\u0022https:\\\/\\\/www.mrhankeystoys.com\\\/pslogin\\\/account\\\/douse\\\/type\\\/amazon\\\/refresh\\\/1791037041\\\/customer_action\\\/login\\\/\u0022}];\n\n return {\n buttons,\n show: false,\n title: \u0027show\\u0020more\u0027,\n toggle() {\n this.show = !this.show;\n this.title = this.show ?\n \u0027show\\u0020less\u0027 :\n \u0027show\\u0020more\u0027;\n },\n hasHidden() {\n return this.buttons.filter(btn =\u003E !btn.visible).length \u003E 0;\n },\n login(btn) {\n if (! btn.url) {\n alert(\u0027The\\u0020Login\\u0020Application\\u0020was\\u0020not\\u0020configured\\u0020correctly.\\u0020If\\u0020your\\u0020are\\u0020the\\u0020admin\\u0020of\\u0020store\\u003A\\u0020Please\\u0020activate\\u0020\\u201CEnable\\u0020Logging\\u201D\\u0020in\\u0020Magento\\u0020Login\\u0020Extension\\u0020and\\u0020try\\u0020again\\u0020to\\u0020see\\u0020error\\u0020details.\u0027);\n return false;\n }\n\n let href = btn.url,\n openOnPage = btn.openOnPage,\n width = btn.width,\n height = btn.height;\n\n if (openOnPage) {\n window.dispatchEvent(new CustomEvent(\u0022reload-customer-section-data\u0022));\n window.location.href = href;\n return;\n }\n\n const bc = new BroadcastChannel(\u0027loginChannel\u0027);\n bc.onmessage = (event) =\u003E {\n if (event.data.type === \u0027loginSuccess\u0027) {\n document.getElementById(\u0027pslogin-login-referer\u0027).value = event.data.referer;\n document.getElementById(\u0027pslogin-login-action\u0027).value = event.data.action;\n document.getElementById(\u0027pslogin-login-submit\u0027).click();\n }\n bc.close();\n };\n\n width = width ? width : 650;\n height = height ? height : 350;\n\n if (href.indexOf(\u0027js_login_method\u0027) === 0) {\n \/\/ For Telegram\n \/\/ prCustomJsLoginMethod(href, width, height);\n return;\n }\n\n const popup = this.openPopup(href, width, height);\n this.loadingMessage(popup);\n\n return false;\n },\n \/**\n * Open OAuth window using Modal\/InitOAuth action.\n *\n * @since 3.10.0\n * @param href\n * @param width\n * @param height\n * @returns {WindowProxy}\n *\/\n openPopup(href, width, height) {\n const left = parseInt((window.innerWidth - width) \/ 2);\n const top = parseInt((window.innerHeight - height) \/ 2);\n\n const params = [\n \u0027resizable=yes\u0027,\n \u0027scrollbars=no\u0027,\n \u0027toolbar=no\u0027,\n \u0027menubar=no\u0027,\n \u0027location=no\u0027,\n \u0027directories=no\u0027,\n \u0027status=yes\u0027,\n \u0027width=\u0027 + width,\n \u0027height=\u0027 + height,\n \u0027left=\u0027 + left,\n \u0027top=\u0027 + top\n ];\n\n const popup = window.open(href, \u0027pslogin_popup\u0027, params.join(\u0027,\u0027));\n popup.focus();\n\n return popup;\n },\n loadingMessage(popup) {\n const loaderText = \u0027Loading...\u0027;\n let html = \u0027\u003C!DOCTYPE html\u003E\u003Chtml style=\u0022height: 100%;\u0022\u003E\u003Chead\u003E\u003Cmeta name=\u0022viewport\u0022 content=\u0022width=device-width, initial-scale=1\u0022\u003E\u003Ctitle\u003E\u0027 + loaderText + \u0027\u003C\/title\u003E\u003C\/head\u003E\u0027;\n html += \u0027\u003Cbody style=\u0022height: 100%; margin: 0; padding: 0;\u0022\u003E\u0027;\n html += \u0027\u003Cdiv style=\u0022text-align: center; height: 100%;\u0022\u003E\u003Cdiv id=\u0022loader\u0022 style=\u0022top: 50%; position: relative; margin-top: -50px; color: #646464; height:25px; font-size: 25px; text-align: center; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;\u0022\u003E\u0027 + loaderText + \u0027\u003C\/div\u003E\u003C\/div\u003E\u0027;\n html += \u0027\u003C\/body\u003E\u003C\/html\u003E\u0027;\n\n popup.document.documentElement.innerHTML = html;\n }\n };\n }\n\u003C\/script\u003E\n";</script>
vendor: 1 bytes, line 8057
8057
8058<script> 8059 (() => { 8060 function src_default(Alpine) { 8061 Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { 8062 let evaluate = evaluateLater(expression); 8063 let options = { 8064 rootMargin: getRootMargin(modifiers), 8065 threshold: getThreshold(modifiers) 8066 }; 8067 let observer = new IntersectionObserver((entries) => { 8068 entries.forEach((entry) => { 8069 if (entry.isIntersecting === (value === "leave")) 8070 return; 8071 evaluate(); 8072 modifiers.includes("once") && observer.disconnect(); 8073 }); 8074 }, options); 8075 observer.observe(el); 8076 cleanup(() => { 8077 observer.disconnect(); 8078 }); 8079 })); 8080 } 8081 function getThreshold(modifiers) { 8082 if (modifiers.includes("full")) 8083 return 0.99; 8084 if (modifiers.includes("half")) 8085 return 0.5; 8086 if (!modifiers.includes("threshold")) 8087 return 0; 8088 let threshold = modifiers[modifiers.indexOf("threshold") + 1]; 8089 if (threshold === "100") 8090 return 1; 8091 if (threshold === "0") 8092 return 0; 8093 return Number(`.${threshold}`); 8094 } 8095 function getLengthValue(rawValue) { 8096 let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); 8097 return match ? match[1] + (match[2] || "px") : void 0; 8098 } 8099 function getRootMargin(modifiers) { 8100 const key = "margin"; 8101 const fallback = "0px 0px 0px 0px"; 8102 const index = modifiers.indexOf(key); 8103 if (index === -1) 8104 return fallback; 8105 let values = []; 8106 for (let i = 1; i < 5; i++) { 8107 values.push(getLengthValue(modifiers[index + i] || "")); 8108 } 8109 values = values.filter((v) => v !== void 0); 8110 return values.length ? values.join(" ").trim() : fallback; 8111 } 8112 8113 document.addEventListener("alpine:init", () => { 8114 window.Alpine.plugin(src_default); 8115 }); 8116 })(); 8117</script>
vendor: 1 bytes, line 8117
8117
8118<script> 8119 for (const [selector, deferUntil] of Object.entries({".product-slider section[x-data]":"intersect",".product-info [x-data]":"intersect","#review_form":"intersect","section[x-data^=initRecentlyViewedProductsComponent]":"intersect","div[x-data^=initBundleOptions]":"intersect","#product_addtocart_form [x-data]":"intersect","#notice-cookie-block":"idle"})) { 8120 document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); 8121 } 8122</script>
vendor: 1 bytes, line 8122
8122
8123<script> 8124 (function () { 8125 "use strict"; 8126 8127 const hasAlpine = new Promise(resolve => { 8128 window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); 8129 }); 8130 8131 const hasInteract = new Promise(resolve => { 8132 (events => { 8133 const onInteract = () => { 8134 resolve(); 8135 events.forEach(type => window.removeEventListener(type, onInteract)); 8136 } 8137 events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) 8138 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 8139 }); 8140 8141 const onIntersect = (el) => { 8142 return new Promise(resolve => { 8143 const observer = new IntersectionObserver(entries => { 8144 for (const entry of entries) { 8145 if (entry.isIntersecting) { 8146 observer.disconnect() 8147 resolve(); 8148 } 8149 } 8150 }, {}); 8151 observer.observe(el); 8152 }); 8153 } 8154 8155 function runComponent(el) { 8156 hasAlpine.then(() => { 8157 el.removeAttribute('x-ignore'); 8158 queueMicrotask(() => Alpine.initTree(el)); 8159 }); 8160 } 8161 8162 function initDeferredComponents() { 8163 document.querySelectorAll('[x-data][x-defer]').forEach(el => { 8164 el.setAttribute('x-ignore', ''); 8165 const deferUntil = (el.getAttribute('x-defer') || '').trim(); 8166 switch (deferUntil) { 8167 case 'interact': 8168 hasInteract.then(() => runComponent(el)); 8169 break; 8170 case 'intersect': 8171 onIntersect(el).then(() => runComponent(el)) 8172 break; 8173 case 'idle': 8174 window.requestIdleCallback 8175 ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) 8176 : setTimeout(() => runComponent(el), 4000); 8177 break; 8178 case 'eager': 8179 runComponent(el); 8180 break; 8181 default: 8182 if (deferUntil.startsWith('event:') && deferUntil.length > 6) { 8183 window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); 8184 } 8185 } 8186 }); 8187 } 8188 8189 window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); 8190 })() 8191</script>
vendor: 1 bytes, line 8191
8191
8192<script> 8193 (() => { 8194 function alpineSnapSlider(Alpine) { 8195 function roundUpIfGreaterThan(number, min = 8) { 8196 const decimalPart = number - Math.floor(number); 8197 return decimalPart >= min ? Math.ceil(number) : Math.floor(number); 8198 } 8199 Alpine.directive("snap-slider", (el, { modifiers }, { cleanup }) => { 8200 const track = el.querySelector("[data-track]"); 8201 if (!track) { 8202 console.warn( 8203 "No Slider track defined, reverting back to CSS slider.\nPlease create a wrapper element for your slides with the attribute data-track" 8204 ); 8205 return; 8206 } 8207 let initialLoad = true; 8208 let pager = el.querySelector("[data-pager]"); 8209 let slides = []; 8210 let inViewObserver, mutationObserver, resizeObserver; 8211 const navBtns = Array.from( 8212 el.querySelectorAll("[data-next], [data-prev]") 8213 ); 8214 const slideLabelSepparator = el.dataset.slideLabelSepparator || "of"; 8215 const useAutoPager = modifiers.includes("auto-pager"); 8216 const useGroupPager = modifiers.includes("group-pager"); 8217 const sliderLabel = el.hasAttribute("aria-label") && el.getAttribute("aria-label").toLowerCase().trim().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, ""); 8218 const sliderId = el.id || sliderLabel || "slider"; 8219 const markerIdName = "data-target-id"; 8220 const pagerClasses = el.dataset.pagerClass || "pager"; 8221 const markerClasses = el.dataset.markerClass || "pager-item"; 8222 function getInViewItems() { 8223 const inViewSlides = track.querySelectorAll("[data-in-view]"); 8224 const firstInViewSlide = inViewSlides[0] || null; 8225 const lastInViewSlide = inViewSlides[inViewSlides.length - 1] || null; 8226 const isAtStart = firstInViewSlide === slides[0]; 8227 const isAtEnd = lastInViewSlide === slides[slides.length - 1]; 8228 return { 8229 inViewSlides, 8230 totalInViewSlides: inViewSlides.length, 8231 firstInViewSlide, 8232 lastInViewSlide, 8233 isAtStart, 8234 isAtEnd, 8235 hasNoOverflow: isAtStart && isAtEnd 8236 }; 8237 } 8238 function groupPagerMarkers() { 8239 if (!pager || !useGroupPager) return; 8240 const totalVisibleSlides = roundUpIfGreaterThan( 8241 track.offsetWidth / slides[0].offsetWidth 8242 ); 8243 const markers = Array.from(pager.querySelectorAll("a, button")); 8244 markers.forEach((marker, index) => { 8245 marker.style.display = index % totalVisibleSlides === 0 ? null : "none"; 8246 }); 8247 } 8248 function handleInView(entries) { 8249 entries.forEach((entry) => { 8250 const marker = pager && (pager.querySelector(`[href="#${entry.target.id}"]`) || pager.querySelector( 8251 `[${markerIdName}="${entry.target.id}"]` 8252 )); 8253 entry.target.toggleAttribute( 8254 "data-in-view", 8255 entry.isIntersecting 8256 ); 8257 entry.target.toggleAttribute("inert", !entry.isIntersecting); 8258 marker?.setAttribute("aria-current", entry.isIntersecting); 8259 marker?.setAttribute( 8260 "tabindex", 8261 entry.isIntersecting ? "0" : "-1" 8262 ); 8263 }); 8264 const { isAtStart, isAtEnd, hasNoOverflow } = getInViewItems(); 8265 navBtns.forEach((btn) => { 8266 if (btn.hasAttribute("data-next")) { 8267 btn.style.visibility = hasNoOverflow ? "hidden" : null; 8268 isAtEnd ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 8269 } 8270 if (btn.hasAttribute("data-prev")) { 8271 btn.style.visibility = hasNoOverflow ? "hidden" : null; 8272 isAtStart ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 8273 } 8274 }); 8275 if (pager) { 8276 pager.style.visibility = hasNoOverflow ? "hidden" : null; 8277 } 8278 if (!initialLoad) { 8279 el.dispatchEvent( 8280 new CustomEvent("slideChange", { detail: getInViewItems() }) 8281 ); 8282 } else { 8283 initialLoad = false;
8284 } 8285 if (document.activeElement.parentElement.hasAttribute("data-pager")) { 8286 const activeItems = pager.querySelectorAll('[tabindex="0"]'); 8287 if (activeItems.length) { 8288 activeItems[0].focus(); 8289 } 8290 } 8291 } 8292 function getSlides() { 8293 if (!track) return []; 8294 return Array.from(track.children).filter( 8295 (child) => child.tagName.toLowerCase() !== "template" && child.tagName.toLowerCase() !== "script" 8296 ); 8297 } 8298 function refreshSlides() { 8299 initialLoad = true; 8300 slides = getSlides(); 8301 setupSlides(); 8302 if (useAutoPager) { 8303 createPager(); 8304 } else { 8305 setupPager(); 8306 } 8307 groupPagerMarkers(); 8308 setupObservers(); 8309 } 8310 function setupSlides() { 8311 slides = getSlides(); 8312 slides.forEach((slide, index) => { 8313 const totalSlides = slides.length; 8314 const currentSlide = index + 1; 8315 const existingLabel = slide.getAttribute("aria-label") || ""; 8316 const isImage = slide.tagName.toLowerCase() === "img" || slide.tagName.toLowerCase() === "picture"; 8317 const slideLabelTag = isImage ? "alt" : "aria-label"; 8318 const hasAutoLabel = existingLabel.startsWith(`${currentSlide} ${slideLabelSepparator} `); 8319 if (!slide.hasAttribute("id")) { 8320 slide.setAttribute("id", `${sliderId}-item-${currentSlide}`); 8321 } 8322 8323 if ((!slide.hasAttribute(slideLabelTag) || slide.getAttribute(slideLabelTag) === "") || hasAutoLabel) { 8324 slide.setAttribute(slideLabelTag, `${currentSlide} ${slideLabelSepparator} ${totalSlides}`); 8325 } 8326 8327 if (slide.tagName.toLowerCase() === "div" && !slide.hasAttribute("role")) { 8328 slide.setAttribute("role", "group"); 8329 } 8330 8331 if (pager && !isImage) { 8332 slide.setAttribute("role", "tabpanel"); 8333 } 8334 8335 if (slide.getAttribute('role') === "group") { 8336 slide.setAttribute("aria-roledescription", "item"); 8337 } 8338 }); 8339 if (!el.hasAttribute("role")) { 8340 el.setAttribute("role", "region"); 8341 } 8342 if (!el.hasAttribute("aria-roledescription")) { 8343 el.setAttribute("aria-roledescription", "carousel"); 8344 } 8345 track.setAttribute("tabindex", 0); 8346 track.setAttribute("aria-live", "polite"); 8347 } 8348 function setupNav() { 8349 navBtns.forEach((btn) => { 8350 btn.setAttribute("disabled", ""); 8351 btn.removeAttribute("hidden"); 8352 btn.classList.remove("invisible"); 8353 btn.style.visibility = null; 8354 }); 8355 } 8356 function createPager() { 8357 const newPager = document.createElement("nav"); 8358 newPager.setAttribute("data-pager", ""); 8359 newPager.setAttribute("role", "tablist"); 8360 newPager.classList.add(...pagerClasses.split(" ")); 8361 8362 slides.forEach((slide, index) => { 8363 const marker = document.createElement("button"); 8364 const slideId = slide.id || `${sliderId}-item-${index + 1}`; 8365 marker.setAttribute(markerIdName, slideId); 8366 marker.classList.add(...markerClasses.split(" ")); 8367 setupPagerMarker(marker, index); 8368 newPager.appendChild(marker); 8369 8370 if (slide.tagName.toLowerCase() !== "img" && slide.tagName.toLowerCase() !== "picture") { 8371 slide.removeAttribute("aria-roledescription"); 8372 slide.setAttribute("role", "tabpanel"); 8373 } 8374 }); 8375 8376 if (pager) { 8377 pager.setAttribute("role", "tablist"); 8378 pager.replaceChildren(...newPager.children); 8379 } else { 8380 track.after(newPager); 8381 pager = el.querySelector("[data-pager]"); 8382 } 8383 } 8384 function setupPager() { 8385 if (!pager) return; 8386 pager.setAttribute("role", "tablist"); 8387 const items = Array.from(pager.querySelectorAll("a, button"));
8388 items.forEach((marker, index) => setupPagerMarker(marker, index)); 8389 } 8390 function setupPagerMarker(marker, index) { 8391 const markerId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(markerIdName); 8392 const slideId = markerId || `${sliderId}-item-${index + 1}`; 8393 if (!markerId) { 8394 marker.setAttribute(markerIdName, slideId); 8395 } 8396 marker.setAttribute("role", "tab"); 8397 marker.setAttribute("aria-controls", slideId); 8398 marker.setAttribute("aria-posinset", index + 1); 8399 marker.setAttribute("aria-setsize", slides.length); 8400 marker.setAttribute("tabindex", "-1"); 8401 if (!marker.hasAttribute("aria-label")) { 8402 marker.setAttribute("aria-label", `Slide ${index + 1}`); 8403 } 8404 } 8405 function setupObservers() { 8406 if (inViewObserver) { 8407 inViewObserver.disconnect(); 8408 } 8409 inViewObserver = new IntersectionObserver( 8410 handleInView.bind(track), 8411 { root: track, threshold: 0.8 } 8412 ); 8413 slides.forEach((slide) => inViewObserver.observe(slide)); 8414 } 8415 function setupMutationObserver() { 8416 mutationObserver = new MutationObserver(refreshSlides.bind(track)); 8417 mutationObserver.observe(track, { 8418 childList: true, 8419 subtree: false 8420 }); 8421 } 8422 function setupResizeObserver() { 8423 resizeObserver = new ResizeObserver(groupPagerMarkers.bind(el)); 8424 resizeObserver.observe(el); 8425 } 8426 function goToSlideDir(dir = "next") { 8427 const { firstInViewSlide, lastInViewSlide } = getInViewItems(); 8428 const isPrev = dir === "prev"; 8429 let targetSlide = isPrev ? firstInViewSlide?.previousElementSibling : lastInViewSlide?.nextElementSibling; 8430 if (!targetSlide) return; 8431 if (targetSlide.tagName.toLowerCase() === "template") { 8432 targetSlide = isPrev ? targetSlide?.previousElementSibling : targetSlide?.nextElementSibling; 8433 } 8434 targetSlide.scrollIntoView({ 8435 block: "nearest", 8436 inline: isPrev ? "end" : "start", 8437 behavior: "smooth" 8438 }); 8439 } 8440 function pagerToSlide(event) { 8441 if (!event.target.closest("[data-pager]")) return; 8442 const marker = event.target.closest("a, button"); 8443 if (!marker) return; 8444 event.preventDefault(); 8445 const slideId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(markerIdName); 8446 const targetSlide = track.querySelector(`#${slideId}`); 8447 targetSlide?.scrollIntoView({ 8448 block: "nearest", 8449 inline: "start", 8450 behavior: "smooth" 8451 }); 8452 } 8453 setupSlides(); 8454 setupNav(); 8455 if (useAutoPager) { 8456 createPager(); 8457 } else { 8458 setupPager(); 8459 } 8460 setupObservers(); 8461 setupMutationObserver(); 8462 setupResizeObserver(); 8463 function eventHandler(event) { 8464 const target = event.target.closest( 8465 "[data-next], [data-prev], [data-pager]" 8466 ); 8467 if (!target) return; 8468 if (event.type === "click") { 8469 if (target.hasAttribute("data-next")) { 8470 goToSlideDir("next"); 8471 } else if (target.hasAttribute("data-prev")) { 8472 goToSlideDir("prev"); 8473 } else if (target.closest("[data-pager]")) { 8474 pagerToSlide(event); 8475 } 8476 } 8477 if (event.type === "keydown" && target.closest("[data-pager]")) { 8478 if (event.key === "ArrowRight") { 8479 goToSlideDir("next"); 8480 } else if (event.key === "ArrowLeft") { 8481 goToSlideDir("prev"); 8482 } 8483 } 8484 } 8485 el.addEventListener("click", eventHandler); 8486 el.addEventListener("keydown", eventHandler); 8487 cleanup(() => { 8488 inViewObserver?.disconnect(); 8489 mutationObserver?.disconnect(); 8490 resizeObserver?.disconnect(); 8491 el.removeEventListener("click", eventHandler); 8492 el.removeEventListener("keydown", eventHandler); 8493 }); 8494 }); 8495 } 8496 8497 document.addEventListener("alpine:init", () => { 8498 window.Alpine.plugin(alpineSnapSlider); 8499 }); 8500 })(); 8501</script>
vendor: 1 bytes, line 8501
8501
8502<script> 8503 (() => { 8504 // src/dialog.js 8505 function dialog_default(Alpine) { 8506 Alpine.directive("htmldialog", fylgjaAlpineDialog); 8507 8508 function fylgjaAlpineDialog(el, { 8509 expression, 8510 modifiers 8511 }, { 8512 evaluateLater, 8513 cleanup 8514 }) { 8515 const evaluate = expression.length ? evaluateLater(expression) : () => {}; 8516 const lockPageScroll = modifiers.includes("noscroll"); 8517 const closeby = modifierValue(modifiers, "closeby", "any"); 8518 el.style.display = null; 8519 el.hidden = false; 8520 el.style.length === 0 && el.removeAttribute("style"); 8521 el.addEventListener("keydown", escapeDialog); 8522 el.addEventListener("click", backdropDialog); 8523 el.addEventListener("submit", methodDialog); 8524 8525 function scrollLock(use = true) { 8526 document.body.style.overflow = use ? "hidden" : ""; 8527 } 8528 8529 function methodDialog(event) { 8530 if (event.target.getAttribute("method") === "dialog" || event.submitter && event.submitter.getAttribute("formmethod") === "dialog") { 8531 evaluate(); 8532 } 8533 } 8534 8535 function escapeDialog(event) { 8536 if (event.key !== "Escape") 8537 return; 8538 event.preventDefault(); 8539 if (closeby !== "any" && closeby !== "closerequest") 8540 return; 8541 evaluate(); 8542 } 8543 8544 function backdropDialog(event) { 8545 if (event.target !== el || closeby !== "any") 8546 return; 8547 const rect = el.getBoundingClientRect(); 8548 const isInDialog = rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width; 8549 if (isInDialog) 8550 return; 8551 evaluate(); 8552 } 8553 el._x_doShow = () => { 8554 if (el.hasAttribute("open")) 8555 return; 8556 el.showModal(); 8557 scrollLock(lockPageScroll); 8558 }; 8559 el._x_doHide = () => { 8560 if (!el.hasAttribute("open")) 8561 return; 8562 el.close(); 8563 scrollLock(false); 8564 }; 8565 cleanup(() => { 8566 el.removeEventListener("keydown", escapeDialog); 8567 el.removeEventListener("click", backdropDialog); 8568 el.removeEventListener("submit", methodDialog); 8569 scrollLock(false); 8570 }); 8571 } 8572 } 8573 8574 function modifierValue(modifiers, key, fallback) { 8575 if (modifiers.indexOf(key) === -1) 8576 return fallback; 8577 const rawValue = modifiers[modifiers.indexOf(key) + 1]; 8578 if (!rawValue) 8579 return fallback; 8580 if (key === "closeby") { 8581 const allowedValues = ["auto", "none", "closerequest", "any"]; 8582 const options = allowedValues.join(", "); 8583 if (!allowedValues.includes(rawValue)) { 8584 console.warn( 8585 `"${rawValue}" is not one of the allowed values for closeby: ${options}` 8586 ); 8587 } 8588 return fallback; 8589 } 8590 return rawValue; 8591 } 8592 8593 // src/cdn.js 8594 document.addEventListener("alpine:init", () => { 8595 window.Alpine.plugin(dialog_default); 8596 }); 8597 })(); 8598</script>
8598 8599
8600<script type="module" 8601 src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/Hyva_Theme/js/alpine3.min.js" 8602 defer 8603 crossorigin 8604></script>
vendor: 1 bytes, line 8604
8604
8605<script> 8606 'use strict'; 8607 function dispatchMessages(messages, hideAfter) { 8608 const messagesEvent = new CustomEvent("messages-loaded", { 8609 detail: { 8610 messages: messages, 8611 hideAfter: hideAfter 8612 } 8613 }); 8614 window.dispatchEvent(messagesEvent); 8615 } 8616 8617 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 8618 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 8619 } 8620 8621 (function( hyva, undefined ) { 8622 8623 hyva.initFormKey = () => { 8624 const inputSelector = 'input[name="form_key"]', 8625 formKey = hyva.getFormKey(); 8626 8627 Array.from(document.querySelectorAll(inputSelector)).map(function (input) { 8628 input.value = formKey 8629 }); 8630 } 8631 8632 hyva.initMessages = () => { 8633 try { 8634 const messages = hyva.getCookie('mage-messages'); 8635 window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; 8636 8637 dispatchMessages(window.mageMessages); 8638 8639 // empty `mage-messages` cookie 8640 const skipSetDomain = true; 8641 hyva.setCookie('mage-messages','', -1, skipSetDomain); 8642 8643 } catch (error) { 8644 console.warn('Error parsing Cookie Messages:', error); 8645 } 8646 } 8647 8648 window.addEventListener('DOMContentLoaded', hyva.initFormKey); 8649 hyva.alpineInitialized(hyva.initMessages) 8650 8651 }( window.hyva = window.hyva || {} )); 8652</script>
vendor: 1 bytes, line 8652
8652
8653<script> 8654 'use strict'; 8655 { 8656 const private_content_key = 'mage-cache-storage'; 8657 const private_content_expire_key = 'mage-cache-timeout'; 8658 const private_content_version_key = 'private_content_version'; 8659 const section_data_ids_key = 'section_data_ids'; 8660 const mage_cache_session_id_key = 'mage-cache-sessid'; 8661 const last_visited_store_key = 'last_visited_store'; 8662 8663 const ttl = 3600; 8664 8665 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 8666 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 8667 } 8668 8669 function loadSectionData () { 8670 const browserStorage = hyva.getBrowserStorage(); 8671 if (!browserStorage) { 8672 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 8673 [{ 8674 type: "warning", 8675 text: "Please enable LocalStorage in your browser." 8676 }] 8677 ); 8678 return; 8679 } 8680 try { 8681 let isInvalid = false; 8682 8683 if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { 8684 isInvalid = true; 8685 } 8686 hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); 8687 8688 if (!hyva.getCookie(mage_cache_session_id_key)) { 8689 isInvalid = true; 8690 browserStorage.removeItem(private_content_key); 8691 const skipSetDomain = true; 8692 const days = false; 8693 hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) 8694 } 8695 8696 const cookieVersion = hyva.getCookie(private_content_version_key); 8697 const storageVersion = browserStorage.getItem(private_content_version_key); 8698 8699 if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { 8700 isInvalid = true; 8701 } 8702 8703 const privateContentExpires = browserStorage.getItem(private_content_expire_key); 8704 if (privateContentExpires && new Date(privateContentExpires) < new Date()) { 8705 browserStorage.removeItem(private_content_key); 8706 } 8707 8708 if (isInvalid && cookieVersion) { 8709 fetchPrivateContent([]); 8710 } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { 8711 const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); 8712 if ( 8713 privateContent && 8714 privateContentExpires && 8715 privateContent.cart && 8716 privateContent.customer 8717 ) { 8718 dispatchPrivateContent(privateContent); 8719 } else { 8720 fetchPrivateContent([]); 8721 } 8722 } else { 8723 if (document.getElementById('default-section-data')) { 8724 const privateContent = JSON.parse(document.getElementById('default-section-data').innerText.trim()); 8725 dispatchPrivateContent(privateContent); 8726 } else { 8727 dispatchPrivateContent({}); 8728 } 8729 } 8730 8731 } catch (error) { 8732 console.warn('Error retrieving Private Content:', error); 8733 } 8734 } 8735 8736 hyva.alpineInitialized(loadSectionData) 8737 window.addEventListener('reload-customer-section-data', loadSectionData); 8738 8739 window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data); 8740 8741 function dispatchPrivateContent(data) { 8742 8743 const privateContentEvent = new CustomEvent("private-content-loaded", { 8744 detail: { 8745 data: window.processSectionDataBeforeDispatch(data) 8746 } 8747 }); 8748 window.dispatchEvent(privateContentEvent); 8749 } 8750 8751 function fetchPrivateContent(sections) { 8752 fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { 8753 method: 'GET', 8754 headers: { 8755 'Content-Type': 'application/json', 8756 'X-Requested-With': 'XMLHttpRequest' 8757 } 8758 }) 8759 .then(response => response.ok && response.json()) 8760 .then( 8761 data => { 8762 if (data) { 8763 try { 8764 const browserStorage = hyva.getBrowserStorage(); 8765 8766 // merge new data preserving non-invalidated sections 8767 const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; 8768 8769 if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { 8770 delete oldSectionData['checkout-data']; 8771 } 8772 const newSectionData = Object.assign(oldSectionData, data); 8773 8774 dispatchPrivateContent(newSectionData); 8775 8776 // don't persist messages, they've been dispatched already 8777 if (newSectionData.messages && newSectionData.messages.messages ) { 8778 newSectionData.messages.messages = []; 8779 } 8780 8781 browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); 8782 8783 const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); 8784 browserStorage.setItem(private_content_expire_key, expiresAt); 8785 8786 const newCookieVersion = hyva.getCookie(private_content_version_key); 8787 browserStorage.setItem(private_content_version_key, newCookieVersion); 8788 8789 // We don't need the section_data_ids in Hyvä, but we store them for compatibility 8790 // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout 8791 hyva.setCookie( 8792 section_data_ids_key, 8793 JSON.stringify( 8794 Object.keys(data).reduce((sectionDataIds, sectionKey) => { 8795 sectionDataIds[sectionKey] = data[sectionKey]['data_id']; 8796 return sectionDataIds; 8797 }, {}) 8798 ), 8799 false, 8800 true 8801 ); 8802 } catch (error) { 8803 console.warn("Couldn't store privateContent", error); 8804 } 8805 } 8806 } 8807 ); 8808 } 8809 } 8810</script>
vendor: 1 bytes, line 8810
8810
8811<script> 8812 (() => { 8813 document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); 8814 })() 8815</script>
vendor: 1 bytes, line 8815
8815
8816<script> 8817 (events => { 8818 const dispatchUserInteractionEvent = () => { 8819 events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) 8820 window.dispatchEvent(new Event('init-external-scripts')) 8821 }; 8822 events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) 8823 })(['touchstart', 'mousemove', 'wheel', 'scroll', 'keydown']) 8824</script>
vendor: 1 bytes, line 8824
8824
8825<script> 8826 'use strict'; 8827 8828 const grecaptchaV2LoadCallbacks = []; 8829 8830 function executeRecaptchaLoadCallbacks () { 8831 while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) { 8832 const callback = grecaptchaV2LoadCallbacks.pop(); 8833 typeof callback === 'string' ? window[callback]() : callback(); 8834 } 8835 } 8836 8837 (function() { 8838 const loadRecaptchaScript = (event) => { 8839 8840 if (window.grecaptcha || !event.target.form) { 8841 return; 8842 } 8843 8844 const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks'; 8845 const siteKey = '6LeoIcUrAAAAAJYfHQM4lGMaUcmcjlQaBgv49EZy'; 8846 const script = document.createElement('script'); 8847 script.type = 'text/javascript'; 8848 script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`; 8849 script.async = true; 8850 document.head.appendChild(script); 8851 8852 script.addEventListener('load', () => { 8853 Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled')); 8854 }); 8855 } 8856 8857 window.forceLoadRecaptchaScript = (form) => { 8858 loadRecaptchaScript({target: {form: form || 'dummy'}}); 8859 executeRecaptchaLoadCallbacks(); 8860 }; 8861 8862 document.body.addEventListener('input', loadRecaptchaScript, { once: true }); 8863 document.body.addEventListener('focus', loadRecaptchaScript, { once: true }); 8864 8865 }()); 8866 8867</script>
8867 8868<div 8869 x-show="open" 8870 x-cloak 8871 x-data="{ 8872 open: document.cookie.indexOf('ageVerified=true') === -1, 8873 agree() { 8874 document.cookie = 'ageVerified=true; path=/; max-age=' + (60 * 60 * 24 * 7); // 7 days 8875 this.open = false; 8876 } 8877 }" 8878 class="fixed inset-0 z-50 bg-black bg-opacity-75 flex items-center justify-center" 8879> 8880 <div class="bg-white max-w-lg rounded"> 8881 <h2 class="text-xl font-bold py-4 px-5 border-b border-gray-300">Adult Content - Access Restricted</h2> 8882 <div class="p-5 border-b border-gray-300 flex flex-col gap-2.5"> 8883 <p class="text-sm text-left"> 8884 <strong>WARNING</strong> This is an adult website that contains sexually explicit materials. This site uses cookies. By clicking below to proceed further, you certify that: 8885 </p> 8886 <ul class="text-sm text-left list-disc pl-5 [&_a]:text-hoverColor"> 8887 <li>You are 18 years of age or older (or have reached the age of majority in your jurisdiction)</li> 8888 <li>You are legally allowed to use this adult website in your jurisdiction</li> 8889 <li>You agree to Safewayz LLC's <a href="/terms-of-services" target="_blank" class="underline">Terms of Service</a>, <a href="/privacy-policy" target="_blank" class="underline">Privacy Policy,</a> and <a href="/usage-and-safety" target="_blank" class="underline">Usage & Safety Guidelines</a>.</li> 8890 </ul> 8891 <p class="text-sm">While browsing this site, you agree to the use of cookies.</p> 8892 </div> 8893 <div class="flex justify-center gap-3 p-5"> 8894 <button @click="agree" class="btn btn-primary bg-goldColor border-goldColor">YES, I AGREE.</button> 8895 <a href="https://www.google.com" 8896 class="btn bg-white border border-goldColor text-sm text-goldColor font-semibold py-3 px-6 transition hover:bg-black hover:border-black hover:text-white"> 8897 NO, EXIT 8898 </a> 8899 </div> 8900 </div> 8901</div> 8902 8903 8904<!-- Wrapping template -->
8905<script type="text/template" id="instant_wrapper_template"> 8906 {{#findAutocomplete}} 8907 <div id="algolia-autocomplete-container"></div> 8908 {{/findAutocomplete}} 8909 8910 <div id="algolia_instant_selector" class="container"> 8911 <div class="plp-column-container flex gap-[60px] s1200:gap-x-7 s767:flex-col s767:gap-5"> 8912 <div class="block-filter flex flex-col md:block w-[240px] bg-white shrink-0 s767:w-full" id="algolia-left-container"> 8913 <div class=""> 8914 <div class="block-title md:border-b md:border-baseColor md:pb-5 s767:hidden"> 8915 <div class="h-[45px] text-lg font-semibold text-goldColor flex items-center gap-2.5"> 8916 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="20" viewBox="0 0 25 20" fill="none" role="img"> 8917<path d="M24.2065 4.0272H11.4928C11.1421 5.44412 9.86036 6.49792 8.33661 6.49792C6.81285 6.49792 5.5311 5.44412 5.18041 4.0272H0.781311C0.350094 4.0272 0.000473022 3.67758 0.000473022 3.24636C0.000473022 2.81514 0.350094 2.46552 0.781311 2.46552H5.18046C5.5311 1.04859 6.81285 -0.00524902 8.33666 -0.00524902C9.86046 -0.00524902 11.1422 1.04859 11.4929 2.46552H24.2065C24.6377 2.46552 24.9873 2.81514 24.9873 3.24636C24.9873 3.67758 24.6377 4.0272 24.2065 4.0272ZM8.33661 1.55643C7.40477 1.55643 6.64668 2.31452 6.64668 3.24631C6.64668 4.17814 7.40477 4.93624 8.33661 4.93624C9.26844 4.93624 10.0265 4.17814 10.0265 3.24631C10.0265 2.31452 9.26844 1.55643 8.33661 1.55643ZM24.2065 10.7809H19.8073C19.4566 12.1978 18.1749 13.2516 16.6511 13.2516C15.1273 13.2516 13.8456 12.1978 13.4949 10.7809H0.781311C0.350094 10.7809 0.000473022 10.4312 0.000473022 10C0.000473022 9.56881 0.350094 9.21918 0.781311 9.21918H13.495C13.8457 7.80226 15.1274 6.74842 16.6512 6.74842C18.175 6.74842 19.4567 7.80226 19.8074 9.21918H24.2065C24.6377 9.21918 24.9873 9.56881 24.9873 10C24.9873 10.4312 24.6377 10.7809 24.2065 10.7809ZM16.6512 8.31009C15.7193 8.31009 14.9612 9.06819 14.9612 10C14.9612 10.9318 15.7193 11.6899 16.6512 11.6899C17.583 11.6899 18.3411 10.9318 18.3411 10C18.3411 9.06819 17.583 8.31009 16.6512 8.31009ZM0.781311 15.9729H5.18046C5.53115 14.5559 6.81285 13.5021 8.33666 13.5021C9.86046 13.5021 11.1422 14.5559 11.4929 15.9729H24.2065C24.6377 15.9729 24.9873 16.3225 24.9873 16.7537C24.9873 17.1849 24.6377 17.5345 24.2065 17.5345H11.4928C11.1421 18.9515 9.86041 20.0053 8.33661 20.0053C6.8128 20.0053 5.5311 18.9515 5.18041 17.5345H0.781311C0.350094 17.5345 0.000473022 17.1849 0.000473022 16.7537C0.000473022 16.3225 0.350044 15.9729 0.781311 15.9729ZM8.33661 18.4436C9.26844 18.4436 10.0265 17.6855 10.0265 16.7537C10.0265 15.8219 9.26844 15.0638 8.33661 15.0638C7.40477 15.0638 6.64668 15.8219 6.64668 16.7537C6.64668 17.6855 7.40477 18.4436 8.33661 18.4436Z" fill="currentColor"/> 8918<title>filterBy</title></svg> 8919 <span>Filter By</span> 8920 </div> 8921 </div> 8922 <div class="block min767:hidden"> 8923 <div class="flex items-center justify-between" x-data="{open:false}"> 8924 8925 <div class="relative bg-container-lighter rounded cursor-pointer" @click="open = !open"> 8926 <div class="absolute z-20 w-full h-full text-transparent" id="refine-toggle"> 8927 </div> 8928 <div class="h-[45px] text-lg font-semibold text-goldColor flex items-center gap-2.5 s767:btn s767:btn-primary" id="filter-btn-div" > 8929 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="20" viewBox="0 0 25 20" fill="none" role="img"> 8930<path d="M24.2065 4.0272H11.4928C11.1421 5.44412 9.86036 6.49792 8.33661 6.49792C6.81285 6.49792 5.5311 5.44412 5.18041 4.0272H0.781311C0.350094 4.0272 0.000473022 3.67758 0.000473022 3.24636C0.000473022 2.81514 0.350094 2.46552 0.781311 2.46552H5.18046C5.5311 1.04859 6.81285 -0.00524902 8.33666 -0.00524902C9.86046 -0.00524902 11.1422 1.04859 11.4929 2.46552H24.2065C24.6377 2.46552 24.9873 2.81514 24.9873 3.24636C24.9873 3.67758 24.6377 4.0272 24.2065 4.0272ZM8.33661 1.55643C7.40477 1.55643 6.64668 2.31452 6.64668 3.24631C6.
893064668 4.17814 7.40477 4.93624 8.33661 4.93624C9.26844 4.93624 10.0265 4.17814 10.0265 3.24631C10.0265 2.31452 9.26844 1.55643 8.33661 1.55643ZM24.2065 10.7809H19.8073C19.4566 12.1978 18.1749 13.2516 16.6511 13.2516C15.1273 13.2516 13.8456 12.1978 13.4949 10.7809H0.781311C0.350094 10.7809 0.000473022 10.4312 0.000473022 10C0.000473022 9.56881 0.350094 9.21918 0.781311 9.21918H13.495C13.8457 7.80226 15.1274 6.74842 16.6512 6.74842C18.175 6.74842 19.4567 7.80226 19.8074 9.21918H24.2065C24.6377 9.21918 24.9873 9.56881 24.9873 10C24.9873 10.4312 24.6377 10.7809 24.2065 10.7809ZM16.6512 8.31009C15.7193 8.31009 14.9612 9.06819 14.9612 10C14.9612 10.9318 15.7193 11.6899 16.6512 11.6899C17.583 11.6899 18.3411 10.9318 18.3411 10C18.3411 9.06819 17.583 8.31009 16.6512 8.31009ZM0.781311 15.9729H5.18046C5.53115 14.5559 6.81285 13.5021 8.33666 13.5021C9.86046 13.5021 11.1422 14.5559 11.4929 15.9729H24.2065C24.6377 15.9729 24.9873 16.3225 24.9873 16.7537C24.9873 17.1849 24.6377 17.5345 24.2065 17.5345H11.4928C11.1421 18.9515 9.86041 20.0053 8.33661 20.0053C6.8128 20.0053 5.5311 18.9515 5.18041 17.5345H0.781311C0.350094 17.5345 0.000473022 17.1849 0.000473022 16.7537C0.000473022 16.3225 0.350044 15.9729 0.781311 15.9729ZM8.33661 18.4436C9.26844 18.4436 10.0265 17.6855 10.0265 16.7537C10.0265 15.8219 9.26844 15.0638 8.33661 15.0638C7.40477 15.0638 6.64668 15.8219 6.64668 16.7537C6.64668 17.6855 7.40477 18.4436 8.33661 18.4436Z" fill="currentColor"/> 8931<title>filterBy</title></svg> 8932 <span>Filter By</span> 8933 </div> 8934 </div> 8935 </div> 8936 </div> 8937 <div class="[&_.ais-Panel]:shadow-none [&_.ais-Panel]:p-0 [&_.ais-Panel]:m-0 flex flex-col gap-5 mt-5 s767:mt-1 s767:mb-16 s767:mt-5" id="instant-search-facets-container"> 8938 <div class="w-full flex flex-col px-8 py-4 bg-white shadow hidden-sm hidden-xs"> 8939 <span class="text-base md:text-lg font-semibold"> 8940 Active filtering </span> 8941 <div class="order-2" id="clear-refinements"></div> 8942 <div id="current-refinements"></div> 8943 </div> 8944 </div> 8945 </div> 8946 </div> 8947 8948 <div class="w-full" id="algolia-right-container"> 8949 <div class="border-b border-baseColor pb-5"> 8950 <div class="flex w-full justify-between items-center s767:gap-2.5"> 8951 <div class="toolbar-amount text-sm" id="algolia-stats"></div> 8952 <div class="flex gap-4 items-center relative"> 8953 <span class="font-medium text-sm s767:absolute s767:-top-2.5 s767:left-3 s767:bg-white s767:px-[5px]">Sort by:</span> 8954 <div id="algolia-sorts"></div> 8955 </div> 8956 </div> 8957 </div> 8958 <div class="hidden"> 8959 <div class="pb-3.5"> 8960 <div class="px-2.5"> 8961 {{#second_bar}} 8962 <div id="instant-search-bar"></div> 8963 {{/second_bar}} 8964 </div> 8965 </div> 8966 </div> 8967 <div> 8968 <div> 8969 <div itemscope itemtype="http://schema.org/ItemList"> 8970 8971 <div id="algolia-banner"></div> 8972 <div id="instant-empty-results-container"></div> 8973 <div id="instant-search-results-container" class=""></div> 8974 </div> 8975 </div> 8976 </div> 8977 <div class="toolbar toolbar-products flex justify-between items-center s767:justify-center"> 8978 <div id="instant-search-pagination-container"></div> 8979 </div> 8980 </div> 8981 </div> 8982 </div> 8983</script>
vendor: 2 bytes, line 8983
8983
8984<script> 8985 (function () { 8986 const mobileBreakpoint = 768; 8987 let isMobileTriggered = false; 8988 let filterBtn = null; 8989 8990 // Utility: Wait until element exists 8991 function waitForElement(selector, callback, checkInterval = 200, timeout = 10000) { 8992 const startTime = Date.now(); 8993 const timer = setInterval(() => { 8994 const el = document.querySelector(selector); 8995 if (el) { 8996 clearInterval(timer); 8997 callback(el); 8998 } else if (Date.now() - startTime > timeout) { 8999 clearInterval(timer); 9000 console.warn('Timeout: Element not found:', selector); 9001 } 9002 }, checkInterval); 9003 } 9004 9005 function triggerClickIfMobile(el) { 9006 const isMobile = window.innerWidth <= mobileBreakpoint; 9007 if (isMobile && !isMobileTriggered) { 9008 el.classList.add('hidden-sm'); 9009 el.classList.add('hidden-xs'); 9010 isMobileTriggered = true; 9011 } else if (!isMobile) { 9012 el.classList.remove('hidden-sm'); 9013 el.classList.remove('hidden-xs'); 9014 isMobileTriggered = false; 9015 } 9016 } 9017 9018 // Wait until the element is available, then attach logic 9019 waitForElement('#instant-search-facets-container', (el) => { 9020 filterBtn = el; 9021 // Run initial check 9022 triggerClickIfMobile(filterBtn); 9023 // Re-check on resize 9024 window.addEventListener('resize', () => triggerClickIfMobile(filterBtn)); 9025 }); 9026 })(); 9027</script>
vendor: 2 bytes, line 9027
9027
9028<script type="text/template" id="instant-hit-template"> 9029 <div class="item product product-item product_addtocart_form w-full static flex group pt-7 h-full" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"> 9030 <meta itemprop="position" content="{{__position}}" /> 9031 <div class="flex-grow border border-[#eee] bg-white relative w-full overflow-hidden" itemprop="item" itemscope itemtype="http://schema.org/Product"> 9032 <meta itemprop="url" 9033 {{^__queryID}} content="{{url}}" {{/__queryID}} 9034 {{#__queryID}} content="{{urlForInsights}}" {{/__queryID}} 9035 /> 9036 <div class="flex flex-col"> 9037 <div class="product photo product-item-photo block flex justify-center items-center p-5 pb-0 group-hover:[&_img]:scale-110 [&_img]:transition [&_img]:duration-500 [&_img]:ease-in-out s1023:px-4 overflow-hidden"> 9038 <a class="h-full" 9039 {{^__queryID}} href="{{url}}" {{/__queryID}} 9040 {{#__queryID}} href="{{urlForInsights}}" {{/__queryID}} 9041 data-objectid="{{objectID}}" 9042 data-indexname="{{__indexName}}" 9043 data-position="{{__position}}" 9044 data-queryid="{{__queryID}}"> 9045 {{#image_url}}<img itemprop="image" src="{{{image_url}}}" alt="{{{name}}}" />{{/image_url}} 9046 {{^image_url}}<span class="no-image"></span>{{/image_url}} 9047 </a> 9048 </div> 9049 <div class="product-info flex flex-col grow py-5 px-6 flex flex-col gap-4 s1023:px-4"> 9050 <div class="text-[#666] font-medium text-sm s1023:text-xs">{{#manufacturer_heading}}{{manufacturer_heading}}{{/manufacturer_heading}}</div> 9051 <div class="-mt-3 product-name"> 9052 <a class="h-full product-item-link font-medium inline-block align-top s1023:text-sm hover:text-hoverColor [&_mark]:font-medium" 9053 {{^__queryID}} href="{{url}}" {{/__queryID}} 9054 {{#__queryID}} href="{{urlForInsights}}" {{/__queryID}} 9055 data-objectid="{{objectID}}" 9056 data-indexname="{{__indexName}}" 9057 data-position="{{__position}}" 9058 data-queryid="{{__queryID}}"> 9059 {{{ _highlightResult.name.value }}} 9060 </a> 9061 </div> 9062 <div class="rating-summary flex items-center gap-1 relative"> 9063 <div class="rating-summary flex"> 9064 <svg 9065 xmlns="http://www.w3.org/2000/svg" 9066 class="fill-current text-gray-200 w-6 h-6 s767:w-5 s767:h-5 shrink-0"
9067 viewBox="3 0 20 20" 9068 fill="currentColor" 9069 aria-hidden="true" 9070 > 9071 <path 9072 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 9073 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 9074 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 9075 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" 9076 /> 9077 </svg> 9078 <svg 9079 xmlns="http://www.w3.org/2000/svg" 9080 class="fill-current text-gray-200 w-6 h-6 s767:w-5 s767:h-5 shrink-0"
9081 viewBox="3 0 20 20" 9082 fill="currentColor" 9083 aria-hidden="true" 9084 > 9085 <path 9086 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 9087 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 9088 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 9089 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" 9090 /> 9091 </svg> 9092 <svg 9093 xmlns="http://www.w3.org/2000/svg" 9094 class="fill-current text-gray-200 w-6 h-6 s767:w-5 s767:h-5 shrink-0"
9095 viewBox="3 0 20 20" 9096 fill="currentColor" 9097 aria-hidden="true" 9098 > 9099 <path 9100 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 9101 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 9102 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 9103 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" 9104 /> 9105 </svg> 9106 <svg 9107 xmlns="http://www.w3.org/2000/svg" 9108 class="fill-current text-gray-200 w-6 h-6 s767:w-5 s767:h-5 shrink-0"
9109 viewBox="3 0 20 20" 9110 fill="currentColor" 9111 aria-hidden="true" 9112 > 9113 <path 9114 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 9115 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 9116 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 9117 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" 9118 /> 9119 </svg> 9120 <svg 9121 xmlns="http://www.w3.org/2000/svg" 9122 class="fill-current text-gray-200 w-6 h-6 s767:w-5 s767:h-5 shrink-0"
9123 viewBox="3 0 20 20" 9124 fill="currentColor" 9125 aria-hidden="true" 9126 > 9127 <path 9128 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 9129 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 9130 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 9131 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" 9132 /> 9133 </svg> 9134 </div> 9135 <div title="{{rating_summary}}%" class="absolute left-0 top-0"> 9136 <span style="width:{{rating_summary}}%; overflow:hidden; display:flex;"> 9137 <span class="hidden">{{rating_summary}}%</span> 9138 <svg 9139 xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6 s767:w-5 s767:h-5 shrink-0" viewBox="3 0 20 20" 9140 style="color: #f6e05e" 9141 fill="currentColor" 9142 aria-hidden="true" 9143 > 9144 <path 9145 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 9146 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 9147 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 9148 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> 9149 </svg> 9150 <svg 9151 xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6 s767:w-5 s767:h-5 shrink-0" viewBox="3 0 20 20" 9152 style="color: #f6e05e" 9153 fill="currentColor" 9154 aria-hidden="true" 9155 > 9156 <path 9157 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 9158 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 9159 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 9160 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> 9161 </svg> 9162 <svg 9163 xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6 s767:w-5 s767:h-5 shrink-0" viewBox="3 0 20 20" 9164 style="color: #f6e05e" 9165 fill="currentColor" 9166 aria-hidden="true" 9167 > 9168 <path 9169 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 9170 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 9171 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 9172 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
9172 9173 </svg> 9174 <svg 9175 xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6 s767:w-5 s767:h-5 shrink-0" viewBox="3 0 20 20" 9176 style="color: #f6e05e" 9177 fill="currentColor" 9178 aria-hidden="true" 9179 > 9180 <path 9181 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 9182 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 9183 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 9184 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> 9185 </svg> 9186 <svg 9187 xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6 s767:w-5 s767:h-5 shrink-0" viewBox="3 0 20 20" 9188 style="color: #f6e05e" 9189 fill="currentColor" 9190 aria-hidden="true" 9191 > 9192 <path 9193 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 9194 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 9195 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 9196 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> 9197 </svg> 9198 </span> 9199 </div> 9200 <span class="text-sm" :class="{'hidden':rating_summary=='0'}" x-data="{ rating_summary: {{rating_summary}} }" x-text="'(' + (rating_summary / 20).toFixed(1) + ')'"></span> 9201 9202 </div> 9203 9204 {{^price.USD.group_0_max}} 9205 <div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="price"> 9206 <meta itemprop="price" content="{{price.USD.group_0}}" /> 9207 {{/price.USD.group_0_max}} 9208 {{#price.USD.group_0_max}} 9209 <div itemprop="offers" itemscope itemtype="http://schema.org/AggregateOffer" class="price"> 9210 <meta itemprop="lowPrice" content="{{price.USD.group_0}}" /> 9211 <meta itemprop="highPrice" content="{{price.USD.group_0_max}}" /> 9212 {{/price.USD.group_0_max}} 9213 <meta itemprop="priceCurrency" content="USD" /> 9214 <div> 9215 <div class="price-box flex-wrap s767:flex-col s767:items-start"> 9216 <span class="price !flex items-end s767:flex-wrap md:!leading-none"> 9217 <span class="text-xs font-medium mr-1.5 shrink-0 md:leading-none">Starting at</span> 9218 ${{price.USD.group_0}} 9219 </span> 9220 {{#price.USD.group_0_original_formated}} 9221 <div class="price flex items-end s767:flex-wrap !hidden">
9222 <span class="text-xs font-medium mr-1.5 shrink-0 md:leading-none">Regular Price</span> 9223 <span class="line-through font-normal text-lg s767:text-sm md:leading-none"> {{price.USD.group_0_original_formated}}</span> 9224 </div> 9225 {{/price.USD.group_0_original_formated}} 9226 {{#price.USD.group_0_tier_formated}} 9227 <span> 9228 As low as <span>{{price.USD.group_0_tier_formated}}</span> 9229 </span> 9230 {{/price.USD.group_0_tier_formated}} 9231 </div> 9232 </div> 9233 </div> 9234 {{#isAddToCartEnabled}} 9235 <button 9236 x-data="initWishlist()" 9237 @click.prevent="addToWishlist({{objectID}})" 9238 class="rounded-full w-11 h-11 bg-white text-[#C8A888] flex justify-center items-center absolute top-4 right-4 s767:top-2 s767:right-2 s767:w-7 s767:h-7" 9239 > 9240 <svg class="s767:h-[14px] s767:w-[14px]" width="23" height="20" viewBox="0 0 23 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M16.8906 0C14.9202 0 13.2077 0.902823 11.9382 2.6108C11.7751 2.83028 11.6294 3.04985 11.5 3.26285C11.3706 3.0498 11.225 2.83028 11.0618 2.6108C9.79234 0.902823 8.07978 0 6.10938 0C2.46019 0 0 2.93415 0 6.53137C0 11.2261 4.45769 14.1818 10.9248 19.5765C11.0914 19.7154 11.2957 19.7849 11.5 19.7849C11.7043 19.7849 11.9086 19.7155 12.0752 19.5765C18.5408 14.1832 23 11.2267 23 6.53137C23 2.93627 20.5419 0 16.8906 0ZM11.5 17.7167C5.54507 12.7853 1.79688 10.1719 1.79688 6.53137C1.79688 4.17952 3.27822 1.79863 6.10938 1.79863C7.49292 1.79863 8.66372 2.4192 9.58929 3.64317C10.3226 4.61295 10.6273 5.61384 10.6372 5.64658C10.7485 6.03077 11.1002 6.29521 11.5 6.29521C11.9004 6.29521 12.2525 6.02996 12.3634 5.64478C12.3744 5.60633 13.5091 1.79863 16.8906 1.79863C19.7218 1.79863 21.2031 4.17952 21.2031 6.53137C21.2031 10.1755 17.436 12.8012 11.5 17.7167Z" fill="currentColor"/><path class="hidden" d="M17.0742 0C15.0824 0 13.3513 0.912636 12.0679 2.63918C11.903 2.86105 11.7558 3.083 11.625 3.29832C11.4942 3.08295 11.347 2.86105 11.1821 2.63918C9.89878 0.912636 8.16761 0 6.17578 0C2.48693 0 0 2.96605 0 6.60236C0 11.3481 4.50614 14.3359 11.0436 19.7893C11.2119 19.9297 11.4185 20 11.625 20C11.8315 20 12.0381 19.9298 12.2064 19.7893C18.7423 14.3374 23.25 11.3487 23.25 6.60236C23.25 2.96818 20.7652 0 17.0742 0Z" fill="#C8A888"/></svg> 9241 </button> 9242 {{/isAddToCartEnabled}} 9243 </div> 9244 </div> 9245 </div> 9246 </div> 9247</script>
vendor: 2 bytes, line 9247
9247
9248<script type="text/template" id="instant-stats-template"> 9249 <div> 9250 {{#hasOneResult}}<strong>1</strong> 9251 <span> 9252 Item </span> 9253 {{/hasOneResult}} 9254 {{#hasManyResults}} 9255 <span> 9256 Items </span> 9257 <span itemprop="numberOfItems"> 9258 {{first}}-{{last}} of </span> 9259 <span itemprop="numberOfItems">{{nbHits}}</span> 9260 {{/hasManyResults}} 9261 {{#hasNoResults}} 9262 <span> 9263 Your search returned no results. </span> 9264 {{/hasNoResults}} 9265 </div> 9266</script>
vendor: 2 bytes, line 9266
9266
9267<script type="text/template" id="refinements-lists-item-template"> 9268 <label class="{{cssClasses.label}} {{#isRefined}}checked{{/isRefined}} flex items-center mb-2 text-sm hover:text-orangeColor cursor-pointer"> 9269 <input class="{{cssClasses.checkbox}} checkbox" {{#isRefined}}checked{{/isRefined}} type="checkbox" value="{{value}}" /> 9270 <span class="pr-[6px]">{{value}}</span> 9271 <span class="{{cssClasses.count}} ml-auto">({{count}})</span> 9272 </label> 9273</script>
9273<script> 9274 'use strict'; 9275 9276 (function () { 9277 const modals = []; 9278 const excludedFromFocusTrapping = new Set(); 9279 9280 function trapFocusInNextModalWithOverlay() { 9281 for (let idx = modals.length -1; idx >= 0; idx--) { 9282 const nextOnStack = modals[idx]; 9283 const nextDialogElement = nextOnStack.instance.$refs[nextOnStack.name]; 9284 if (! isOverlayDisabled(nextDialogElement)) { 9285 hyva.trapFocus(nextDialogElement); 9286 break; 9287 } 9288 } 9289 } 9290 9291 function focusables(dialogElement) { 9292 const selector = 'button, [href], input, textarea, select, details, [tabindex]:not([tabindex="-1"])'; 9293 return Array.from(dialogElement.querySelectorAll(selector)) 9294 .filter(el => !el.hasAttribute('disabled')); 9295 } 9296 9297 function firstVisible(elements) { 9298 const a = Array.from(elements); 9299 for (let i = 0; i < a.length; i++) { 9300 if (a[i].offsetWidth || a[i].offsetHeight || a[i].getClientRects().length) return a[i]; 9301 } 9302 return null; 9303 } 9304 9305 function isInViewport(element) { 9306 const rect = element && element.getBoundingClientRect(); 9307 return rect && 9308 rect.top >= 0 && 9309 rect.left >= 0 && 9310 rect.right <= window.innerWidth && 9311 rect.bottom <= window.innerHeight; 9312 } 9313 9314 function setFocusAfterTransition(dialogElement, duration) { 9315 const nested = Array.from(dialogElement.querySelectorAll('[role="dialog"]')); 9316 const candidates = Array.from(dialogElement.querySelectorAll('[x-focus-first]')); 9317 next: for (let candidate of candidates) { 9318 for (let child of nested) { 9319 if (child.contains(candidate)) continue next; 9320 } 9321 setTimeout(() => candidate.focus(), 50); 9322 break; 9323 } 9324 window.setTimeout(() => { 9325 const focusElement = firstVisible(dialogElement.querySelectorAll('[x-focus-first]')) || 9326 focusables(dialogElement)[0] || 9327 null; 9328 focusElement && isInViewport(focusElement) && focusElement.focus(); 9329 }, Math.max(1, duration)); 9330 } 9331 9332 function determineTrigger($refs, dialog, trigger) { 9333 if (typeof trigger === 'undefined' && typeof dialog === 'object' && dialog.target instanceof HTMLElement) { 9334 return dialog.target; 9335 } 9336 if (typeof dialog === 'string' && typeof trigger === 'object' && trigger.target instanceof HTMLElement) { 9337 return trigger.target; 9338 } 9339 if (typeof trigger === 'string') { 9340 try { 9341 return $refs[trigger] || document.querySelector(trigger) 9342 } catch (e) {} 9343 } 9344 if (trigger instanceof Element) { 9345 return trigger; 9346 } 9347 9348 return null; 9349 } 9350 9351 function isOverlayDisabled(dialog) { 9352 return dialog && dialog.hasAttribute('x-no-overlay') 9353 } 9354 9355 function areRemainingModalsWithoutOverlay(modals) 9356 { 9357 const overflowDisabled = modals.map(modal => modal.instance.$refs[modal.name]).filter(isOverlayDisabled); 9358 9359 return overflowDisabled.length === modals.length; 9360 } 9361 9362 window.hyva.modal = function(options = {}) { 9363 if (this.$el && this.$el.dataset && this.$el.dataset.options) { 9364 try { 9365 options = Object.assign(options, JSON.parse(this.$el.dataset.options || '{}')); 9366 } catch (e) { 9367 throw new Error('Cannot read the dialog options from the data-options attribute: not valid JSON'); 9368 } 9369 } 9370 9371 const config = Object.assign({ 9372 dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300', 9373 transitionEnterStart: 'opacity-0', 9374 transitionEnterEnd: 'opacity-100', 9375 transitionLeave: 'transition ease-in duration-300', 9376 transitionLeaveStart: 'opacity-100', 9377 transitionLeaveEnd: 'opacity-0', 9378 }, options); 9379 let lastHide = 0; 9380 9381 return { 9382 opened: {}, 9383 show(dialog, trigger) { 9384 const focusTargetAfterHide = determineTrigger(this.$refs, dialog, trigger); 9385 const name = typeof dialog === 'string' ? dialog : config.dialog; 9386 const dialogElement = this.$refs[name]; 9387 if (! dialogElement) { 9388 return; 9389 } 9390 const useOverlay = ! dialogElement.hasAttribute('x-no-overlay'); 9391 9392 dialogElement.scrollTop = 0; 9393 9394 if (this.opened[name]) { 9395 return; 9396 } 9397 9398 if (focusTargetAfterHide) { 9399 focusTargetAfterHide.setAttribute('aria-expanded', 'true'); 9400 } 9401 9402 this.opened[name] = true; 9403 useOverlay && this.$nextTick(() => hyva.trapFocus(dialogElement)); 9404 setFocusAfterTransition(dialogElement, config.duration); 9405 9406 const frame = {name, instance: this, focusTarget: focu
9406sTargetAfterHide, time: Date.now()}; 9407 9408 modals.push(frame); 9409 if (useOverlay) { 9410 document.body.classList.add('overflow-hidden'); 9411 } 9412 return new Promise(resolve => frame.resolve = resolve); 9413 }, 9414 cancel() { 9415 this.hide(false); 9416 }, 9417 ok() { 9418 this.hide(true); 9419 }, 9420 hide(value) { 9421 if (Date.now() - lastHide < config.duration) { 9422 return; 9423 } 9424 lastHide = Date.now(); 9425 9426 const modal = modals.pop() || {}; 9427 if (! modal.instance) { 9428 return; 9429 } 9430 9431 const name = modal.name; 9432 this.opened[name] = false; 9433 hyva.releaseFocus(modal.instance.$refs[modal.name]) 9434 trapFocusInNextModalWithOverlay(); 9435 9436 const nextFocusAfterHide = modal.focusTarget; 9437 nextFocusAfterHide && setTimeout(() => { 9438 nextFocusAfterHide.setAttribute('aria-expanded', 'false'); 9439 nextFocusAfterHide.focus() 9440 }, config.duration); 9441 9442 if (modals.length === 0 || areRemainingModalsWithoutOverlay(modals)) { 9443 document.body.classList.remove('overflow-hidden'); 9444 } 9445 9446 modal.resolve(value); 9447 }, 9448 overlay(dialog) { 9449 dialog = this.$el.dataset.dialogRefName || dialog; 9450 const name = typeof dialog === 'string' ? dialog : config.dialog; 9451 return { 9452 ['x-show']() { 9453 return this.opened[name] 9454 }, 9455 ['x-transition:enter']: config.transitionEnter, 9456 ['x-transition:enter-start']: config.transitionEnterStart, 9457 ['x-transition:enter-end']: config.transitionEnterEnd, 9458 ['x-transition:leave']: config.transitionLeave, 9459 ['x-transition:leave-start']: config.transitionLeaveStart, 9460 ['x-transition:leave-end']: config.transitionLeaveEnd, 9461 ['@hyva-modal-show.window'](event) { 9462 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide) 9463 } 9464 }; 9465 }, 9466 showDialogOnInit() { 9467 const parent = this.$el.closest('[data-dialog-ref-name]'); 9468 if (parent && parent.dataset.dialogRefName) { 9469 this.$dispatch('hyva-modal-show', {dialog: parent.dataset.dialogRefName}) 9470 } 9471 } 9472 }; 9473 } 9474 9475 window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length -1] 9476 9477 window.hyva.modal.pop = function () { 9478 if (modals.length > 0) { 9479 const modal = modals[modals.length -1]; 9480 modal.instance.hide(); 9481 } 9482 } 9483 9484 window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) { 9485 typeof selectors === 'string' || selectors instanceof String 9486 ? excludedFromFocusTrapping.add(selectors) 9487 : selectors.map(selector => excludedFromFocusTrapping.add(selector)); 9488 } 9489 9490 window.hyva.modal.eventListeners = { 9491 keydown: event => { 9492 if (event.key === 'Escape') { 9493 window.hyva.modal.pop(); 9494 } 9495 }, 9496 click: event => { 9497 if (modals.length > 0) { 9498 const modal = modals[modals.length -1]; 9499 const dialog = modal.instance.$refs[modal.name]; 9500 if (modal.time + 50 < Date.now() && // if last click processing is more than 50ms ago 9501 ! isOverlayDisabled(dialog) && // if dialog has overlay 9502 ! dialog.contains(event.target)) { // if click is outside of dialog 9503 modal.instance.hide(); 9504 } 9505 } 9506 } 9507 }; 9508 9509 document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown); 9510 9511 document.addEventListener('click', window.hyva.modal.eventListeners.click); 9512 })(); 9513 window.addEventListener('alpine:init', () => { 9514 Alpine.data('hyvaModal', window.hyva.modal); 9515 }, {once: true}); 9516</script>
9516 9517
9517<script defer src="https://www.dwin1.com/123588.js"></script>
9517 9518
9518<script> 9519 window.addEventListener('init-external-scripts', () => { 9520 window.clarity = window.clarity || function() { 9521 (window.clarity.q = window.clarity.q || []).push(arguments); 9522 }; 9523 const script = document.createElement('script'); 9524 script.type = 'text/javascript'; 9525 script.async = true; 9526 script.src = 'https://www.clarity.ms/tag/r8ssc79bu5'; 9527 document.head.appendChild(script); 9528 }, { once: true, passive: true }); 9529</script>
vendor: 1 bytes, line 9529
9529
9530<script type="application/json" id="mht-cro-data-layer-config">{"enabled":true,"debug":false,"mode":"complement","magefanDetected":true,"events":{"item_variant":true,"search":false,"filter":true,"sort":true,"remove_from_cart":false,"add_to_wishlist":false,"add_to_cart":false,"view_item":false,"view_item_list":false,"select_item":false,"view_cart":false,"begin_checkout":false,"add_shipping_info":false,"add_payment_info":false,"purchase":false,"refund":false},"currency":"USD","pageType":"other","product":null,"itemListName":"Product List","cart":null,"purchase":null}</script>
vendor: 1 bytes, line 9530
9530
9531<script src="https://www.mrhankeystoys.com/static/version1790675038/frontend/Krish/mrhankeytoys/en_US/Mht_CroDataLayer/js/data-layer.js"></script>
vendor: 1 bytes, line 9531
9531
9532<script type="text/json" id="default-section-data"> 9533 {"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"cart":[],"directory-data":{"AD":{"name":"Andorra"},"AF":{"name":"Afghanistan"},"AG":{"name":"Antigua & Barbuda"},"AI":{"name":"Anguilla"},"AL":{"name":"Albania","regions":{"512":{"code":"AL-01","name":"Berat"},"513":{"code":"AL-09","name":"Dib\u00ebr"},"514":{"code":"AL-02","name":"Durr\u00ebs"},"515":{"code":"AL-03","name":"Elbasan"},"516":{"code":"AL-04","name":"Fier"},"517":{"code":"AL-05","name":"Gjirokast\u00ebr"},"518":{"code":"AL-06","name":"Kor\u00e7\u00eb"},"519":{"code":"AL-07","name":"Kuk\u00ebs"},"520":{"code":"AL-08","name":"Lezh\u00eb"},"521":{"code":"AL-10","name":"Shkod\u00ebr"},"522":{"code":"AL-11","name":"Tiran\u00eb"},"523":{"code":"AL-12","name":"Vlor\u00eb"}}},"AM":{"name":"Armenia"},"AO":{"name":"Angola"},"AQ":{"name":"Antarctica"},"AR":{"name":"Argentina","regions":{"525":{"code":"AR-B","name":"Buenos Aires"},"526":{"code":"AR-K","name":"Catamarca"},"527":{"code":"AR-H","name":"Chaco"},"528":{"code":"AR-U","name":"Chubut"},"524":{"code":"AR-C","name":"Ciudad Aut\u00f3noma de Buenos Aires"},"529":{"code":"AR-X","name":"C\u00f3rdoba"},"530":{"code":"AR-W","name":"Corrientes"},"531":{"code":"AR-E","name":"Entre R\u00edos"},"532":{"code":"AR-P","name":"Formosa"},"533":{"code":"AR-Y","name":"Jujuy"},"534":{"code":"AR-L","name":"La Pampa"},"535":{"code":"AR-F","name":"La Rioja"},"536":{"code":"AR-M","name":"Mendoza"},"537":{"code":"AR-N","name":"Misiones"},"538":{"code":"AR-Q","name":"Neuqu\u00e9n"},"539":{"code":"AR-R","name":"R\u00edo Negro"},"540":{"code":"AR-A","name":"Salta"},"541":{"code":"AR-J","name":"San Juan"},"542":{"code":"AR-D","name":"San Luis"},"543":{"code":"AR-Z","name":"Santa Cruz"},"544":{"code":"AR-S","name":"Santa Fe"},"545":{"code":"AR-G","name":"Santiago del Estero"},"546":{"code":"AR-V","name":"Tierra del Fuego"},"547":{"code":"AR-T","name":"Tucum\u00e1n"}}},"AS":{"name":"American Samoa"},"AT":{"name":"Austria","regions":{"102":{"code":"BL","name":"Burgenland"},"99":{"code":"KN","name":"K\u00e4rnten"},"96":{"code":"NO","name":"Nieder\u00f6sterreich"},"97":{"code":"OO","name":"Ober\u00f6sterreich"},"98":{"code":"SB","name":"Salzburg"},"100":{"code":"ST","name":"Steiermark"},"101":{"code":"TI","name":"Tirol"},"103":{"code":"VB","name":"Vorarlberg"},"95":{"code":"WI","name":"Wien"}}},"AU":{"name":"Australia","regions":{"605":{"code":"ACT","name":"Australian Capital Territory"},"606":{"code":"NSW","name":"New South Wales"},"612":{"code":"NT","name":"Northern Territory"},"608":{"code":"QLD","name":"Queensland"},"609":{"code":"SA","name":"South Australia"},"610":{"code":"TAS","name":"Tasmania"},"607":{"code":"VIC","name":"Victoria"},"611":{"code":"WA","name":"Western Australia"}}},"AW":{"name":"Aruba"},"AX":{"name":"\u00c5land Islands"},"AZ":{"name":"Azerbaijan"},"BA":{"name":"Bosnia & Herzegovina"},"BB":{"name":"Barbados"},"BD":{"name":"Bangladesh"},"BE":{"name":"Belgium","regions":{"620":{"code":"VAN","name":"Antwerpen"},"621":{"code":"WBR","name":"Brabant wallon"},"622":{"code":"BRU","name":"Brussels-Capital Region"},"623":{"code":"WHT","name":"Hainaut"},"625":{"code":"WLG","name":"Li\u00e8ge"},"624":{"code":"VLI","name":"Limburg"},"626":{"code":"WLX","name":"Luxembourg"},"627":{"code":"WNA","name":"Namur"},"628":{"code":"VOV","name":"Oost-Vlaanderen"},"629":{"code":"VBR","name":"Vlaams-Brabant"},"630":{"code":"VWV","name":"West-Vlaanderen"}}},"BF":{"name":"Burkina Faso"},"BG":{"name":"Bulgaria","regions":{"640":{"code":"BG-01","name":"Blagoevgrad"},"641":{"code":"BG-02","name":"Burgas"},"647":{"code":"BG-08","name":"Dobrich"},"646":{"code":"BG-07","name":"Gabrovo"},"665":{"code":"BG-26","name":"Haskovo"},"648":{"code":"BG-09","name":"Kardzhali"},"649":{"code":"BG-10","name":"Kyustendil"},"650":{"code":"BG-11","name":"Lovech"},"651":{"code":"BG-12","name":"Montana"},"652":{"code":"BG-13","name":"Pazardzhik"},"653":{"code":"BG-14","name":"Pernik"},"654":{"code":"BG-15","name":"Pleven"},"655":{"code":"BG-16","name":"Plovdiv"},"656":{"code":"BG-17","name":"Razgrad"},"657":{"code":"BG-18","name":"Ruse"},"666":{"code":"BG-27","name":"Shumen"},"658":{"code":"BG-19","name":"Silistra"},"659":{"code":"BG-20","name":"Sliven"},"660":{"code":"BG-21","name":"Smolyan"},"661":{"code":"BG-22","name":"Sofia City"},"662":{"code":"BG-23","name":"Sofia Province"},"663":{"code":"BG-24","name":"Stara Zagora"},"664":{"code":"BG-25","name":"Targovishte"},"642":{"code":"BG-03","name":"Varna"},"643":{"code":"BG-04","name":"Veliko Tarnovo"},"644":{"code":"BG-05","name":"Vidin"},"645":{"code":"BG-06","name":"Vratsa"},"667":{"code":"BG-28","name":"Yambol"}}},"BH":{"name":"Bahrain"},"BJ":{"name":"Benin"},"BL":{"name":"St. Barth\u00e9lemy"},"BM":{"name":"Bermuda"},"BN":{"name":"Brunei"}
9533,"BO":{"name":"Bolivia","regions":{"632":{"code":"BO-H","name":"Chuquisaca"},"631":{"code":"BO-C","name":"Cochabamba"},"633":{"code":"BO-B","name":"El Beni"},"634":{"code":"BO-L","name":"La Paz"},"635":{"code":"BO-O","name":"Oruro"},"636":{"code":"BO-N","name":"Pando"},"637":{"code":"BO-P","name":"Potos\u00ed"},"638":{"code":"BO-S","name":"Santa Cruz"},"639":{"code":"BO-T","name":"Tarija"}}},"BQ":{"name":"Caribbean Netherlands"},"BR":{"name":"Brazil","regions":{"485":{"code":"AC","name":"Acre"},"486":{"code":"AL","name":"Alagoas"},"487":{"code":"AP","name":"Amap\u00e1"},"488":{"code":"AM","name":"Amazonas"},"489":{"code":"BA","name":"Bahia"},"490":{"code":"CE","name":"Cear\u00e1"},"511":{"code":"DF","name":"Distrito Federal"},"491":{"code":"ES","name":"Esp\u00edrito Santo"},"492":{"code":"GO","name":"Goi\u00e1s"},"493":{"code":"MA","name":"Maranh\u00e3o"},"494":{"code":"MT","name":"Mato Grosso"},"495":{"code":"MS","name":"Mato Grosso do Sul"},"496":{"code":"MG","name":"Minas Gerais"},"497":{"code":"PA","name":"Par\u00e1"},"498":{"code":"PB","name":"Para\u00edba"},"499":{"code":"PR","name":"Paran\u00e1"},"500":{"code":"PE","name":"Pernambuco"},"501":{"code":"PI","name":"Piau\u00ed"},"502":{"code":"RJ","name":"Rio de Janeiro"},"503":{"code":"RN","name":"Rio Grande do Norte"},"504":{"code":"RS","name":"Rio Grande do Sul"},"505":{"code":"RO","name":"Rond\u00f4nia"},"506":{"code":"RR","name":"Roraima"},"507":{"code":"SC","name":"Santa Catarina"},"508":{"code":"SP","name":"S\u00e3o Paulo"},"509":{"code":"SE","name":"Sergipe"},"510":{"code":"TO","name":"Tocantins"}}},"BS":{"name":"Bahamas"},"BT":{"name":"Bhutan"},"BV":{"name":"Bouvet Island"},"BW":{"name":"Botswana"},"BZ":{"name":"Belize"},"CA":{"name":"Canada","regions":{"66":{"code":"AB","name":"Alberta"},"67":{"code":"BC","name":"British Columbia"},"68":{"code":"MB","name":"Manitoba"},"70":{"code":"NB","name":"New Brunswick"},"69":{"code":"NL","name":"Newfoundland and Labrador"},"72":{"code":"NT","name":"Northwest Territories"},"71":{"code":"NS","name":"Nova Scotia"},"73":{"code":"NU","name":"Nunavut"},"74":{"code":"ON","name":"Ontario"},"75":{"code":"PE","name":"Prince Edward Island"},"76":{"code":"QC","name":"Quebec"},"77":{"code":"SK","name":"Saskatchewan"},"78":{"code":"YT","name":"Yukon Territory"}}},"CC":{"name":"Cocos (Keeling) Islands"},"CG":{"name":"Congo - Brazzaville"},"CH":{"name":"Switzerland","regions":{"104":{"code":"AG","name":"Aargau"},"106":{"code":"AR","name":"Appenzell Ausserrhoden"},"105":{"code":"AI","name":"Appenzell Innerrhoden"},"108":{"code":"BL","name":"Basel-Landschaft"},"109":{"code":"BS","name":"Basel-Stadt"},"107":{"code":"BE","name":"Bern"},"110":{"code":"FR","name":"Friburg"},"111":{"code":"GE","name":"Geneva"},"112":{"code":"GL","name":"Glarus"},"113":{"code":"GR","name":"Graub\u00fcnden"},"114":{"code":"JU","name":"Jura"},"115":{"code":"LU","name":"Lucerne"},"116":{"code":"NE","name":"Neuch\u00e2tel"},"117":{"code":"NW","name":"Nidwalden"},"118":{"code":"OW","name":"Obwalden"},"120":{"code":"SH","name":"Schaffhausen"},"122":{"code":"SZ","name":"Schwyz"},"121":{"code":"SO","name":"Solothurn"},"119":{"code":"SG","name":"St. Gallen"},"123":{"code":"TG","name":"Thurgau"},"124":{"code":"TI","name":"Ticino"},"125":{"code":"UR","name":"Uri"},"126":{"code":"VD","name":"Vaud"},"127":{"code":"VS","name":"Wallis"},"128":{"code":"ZG","name":"Zug"},"129":{"code":"ZH","name":"Z\u00fcrich"}}},"CI":{"name":"C\u00f4te d\u2019Ivoire"},"CK":{"name":"Cook Islands"},"CL":{"name":"Chile","regions":{"668":{"code":"CL-AI","name":"Ais\u00e9n del General Carlos Iba\u00f1ez del Campo"},"669":{"code":"CL-AN","name":"Antofagasta"},"670":{"code":"CL-AP","name":"Arica y Parinacota"},"672":{"code":"CL-AT","name":"Atacama"},"673":{"code":"CL-BI","name":"Biob\u00edo"},"674":{"code":"CL-CO","name":"Coquimbo"},"671":{"code":"CL-AR","name":"La Araucan\u00eda"},"675":{"code":"CL-LI","name":"Libertador General Bernardo O'Higgins"},"676":{"code":"CL-LL","name":"Los Lagos"},"677":{"code":"CL-LR","name":"Los R\u00edos"},"678":{"code":"CL-MA","name":"Magallanes"},"679":{"code":"CL-ML","name":"Maule"},"680":{"code":"CL-NB","name":"\u00d1uble"},"681":{"code":"CL-RM","name":"Regi\u00f3n Metropolitana de Santiago"},"682":{"code":"CL-TA","name":"Tarapac\u00e1"}
9533,"683":{"code":"CL-VS","name":"Valpara\u00edso"}}},"CM":{"name":"Cameroon"},"CN":{"name":"China","regions":{"684":{"code":"CN-AH","name":"Anhui Sheng"},"685":{"code":"CN-BJ","name":"Beijing Shi"},"686":{"code":"CN-CQ","name":"Chongqing Shi"},"687":{"code":"CN-FJ","name":"Fujian Sheng"},"688":{"code":"CN-GS","name":"Gansu Sheng"},"689":{"code":"CN-GD","name":"Guangdong Sheng"},"690":{"code":"CN-GX","name":"Guangxi Zhuangzu Zizhiqu"},"691":{"code":"CN-GZ","name":"Guizhou Sheng"},"692":{"code":"CN-HI","name":"Hainan Sheng"},"693":{"code":"CN-HE","name":"Hebei Sheng"},"694":{"code":"CN-HL","name":"Heilongjiang Sheng"},"695":{"code":"CN-HA","name":"Henan Sheng"},"696":{"code":"CN-HK","name":"Hong Kong SAR"},"697":{"code":"CN-HB","name":"Hubei Sheng"},"698":{"code":"CN-HN","name":"Hunan Sheng"},"699":{"code":"CN-JS","name":"Jiangsu Sheng"},"700":{"code":"CN-JX","name":"Jiangxi Sheng"},"701":{"code":"CN-JL","name":"Jilin Sheng"},"702":{"code":"CN-LN","name":"Liaoning Sheng"},"703":{"code":"CN-MO","name":"Macao SAR"},"704":{"code":"CN-NM","name":"Nei Mongol Zizhiqu"},"705":{"code":"CN-NX","name":"Ningxia Huizi Zizhiqu"},"706":{"code":"CN-QH","name":"Qinghai Sheng"},"707":{"code":"CN-SN","name":"Shaanxi Sheng"},"708":{"code":"CN-SD","name":"Shandong Sheng"},"709":{"code":"CN-SH","name":"Shanghai Shi"},"710":{"code":"CN-SX","name":"Shanxi Sheng"},"711":{"code":"CN-SC","name":"Sichuan Sheng"},"712":{"code":"CN-TW","name":"Taiwan Sheng"},"713":{"code":"CN-TJ","name":"Tianjin Shi"},"714":{"code":"CN-XJ","name":"Xinjiang Uygur Zizhiqu"},"715":{"code":"CN-XZ","name":"Xizang Zizhiqu"},"716":{"code":"CN-YN","name":"Yunnan Sheng"},"717":{"code":"CN-ZJ","name":"Zhejiang Sheng"}}},"CO":{"name":"Colombia","regions":{"718":{"code":"CO-AMA","name":"Amazonas"},"719":{"code":"CO-ANT","name":"Antioquia"},"720":{"code":"CO-ARA","name":"Arauca"},"721":{"code":"CO-ATL","name":"Atl\u00e1ntico"},"722":{"code":"CO-BOL","name":"Bol\u00edvar"},"723":{"code":"CO-BOY","name":"Boyac\u00e1"},"724":{"code":"CO-CAL","name":"Caldas"},"725":{"code":"CO-CAQ","name":"Caquet\u00e1"},"726":{"code":"CO-CAS","name":"Casanare"},"727":{"code":"CO-CAU","name":"Cauca"},"728":{"code":"CO-CES","name":"Cesar"},"729":{"code":"CO-CHO","name":"Choc\u00f3"},"730":{"code":"CO-COR","name":"C\u00f3rdoba"},"731":{"code":"CO-CUN","name":"Cundinamarca"},"732":{"code":"CO-GUA","name":"Guain\u00eda"},"733":{"code":"CO-GUV","name":"Guaviare"},"734":{"code":"CO-HUL","name":"Huila"},"735":{"code":"CO-LAG","name":"La Guajira"},"736":{"code":"CO-MAG","name":"Magdalena"},"737":{"code":"CO-MET","name":"Meta"},"738":{"code":"CO-NAR","name":"Nari\u00f1o"},"739":{"code":"CO-NSA","name":"Norte de Santander"},"740":{"code":"CO-PUT","name":"Putumayo"},"741":{"code":"CO-QUI","name":"Quind\u00edo"},"742":{"code":"CO-RIS","name":"Risaralda"},"743":{"code":"CO-SAP","name":"San Andr\u00e9s y Providencia"},"744":{"code":"CO-SAN","name":"Santander"},"745":{"code":"CO-SUC","name":"Sucre"},"746":{"code":"CO-TOL","name":"Tolima"},"747":{"code":"CO-VAC","name":"Valle del Cauca"},"748":{"code":"CO-VAU","name":"Vaup\u00e9s"},"749":{"code":"CO-VID","name":"Vichada"}}},"CR":{"name":"Costa Rica","regions":{"751":{"code":"CR-AL","name":"Alajuela"},"752":{"code":"CR-CA","name":"Cartago"},"754":{"code":"CR-GU","name":"Guanacaste"},"753":{"code":"CR-HE","name":"Heredia"},"756":{"code":"CR-LI","name":"Lim\u00f3n"},"755":{"code":"CR-PU","name":"Puntarenas"},"750":{"code":"CR-SJ","name":"San Jos\u00e9"}}},"CV":{"name":"Cape Verde"},"CW":{"name":"Cura\u00e7ao"},"CX":{"name":"Christmas Island"},"CY":{"name":"Cyprus"},"CZ":{"name":"Czechia","regions":{"759":{"code":"CZ-31","name":"Jiho\u010desk\u00fd kraj"},"767":{"code":"CZ-64","name":"Jihomoravsk\u00fd kraj"},"761":{"code":"CZ-41","name":"Karlovarsk\u00fd kraj"},"766":{"code":"CZ-63","name":"Kraj Vyso\u010dina"},"764":{"code":"CZ-52","name":"Kr\u00e1lov\u00e9hradeck\u00fd kraj"},"763":{"code":"CZ-51","name":"Libereck\u00fd kraj"},"770":{"code":"CZ-80","name":"Moravskoslezsk\u00fd kraj"},"768":{"code":"CZ-71","name":"Olomouck\u00fd kraj"},"765":{"code":"CZ-53","name":"Pardubick\u00fd kraj"},"760":{"code":"CZ-32","name":"Plze\u0148sk\u00fd kraj"},"757":{"code":"CZ-10","name":"Praha, Hlavn\u00ed m\u011bsto"},"758":{"code":"CZ-20","name":"St\u0159edo\u010desk\u00fd kraj"},"762":{"code":"CZ-42","name":"\u00dasteck\u00fd kraj"},"769":{"code":"CZ-72","name":"Zl\u00ednsk\u00fd kraj"}}},"DE":{"name":"Germany","regions":{"80":{"code":"BAW","name":"Baden-W\u00fcrttemberg"},"81":{"code":"BAY","name":"Bayern"},"82":{"code":"BER","name":"Berlin"},"83":{"code":"BRG","name":"Brandenburg"},"84":{"code":"BRE","name":"Bremen"},"85":{"code":"HAM","name":"Hamburg"},"86":{"code":"HES","name":"Hessen"},"87":{"code":"MEC","name":"Mecklenburg-Vorpommern"},"79":{"code":"NDS","name":"Niedersachsen"},"88":{"code":"NRW","name":"Nordrhein-Westfalen"},"89":{"code":"RHE","name":"Rheinland-Pfalz"},"90":{"code":"SAR","name":"Saarland"},"91":{"code":"SAS","name":"Sachsen"},"92":{"code":"SAC","name":"Sachsen-Anhalt"},"93":{"code":"SCN","name":"Schleswig-Holstein"},"94":{"code":"THE","name":"Th\u00fcringen"}}},"DJ":{"name":"Djibouti"},"DK":{"name":"Denmark","regions":{"771":{"code":"DK-84","name":"Hovedstaden"},"772":{"code":"DK-82","name":"Midtjylland"},"773":{"code":"DK-81","name":"Nordjylland"},"774":{"code":"DK-85","name":"Sj\u00e6lland"},"775":{"code":"DK-83","name":"Syddanmark"}}},"DM":{"name":"Dominica"}
9533,"DO":{"name":"Dominican Republic"},"DZ":{"name":"Algeria"},"EC":{"name":"Ecuador","regions":{"776":{"code":"EC-A","name":"Azuay"},"777":{"code":"EC-B","name":"Bol\u00edvar"},"778":{"code":"EC-F","name":"Ca\u00f1ar"},"779":{"code":"EC-C","name":"Carchi"},"780":{"code":"EC-H","name":"Chimborazo"},"781":{"code":"EC-X","name":"Cotopaxi"},"782":{"code":"EC-O","name":"El Oro"},"783":{"code":"EC-E","name":"Esmeraldas"},"784":{"code":"EC-W","name":"Gal\u00e1pagos"},"785":{"code":"EC-G","name":"Guayas"},"786":{"code":"EC-I","name":"Imbabura"},"787":{"code":"EC-L","name":"Loja"},"788":{"code":"EC-R","name":"Los R\u00edos"},"789":{"code":"EC-M","name":"Manab\u00ed"},"790":{"code":"EC-S","name":"Morona Santiago"},"791":{"code":"EC-N","name":"Napo"},"792":{"code":"EC-D","name":"Orellana"},"793":{"code":"EC-Y","name":"Pastaza"},"794":{"code":"EC-P","name":"Pichincha"},"795":{"code":"EC-SE","name":"Santa Elena"},"796":{"code":"EC-SD","name":"Santo Domingo de los Ts\u00e1chilas"},"797":{"code":"EC-U","name":"Sucumb\u00edos"},"798":{"code":"EC-T","name":"Tungurahua"},"799":{"code":"EC-Z","name":"Zamora Chinchipe"}}},"EE":{"name":"Estonia","regions":{"340":{"code":"EE-37","name":"Harjumaa"},"341":{"code":"EE-39","name":"Hiiumaa"},"342":{"code":"EE-44","name":"Ida-Virumaa"},"344":{"code":"EE-51","name":"J\u00e4rvamaa"},"343":{"code":"EE-49","name":"J\u00f5gevamaa"},"346":{"code":"EE-59","name":"L\u00e4\u00e4ne-Virumaa"},"345":{"code":"EE-57","name":"L\u00e4\u00e4nemaa"},"348":{"code":"EE-67","name":"P\u00e4rnumaa"},"347":{"code":"EE-65","name":"P\u00f5lvamaa"},"349":{"code":"EE-70","name":"Raplamaa"},"350":{"code":"EE-74","name":"Saaremaa"},"351":{"code":"EE-78","name":"Tartumaa"},"352":{"code":"EE-82","name":"Valgamaa"},"353":{"code":"EE-84","name":"Viljandimaa"},"354":{"code":"EE-86","name":"V\u00f5rumaa"}}},"EG":{"name":"Egypt"},"EH":{"name":"Western Sahara"},"ER":{"name":"Eritrea"},"ES":{"name":"Spain","regions":{"130":{"code":"A Coru\u0441a","name":"A Coru\u00f1a"},"131":{"code":"Alava","name":"Alava"},"132":{"code":"Albacete","name":"Albacete"},"133":{"code":"Alicante","name":"Alicante"},"134":{"code":"Almeria","name":"Almeria"},"135":{"code":"Asturias","name":"Asturias"},"136":{"code":"Avila","name":"Avila"},"137":{"code":"Badajoz","name":"Badajoz"},"138":{"code":"Baleares","name":"Baleares"},"139":{"code":"Barcelona","name":"Barcelona"},"140":{"code":"Burgos","name":"Burgos"},"141":{"code":"Caceres","name":"Caceres"},"142":{"code":"Cadiz","name":"Cadiz"},"143":{"code":"Cantabria","name":"Cantabria"},"144":{"code":"Castellon","name":"Castellon"},"145":{"code":"Ceuta","name":"Ceuta"},"146":{"code":"Ciudad Real","name":"Ciudad Real"},"147":{"code":"Cordoba","name":"Cordoba"},"148":{"code":"Cuenca","name":"Cuenca"},"149":{"code":"Girona","name":"Girona"},"150":{"code":"Granada","name":"Granada"},"151":{"code":"Guadalajara","name":"Guadalajara"},"152":{"code":"Guipuzcoa","name":"Guipuzcoa"},"153":{"code":"Huelva","name":"Huelva"},"154":{"code":"Huesca","name":"Huesca"},"155":{"code":"Jaen","name":"Jaen"},"156":{"code":"La Rioja","name":"La Rioja"},"157":{"code":"Las Palmas","name":"Las Palmas"},"158":{"code":"Leon","name":"Leon"},"159":{"code":"Lleida","name":"Lleida"},"160":{"code":"Lugo","name":"Lugo"},"161":{"code":"Madrid","name":"Madrid"},"162":{"code":"Malaga","name":"Malaga"},"163":{"code":"Melilla","name":"Melilla"},"164":{"code":"Murcia","name":"Murcia"},"165":{"code":"Navarra","name":"Navarra"},"166":{"code":"Ourense","name":"Ourense"},"167":{"code":"Palencia","name":"Palencia"},"168":{"code":"Pontevedra","name":"Pontevedra"},"169":{"code":"Salamanca","name":"Salamanca"},"170":{"code":"Santa Cruz de Tenerife","name":"Santa Cruz de Tenerife"},"171":{"code":"Segovia","name":"Segovia"},"172":{"code":"Sevilla","name":"Sevilla"},"173":{"code":"Soria","name":"Soria"},"174":{"code":"Tarragona","name":"Tarragona"},"175":{"code":"Teruel","name":"Teruel"},"176":{"code":"Toledo","name":"Toledo"},"177":{"code":"Valencia","name":"Valencia"},"178":{"code":"Valladolid","name":"Valladolid"},"179":{"code":"Vizcaya","name":"Vizcaya"},"180":{"code":"Zamora","name":"Zamora"},"181":{"code":"Zaragoza","name":"Zaragoza"}}},"ET":{"name":"Ethiopia"},"FI":{"name":"Finland","regions":{"339":{"code":"Ahvenanmaa","name":"Ahvenanmaa"},"333":{"code":"Etel\u00e4-Karjala","name":"Etel\u00e4-Karjala"},"326":{"code":"Etel\u00e4-Pohjanmaa","name":"Etel\u00e4-Pohjanmaa"},"325":{"code":"Etel\u00e4-Savo","name":"Etel\u00e4-Savo"},"337":{"code":"It\u00e4-Uusimaa","name":"It\u00e4-Uusimaa"},"322":{"code":"Kainuu","name":"Kainuu"},"335":{"code":"Kanta-H\u00e4me","name":"Kanta-H\u00e4me"},"330":{"code":"Keski-Pohjanmaa","name":"Keski-Pohjanmaa"},"331":{"code":"Keski-Suomi","name":"Keski-Suomi"},"338":{"code":"Kymenlaakso","name":"Kymenlaakso"},"320":{"code":"Lappi","name":"Lappi"},"334":{"code":"P\u00e4ij\u00e4t-H\u00e4me","name":"P\u00e4ij\u00e4t-H\u00e4me"},"328":{"code":"Pirkanmaa","name":"Pirkanmaa"},"327":{"code":"Pohjanmaa","name":"Pohjanmaa"},"323":{"code":"Pohjois-Karjala","name":"Pohjois-Karjala"},"321":{"code":"Pohjois-Pohjanmaa","name":"Pohjois-Pohjanmaa"},"324":{"code":"Pohjois-Savo","name":"Pohjois-Savo"},"329":{"code":"Satakunta","name":"Satakunta"},"336":{"code":"Uusimaa","name":"Uusimaa"},"332":{"code":"Varsinais-Suomi","name":"Varsinais-Suomi"}}},"FJ":{"name":"Fiji"},"FK":{"name":"Falkland Islands"},"FM":{"name":"Micronesia"},"FO":{"name":"Faroe Islands"},"FR":{"name":"France","regions":{"182":{"code":"1","name":"Ain"},"183":{"code":"2","name":"Aisne"},"184":{"code":"3","name":"Allier"}
9533,"185":{"code":"4","name":"Alpes-de-Haute-Provence"},"187":{"code":"6","name":"Alpes-Maritimes"},"188":{"code":"7","name":"Ard\u00e8che"},"189":{"code":"8","name":"Ardennes"},"190":{"code":"9","name":"Ari\u00e8ge"},"191":{"code":"10","name":"Aube"},"192":{"code":"11","name":"Aude"},"193":{"code":"12","name":"Aveyron"},"249":{"code":"67","name":"Bas-Rhin"},"194":{"code":"13","name":"Bouches-du-Rh\u00f4ne"},"195":{"code":"14","name":"Calvados"},"196":{"code":"15","name":"Cantal"},"197":{"code":"16","name":"Charente"},"198":{"code":"17","name":"Charente-Maritime"},"199":{"code":"18","name":"Cher"},"200":{"code":"19","name":"Corr\u00e8ze"},"201":{"code":"2A","name":"Corse-du-Sud"},"203":{"code":"21","name":"C\u00f4te-d'Or"},"204":{"code":"22","name":"C\u00f4tes-d'Armor"},"205":{"code":"23","name":"Creuse"},"261":{"code":"79","name":"Deux-S\u00e8vres"},"206":{"code":"24","name":"Dordogne"},"207":{"code":"25","name":"Doubs"},"208":{"code":"26","name":"Dr\u00f4me"},"273":{"code":"91","name":"Essonne"},"209":{"code":"27","name":"Eure"},"210":{"code":"28","name":"Eure-et-Loir"},"211":{"code":"29","name":"Finist\u00e8re"},"212":{"code":"30","name":"Gard"},"214":{"code":"32","name":"Gers"},"215":{"code":"33","name":"Gironde"},"250":{"code":"68","name":"Haut-Rhin"},"202":{"code":"2B","name":"Haute-Corse"},"213":{"code":"31","name":"Haute-Garonne"},"225":{"code":"43","name":"Haute-Loire"},"234":{"code":"52","name":"Haute-Marne"},"252":{"code":"70","name":"Haute-Sa\u00f4ne"},"256":{"code":"74","name":"Haute-Savoie"},"269":{"code":"87","name":"Haute-Vienne"},"186":{"code":"5","name":"Hautes-Alpes"},"247":{"code":"65","name":"Hautes-Pyr\u00e9n\u00e9es"},"274":{"code":"92","name":"Hauts-de-Seine"},"216":{"code":"34","name":"H\u00e9rault"},"217":{"code":"35","name":"Ille-et-Vilaine"},"218":{"code":"36","name":"Indre"},"219":{"code":"37","name":"Indre-et-Loire"},"220":{"code":"38","name":"Is\u00e8re"},"221":{"code":"39","name":"Jura"},"222":{"code":"40","name":"Landes"},"223":{"code":"41","name":"Loir-et-Cher"},"224":{"code":"42","name":"Loire"},"226":{"code":"44","name":"Loire-Atlantique"},"227":{"code":"45","name":"Loiret"},"228":{"code":"46","name":"Lot"},"229":{"code":"47","name":"Lot-et-Garonne"},"230":{"code":"48","name":"Loz\u00e8re"},"231":{"code":"49","name":"Maine-et-Loire"},"232":{"code":"50","name":"Manche"},"233":{"code":"51","name":"Marne"},"235":{"code":"53","name":"Mayenne"},"236":{"code":"54","name":"Meurthe-et-Moselle"},"237":{"code":"55","name":"Meuse"},"238":{"code":"56","name":"Morbihan"},"239":{"code":"57","name":"Moselle"},"240":{"code":"58","name":"Ni\u00e8vre"},"241":{"code":"59","name":"Nord"},"242":{"code":"60","name":"Oise"},"243":{"code":"61","name":"Orne"},"257":{"code":"75","name":"Paris"},"244":{"code":"62","name":"Pas-de-Calais"},"245":{"code":"63","name":"Puy-de-D\u00f4me"},"246":{"code":"64","name":"Pyr\u00e9n\u00e9es-Atlantiques"},"248":{"code":"66","name":"Pyr\u00e9n\u00e9es-Orientales"},"251":{"code":"69","name":"Rh\u00f4ne"},"253":{"code":"71","name":"Sa\u00f4ne-et-Loire"},"254":{"code":"72","name":"Sarthe"},"255":{"code":"73","name":"Savoie"},"259":{"code":"77","name":"Seine-et-Marne"},"258":{"code":"76","name":"Seine-Maritime"},"275":{"code":"93","name":"Seine-Saint-Denis"},"262":{"code":"80","name":"Somme"},"263":{"code":"81","name":"Tarn"},"264":{"code":"82","name":"Tarn-et-Garonne"},"272":{"code":"90","name":"Territoire-de-Belfort"},"277":{"code":"95","name":"Val-d'Oise"},"276":{"code":"94","name":"Val-de-Marne"},"265":{"code":"83","name":"Var"},"266":{"code":"84","name":"Vaucluse"},"267":{"code":"85","name":"Vend\u00e9e"},"268":{"code":"86","name":"Vienne"},"270":{"code":"88","name":"Vosges"},"271":{"code":"89","name":"Yonne"},"260":{"code":"78","name":"Yvelines"}}},"GA":{"name":"Gabon"},"GB":{"name":"United Kingdom"},"GD":{"name":"Grenada"},"GE":{"name":"Georgia"},"GF":{"name":"French Guiana"},"GG":{"name":"Guernsey"},"GH":{"name":"Ghana"},"GI":{"name":"Gibraltar"},"GL":{"name":"Greenland"},"GM":{"name":"Gambia"},"GN":{"name":"Guinea"},"GP":{"name":"Guadeloupe"},"GQ":{"name":"Equatorial Guinea"},"GR":{"name":"Greece","regions":{"813":{"code":"GR-69","name":"\u00c1gion \u00d3ros"},"800":{"code":"GR-A","name":"Anatolik\u00ed Makedon\u00eda kai Thr\u00e1ki"},"801":{"code":"GR-I","name":"Attik\u00ed"},"802":{"code":"GR-G","name":"Dytik\u00ed Ell\u00e1da"},"803":{"code":"GR-C","name":"Dytik\u00ed Makedon\u00eda"},"804":{"code":"GR-F","name":"Ion\u00eda N\u00edsia"},"805":{"code":"GR-D","name":"\u00cdpeiros"},"806":{"code":"GR-B","name":"Kentrik\u00ed Makedon\u00eda"},"807":{"code":"GR-M","name":"Kr\u00edti"},"808":{"code":"GR-L","name":"N\u00f3tio Aiga\u00edo"},"809":{"code":"GR-J","name":"Pelop\u00f3nnisos"},"810":{"code":"GR-H","name":"Stere\u00e1 Ell\u00e1da"}
9533,"811":{"code":"GR-E","name":"Thessal\u00eda"},"812":{"code":"GR-K","name":"V\u00f3reio Aiga\u00edo"}}},"GS":{"name":"South Georgia & South Sandwich Islands"},"GT":{"name":"Guatemala"},"GU":{"name":"Guam"},"GW":{"name":"Guinea-Bissau"},"GY":{"name":"Guyana","regions":{"814":{"code":"GY-BA","name":"Barima-Waini"},"815":{"code":"GY-CU","name":"Cuyuni-Mazaruni"},"816":{"code":"GY-DE","name":"Demerara-Mahaica"},"817":{"code":"GY-EB","name":"East Berbice-Corentyne"},"818":{"code":"GY-ES","name":"Essequibo Islands-West Demerara"},"819":{"code":"GY-MA","name":"Mahaica-Berbice"},"820":{"code":"GY-PM","name":"Pomeroon-Supenaam"},"821":{"code":"GY-PT","name":"Potaro-Siparuni"},"822":{"code":"GY-UD","name":"Upper Demerara-Berbice"},"823":{"code":"GY-UT","name":"Upper Takutu-Upper Essequibo"}}},"HK":{"name":"Hong Kong SAR China"},"HM":{"name":"Heard & McDonald Islands"},"HN":{"name":"Honduras"},"HR":{"name":"Croatia","regions":{"554":{"code":"HR-07","name":"Bjelovarsko-bilogorska \u017eupanija"},"559":{"code":"HR-12","name":"Brodsko-posavska \u017eupanija"},"566":{"code":"HR-19","name":"Dubrova\u010dko-neretvanska \u017eupanija"},"568":{"code":"HR-21","name":"Grad Zagreb"},"565":{"code":"HR-18","name":"Istarska \u017eupanija"},"551":{"code":"HR-04","name":"Karlova\u010dka \u017eupanija"},"553":{"code":"HR-06","name":"Koprivni\u010dko-kri\u017eeva\u010dka \u017eupanija"},"549":{"code":"HR-02","name":"Krapinsko-zagorska \u017eupanija"},"556":{"code":"HR-09","name":"Li\u010dko-senjska \u017eupanija"},"567":{"code":"HR-20","name":"Me\u0111imurska \u017eupanija"},"561":{"code":"HR-14","name":"Osje\u010dko-baranjska \u017eupanija"},"558":{"code":"HR-11","name":"Po\u017ee\u0161ko-slavonska \u017eupanija"},"555":{"code":"HR-08","name":"Primorsko-goranska \u017eupanija"},"562":{"code":"HR-15","name":"\u0160ibensko-kninska \u017eupanija"},"550":{"code":"HR-03","name":"Sisa\u010dko-moslava\u010dka \u017eupanija"},"564":{"code":"HR-17","name":"Splitsko-dalmatinska \u017eupanija"},"552":{"code":"HR-05","name":"Vara\u017edinska \u017eupanija"},"557":{"code":"HR-10","name":"Viroviti\u010dko-podravska \u017eupanija"},"563":{"code":"HR-16","name":"Vukovarsko-srijemska \u017eupanija"},"560":{"code":"HR-13","name":"Zadarska \u017eupanija"},"548":{"code":"HR-01","name":"Zagreba\u010dka \u017eupanija"}}},"HT":{"name":"Haiti"},"HU":{"name":"Hungary"},"ID":{"name":"Indonesia"},"IE":{"name":"Ireland"},"IL":{"name":"Israel"},"IM":{"name":"Isle of Man"},"IO":{"name":"British Indian Ocean Territory"},"IS":{"name":"Iceland","regions":{"830":{"code":"IS-07","name":"Austurland"},"824":{"code":"IS-01","name":"H\u00f6fu\u00f0borgarsv\u00e6\u00f0i"},"829":{"code":"IS-06","name":"Nor\u00f0urland eystra"},"828":{"code":"IS-05","name":"Nor\u00f0urland vestra"},"831":{"code":"IS-08","name":"Su\u00f0urland"},"825":{"code":"IS-02","name":"Su\u00f0urnes"},"827":{"code":"IS-04","name":"Vestfir\u00f0ir"},"826":{"code":"IS-03","name":"Vesturland"}}},"IT":{"name":"Italy","regions":{"832":{"code":"AG","name":"Agrigento"},"833":{"code":"AL","name":"Alessandria"},"834":{"code":"AN","name":"Ancona"},"835":{"code":"AO","name":"Aosta"},"837":{"code":"AR","name":"Arezzo"},"838":{"code":"AP","name":"Ascoli-Piceno"},"839":{"code":"AT","name":"Asti"},"840":{"code":"AV","name":"Avellino"},"841":{"code":"BA","name":"Bari"},"842":{"code":"BT","name":"Barletta-Andria-Trani"},"843":{"code":"BL","name":"Belluno"},"844":{"code":"BN","name":"Benevento"},"845":{"code":"BG","name":"Bergamo"},"846":{"code":"BI","name":"Biella"},"847":{"code":"BO","name":"Bologna"},"848":{"code":"BZ","name":"Bolzano"},"849":{"code":"BS","name":"Brescia"},"850":{"code":"BR","name":"Brindisi"},"851":{"code":"CA","name":"Cagliari"},"852":{"code":"CL","name":"Caltanissetta"},"853":{"code":"CB","name":"Campobasso"},"854":{"code":"CI","name":"Carbonia Iglesias"},"855":{"code":"CE","name":"Caserta"},"856":{"code":"CT","name":"Catania"},"857":{"code":"CZ","name":"Catanzaro"},"858":{"code":"CH","name":"Chieti"},"859":{"code":"CO","name":"Como"},"860":{"code":"CS","name":"Cosenza"},"861":{"code":"CR","name":"Cremona"},"862":{"code":"KR","name":"Crotone"},"863":{"code":"CN","name":"Cuneo"},"864":{"code":"EN","name":"Enna"},"865":{"code":"FM","name":"Fermo"},"866":{"code":"FE","name":"Ferrara"},"867":{"code":"FI","name":"Firenze"},"868":{"code":"FG","name":"Foggia"},"869":{"code":"FC","name":"Forli-Cesena"},"870":{"code":"FR","name":"Frosinone"},"871":{"code":"GE","name":"Genova"},"872":{"code":"GO","name":"Gorizia"},"873":{"code":"GR","name":"Grosseto"},"874":{"code":"IM","name":"Imperia"},"875":{"code":"IS","name":"Isernia"},"836":{"code":"AQ","name":"L'Aquila"},"876":{"code":"SP","name":"La-Spezia"},"877":{"code":"LT","name":"Latina"},"878":{"code":"LE","name":"Lecce"},"879":{"code":"LC","name":"Lecco"},"880":{"code":"LI","name":"Livorno"},"881":{"code":"LO","name":"Lodi"},"882":{"code":"LU","name":"Lucca"},"883":{"code":"MC","name":"Macerata"},"884":{"code":"MN","name":"Mantova"},"885":{"code":"MS","name":"Massa-Carrara"},"886":{"code":"MT","name":"Matera"},"887":{"code":"VS","name":"Medio Campidano"},"888":{"code":"ME","name":"Messina"},"889":{"code":"MI","name":"Milano"},"890":{"code":"MO","name":"Modena"},"891":{"code":"MB","name":"Monza-Brianza"},"892":{"code":"NA","name":"Napoli"},"893":{"code":"NO","name":"Novara"},"894":{"code":"NU","name":"Nuoro"},"895":{"code":"OG","name":"Ogliastra"},"896":{"code":"OT","name":"Olbia Tempio"},"897":{"code":"OR","name":"Oristano"},"898":{"code":"PD","name":"Padova"},"899":{"code":"PA","name":"Palermo"},"900":{"code":"PR","name":"Parma"},"901":{"code":"PV","name":"Pavia"},"902":{"code":"PG","name":"Perugia"},"903":{"code":"PU","name":"Pesaro-Urbino"},"904":{"code":"PE","name":"Pescara"},"905":{"code":"PC","name":"Piacenza"},"906":{"code":"PI","name":"Pisa"},"907":{"code":"PT","name":"Pistoia"},"908":{"code":"PN","name":"Pordenone"},"909":{"code":"PZ","name":"Potenza"},"910":{"code":"PO","name":"Prato"},"911":{"code":"RG","name":"Ragusa"},"912":{"code":"RA","name":"Ravenna"},"913":{"code":"RC","name":"Reggio-Calabria"},"914":{"code":"RE","name":"Reggio-Emilia"},"915":{"code":"RI","name":"Rieti"},"916":{"code":"RN","name":"Rimini"},"917":{"code":"RM","name":"Roma"},"918":{"code":"RO","name":"Rovigo"},"919":{"code":"SA","name":"Salerno"},"920":{"code":"SS","name":"Sassari"},"921":{"code":"SV","name":"Savona"},"922":{"code":"SI","name":"Siena"},"923":{"code":"SR","name":"Siracusa"},"924":{"code":"SO","name":"Sondrio"},"925":{"code":"TA","name":"Taranto"},"926":{"code":"TE","name":"Teramo"},"927":{"code":"TR","name":"Terni"},"928":{"code":"TO","name":"Torino"},"929":{"code":"TP","name":"Trapani"},"930":{"code":"TN","name":"Trento"},"931":{"code":"TV","name":"Treviso"},"932":{"code":"TS","name":"Trieste"},"933":{"code":"UD","name":"Udine"},"934":{"code":"VA","name":"Varese"},"935":{"code":"VE","name":"Venezia"},"936":{"code":"VB","name":"Verbania"},"937":{"code":"VC","name":"Vercelli"},"938":{"code":"VR","name":"Verona"}
9533,"939":{"code":"VV","name":"Vibo-Valentia"},"940":{"code":"VI","name":"Vicenza"},"941":{"code":"VT","name":"Viterbo"}}},"JE":{"name":"Jersey"},"JM":{"name":"Jamaica"},"JO":{"name":"Jordan"},"JP":{"name":"Japan"},"KE":{"name":"Kenya"},"KG":{"name":"Kyrgyzstan"},"KH":{"name":"Cambodia"},"KI":{"name":"Kiribati"},"KM":{"name":"Comoros"},"KN":{"name":"St. Kitts & Nevis"},"KR":{"name":"South Korea"},"KW":{"name":"Kuwait"},"KY":{"name":"Cayman Islands"},"KZ":{"name":"Kazakhstan"},"LA":{"name":"Laos"},"LC":{"name":"St. Lucia"},"LI":{"name":"Liechtenstein"},"LK":{"name":"Sri Lanka"},"LR":{"name":"Liberia"},"LS":{"name":"Lesotho"},"LT":{"name":"Lithuania","regions":{"475":{"code":"LT-AL","name":"Alytaus Apskritis"},"476":{"code":"LT-KU","name":"Kauno Apskritis"},"477":{"code":"LT-KL","name":"Klaip\u0117dos Apskritis"},"478":{"code":"LT-MR","name":"Marijampol\u0117s Apskritis"},"479":{"code":"LT-PN","name":"Panev\u0117\u017eio Apskritis"},"480":{"code":"LT-SA","name":"\u0160iauli\u0173 Apskritis"},"481":{"code":"LT-TA","name":"Taurag\u0117s Apskritis"},"482":{"code":"LT-TE","name":"Tel\u0161i\u0173 Apskritis"},"483":{"code":"LT-UT","name":"Utenos Apskritis"},"484":{"code":"LT-VL","name":"Vilniaus Apskritis"}}},"LU":{"name":"Luxembourg"},"LV":{"name":"Latvia","regions":{"471":{"code":"\u0100da\u017eu novads","name":"\u0100da\u017eu novads"},"366":{"code":"Aglonas novads","name":"Aglonas novads"},"367":{"code":"LV-AI","name":"Aizkraukles novads"},"368":{"code":"Aizputes novads","name":"Aizputes novads"},"369":{"code":"Akn\u012bstes novads","name":"Akn\u012bstes novads"},"370":{"code":"Alojas novads","name":"Alojas novads"},"371":{"code":"Alsungas novads","name":"Alsungas novads"},"372":{"code":"LV-AL","name":"Al\u016bksnes novads"},"373":{"code":"Amatas novads","name":"Amatas novads"},"374":{"code":"Apes novads","name":"Apes novads"},"375":{"code":"Auces novads","name":"Auces novads"},"376":{"code":"Bab\u012btes novads","name":"Bab\u012btes novads"},"377":{"code":"Baldones novads","name":"Baldones novads"},"378":{"code":"Baltinavas novads","name":"Baltinavas novads"},"379":{"code":"LV-BL","name":"Balvu novads"},"380":{"code":"LV-BU","name":"Bauskas novads"},"381":{"code":"Bever\u012bnas novads","name":"Bever\u012bnas novads"},"382":{"code":"Broc\u0113nu novads","name":"Broc\u0113nu novads"},"383":{"code":"Burtnieku novads","name":"Burtnieku novads"},"384":{"code":"Carnikavas novads","name":"Carnikavas novads"},"387":{"code":"LV-CE","name":"C\u0113su novads"},"385":{"code":"Cesvaines novads","name":"Cesvaines novads"},"386":{"code":"Ciblas novads","name":"Ciblas novads"},"388":{"code":"Dagdas novads","name":"Dagdas novads"},"355":{"code":"LV-DGV","name":"Daugavpils"},"389":{"code":"LV-DA","name":"Daugavpils novads"},"390":{"code":"LV-DO","name":"Dobeles novads"},"391":{"code":"Dundagas novads","name":"Dundagas novads"},"392":{"code":"Durbes novads","name":"Durbes novads"},"393":{"code":"Engures novads","name":"Engures novads"},"472":{"code":"\u0112rg\u013cu novads","name":"\u0112rg\u013cu novads"},"394":{"code":"Garkalnes novads","name":"Garkalnes novads"},"395":{"code":"Grobi\u0146as novads","name":"Grobi\u0146as novads"},"396":{"code":"LV-GU","name":"Gulbenes novads"},"397":{"code":"Iecavas novads","name":"Iecavas novads"},"398":{"code":"Ik\u0161\u0137iles novads","name":"Ik\u0161\u0137iles novads"},"399":{"code":"Il\u016bkstes novads","name":"Il\u016bkstes novads"},"400":{"code":"In\u010dukalna novads","name":"In\u010dukalna novads"},"401":{"code":"Jaunjelgavas novads","name":"Jaunjelgavas novads"},"402":{"code":"Jaunpiebalgas novads","name":"Jaunpiebalgas novads"},"403":{"code":"Jaunpils novads","name":"Jaunpils novads"},"357":{"code":"J\u0113kabpils","name":"J\u0113kabpils"},"405":{"code":"LV-JK","name":"J\u0113kabpils novads"},"356":{"code":"LV-JEL","name":"Jelgava"},"404":{"code":"LV-JL","name":"Jelgavas novads"},"358":{"code":"LV-JUR","name":"J\u016brmala"},"406":{"code":"Kandavas novads","name":"Kandavas novads"},"412":{"code":"K\u0101rsavas novads","name":"K\u0101rsavas novads"},"473":{"code":"\u0136eguma novads","name":"\u0136eguma novads"},"474":{"code":"\u0136ekavas novads","name":"\u0136ekavas novads"},"407":{"code":"Kokneses novads","name":"Kokneses novads"},"410":{"code":"LV-KR","name":"Kr\u0101slavas novads"},"408":{"code":"Krimuldas novads","name":"Krimuldas novads"},"409":{"code":"Krustpils novads","name":"Krustpils novads"},"411":{"code":"LV-KU","name":"Kuld\u012bgas novads"},"413":{"code":"Lielv\u0101rdes novads","name":"Lielv\u0101rdes novads"},"359":{"code":"LV-LPX","name":"Liep\u0101ja"},"360":{"code":"LV-LE","name":"Liep\u0101jas novads"},"417":{"code":"L\u012bgatnes novads","name":"L\u012bgatnes novads"},"414":{"code":"LV-LM","name":"Limba\u017eu novads"},"418":{"code":"L\u012bv\u0101nu novads","name":"L\u012bv\u0101nu novads"},"415":{"code":"Lub\u0101nas novads","name":"Lub\u0101nas novads"},"416":{"code":"LV-LU","name":"Ludzas novads"},"419":{"code":"LV-MA","name":"Madonas novads"},"421":{"code":"M\u0101lpils novads","name":"M\u0101lpils novads"},"422":{"code":"M\u0101rupes novads","name":"M\u0101rupes novads"},"420":{"code":"Mazsalacas novads","name":"Mazsalacas novads"},"423":{"code":"Nauk\u0161\u0113nu novads","name":"Nauk\u0161\u0113nu novads"},"424":{"code":"Neretas novads","name":"Neretas novads"},"425":{"code":"N\u012bcas novads","name":"N\u012bcas novads"},"426":{"code":"LV-OG","name":"Ogres novads"},"427":{"code":"Olaines novads","name":"Olaines novads"},"428":{"code":"Ozolnieku novads","name":"Ozolnieku novads"},"432":{"code":"P\u0101rgaujas novads","name":"P\u0101rgaujas novads"},"433":{"code":"P\u0101vilostas novads","name":"P\u0101vilostas novads"},"434":{"code":"P\u013cavi\u0146u novads","name":"P\u013cavi\u0146u novads"},"429":{"code":"LV-PR","name":"Prei\u013cu novads"},"430":{"code":"Priekules novads","name":"Priekules novads"},"431":{"code":"Prieku\u013cu novads","name":"Prieku\u013cu novads"},"435":{"code":"Raunas novads","name":"Raunas novads"},"361":{"code":"LV-REZ","name":"R\u0113zekne"},"442":{"code":"LV-RE","name":"R\u0113zeknes novads"},"436":{"code":"Riebi\u0146u novads","name":"Riebi\u0146u novads"},"362":{"code":"LV-RIX","name":"R\u012bga"},"363":{"code":"LV-RI","name":"R\u012bgas novads"},"437":{"code":"Rojas novads","name":"Rojas novads"},"438":{"code":"Ropa\u017eu novads","name":"Ropa\u017eu novads"},"439":{"code":"Rucavas novads","name":"Rucavas novads"},"440":{"code":"Rug\u0101ju novads","name":"Rug\u0101ju novads"},"443":{"code":"R\u016bjienas novads","name":"R\u016bjienas novads"},"441":{"code":"Rund\u0101les novads","name":"Rund\u0101les novads"},"444":{"code":"Salacgr\u012bvas novads","name":"Salacgr\u012bvas novads"},"445":{"code":"Salas novads","name":"Salas novads"},"446":{"code":"Salaspils novads","name":"Salaspils novads"},"447":{"code":"LV-SA","name":"Saldus novads"},"448":{"code":"Saulkrastu novads","name":"Saulkrastu novads"},"455":{"code":"S\u0113jas novads","name":"S\u0113jas novads"},"449":{"code":"Siguldas novads","name":"Siguldas novads"}
9533,"451":{"code":"Skr\u012bveru novads","name":"Skr\u012bveru novads"},"450":{"code":"Skrundas novads","name":"Skrundas novads"},"452":{"code":"Smiltenes novads","name":"Smiltenes novads"},"453":{"code":"Stopi\u0146u novads","name":"Stopi\u0146u novads"},"454":{"code":"Stren\u010du novads","name":"Stren\u010du novads"},"456":{"code":"LV-TA","name":"Talsu novads"},"458":{"code":"T\u0113rvetes novads","name":"T\u0113rvetes novads"},"457":{"code":"LV-TU","name":"Tukuma novads"},"459":{"code":"Vai\u0146odes novads","name":"Vai\u0146odes novads"},"460":{"code":"LV-VK","name":"Valkas novads"},"364":{"code":"Valmiera","name":"Valmiera"},"461":{"code":"LV-VM","name":"Valmieras novads"},"462":{"code":"Varak\u013c\u0101nu novads","name":"Varak\u013c\u0101nu novads"},"469":{"code":"V\u0101rkavas novads","name":"V\u0101rkavas novads"},"463":{"code":"Vecpiebalgas novads","name":"Vecpiebalgas novads"},"464":{"code":"Vecumnieku novads","name":"Vecumnieku novads"},"365":{"code":"LV-VEN","name":"Ventspils"},"465":{"code":"LV-VE","name":"Ventspils novads"},"466":{"code":"Vies\u012btes novads","name":"Vies\u012btes novads"},"467":{"code":"Vi\u013cakas novads","name":"Vi\u013cakas novads"},"468":{"code":"Vi\u013c\u0101nu novads","name":"Vi\u013c\u0101nu novads"},"470":{"code":"Zilupes novads","name":"Zilupes novads"}}},"MC":{"name":"Monaco"},"MD":{"name":"Moldova"},"ME":{"name":"Montenegro"},"MF":{"name":"St. Martin"},"MG":{"name":"Madagascar"},"MH":{"name":"Marshall Islands"},"MK":{"name":"North Macedonia"},"MM":{"name":"Myanmar (Burma)"},"MN":{"name":"Mongolia"},"MO":{"name":"Macao SAR China"},"MP":{"name":"Northern Mariana Islands"},"MQ":{"name":"Martinique"},"MR":{"name":"Mauritania"},"MS":{"name":"Montserrat"},"MT":{"name":"Malta"},"MU":{"name":"Mauritius"},"MW":{"name":"Malawi"},"MX":{"name":"Mexico","regions":{"942":{"code":"AGU","name":"Aguascalientes"},"943":{"code":"BCN","name":"Baja California"},"944":{"code":"BCS","name":"Baja California Sur"},"945":{"code":"CAM","name":"Campeche"},"946":{"code":"CHP","name":"Chiapas"},"947":{"code":"CHH","name":"Chihuahua"},"948":{"code":"CMX","name":"Ciudad de M\u00e9xico"},"949":{"code":"COA","name":"Coahuila"},"950":{"code":"COL","name":"Colima"},"951":{"code":"DUR","name":"Durango"},"952":{"code":"MEX","name":"Estado de M\u00e9xico"},"953":{"code":"GUA","name":"Guanajuato"},"954":{"code":"GRO","name":"Guerrero"},"955":{"code":"HID","name":"Hidalgo"},"956":{"code":"JAL","name":"Jalisco"},"957":{"code":"MIC","name":"Michoac\u00e1n"},"958":{"code":"MOR","name":"Morelos"},"959":{"code":"NAY","name":"Nayarit"},"960":{"code":"NLE","name":"Nuevo Le\u00f3n"},"961":{"code":"OAX","name":"Oaxaca"},"962":{"code":"PUE","name":"Puebla"},"963":{"code":"QUE","name":"Quer\u00e9taro"},"964":{"code":"ROO","name":"Quintana Roo"},"965":{"code":"SLP","name":"San Luis Potos\u00ed"},"966":{"code":"SIN","name":"Sinaloa"},"967":{"code":"SON","name":"Sonora"},"968":{"code":"TAB","name":"Tabasco"},"969":{"code":"TAM","name":"Tamaulipas"},"970":{"code":"TLA","name":"Tlaxcala"},"971":{"code":"VER","name":"Veracruz"},"972":{"code":"YUC","name":"Yucat\u00e1n"},"973":{"code":"ZAC","name":"Zacatecas"}}},"MZ":{"name":"Mozambique"},"NA":{"name":"Namibia"},"NC":{"name":"New Caledonia"},"NE":{"name":"Niger"},"NF":{"name":"Norfolk Island"},"NG":{"name":"Nigeria"},"NL":{"name":"Netherlands"},"NO":{"name":"Norway"},"NP":{"name":"Nepal"},"NR":{"name":"Nauru"},"NU":{"name":"Niue"},"NZ":{"name":"New Zealand"},"OM":{"name":"Oman"},"PA":{"name":"Panama"},"PE":{"name":"Peru","regions":{"993":{"code":"PE-AMA","name":"Amazonas"},"994":{"code":"PE-ANC","name":"Ancash"},"995":{"code":"PE-APU","name":"Apur\u00edmac"},"996":{"code":"PE-ARE","name":"Arequipa"},"997":{"code":"PE-AYA","name":"Ayacucho"},"998":{"code":"PE-CAJ","name":"Cajamarca"},"999":{"code":"PE-CUS","name":"Cusco"},"1000":{"code":"PE-CAL","name":"El Callao"},"1001":{"code":"PE-HUV","name":"Huancavelica"},"1002":{"code":"PE-HUC","name":"Hu\u00e1nuco"},"1003":{"code":"PE-ICA","name":"Ica"},"1004":{"code":"PE-JUN","name":"Jun\u00edn"},"1005":{"code":"PE-LAL","name":"La Libertad"},"1006":{"code":"PE-LAM","name":"Lambayeque"},"1007":{"code":"PE-LIM","name":"Lima"},"1008":{"code":"PE-LOR","name":"Loreto"},"1009":{"code":"PE-MDD","name":"Madre de Dios"},"1010":{"code":"PE-MOQ","name":"Moquegua"}
9533,"992":{"code":"PE-LMA","name":"Municipalidad Metropolitana de Lima"},"1011":{"code":"PE-PAS","name":"Pasco"},"1012":{"code":"PE-PIU","name":"Piura"},"1013":{"code":"PE-PUN","name":"Puno"},"1014":{"code":"PE-SAM","name":"San Mart\u00edn"},"1015":{"code":"PE-TAC","name":"Tacna"},"1016":{"code":"PE-TUM","name":"Tumbes"},"1017":{"code":"PE-UCA","name":"Ucayali"}}},"PF":{"name":"French Polynesia"},"PG":{"name":"Papua New Guinea"},"PH":{"name":"Philippines"},"PK":{"name":"Pakistan"},"PL":{"name":"Poland","regions":{"1018":{"code":"PL-02","name":"dolno\u015bl\u0105skie"},"1019":{"code":"PL-04","name":"kujawsko-pomorskie"},"1020":{"code":"PL-06","name":"lubelskie"},"1021":{"code":"PL-08","name":"lubuskie"},"1024":{"code":"PL-14","name":"mazowieckie"},"1023":{"code":"PL-12","name":"ma\u0142opolskie"},"1025":{"code":"PL-16","name":"opolskie"},"1026":{"code":"PL-18","name":"podkarpackie"},"1027":{"code":"PL-20","name":"podlaskie"},"1028":{"code":"PL-22","name":"pomorskie"},"1029":{"code":"PL-24","name":"\u015bl\u0105skie"},"1030":{"code":"PL-26","name":"\u015bwi\u0119tokrzyskie"},"1031":{"code":"PL-28","name":"warmi\u0144sko-mazurskie"},"1032":{"code":"PL-30","name":"wielkopolskie"},"1033":{"code":"PL-32","name":"zachodniopomorskie"},"1022":{"code":"PL-10","name":"\u0142\u00f3dzkie"}}},"PM":{"name":"St. Pierre & Miquelon"},"PN":{"name":"Pitcairn Islands"},"PS":{"name":"Palestinian Territories"},"PT":{"name":"Portugal","regions":{"1034":{"code":"PT-01","name":"Aveiro"},"1035":{"code":"PT-02","name":"Beja"},"1036":{"code":"PT-03","name":"Braga"},"1037":{"code":"PT-04","name":"Bragan\u00e7a"},"1038":{"code":"PT-05","name":"Castelo Branco"},"1039":{"code":"PT-06","name":"Coimbra"},"1040":{"code":"PT-07","name":"\u00c9vora"},"1041":{"code":"PT-08","name":"Faro"},"1042":{"code":"PT-09","name":"Guarda"},"1043":{"code":"PT-10","name":"Leiria"},"1044":{"code":"PT-11","name":"Lisboa"},"1045":{"code":"PT-12","name":"Portalegre"},"1046":{"code":"PT-13","name":"Porto"},"1053":{"code":"PT-30","name":"Regi\u00e3o Aut\u00f3noma da Madeira"},"1052":{"code":"PT-20","name":"Regi\u00e3o Aut\u00f3noma dos A\u00e7ores"},"1047":{"code":"PT-14","name":"Santar\u00e9m"},"1048":{"code":"PT-15","name":"Set\u00fabal"},"1049":{"code":"PT-16","name":"Viana do Castelo"},"1050":{"code":"PT-17","name":"Vila Real"},"1051":{"code":"PT-18","name":"Viseu"}}},"PW":{"name":"Palau"},"PY":{"name":"Paraguay","regions":{"975":{"code":"PY-16","name":"Alto Paraguay"},"976":{"code":"PY-10","name":"Alto Paran\u00e1"},"977":{"code":"PY-13","name":"Amambay"},"974":{"code":"PY-ASU","name":"Asunci\u00f3n"},"978":{"code":"PY-19","name":"Boquer\u00f3n"},"979":{"code":"PY-5","name":"Caaguaz\u00fa"},"980":{"code":"PY-6","name":"Caazap\u00e1"},"981":{"code":"PY-14","name":"Canindey\u00fa"},"982":{"code":"PY-11","name":"Central"},"983":{"code":"PY-1","name":"Concepci\u00f3n"},"984":{"code":"PY-3","name":"Cordillera"},"985":{"code":"PY-4","name":"Guair\u00e1"},"986":{"code":"PY-7","name":"Itap\u00faa"},"987":{"code":"PY-8","name":"Misiones"},"988":{"code":"PY-12","name":"\u00d1eembuc\u00fa"},"989":{"code":"PY-9","name":"Paraguar\u00ed"},"990":{"code":"PY-15","name":"Presidente Hayes"},"991":{"code":"PY-2","name":"San Pedro"}}},"QA":{"name":"Qatar"},"RE":{"name":"R\u00e9union"},"RO":{"name":"Romania","regions":{"278":{"code":"AB","name":"Alba"},"279":{"code":"AR","name":"Arad"},"280":{"code":"AG","name":"Arge\u015f"},"281":{"code":"BC","name":"Bac\u0103u"},"282":{"code":"BH","name":"Bihor"},"283":{"code":"BN","name":"Bistri\u0163a-N\u0103s\u0103ud"},"284":{"code":"BT","name":"Boto\u015fani"},"286":{"code":"BR","name":"Br\u0103ila"},"285":{"code":"BV","name":"Bra\u015fov"},"287":{"code":"B","name":"Bucure\u015fti"},"288":{"code":"BZ","name":"Buz\u0103u"},"290":{"code":"CL","name":"C\u0103l\u0103ra\u015fi"},"289":{"code":"CS","name":"Cara\u015f-Severin"},"291":{"code":"CJ","name":"Cluj"},"292":{"code":"CT","name":"Constan\u0163a"},"293":{"code":"CV","name":"Covasna"},"294":{"code":"DB","name":"D\u00e2mbovi\u0163a"},"295":{"code":"DJ","name":"Dolj"},"296":{"code":"GL","name":"Gala\u0163i"},"297":{"code":"GR","name":"Giurgiu"},"298":{"code":"GJ","name":"Gorj"},"299":{"code":"HR","name":"Harghita"},"300":{"code":"HD","name":"Hunedoara"},"301":{"code":"IL","name":"Ialomi\u0163a"},"302":{"code":"IS","name":"Ia\u015fi"},"303":{"code":"IF","name":"Ilfov"},"304":{"code":"MM","name":"Maramure\u015f"},"305":{"code":"MH","name":"Mehedin\u0163i"},"306":{"code":"MS","name":"Mure\u015f"},"307":{"code":"NT","name":"Neam\u0163"},"308":{"code":"OT","name":"Olt"},"309":{"code":"PH","name":"Prahova"},"311":{"code":"SJ","name":"S\u0103laj"},"310":{"code":"SM","name":"Satu-Mare"},"312":{"code":"SB","name":"Sibiu"},"313":{"code":"SV","name":"Suceava"},"314":{"code":"TR","name":"Teleorman"},"315":{"code":"TM","name":"Timi\u015f"},"316":{"code":"TL","name":"Tulcea"},"318":{"code":"VL","name":"V\u00e2lcea"},"317":{"code":"VS","name":"Vaslui"},"319":{"code":"VN","name":"Vrancea"}}},"RS":{"name":"Serbia"},"RW":{"name":"Rwanda"},"SB":{"name":"Solomon Islands"},"SC":{"name":"Seychelles"},"SE":{"name":"Sweden","regions":{"1064":{"code":"SE-K","name":"Blekinge l\u00e4n"}
9533,"1065":{"code":"SE-W","name":"Dalarnas l\u00e4n"},"1067":{"code":"SE-X","name":"G\u00e4vleborgs l\u00e4n"},"1066":{"code":"SE-I","name":"Gotlands l\u00e4n"},"1068":{"code":"SE-N","name":"Hallands l\u00e4n"},"1069":{"code":"SE-Z","name":"J\u00e4mtlands l\u00e4n"},"1070":{"code":"SE-F","name":"J\u00f6nk\u00f6pings l\u00e4n"},"1071":{"code":"SE-H","name":"Kalmar l\u00e4n"},"1072":{"code":"SE-G","name":"Kronobergs l\u00e4n"},"1073":{"code":"SE-BD","name":"Norrbottens l\u00e4n"},"1083":{"code":"SE-T","name":"\u00d6rebro l\u00e4n"},"1084":{"code":"SE-E","name":"\u00d6sterg\u00f6tlands l\u00e4n"},"1074":{"code":"SE-M","name":"Sk\u00e5ne l\u00e4n"},"1076":{"code":"SE-D","name":"S\u00f6dermanlands l\u00e4n"},"1075":{"code":"SE-AB","name":"Stockholms l\u00e4n"},"1077":{"code":"SE-C","name":"Uppsala l\u00e4n"},"1078":{"code":"SE-S","name":"V\u00e4rmlands l\u00e4n"},"1079":{"code":"SE-AC","name":"V\u00e4sterbottens l\u00e4n"},"1080":{"code":"SE-Y","name":"V\u00e4sternorrlands l\u00e4n"},"1081":{"code":"SE-U","name":"V\u00e4stmanlands l\u00e4n"},"1082":{"code":"SE-O","name":"V\u00e4stra G\u00f6talands l\u00e4n"}}},"SG":{"name":"Singapore"},"SH":{"name":"St. Helena"},"SI":{"name":"Slovenia"},"SJ":{"name":"Svalbard & Jan Mayen"},"SK":{"name":"Slovakia"},"SL":{"name":"Sierra Leone"},"SM":{"name":"San Marino"},"SN":{"name":"Senegal"},"SR":{"name":"Suriname","regions":{"1054":{"code":"SR-BR","name":"Brokopondo"},"1055":{"code":"SR-CM","name":"Commewijne"},"1056":{"code":"SR-CR","name":"Coronie"},"1057":{"code":"SR-MA","name":"Marowijne"},"1058":{"code":"SR-NI","name":"Nickerie"},"1059":{"code":"SR-PR","name":"Para"},"1060":{"code":"SR-PM","name":"Paramaribo"},"1061":{"code":"SR-SA","name":"Saramacca"},"1062":{"code":"SR-SI","name":"Sipaliwini"},"1063":{"code":"SR-WA","name":"Wanica"}}},"ST":{"name":"S\u00e3o Tom\u00e9 & Pr\u00edncipe"},"SV":{"name":"El Salvador"},"SX":{"name":"Sint Maarten"},"SZ":{"name":"Eswatini"},"TC":{"name":"Turks & Caicos Islands"},"TD":{"name":"Chad"},"TF":{"name":"French Southern Territories"},"TG":{"name":"Togo"},"TJ":{"name":"Tajikistan"},"TK":{"name":"Tokelau"},"TL":{"name":"Timor-Leste"},"TM":{"name":"Turkmenistan"},"TN":{"name":"Tunisia"},"TO":{"name":"Tonga"},"TR":{"name":"T\u00fcrkiye"},"TT":{"name":"Trinidad & Tobago"},"TV":{"name":"Tuvalu"},"TW":{"name":"Taiwan"},"TZ":{"name":"Tanzania"},"UG":{"name":"Uganda"},"UM":{"name":"U.S. Outlying Islands"},"US":{"name":"United States","regions":{"2":{"code":"AK","name":"Alaska"},"3":{"code":"AS","name":"American Samoa"},"4":{"code":"AZ","name":"Arizona"},"5":{"code":"AR","name":"Arkansas"},"6":{"code":"AE","name":"Armed Forces Africa"},"7":{"code":"AA","name":"Armed Forces Americas"},"8":{"code":"AE","name":"Armed Forces Canada"},"9":{"code":"AE","name":"Armed Forces Europe"},"10":{"code":"AE","name":"Armed Forces Middle East"},"11":{"code":"AP","name":"Armed Forces Pacific"},"12":{"code":"CA","name":"California"},"13":{"code":"CO","name":"Colorado"},"14":{"code":"CT","name":"Connecticut"},"15":{"code":"DE","name":"Delaware"},"16":{"code":"DC","name":"District of Columbia"},"17":{"code":"FM","name":"Federated States Of Micronesia"},"18":{"code":"FL","name":"Florida"},"19":{"code":"GA","name":"Georgia"},"20":{"code":"GU","name":"Guam"},"21":{"code":"HI","name":"Hawaii"},"22":{"code":"ID","name":"Idaho"},"23":{"code":"IL","name":"Illinois"},"24":{"code":"IN","name":"Indiana"},"25":{"code":"IA","name":"Iowa"},"26":{"code":"KS","name":"Kansas"},"27":{"code":"KY","name":"Kentucky"},"28":{"code":"LA","name":"Louisiana"},"29":{"code":"ME","name":"Maine"},"30":{"code":"MH","name":"Marshall Islands"},"31":{"code":"MD","name":"Maryland"},"32":{"code":"MA","name":"Massachusetts"},"33":{"code":"MI","name":"Michigan"},"34":{"code":"MN","name":"Minnesota"},"35":{"code":"MS","name":"Mississippi"},"36":{"code":"MO","name":"Missouri"},"37":{"code":"MT","name":"Montana"},"38":{"code":"NE","name":"Nebraska"},"39":{"code":"NV","name":"Nevada"},"40":{"code":"NH","name":"New Hampshire"},"41":{"code":"NJ","name":"New Jersey"},"42":{"code":"NM","name":"New Mexico"},"43":{"code":"NY","name":"New York"},"44":{"code":"NC","name":"North Carolina"},"45":{"code":"ND","name":"North Dakota"},"46":{"code":"MP","name":"Northern Mariana Islands"},"47":{"code":"OH","name":"Ohio"},"48":{"code":"OK","name":"Oklahoma"},"49":{"code":"OR","name":"Oregon"},"50":{"code":"PW","name":"Palau"},"51":{"code":"PA","name":"Pennsylvania"},"52":{"code":"PR","name":"Puerto Rico"},"53":{"code":"RI","name":"Rhode Island"},"54":{"code":"SC","name":"South Carolina"},"55":{"code":"SD","name":"South Dakota"},"56":{"code":"TN","name":"Tennessee"},"57":{"code":"TX","name":"Texas"}
9533,"58":{"code":"UT","name":"Utah"},"59":{"code":"VT","name":"Vermont"},"60":{"code":"VI","name":"Virgin Islands"},"61":{"code":"VA","name":"Virginia"},"62":{"code":"WA","name":"Washington"},"63":{"code":"WV","name":"West Virginia"},"64":{"code":"WI","name":"Wisconsin"},"65":{"code":"WY","name":"Wyoming"}}},"UY":{"name":"Uruguay","regions":{"1112":{"code":"UY-AR","name":"Artigas"},"1113":{"code":"UY-CA","name":"Canelones"},"1114":{"code":"UY-CL","name":"Cerro Largo"},"1115":{"code":"UY-CO","name":"Colonia"},"1116":{"code":"UY-DU","name":"Durazno"},"1117":{"code":"UY-FS","name":"Flores"},"1118":{"code":"UY-FD","name":"Florida"},"1119":{"code":"UY-LA","name":"Lavalleja"},"1120":{"code":"UY-MA","name":"Maldonado"},"1121":{"code":"UY-MO","name":"Montevideo"},"1122":{"code":"UY-PA","name":"Paysandu"},"1123":{"code":"UY-RN","name":"R\u00edo Negro"},"1124":{"code":"UY-RV","name":"Rivera"},"1125":{"code":"UY-RO","name":"Rocha"},"1126":{"code":"UY-SA","name":"Salto"},"1127":{"code":"UY-SJ","name":"San Jos\u00e9"},"1128":{"code":"UY-SO","name":"Soriano"},"1129":{"code":"UY-TA","name":"Tacuaremb\u00f3"},"1130":{"code":"UY-TT","name":"Treinta y Tres"}}},"UZ":{"name":"Uzbekistan"},"VA":{"name":"Vatican City"},"VC":{"name":"St. Vincent & Grenadines"},"VG":{"name":"British Virgin Islands"},"VI":{"name":"U.S. Virgin Islands"},"VU":{"name":"Vanuatu"},"WF":{"name":"Wallis & Futuna"},"WS":{"name":"Samoa"},"XK":{"name":"Kosovo"},"YE":{"name":"Yemen"},"YT":{"name":"Mayotte"},"ZA":{"name":"South Africa"},"ZM":{"name":"Zambia"},"data_id":1791037041},"captcha":[],"instant-purchase":[],"loggedAsCustomer":[],"persistent":[],"review":[],"payments":{"sdkParams":{"paypal":[{"name":"src","value":"https:\/\/www.paypal.com\/sdk\/js?client-id=AXgJpe2oER86DpKD05zLIJa6-GgkY--5X1FK2iZG3JwlMNX6GK0JJp4jqNwUUCcjZgrOoW2zmvYklMW4&intent=capture&locale=en_US&merchant-id=LNG63PUBYFCKW¤cy=USD&disable-funding=bancontact,boleto,boletobancario,blik,eps,giropay,ideal,itau,mercadopago,multibanco,mybank,oxxo,payu,p24,satispay,sepa,sofort,trustly,wechatpay,applepay,card&enable-funding=venmo,paylater&components=buttons,messages&commit=false"}],"applepay":[{"name":"src","value":"https:\/\/www.paypal.com\/sdk\/js?client-id=AXgJpe2oER86DpKD05zLIJa6-GgkY--5X1FK2iZG3JwlMNX6GK0JJp4jqNwUUCcjZgrOoW2zmvYklMW4&intent=capture&locale=en_US&merchant-id=LNG63PUBYFCKW¤cy=USD&disable-funding=bancontact,boleto,boletobancario,blik,eps,giropay,ideal,itau,mercadopago,multibanco,mybank,oxxo,payu,p24,satispay,sepa,sofort,trustly,wechatpay&components=applepay"}],"googlepay":[{"name":"src","value":"https:\/\/www.paypal.com\/sdk\/js?client-id=AXgJpe2oER86DpKD05zLIJa6-GgkY--5X1FK2iZG3JwlMNX6GK0JJp4jqNwUUCcjZgrOoW2zmvYklMW4&intent=capture&locale=en_US&merchant-id=LNG63PUBYFCKW¤cy=USD&disable-funding=bancontact,boleto,boletobancario,blik,eps,giropay,ideal,itau,mercadopago,multibanco,mybank,oxxo,payu,p24,satispay,sepa,sofort,trustly,wechatpay&components=googlepay"}]},"data_id":1791037041},"wishlist":{"items":[]},"webforms":[],"pslogin":[],"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[],"paypal-buyer-country":[]}</script>
9533 9534<style> 9535 .afterpay-paragraph{ 9536 font-size: 14px !important; 9537 } 9538 .afterpay-main-text{ 9539 font-size: 14px !important; 9540 } 9541 .catalog-category-view .product-image-photo{max-width:360px !important;max-height: auto !important;width: 100% !important;} 9542 @media(min-width:1840px) { 9543 .ais-Hits ol { grid-template-columns: repeat(4,minmax(0,1fr)) } 9544 } 9545 #customer-review-list .customer-review-item:not(:last-child) {border-bottom: solid 1px #cfcfcf; padding-bottom: 40px;} 9546 .grecaptcha-badge { 9547 transform: scale(0.9); 9548 -webkit-transform: scale(0.9); 9549 } 9550</style>
9551<script> 9552 document.addEventListener('DOMContentLoaded', function () { 9553 document.querySelectorAll('div[aria-controls]').forEach(function (el) { 9554 el.setAttribute('role', 'button'); 9555 el.setAttribute('tabindex', '0'); 9556 el.style.cursor = 'default'; 9557 el.addEventListener('keydown', function (e) { 9558 if (e.key === 'Enter' || e.key === ' ') { 9559 e.preventDefault(); 9560 el.click(); 9561 } 9562 }); 9563 }); 9564 }); 9565</script>
vendor: 1 bytes, line 9565
9565
9566<script> 9567 (function () { 9568 if (typeof window === 'undefined' || typeof document === 'undefined' || !window.sessionStorage) { 9569 return; 9570 } 9571 9572 var STORE_KEY_PREFIX = 'hyva:scroll:'; 9573 9574 function isHomepage() { 9575 return document.body && document.body.classList.contains('cms-index-index'); 9576 } 9577 9578 function pageKey() { 9579 return STORE_KEY_PREFIX + window.location.pathname + window.location.search; 9580 } 9581 9582 function saveScroll() { 9583 sessionStorage.setItem(pageKey(), String(window.scrollY || window.pageYOffset || 0)); 9584 } 9585 9586 function restoreScroll() { 9587 9588 var raw = sessionStorage.getItem(pageKey()); 9589 if (!raw) return; 9590 9591 var targetY = parseInt(raw, 10); 9592 if (Number.isNaN(targetY) || targetY < 0) { 9593 sessionStorage.removeItem(pageKey()); 9594 return; 9595 } 9596 9597 var attempts = 0; 9598 var maxAttempts = 18; 9599 var delay = 120; 9600 9601 function attemptRestore() { 9602 attempts += 1; 9603 9604 var doc = document.documentElement; 9605 var body = document.body; 9606 var pageHeader = document.querySelector('.page-header'); 9607 var pageHeaderHeight = pageHeader 9608 ? Math.ceil(pageHeader.getBoundingClientRect().height || pageHeader.offsetHeight || 0) 9609 : 0; 9610 var scrollHeight = Math.max(doc ? doc.scrollHeight : 0, body ? body.scrollHeight : 0); 9611 var viewport = window.innerHeight || (doc ? doc.clientHeight : 0) || 0; 9612 var maxY = Math.max(0, scrollHeight - viewport); 9613 var destination = Math.min(Math.max(0, targetY - pageHeaderHeight), maxY); 9614 9615 window.scrollTo(0, destination); 9616 9617 if (Math.abs((window.scrollY || 0) - destination) <= 2 || attempts >= maxAttempts) { 9618 sessionStorage.removeItem(pageKey()); 9619 return; 9620 } 9621 9622 window.setTimeout(attemptRestore, delay); 9623 } 9624 9625 window.requestAnimationFrame(attemptRestore); 9626 } 9627 9628 if ('scrollRestoration' in window.history) { 9629 window.history.scrollRestoration = 'manual'; 9630 } 9631 9632 document.addEventListener('click', function (event) { 9633 var link = event.target && event.target.closest ? event.target.closest('a[href]') : null; 9634 if (!link) return; 9635 9636 if ( 9637 link.target === '_blank' || 9638 link.hasAttribute('download') || 9639 (link.href && link.href.indexOf('javascript:') === 0) 9640 ) { 9641 return; 9642 } 9643 9644 saveScroll(); 9645 }, true); 9646 9647 window.addEventListener('pagehide', saveScroll); 9648 window.addEventListener('beforeunload', saveScroll); 9649 9650 window.addEventListener('pageshow', function (event) { 9651 var navEntries = window.performance && window.performance.getEntriesByType 9652 ? window.performance.getEntriesByType('navigation') 9653 : []; 9654 var navType = navEntries.length ? navEntries[0].type : ''; 9655 var fromBackForward = event.persisted || navType === 'back_forward'; 9656 9657 if (fromBackForward) { 9658 restoreScroll(); 9659 } 9660 }); 9661 })(); 9662</script>
9662 9663</div>
9663<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":"f35fff9d6b744f91b99e5b1d19d33a5d","spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 9663
9663
9664<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:'a44ff47cbfbd1267',t:'MTc5MTA3MjUzNw=='};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>
9664</body> 9665</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.