- ID da verificação
- 28223ae8-6c6c-438e-959a-86d4a468444eConcluído
- URL enviado:
- https://www.onahole.com/
- Relatório concluído:
Ligações · 8 encontradas
As ligações de saída identificadas na página
Hiperligação | Texto |
---|---|
https://www.onahole.co.uk/ | United Kingdom, GBP |
https://www.motsutoys.com/ | www.motsutoys.com |
https://www.motsutoys.fr/ | France, EUR |
https://www.motsutoys.de/ | Germany, EUR |
https://www.motsutoys.nl/ | Nederland, EUR |
https://policies.google.com/privacy | Google Privacy Policy |
https://policies.google.com/terms | Terms of Service |
https://blog.onahole.com/ | Blog |
Variáveis JavaScript · 111 encontradas
Variáveis JavaScript globais carregadas no objeto janela de uma página são variáveis declaradas fora das funções e acessíveis de qualquer parte do código dentro do âmbito atual
Nome | Tipo |
---|---|
0 | object |
1 | object |
2 | object |
onbeforetoggle | object |
documentPictureInPicture | object |
onscrollend | object |
associativeArray | object |
params | object |
affValue | object |
cookieValue | object |
Mensagens de registo da consola · 3 encontradas
Mensagens registadas na consola web
Tipo | Categoria | Registo |
---|---|---|
error | security |
|
verbose | dom |
|
log | other |
|
HTML
O corpo HTML em bruto da página
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<meta name="title" content="Onahole.com - Best Japanese Onahole and Sex Dolls (2024)">
<meta name="description" content="US Onahole Shop with the the best Japanese brands ✓ USA Warehouse ✓ Fast and discreet shipping ✓ Japanese quality ✓ Amazing Onaholes & Sex Dolls">
<meta name="robots" content="INDEX,FOLLOW">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Onahole.com - Best Japanese Onahole and Sex Dolls (2024)</title>
<link rel="stylesheet" type="text/css" media="all" href="https://www.onahole.com/static/frontend/Onaholecom/default/en_US/css/styles.css">
<link rel="stylesheet" type="text/css" media="all" href="https://www.onahole.com/static/frontend/Onaholecom/default/en_US/AdventCalendar_AdventCalendar/css/adventcalendar.css">
<link rel="stylesheet" type="text/css" media="all" href="https://www.onahole.com/static/frontend/Onaholecom/default/en_US/BlackFridayUrgency_BlackFridayUrgency/css/urgency.css">
<link rel="stylesheet" type="text/css" media="all" href="https://www.onahole.com/static/frontend/Onaholecom/default/en_US/DealsOfTheWeek_DealsOfTheWeek/css/flip-clock.css">
<link rel="stylesheet" type="text/css" media="all" href="//maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=G-KYXRJP0HX9&l=dataLayer&cx=c&gtm=45He4cc1v9179240536za200"></script><script async="" src="https://www.googletagmanager.com/gtm.js?id=GTM-WFJQR8HM"></script><script type="text/javascript" src="https://www.onahole.com/static/frontend/Onaholecom/default/en_US/BroSolutions_Url/js/redirect.js"></script>
<script type="text/javascript" async="async" src="https://script.tapfiliate.com/tapfiliate.js"></script>
<link rel="canonical" href="https://www.onahole.com/">
<link rel="icon" type="image/x-icon" href="https://cdn.onahole.com/media/favicon/default/onahole_favicon.png">
<link rel="shortcut icon" type="image/x-icon" href="https://cdn.onahole.com/media/favicon/default/onahole_favicon.png">
<script type="text/javascript" src="//script.crazyegg.com/pages/scripts/0119/1031.js" async="async"></script>
<script type="text/javascript" charset="utf-8" async="" defer="" src="https://front.optimonk.com/public/129487/js/preload.js"></script><script type="text/javascript" async="" src=" https://static-tracking.klaviyo.com/onsite/js/fender_analytics.bf851f3f352b7d7f4ccf.js?cb=1" crossorigin="anonymous"></script><script type="text/javascript" async="" src=" https://static-tracking.klaviyo.com/onsite/js/static.8d136cd44b74e8189276.js?cb=1" crossorigin="anonymous"></script><script type="text/javascript" async="" src="https://static.klaviyo.com/onsite/js/runtime.5a867e10da305d577378.js?cb=1" crossorigin="anonymous"></script><script type="text/javascript" async="" src="https://static.klaviyo.com/onsite/js/sharedUtils.e82919a2352d77ce58ea.js?cb=1" crossorigin="anonymous"></script><script type="text/javascript" async="" src=" https://static.klaviyo.com/onsite/js/vendors~signup_forms~post_identification_sync~atlas~onsite-triggering.95b16dc9b66ebba3f458.js?cb=1" crossorigin="anonymous"></script><script type="text/javascript" async="" src=" https://static.klaviyo.com/onsite/js/vendors~signup_forms~client_identity~onsite-triggering.a5132836f59bf0572cba.js?cb=1" crossorigin="anonymous"></script><script type="text/javascript" async="" src=" https://static.klaviyo.com/onsite/js/vendors~signup_forms.ffb16c5d33241b7ebc9d.js?cb=1" crossorigin="anonymous"></script><script type="text/javascript" async="" src=" https://static.klaviyo.com/onsite/js/default~signup_forms~onsite-triggering.98637825d23e18eabe70.js?cb=1" crossorigin="anonymous"></script><script type="text/javascript" async="" src=" https://static.klaviyo.com/onsite/js/signup_forms.3439ca6924127f20a194.js?cb=1" crossorigin="anonymous"></script><style id="kl-custom-fonts">
@font-face {
font-family: 'Nunito-Sans-Klaviyo-Hosted';
src: url(https://static.klaviyo.com/onsite/hosted-fonts/Nunito-Sans/latin/nunito-sans_latin_italic_400.woff2);
font-weight: 400;
font-style: italic;
font-display: swap;
}
@font-face {
font-family: 'Nunito-Sans-Klaviyo-Hosted';
src: url(https://static.klaviyo.com/onsite/hosted-fonts/Nunito-Sans/latin/nunito-sans_latin_italic_700.woff2);
font-weight: 700;
font-style: italic;
font-display: swap;
}
@font-face {
font-family: 'Nunito-Sans-Klaviyo-Hosted';
src: url(https://static.klaviyo.com/onsite/hosted-fonts/Nunito-Sans/latin/nunito-sans_latin_regular_400.woff2);
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Nunito-Sans-Klaviyo-Hosted';
src: url(https://static.klaviyo.com/onsite/hosted-fonts/Nunito-Sans/latin/nunito-sans_latin_regular_700.woff2);
font-weight: 700;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Poppins-Klaviyo-Hosted';
src: url(https://static.klaviyo.com/onsite/hosted-fonts/Poppins/latin/poppins_latin_italic_400.woff2);
font-weight: 400;
font-style: italic;
font-display: swap;
}
@font-face {
font-family: 'Poppins-Klaviyo-Hosted';
src: url(https://static.klaviyo.com/onsite/hosted-fonts/Poppins/latin/poppins_latin_italic_700.woff2);
font-weight: 700;
font-style: italic;
font-display: swap;
}
@font-face {
font-family: 'Poppins-Klaviyo-Hosted';
src: url(https://static.klaviyo.com/onsite/hosted-fonts/Poppins/latin/poppins_latin_regular_400_2.woff2);
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Poppins-Klaviyo-Hosted';
src: url(https://static.klaviyo.com/onsite/hosted-fonts/Poppins/latin/poppins_latin_regular_700.woff2);
font-weight: 700;
font-style: normal;
font-display: swap;
}
</style><script type="module" src="https://cdn-asset.optimonk.com/script.esm/embedded.0cc934be.js"></script><script src="https://gs-cdn.optimonk.com/jfclientsdk/latest/jfclientsdk.min.js?ts=16" async=""></script><script src="https://gs-cdn.optimonk.com/jfclientsdk/latest/jfclientsdk.min.js?ts=16" async=""></script><link href="https://cdn-asset.optimonk.com/bundles/wseoptimonk/css/optimonk.min.css?v=b2efbc5949" rel="stylesheet" type="text/css"></head><body id="html-body" class="cms-home mst-nav__theme-hyva-reset mst-nav__theme-hyva-default mst-nav__theme-onaholecom-default cms-index-index page-layout-1column"><img src="//tsyndicate.com/api/v1/retargeting/set/48e3e534-188d-47ab-a2b5-c607224b2e45" height="1" width="1">
<meta property="og:type" content="website">
<meta property="og:url" content="https://www.onahole.com/">
<meta property="og:title" content="Onahole.com - Best Japanese Onahole and Sex Dolls (2024)">
<meta property="og:description" content="US Onahole Shop with the the best Japanese brands ✓ USA Warehouse ✓ Fast and discreet shipping ✓ Japanese quality ✓ Amazing Onaholes &amp; Sex Dolls">
<meta property="og:image" content="https://cdn.onahole.com/media/logo/default/onahole_dot_com_logo.jpg">
<meta property="og:site_name" content="Onahole.com">
<link rel="stylesheet" type="text/css" media="all" href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css">
<script src="https://track.onahole.com/uniclick.js?attribution=lastpaid&cookiedomain=www.onahole.com&cookieduration=90&defaultcampaignid=66c85070a2b4c63edc8f6092&regviewonce=false"></script><script>
window.YIREO_GOOGLETAGMANAGER2_ENABLED = true;
(function (events) {
const initYireoGoogleTagManager2 = function () {
events.forEach(function (eventType) {
window.removeEventListener(eventType, initYireoGoogleTagManager2);
});
(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', 'GTM-WFJQR8HM');
}
events.forEach(function (eventType) {
window.addEventListener(eventType, initYireoGoogleTagManager2, {once: true, passive: true})
})
})(['load', 'keydown', 'mouseover', 'scroll', 'touchstart', 'wheel']);
</script>
<script>
var BASE_URL = 'https://www.onahole.com/';
var THEME_PATH = 'https://www.onahole.com/static/frontend/Onaholecom/default/en_US';
var COOKIE_CONFIG = {
"expires": null,
"path": "\u002F",
"domain": ".www.onahole.com",
"secure": false,
"lifetime": "3600",
"cookie_restriction_enabled": false };
var CURRENT_STORE_CODE = 'default';
var CURRENT_WEBSITE_ID = '1';
window.hyva = window.hyva || {}
window.cookie_consent_groups = window.cookie_consent_groups || {}
window.cookie_consent_groups['necessary'] = true;
window.cookie_consent_config = window.cookie_consent_config || {};
window.cookie_consent_config['necessary'] = [].concat(
window.cookie_consent_config['necessary'] || [],
[
'user_allowed_save_cookie',
'form_key',
'mage-messages',
'private_content_version',
'mage-cache-sessid',
'last_visited_store',
'section_data_ids'
]
);
</script>
<script>
'use strict';
(function( hyva, undefined ) {
function lifetimeToExpires(options, defaults) {
var lifetime = options.lifetime || defaults.lifetime;
if (lifetime) {
var date = new Date;
date.setTime(date.getTime() + lifetime * 1000);
return date;
}
return null;
}
function generateRandomString() {
const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
length = 16;
let formKey = '',
charactersLength = allowedCharacters.length;
for (var i = 0; i < length; i++) {
formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))]
}
return formKey;
}
const cookieTempStorage = {};
const internalCookie = {
get(name) {
const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return v ? v[2] : null;
},
set(name, value, days, skipSetDomain) {
let expires,
path,
domain,
secure,
samesite;
const defaultCookieConfig = {
expires: null,
path: '/',
domain: null,
secure: false,
lifetime: null,
samesite: 'lax'
};
const cookieConfig = window.COOKIE_CONFIG || {};
expires = days
? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig)
: lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires;
path = cookieConfig.path || defaultCookieConfig.path;
domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain);
secure = cookieConfig.secure || defaultCookieConfig.secure;
samesite = cookieConfig.samesite || defaultCookieConfig.samesite;
document.cookie = name + "=" + encodeURIComponent(value) +
(expires ? '; expires=' + expires.toGMTString() : '') +
(path ? '; path=' + path : '') +
(domain ? '; domain=' + domain : '') +
(secure ? '; secure' : '') +
(samesite ? '; samesite=' + samesite : 'lax');
},
isWebsiteAllowedToSaveCookie() {
const allowedCookies = this.get('user_allowed_save_cookie');
if (allowedCookies) {
const allowedWebsites = JSON.parse(unescape(allowedCookies));
return allowedWebsites[CURRENT_WEBSITE_ID] === 1;
}
return false;
},
getGroupByCookieName(name) {
const cookieConsentConfig = window.cookie_consent_config || {};
let group = null;
for (let prop in cookieConsentConfig) {
if (!cookieConsentConfig.hasOwnProperty(prop)) continue;
if (cookieConsentConfig[prop].includes(name)) {
group = prop;
break;
}
}
return group;
},
isCookieAllowed(name) {
const cookieGroup = this.getGroupByCookieName(name);
return cookieGroup
? window.cookie_consent_groups[cookieGroup]
: this.isWebsiteAllowedToSaveCookie();
},
saveTempStorageCookies() {
for (const [name, data] of Object.entries(cookieTempStorage)) {
if (this.isCookieAllowed(name)) {
this.set(name, data['value'], data['days'], data['skipSetDomain']);
delete cookieTempStorage[name];
}
}
}
};
hyva.getCookie = (name) => {
const cookieConfig = window.COOKIE_CONFIG || {};
if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) {
return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null;
}
return internalCookie.get(name);
}
hyva.setCookie = (name, value, days, skipSetDomain) => {
const cookieConfig = window.COOKIE_CONFIG || {};
if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) {
cookieTempStorage[name] = {value, days, skipSetDomain};
return;
}
return internalCookie.set(name, value, days, skipSetDomain);
}
hyva.getBrowserStorage = () => {
const browserStorage = window.localStorage || window.sessionStorage;
if (!browserStorage) {
console.warn('Browser Storage is unavailable');
return false;
}
try {
browserStorage.setItem('storage_test', 1);
browserStorage.removeItem('storage_test');
} catch (error) {
console.warn('Browser Storage is not accessible', error);
return false;
}
return browserStorage;
}
hyva.postForm = (postParams) => {
const form = document.createElement("form");
let data = postParams.data;
if (! postParams.skipUenc && ! data.uenc) {
data.uenc = btoa(window.location.href);
}
form.method = "POST";
form.action = postParams.action;
Object.keys(postParams.data).map(key => {
const field = document.createElement("input");
field.type = 'hidden'
field.value = postParams.data[key];
field.name = key;
form.appendChild(field);
});
const form_key = document.createElement("input");
form_key.type = 'hidden';
form_key.value = hyva.getFormKey();
form_key.name="form_key";
form.appendChild(form_key);
document.body.appendChild(form);
form.submit();
}
hyva.getFormKey = function () {
let formKey = hyva.getCookie('form_key');
if (!formKey) {
formKey = generateRandomString();
hyva.setCookie('form_key', formKey);
}
return formKey;
}
hyva.formatPrice = (value, showSign) => {
var formatter = new Intl.NumberFormat(
'en\u002DUS',
{
style: 'currency',
currency: 'USD',
signDisplay: showSign ? "always" : "auto"
}
);
return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ?
formatter.formatToParts(value).map(({type, value}) => {
switch (type) {
case 'currency':
return '$' || value;
case 'minusSign':
return '- ';
case 'plusSign':
return '+ ';
default :
return value;
}
}).reduce((string, part) => string + part) :
formatter.format(value);
}
const formatStr = function (str, nStart) {
const args = Array.from(arguments).slice(2);
return str.replace(/(%+)([0-9]+)/g, (m, p, n) => {
const idx = parseInt(n) - nStart;
if (args[idx] === null || args[idx] === void 0) {
return m;
}
return p.length % 2
? p.slice(0, -1).replace('%%', '%') + args[idx]
: p.replace('%%', '%') + n;
})
}
hyva.str = function (string) {
const args = Array.from(arguments);
args.splice(1, 0, 1);
return formatStr.apply(undefined, args);
}
hyva.strf = function () {
const args = Array.from(arguments);
args.splice(1, 0, 0);
return formatStr.apply(undefined, args);
}
/**
* Take a html string as `content` parameter and
* extract an element from the DOM to replace in
* the current page under the same selector,
* defined by `targetSelector`
*/
hyva.replaceDomElement = (targetSelector, content) => {
// Parse the content and extract the DOM node using the `targetSelector`
const parser = new DOMParser();
const doc = parser.parseFromString(content, 'text/html');
const contentNode = doc.querySelector(targetSelector);
// Bail if content can't be found
if (!contentNode) {
return;
}
// Extract all the script tags from the new content.
// Script tags won't execute when inserted into a dom-element directly,
// therefore we need to inject them to the head of the document.
const tmpScripts = contentNode.getElementsByTagName('script');
if (tmpScripts.length > 0) {
// Push all script tags into an array
// (to prevent dom manipulation while iterating over dom nodes)
const scripts = [];
for (let i = 0; i < tmpScripts.length; i++) {
scripts.push(tmpScripts[i]);
}
// Iterate over all script tags and duplicate+inject each into the head
for (let i = 0; i < scripts.length; i++) {
let script = document.createElement('script');
script.innerHTML = scripts[i].innerHTML;
document.head.appendChild(script);
// Remove the original (non-executing) node from the page
scripts[i].parentNode.removeChild(scripts[i]);
}
}
// Replace the old DOM node with the new content
document.querySelector(targetSelector).replaceWith(contentNode);
// Reload customerSectionData and display cookie-messages if present
window.dispatchEvent(new CustomEvent("reload-customer-section-data"));
hyva.initMessages();
}
const replace = {['+']: '-', ['/']: '_', ['=']: ','};
hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]);
let currentTrap;
const focusableElements = (rootElement) => {
const selector = 'button, [href], input, select, textarea, details';
return Array.from(rootElement.querySelectorAll(selector))
.filter(el => el.style.display !== 'none' && !el.disabled && el.tabIndex !== -1)
}
const focusTrap = (e) => {
const isTabPressed = e.key === 'Tab' || e.keyCode === 9;
if (!isTabPressed) return;
const focusable = focusableElements(currentTrap)
const firstFocusableElement = focusable[0]
const lastFocusableElement = focusable[focusable.length - 1]
e.shiftKey
? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault())
: document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault())
};
hyva.releaseFocus = (rootElement) => {
if (currentTrap && (!rootElement || rootElement === currentTrap)) {
currentTrap.removeEventListener('keydown', focusTrap)
currentTrap = null
}
}
hyva.trapFocus = (rootElement) => {
if (!rootElement) return;
hyva.releaseFocus()
currentTrap = rootElement
rootElement.addEventListener('keydown', focusTrap)
const firstElement = focusableElements(rootElement)[0]
firstElement && firstElement.focus()
}
window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies())
}( window.hyva = window.hyva || {} ));
</script>
<!-- OptiMonk EntryCode -->
<script type="text/javascript">
document.querySelector('html').addEventListener('optimonk#ready', function () {
OptiMonk.ajax.get("//" + window.location.host + "/optimonk/cart/index/", OptiMonk.addResponseToHead)
});
(function(e,a){
var t,r=e.getElementsByTagName("head")[0],c=e.location.protocol;
t=e.createElement("script");t.type="text/javascript";
t.charset="utf-8";t.async=!0;t.defer=!0;
t.src=c+"//front.optimonk.com/public/"+a+"/js/preload.js";r.appendChild(t);
})(document,"129487");
</script><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WFJQR8HM" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<input name="form_key" type="hidden" value="ecdWqIDEprHSHapn"><script>
function yireoGoogleTagManager2Pusher(eventData, message) {
window.YIREO_GOOGLETAGMANAGER2_PAST_EVENTS = window.YIREO_GOOGLETAGMANAGER2_PAST_EVENTS || [];
const copyEventData = Object.assign({}, eventData);
let metaData = {};
if (copyEventData.meta) {
metaData = copyEventData.meta;
delete copyEventData.meta;
}
const eventHash = btoa(encodeURIComponent(JSON.stringify(copyEventData)));
if (window.YIREO_GOOGLETAGMANAGER2_PAST_EVENTS.includes(eventHash)) {
yireoGoogleTagManager2Logger('Warning: Event already triggered', eventData);
return;
}
if (metaData && metaData.allowed_pages && metaData.allowed_pages.length > 0
&& false === metaData.allowed_pages.some(page => window.location.pathname.includes(page))) {
yireoGoogleTagManager2Logger('Warning: Skipping event, not in allowed pages', window.location.pathname, eventData);
return;
}
if (!message) {
message = 'push (unknown) [unknown]';
}
yireoGoogleTagManager2Logger(message, eventData);
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ecommerce: null});
window.dataLayer.push(eventData);
window.YIREO_GOOGLETAGMANAGER2_PAST_EVENTS.push(eventHash);
}
</script>
<script>
function yireoGoogleTagManager2Logger(...args) {
const debug = window.YIREO_GOOGLETAGMANAGER2_DEBUG || false;
if (false === debug) {
return;
}
var color = 'gray';
if (args[0].toLowerCase().startsWith('push')) {
color = 'green';
}
if (args[0].toLowerCase().startsWith('warning')) {
color = 'orange';
}
var css = 'color:white; background-color:' + color + '; padding:1px;'
console.log('%cYireo_GoogleTagManager2', css, ...args);
}
</script>
<div class="page-wrapper"><header class="page-header"><script>
function initHeader () {
return {
searchOpen: false,
cart: {},
getData(data) {
if (data.cart) { this.cart = data.cart }
}
}
}
function initCompareHeader() {
return {
compareProducts: null,
itemCount: 0,
receiveCompareData(data) {
if (data['compare-products']) {
this.compareProducts = data['compare-products'];
this.itemCount = this.compareProducts.count;
}
}
}
}
</script>
<div id="header" class="relative z-30 w-full border-b shadow bg-container-lighter border-container-lighter" x-data="initHeader()" @keydown.window.escape="searchOpen = false;" @private-content-loaded.window="getData(event.detail.data)">
<div class="relative sm:container flex flex-wrap items-center w-full py-3 lg:py-0 mx-auto mt-0 px-6">
<div x-data="initMenuMobile_67627d04396d7()" class="z-50 navigation lg:hidden">
<div class="bg-container-lighter" :class="{'h-screen overflow-x-hidden overflow-y-auto fixed top-0 left-0 w-full' : open}" @toggle-mobile-menu.window="open = !open" @keydown.window.escape="open=false">
<div class="flex items-baseline justify-between menu-icon">
<div class="flex justify-end w-full">
<a @click="$dispatch('toggle-mobile-menu')" class="flex items-center justify-center cursor-pointer" :class="{ 'ml-auto': open }">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="hidden p-3" width="48" height="48" :class="{ 'hidden' : !open, 'block': open }" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"></path><title>x</title></svg>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="p-3 block" width="48" height="48" :class="{ 'hidden' : open, 'block': !open }" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path><title>menu</title></svg>
</a>
</div>
</div>
<nav class=" hidden w-full duration-150 ease-in-out transform transition-display" data-mage-init="{"menu": {}}" :class="{ 'hidden' : !open }">
<div class="border-t border-grey-150 mx-2.5">
<ul class="__list flex flex-col" x-data="{selected:null}">
<li class="__item text-base text-blue-900 font-medium border-b border-grey-150 ">
<div class="flex items-center py-4 mobile-menu-item">
<a href="https://www.onahole.com/onaholes" class="__link flex items-center" data-menu="menu-40">
<img src="https://cdn.onahole.com/media/snowdog/menu/node/o/n/onahole.gif" alt="" loading="lazy">
Onaholes</a>
</div>
<div class="mobile-menu" x-show="selected == 0" x-transition:enter="transition ease-out duration-500" style="display: none;">
</div>
</li>
<li class="__item text-base text-blue-900 font-medium border-b border-grey-150 ">
<div class="flex items-center py-4 mobile-menu-item">
<a href="https://www.onahole.com/new" class="__link flex items-center" data-menu="menu-34">
NEW</a>
</div>
<div class="mobile-menu" x-show="selected == 1" x-transition:enter="transition ease-out duration-500" style="display: none;">
</div>
</li>
<li class="__item text-base text-blue-900 font-medium border-b border-grey-150 ">
<div class="flex items-center py-4 mobile-menu-item">
<a href="https://www.onahole.com/onahip" class="__link flex items-center" data-menu="menu-41">
Onahip</a>
</div>
<div class="mobile-menu" x-show="selected == 2" x-transition:enter="transition ease-out duration-500" style="display: none;">
</div>
</li>
<li class="__item text-base text-blue-900 font-medium border-b border-grey-150 ">
<div class="flex items-center py-4 mobile-menu-item">
<a href="https://www.onahole.com/sex-doll-torso" class="__link flex items-center" data-menu="menu-35">
Sex Doll Torso</a>
</div>
<div class="mobile-menu" x-show="selected == 3" x-transition:enter="transition ease-out duration-500" style="display: none;">
</div>
</li>
<li class="__item text-base text-blue-900 font-medium border-b border-grey-150 ">
<div class="flex items-center py-4 mobile-menu-item">
<a href="https://www.onahole.com/tit-sex-toys" class="__link flex items-center" data-menu="menu-36">
Tit Sex Toys</a>
</div>
<div class="mobile-menu" x-show="selected == 4" x-transition:enter="transition ease-out duration-500" style="display: none;">
</div>
</li>
<li class="__item text-base text-blue-900 font-medium border-b border-grey-150 ">
<div class="flex items-center py-4 mobile-menu-item">
<a href="https://www.onahole.com/mini-sex-dolls" class="__link flex items-center" data-menu="menu-37">
Mini Sex Dolls</a>
</div>
<div class="mobile-menu" x-show="selected == 5" x-transition:enter="transition ease-out duration-500" style="display: none;">
</div>
</li>
<li class="__item text-base text-blue-900 font-medium border-b border-grey-150 ">
<div class="flex items-center py-4 mobile-menu-item">
<a href="https://www.onahole.com/onahole-cleaning" class="__link flex items-center" data-menu="menu-38">
Onahole Cleaning</a>
</div>
<div class="mobile-menu" x-show="selected == 6" x-transition:enter="transition ease-out duration-500" style="display: none;">
</div>
</li>
<li class="__item text-base text-blue-900 font-medium border-b border-grey-150 ">
<div class="flex items-center py-4 mobile-menu-item">
<a href="https://www.onahole.com/japanese-lube" class="__link flex items-center" data-menu="menu-39">
Japanese Lube</a>
</div>
<div class="mobile-menu" x-show="selected == 7" x-transition:enter="transition ease-out duration-500" style="display: none;">
</div>
</li>
<li class="__item text-base text-blue-900 font-medium border-b border-grey-150 ">
<div class="flex items-center py-4 mobile-menu-item">
<a href="https://www.onahole.com/vibrator-for-men" class="__link flex items-center" data-menu="menu-42">
Vibrator for Men</a>
</div>
<div class="mobile-menu" x-show="selected == 8" x-transition:enter="transition ease-out duration-500" style="display: none;">
</div>
</li>
</ul>
</div>
</nav>
</div>
</div>
<script>
'use strict';
const initMenuMobile_67627d04396d7 = () => {
return {
mobilePanelActiveId: null,
open: false
}
}
</script>
<!--Logo-->
<div class="pb-2 order-first w-full ss:order-none ss:w-auto ss:pb-0">
<a class="flex items-center justify-center text-xl font-medium tracking-wide text-gray-800
no-underline hover:no-underline font-title" href="https://www.onahole.com/" title="Onahole dot Com" aria-label="store logo">
<img src="https://cdn.onahole.com/media/logo/default/onahole_dot_com_logo.jpg" title="Onahole dot Com" alt="Onahole dot Com" width="189" height="64">
</a>
</div>
<nav class=" hidden lg:block mx-auto" data-mage-init="{"menu": {}}" x-data="initMenuDesktop_67627d043e1f5()">
<ul class="__list flex xl:gap-x-5">
<li class="__item py-5 text-base text-blue-700 font-semibold __item--parent" @mouseenter="hoverPanelActiveId = '0'" @mouseleave="hoverPanelActiveId = 0">
<div class="py-1.5 px-3 rounded-md whitespace-nowrap bg-white" :class="{
'bg-white' : hoverPanelActiveId !== '0',
'bg-blue-100' : hoverPanelActiveId === '0'
}">
<div data-menu="menu-1" class="__link flex items-center gap-x-1
rounded cursor-pointer">
Shop All Products <svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-3 h-3" width="12" height="12" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"></path><title>chevron-down</title></svg>
</div> </div>
<div class="hidden shadow-md mx-auto max-w-9xl pt-0.5 inset-x-0 w-full h-fit absolute top-full z-50" :class="{
'hidden' : hoverPanelActiveId !== '0',
'block' : hoverPanelActiveId === '0'
}"> <div class="bg-white rounded-md pt-10 px-10 pb-20 relative">
<ul class="__inner-list grid grid-cols-3 gap-x-10 gap-y-16 __inner-list--level1" data-menu="menu-1">
<li class="__inner-item __inner-item--level1">
<div class="desktop-menu-item flex items-center">
<a href="https://www.onahole.com/onaholes" class="__inner-link flex items-center" data-menu="menu-2">
<img src="https://cdn.onahole.com/media/snowdog/menu/node/g/r/group_1000004049.png" alt="onahole" loading="lazy">
Onahole</a>
</div>
</li>
<li class="__inner-item __inner-item--level1">
<div class="desktop-menu-item flex items-center">
<a href="https://www.onahole.com/sex-doll-torso" class="__inner-link flex items-center" data-menu="menu-3">
<img src="https://cdn.onahole.com/media/snowdog/menu/node/g/r/group_1000004023.png" alt="" loading="lazy">
Sex Doll Torso</a>
</div>
</li>
<li class="__inner-item __inner-item--level1">
<div class="desktop-menu-item flex items-center">
<a href="https://www.onahole.com/tit-sex-toys" class="__inner-link flex items-center" data-menu="menu-4">
<img src="https://cdn.onahole.com/media/snowdog/menu/node/g/r/group_1000004048_2_.png" alt="" loading="lazy">
Tit Sex Toys</a>
</div>
</li>
<li class="__inner-item __inner-item--level1">
<div class="desktop-menu-item flex items-center">
<a href="https://www.onahole.com/onahip" class="__inner-link flex items-center" data-menu="menu-5">
<img src="https://cdn.onahole.com/media/snowdog/menu/node/g/r/group_1000004048.png" alt="" loading="lazy">
Onahip</a>
</div>
</li>
<li class="__inner-item __inner-item--level1">
<div class="desktop-menu-item flex items-center">
<a href="https://www.onahole.com/mini-sex-dolls" class="__inner-link flex items-center" data-menu="menu-6">
<img src="https://cdn.onahole.com/media/snowdog/menu/node/g/r/group_1000004036.png" alt="Mini Sex Dolls" loading="lazy">
Mini Sex Dolls</a>
</div>
</li>
<li class="__inner-item __inner-item--level1">
<div class="desktop-menu-item flex items-center">
<a href="https://www.onahole.com/onahole-cleaning" class="__inner-link flex items-center" data-menu="menu-7">
<img src="https://cdn.onahole.com/media/snowdog/menu/node/g/r/group_1000004023_1_.png" alt="Onahole Cleaning" loading="lazy">
Onahole Cleaning</a>
</div>
</li>
<li class="__inner-item __inner-item--level1">
<div class="desktop-menu-item flex items-center">
<a href="https://www.onahole.com/new" class="__inner-link flex items-center" data-menu="menu-8">
<img src="https://cdn.onahole.com/media/snowdog/menu/node/g/r/group_1000004048_1_.png" alt="New Onaholes" loading="lazy">
New Onaholes</a>
</div>
</li>
<li class="__inner-item __inner-item--level1">
<div class="desktop-menu-item flex items-center">
<a href="https://www.onahole.com/vibrator-for-men" class="__inner-link flex items-center" data-menu="menu-9">
<img src="https://cdn.onahole.com/media/snowdog/menu/node/g/r/group_1000004036_1_.png" alt="Vibrator for men" loading="lazy">
Vibrator for men</a>
</div>
</li>
<li class="__inner-item __inner-item--level1">
<div class="desktop-menu-item flex items-center">
<a href="https://www.onahole.com/japanese-lube" class="__inner-link flex items-center" data-menu="menu-10">
<img src="https://cdn.onahole.com/media/snowdog/menu/node/g/r/group_1000004023_2_.png" alt="Japanese Lube" loading="lazy">
Japanese Lube</a>
</div>
</li>
<li class="__inner-item __inner-item--level1">
<div class="desktop-menu-item flex items-center">
<div class="flex flex-nowrap items-center justify-end absolute
bottom-0 inset-x-0 w-full h-10 bg-grey-100 rounded-b-md px-3">
<a href="/all" data-menu="menu-11" class="__inner-link flex">
<svg class="mr-2 w-5 h-5" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 0H1C.4 0 0 .4 0 1v7c0 .6.4 1 1 1h7c.6 0 1-.4 1-1V1c0-.6-.4-1-1-1Zm0 11H1c-.6 0-1 .4-1 1v7c0 .6.4 1 1 1h7c.6 0 1-.4 1-1v-7c0-.6-.4-1-1-1ZM19 0h-7c-.6 0-1 .4-1 1v7c0 .6.4 1 1 1h7c.6 0 1-.4 1-1V1c0-.6-.4-1-1-1Zm0 11h-7c-.6 0-1 .4-1 1v7c0 .6.4 1 1 1h7c.6 0 1-.4 1-1v-7c0-.6-.4-1-1-1Z" fill="#9DA3AE"></path>
</svg>
View all products </a>
</div>
</div>
</li>
</ul>
</div>
</div>
</li>
<li class="__item py-5 text-base text-blue-700 font-semibold " @mouseenter="hoverPanelActiveId = '1'" @mouseleave="hoverPanelActiveId = 0">
<div class="py-1.5 px-3 rounded-md whitespace-nowrap bg-white" :class="{
'bg-white' : hoverPanelActiveId !== '1',
'bg-blue-100' : hoverPanelActiveId === '1'
}">
<a href="https://www.onahole.com/about-us" class="__link" data-menu="menu-13">
About us</a>
</div>
</li>
<li class="__item py-5 text-base text-blue-700 font-semibold " @mouseenter="hoverPanelActiveId = '2'" @mouseleave="hoverPanelActiveId = 0">
<div class="py-1.5 px-3 rounded-md whitespace-nowrap bg-white" :class="{
'bg-white' : hoverPanelActiveId !== '2',
'bg-blue-100' : hoverPanelActiveId === '2'
}">
<a href="https://www.onahole.com/onapoints" class="__link" data-menu="menu-44">
Ona Points</a>
</div>
</li>
<li class="__item py-5 text-base text-blue-700 font-semibold " @mouseenter="hoverPanelActiveId = '3'" @mouseleave="hoverPanelActiveId = 0">
<div class="py-1.5 px-3 rounded-md whitespace-nowrap bg-white" :class="{
'bg-white' : hoverPanelActiveId !== '3',
'bg-blue-100' : hoverPanelActiveId === '3'
}">
<a href="https://www.onahole.com/blog/" data-menu="menu-43" class="__link flex items-center" target="_blank" rel="noopener">
Blog </a>
</div>
</li>
<li class="__item py-5 text-base text-blue-700 font-semibold " @mouseenter="hoverPanelActiveId = '4'" @mouseleave="hoverPanelActiveId = 0">
<div class="py-1.5 px-3 rounded-md whitespace-nowrap bg-white" :class="{
'bg-white' : hoverPanelActiveId !== '4',
'bg-blue-100' : hoverPanelActiveId === '4'
}">
<a href="contact" data-menu="menu-16" class="__link flex items-center">
Contact </a>
</div>
</li>
</ul>
</nav>
<script>
'use strict';
const initMenuDesktop_67627d043e1f5 = () => {
return {
hoverPanelActiveId: null,
}
}
</script>
<div class="flex items-center ml-auto">
<!--Compare Icon-->
<a id="compare-link" class="relative invisible inline-block ml-1 no-underline sm:ml-3 hover:text-black hidden" :class="{ 'hidden': !(itemCount > 0) }" href="https://www.onahole.com/catalog/product_compare/index/" title="Compare Products" x-data="initCompareHeader()" @private-content-loaded.window="receiveCompareData($event.detail.data)">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="h-6 w-6 hover:text-black" width="25" height="25" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m3 6 3 1m0 0-3 9a5.002 5.002 0 0 0 6.001 0M6 7l3 9M6 7l6-2m6 2 3-1m-3 1-3 9a5.002 5.002 0 0 0 6.001 0M18 7l3 9m-3-9-6-2m0-2v2m0 16V5m0 16H9m3 0h3"></path><title>scale</title></svg>
<span class="sr-only label">
Compare Products </span>
<span class="absolute top-0 right-0 h-5 px-2 py-1 -mt-5 -mr-4 text-xs font-semibold
leading-none text-center text-white uppercase transform -translate-x-1
translate-y-1/2 bg-yellow-500 rounded-full">
<span x-text="itemCount">0</span>
<span x-show="itemCount === 1" class="sr-only" style="display: none;">
item </span>
<span x-show="itemCount > 1" class="sr-only" style="display: none;">
items </span>
</span>
</a>
<!--Search Icon-->
<button id="menu-search-icon" class="inline-block ml-1 no-underline sm:ml-3 hover:text-black" @click.prevent="
searchOpen = !searchOpen;
$nextTick(() => {
const searchInput = document.querySelector('#search');
searchInput.focus();
searchInput.select();
});
">
<span class="sr-only label">
Search </span>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="h-6 w-6 hover:text-black" width="25" height="25" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m21 21-6-6m2-5a7 7 0 1 1-14 0 7 7 0 0 1 14 0Z"></path><title>search</title></svg>
</button>
<!--Customer Icon & Dropdown-->
<div x-data="{ open: false }" class="relative inline-block ml-1 sm:ml-3">
<a href="https://www.onahole.com/customer/account/" id="customer-menu" class="block hover:text-black" @click.prevent="open = true" :aria-expanded="open ? 'true' : 'false'" aria-label="My Account" aria-expanded="false">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="h-6 w-6" width="25" height="25" aria-hidden="true" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 1 1-8 0 4 4 0 0 1 8 0ZM12 14a7 7 0 0 0-7 7h14a7 7 0 0 0-7-7Z"></path><title>user</title></svg>
</a>
<nav class="absolute right-0 z-20 w-40 py-2 mt-2 -mr-4 px-1 overflow-auto origin-top-right rounded-sm
shadow-lg sm:w-48 lg:mt-3 bg-container-lighter" x-show="open" @click.outside="open = false" aria-labelledby="customer-menu" style="display: none;">
<a class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" onclick="hyva.setCookie && hyva.setCookie(
'login_redirect',
window.location.href,
1
)" href="https://www.onahole.com/customer/account/index/" rel="nofollow">
Sign In </a>
<a class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" href="https://www.onahole.com/customer/account/create/" rel="nofollow">
Create an Account </a>
</nav>
</div>
<!--Cart Icon-->
<a id="menu-cart-icon" @click.prevent.stop="$dispatch('toggle-cart',{});" class="relative inline-block ml-1 no-underline sm:ml-3 hover:text-black" href="https://www.onahole.com/checkout/cart/index/" rel="nofollow">
<span class="sr-only label">
Cart </span>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="h-6 w-6 hover:text-black" width="25" height="25" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13 5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4Zm-8 2a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z"></path><title>shopping-cart</title></svg>
<span x-text="cart.summary_count" class="absolute top-0 right-0 hidden h-5 px-2 py-1 -mt-5 -mr-4 text-xs font-semibold
leading-none text-center text-white uppercase transform -translate-x-1
translate-y-1/2 rounded-full bg-primary" :class="{
'hidden': !cart.summary_count,
'block': cart.summary_count }">0</span>
</a>
<div x-data="{ open: false }" class="relative inline-block ml-1 sm:ml-3">
<img src="https://www.onahole.com/static/frontend/Onaholecom/default/en_US/images/flags/usa-flag.webp" class="w-6 h-6 inline-block cursor-pointer" loading="lazy" @click.prevent="open = true" :aria-expanded="open ? 'true' : 'false'" alt="United States" aria-expanded="false">
<div class="absolute right-0 z-20 mt-2 overflow-auto origin-top-right rounded-sm
shadow-lg bg-white flex flex-col py-2 -mr-4 px-1" x-show="open" @click.outside="open = false" aria-labelledby="language-switcher" style="display: none;">
<a class="px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100 flex gap-x-3.5" href="https://www.onahole.co.uk/">
<img src="https://www.onahole.com/static/frontend/Onaholecom/default/en_US/images/flags/uk-flag.webp" class="w-6 h-6 inline-block" loading="lazy" alt="United Kingdom">
<span class="whitespace-nowrap mr-6">United Kingdom, GBP</span>
</a>
<a class="px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100 flex gap-x-3.5" href="https://www.motsutoys.com/">
<img src="https://www.onahole.com/static/frontend/Onaholecom/default/en_US/images/flags/european-flag.webp" class="w-6 h-6 inline-block" loading="lazy" alt="European Union">
<span class="whitespace-nowrap mr-6">European Union, EUR</span>
</a>
<a class="px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100 flex gap-x-3.5" href="https://www.motsutoys.fr/">
<img src="https://www.onahole.com/static/frontend/Onaholecom/default/en_US/images/flags/france-flag.webp" class="w-6 h-6 inline-block" loading="lazy" alt="France">
<span class="whitespace-nowrap mr-6">France, EUR</span>
</a>
<a class="px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100 flex gap-x-3.5" href="https://www.motsutoys.de/">
<img src="https://www.onahole.com/static/frontend/Onaholecom/default/en_US/images/flags/germany-flag.webp" class="w-6 h-6 inline-block" loading="lazy" alt="Germany">
<span class="whitespace-nowrap mr-6">Germany, EUR</span>
</a>
<a class="px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100 flex gap-x-3.5" href="https://www.motsutoys.nl/">
<img src="https://www.onahole.com/static/frontend/Onaholecom/default/en_US/images/flags/netherlands-flag.webp" class="w-6 h-6 inline-block" loading="lazy" alt="Nederland">
<span class="whitespace-nowrap mr-6">Nederland, EUR</span>
</a>
</div>
</div>
</div>
</div>
<!--Search-->
<div class="absolute z-10 w-full border-t shadow-sm bg-container-lighter border-container-lighter" id="search-content" :class="{ 'block': searchOpen}" x-show="searchOpen" @click.outside="searchOpen = false" style="display: none;">
<div class="container py-2 mx-auto text-black" x-data="initMirasvitSearch()" @click.away="closeSearch">
<form class="form minisearch" id="search_mini_form" action="https://www.onahole.com/catalogsearch/result/" method="get" autocomplete="off">
<label class="hidden" for="search" data-role="minisearch-label">
<span>Search</span>
</label>
<input id="search" x-ref="searchInput" type="search" name="q" value="" placeholder="Search entire store here..." maxlength="128" class="w-full p-2 text-lg leading-normal transition appearance-none text-grey-800
focus:outline-none focus:border-transparent lg:text-xl" x-on:keyup.debounce.300="doSearch($refs.searchInput.value)" x-on:click.debounce.150="openSearch" x-on:keydown.debounce.100="startSearch($refs.searchInput.value)">
</form>
<div x-show="isOpen" id="mirasvitSearchResults" class="border-solid border-4 border-light-blue-500 w-full p-2 mt-1 text-lg leading-normal transition appearance-none text-grey-800 lg:text-xl relative" style="display: none;">
<div class="flex flex-row justify-center items-center w-full h-full absolute select-none z-40" style="left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%); background: rgba(255, 255, 255, 0.7); display: none;" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0">
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<svg width="57" height="57" viewBox="0 0 57 57" xmlns="http://www.w3.org/2000/svg" stroke="#fff" class="stroke-current text-primary">
<g fill="none" fill-rule="evenodd">
<g transform="translate(1 1)" stroke-width="2">
<circle cx="5" cy="50" r="5">
<animate attributeName="cy" begin="0s" dur="2.2s" values="50;5;50;50" calcMode="linear" repeatCount="indefinite"></animate>
<animate attributeName="cx" begin="0s" dur="2.2s" values="5;27;49;5" calcMode="linear" repeatCount="indefinite"></animate>
</circle>
<circle cx="27" cy="5" r="5">
<animate attributeName="cy" begin="0s" dur="2.2s" from="5" to="5" values="5;50;50;5" calcMode="linear" repeatCount="indefinite"></animate>
<animate attributeName="cx" begin="0s" dur="2.2s" from="27" to="27" values="27;49;5;27" calcMode="linear" repeatCount="indefinite"></animate>
</circle>
<circle cx="49" cy="50" r="5">
<animate attributeName="cy" begin="0s" dur="2.2s" values="50;50;5;50" calcMode="linear" repeatCount="indefinite"></animate>
<animate attributeName="cx" from="49" to="49" begin="0s" dur="2.2s" values="49;5;27;49" calcMode="linear" repeatCount="indefinite"></animate>
</circle>
</g>
</g>
</svg>
<div class="ml-10 text-primary text-xl">
Loading... </div>
</div>
<template x-if="hotSearch">
<div>
<p class="text-lg leading-normal transition appearance-none text-grey-800 lg:text-xl border-b border-100 p-2 flex">
Hot Searches </p>
<div class="my-3 flex flex-wrap">
<span x-on:click="hotSearchClickEvent" class="m-1 bg-gray-200 hover:bg-gray-300 rounded-full px-2 font-bold text-sm leading-loose cursor-pointer">Searching</span>
<span x-on:click="hotSearchClickEvent" class="m-1 bg-gray-200 hover:bg-gray-300 rounded-full px-2 font-bold text-sm leading-loose cursor-pointer">Onahole</span>
<span x-on:click="hotSearchClickEvent" class="m-1 bg-gray-200 hover:bg-gray-300 rounded-full px-2 font-bold text-sm leading-loose cursor-pointer">Fuck</span>
<span x-on:click="hotSearchClickEvent" class="m-1 bg-gray-200 hover:bg-gray-300 rounded-full px-2 font-bold text-sm leading-loose cursor-pointer">Anal</span>
<span x-on:click="hotSearchClickEvent" class="m-1 bg-gray-200 hover:bg-gray-300 rounded-full px-2 font-bold text-sm leading-loose cursor-pointer">Kyo</span>
</div>
</div>
</template>
<template x-if="searchResults">
<div class="">
<p class="text-lg leading-normal transition appearance-none text-grey-800 lg:text-xl border-b border-100 p-2 flex">
Products <template x-if="searchProducts != ''">
<small class="text-gray-500 ml-1">(<span x-html="searchProductsTotal"></span>)</small>
</template>
</p>
<div class="container mx-auto grid xs:grid-cols-1 mb-6 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6 p-2 md:pt-6 gap-4">
<template x-for="item in searchProducts">
<div class="flex transform transition duration-500 hover:scale-105 flex-wrap md:max-w-md bg-white border border-50 rounded-md overflow-hidden flex-col lg:flex-row xl:flex-nowrap">
<a x-bind:href="`${item.url}`" class="w-full flex flex-wrap flex-col">
<div class="w-full">
<img x-bind:src="`${item.imageUrl}`" class="mx-auto">
</div>
<div class="w-full p-4">
<h4 class="text-gray-900 font-bold text-base lg:text-lg" x-html="item.name"></h4>
<div class="flex items-center mt-3 lg:flex-col xl:flex-row">
<span class="text-gray-700 font-medium text-base" x-html="item.rating"></span>
</div>
<p class="mt-2 text-gray-600 text-xs truncate" x-html="item.description"></p>
<div class="flex items-center justify-end mt-3 lg:flex-col xl:flex-row">
<span class="text-gray-700 font-medium text-base" x-html="item.price"></span>
</div>
</div>
</a>
</div>
</template>
<template x-if="searchProducts == ''">
<p>No results found.</p>
</template>
</div>
<template x-if="searchCategories != ''">
<div class="mb-6">
<p class="text-lg leading-normal transition appearance-none text-grey-800 lg:text-xl border-b border-100 p-2 flex">
Categories <small class="text-gray-500 ml-1">(<span x-html="searchCategoriesTotal"></span>)</small>
</p>
<div class="px-2">
<template x-for="category in searchCategories">
<a x-bind:href="`${category.url}`">
<div class="my-2 flex flex-wrap">
<span class="m-1 transform transition duration-500 hover:scale-105 font-bold text-sm leading-loose cursor-pointer" x-html="category.name"></span>
</div>
</a>
</template>
</div>
</div>
</template>
<template x-if="searchPages != ''">
<div class="mb-6">
<p class="text-lg leading-normal transition appearance-none text-grey-800 lg:text-xl border-b border-100 p-2 flex">
Pages <small class="text-gray-500 ml-1">(<span x-html="searchPagesTotal"></span>)</small>
</p>
<div class="px-2">
<template x-for="page in searchPages">
<a x-bind:href="`${page.url}`">
<div class="my-2 flex flex-wrap">
<span class="m-1 transform transition duration-500 hover:scale-105 font-bold text-sm leading-loose cursor-pointer" x-html="page.name"></span>
</div>
</a>
</template>
</div>
</div>
</template>
<template x-if="searchPosts != ''">
<div class="mb-6">
<p class="text-lg leading-normal transition appearance-none text-grey-800 lg:text-xl border-b border-100 p-2 flex">
Posts <small class="text-gray-500 ml-1">(<span x-html="searchPostsTotal"></span>)</small>
</p>
<div class="px-2">
<template x-for="item in searchPosts">
<a x-bind:href="`${item.url}`">
<div class="my-2 flex flex-wrap">
<span class="m-1 transform transition duration-500 hover:scale-105 font-bold text-sm leading-loose cursor-pointer" x-html="item.name"></span>
</div>
</a>
</template>
</div>
</div>
</template>
<div class="p-4 w-full order-2 col-span-12 bg-gray-100">
<div class="flex items-center justify-center">
<a x-bind:href="numberResultsUrl">
<p class="text-gray-900 transition duration-300 hover:text-gray-500 font-bold text-base lg:text-lg" x-html="numberResults"></p>
</a>
</div>
</div>
</div>
</template>
<template x-if="noResults">
<div class="bg-gray-100 p-2">
<p class="text-lg leading-normal transition appearance-none text-grey-800 lg:text-xl" x-html="noResultsText"></p>
</div>
</template>
</div>
</div>
<style>
i {
margin: 5px;
}
</style>
<script>
function initMirasvitSearch() {
return {
//initialize Variables
hotSearch: false,
searchResults: false,
noResults: false,
isLoading: false,
isOpen: false,
blockConfig: {"query":"","priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"minSearchLength":3,"url":"https:\/\/www.onahole.com\/searchautocomplete\/ajax\/suggest\/","storeId":"1","delay":300,"isAjaxCartButton":false,"isShowCartButton":false,"isShowImage":true,"isShowPrice":true,"isShowSku":false,"isShowRating":true,"isShowDescription":true,"isShowStockStatus":false,"layout":"","popularTitle":"Popular Suggestions","popularSearches":["Searching","Onahole","Fuck","Anal","Kyo"],"isTypeaheadEnabled":false,"typeaheadUrl":"https:\/\/www.onahole.com\/searchautocomplete\/ajax\/typeahead\/","minSuggestLength":2,"currency":"USD","limit":9},
xhttp: false,
noResultsText: '',
numberResults: '',
numberResultsUrl: '',
searchProductsTotal: '',
searchCategoriesTotal: '',
searchPagesTotal: '',
searchProducts: [],
searchCategories: [],
searchPages: [],
searchPosts: [],
searchMap: {
'magento_cms_page': 'Pages',
'magento_catalog_category': 'Categories',
'magento_catalog_product': 'Products',
'magefan_blog_post': 'Posts'
},
hotSearchClickEvent: function (ev) {
var hotSearchClick = event.currentTarget.innerText;
document.getElementById("search").value = hotSearchClick;
this.doSearch(hotSearchClick);
},
openSearch: function () {
this.isOpen = true;
searchValue = document.getElementById("search").value.length;
if (searchValue >= this.blockConfig.minSearchLength) {
this.hideHotSearch();
} else {
this.showHotSearch();
this.hideSearchResults();
}
},
startSearch: function (e) {
if (e) {
this.isOpen = true;
}
},
closeSearch: function () {
this.isOpen = false;
},
showHotSearch: function () {
this.hotSearch = true;
},
hideHotSearch: function () {
this.hotSearch = false;
},
showSearchResults: function () {
this.searchResults = true;
},
hideSearchResults: function () {
this.searchResults = false;
},
showNoResults: function () {
this.noResults = true;
},
hideNoResults: function () {
this.noResults = false;
},
setNoResultsText(text) {
if (!text) {
return;
}
this.noResultsText = text;
},
setNumberResults(text) {
this.numberResults = text;
},
setNumberResultsUrl(text) {
this.numberResultsUrl = text;
},
resetSearchData: function () {
// Reinitialize Variables to avoid wrong search results.
this.searchPages = [];
this.searchPagesTotal = 0;
this.searchCategories = [];
this.searchCategoriesTotal = 0;
this.searchProducts = [];
this.searchProductsTotal = 0;
},
doSearch: function (query) {
var self = this;
// Min search length
if (query.length < this.blockConfig.minSearchLength) {
this.showHotSearch();
this.isLoading = false;
this.hideSearchResults();
this.hideNoResults();
return;
} else {
this.hideHotSearch();
this.isLoading = true;
this.showSearchResults();
this.hideNoResults();
}
// AJAX for searchautocomplete/ajax/suggest/
if (this.xhttp) {
try {
this.xhttp.abort();
} catch {
}
}
this.xhttp = new XMLHttpRequest();
var xhttp = this.xhttp;
var queryEncoded = encodeURIComponent(query);
var url = this.blockConfig.url.replace(/\/$/, "") + "/?q=" + queryEncoded + "&store_id=" + this.blockConfig.storeId + "&cat=false";
xhttp.open("GET", url, true);
xhttp.setRequestHeader("Content-Type", "application/json");
xhttp.onreadystatechange = function () {
if (this.readyState === 4 && this.status === 200) {
// Response from ajax call in JSON.
var response = JSON.parse(this.responseText);
self.resetSearchData();
// Product Search Results
for (index in response.indexes) {
if (response.indexes[index].items.length > 0) {
var res = response.indexes[index];
var map = null;
if (self.searchMap[res.identifier]) {
map = self.searchMap[res.identifier];
self['search' + map] = res.items;
self['search' + map + 'Total'] = res.totalItems;
}
}
}
self.isLoading = false;
self.hideNoResults();
self.setNumberResults(response.textAll);
self.setNumberResultsUrl(response.urlAll);
if (response.noResults) {
self.setNoResultsText(response.textEmpty);
self.hideSearchResults();
self.showNoResults();
}
}
};
xhttp.send();
}
}
}
</script>
</div>
<!--Cart Drawer-->
<script>
function initCartDrawer() {
return {
open: false,
isLoading: false,
cart: {},
maxItemsToDisplay: 10,
itemsCount: 0,
totalCartAmount: 0,
getData(data) {
if (data.cart) {
this.cart = data.cart;
this.itemsCount = data.cart.items && data.cart.items.length || 0;
this.totalCartAmount = this.cart.summary_count;
this.setCartItems();
}
this.isLoading = false;
},
cartItems: [],
getItemCountTitle() {
return hyva.strf('\u00250\u0020of\u0020\u00251\u0020products\u0020in\u0020cart\u0020displayed', this.maxItemsToDisplay, this.totalCartAmount)
},
setCartItems() {
this.cartItems = this.cart.items && this.cart.items.sort((a, b) => b.item_id - a.item_id) || [];
if (this.maxItemsToDisplay > 0) {
this.cartItems = this.cartItems.slice(0, parseInt(this.maxItemsToDisplay, 10));
}
},
deleteItemFromCart(itemId) {
this.isLoading = true;
const formKey = hyva.getFormKey();
const postUrl = BASE_URL + 'checkout/sidebar/removeItem/';
fetch(postUrl, {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
"body": "form_key=" + formKey + "&item_id=" + itemId,
"method": "POST",
"mode": "cors",
"credentials": "include"
}).then(response => {
if (response.redirected) {
window.location.href = response.url;
} else if (response.ok) {
return response.json();
} else {
window.dispatchMessages && window.dispatchMessages([{
type: 'warning',
text: 'Could\u0020not\u0020remove\u0020item\u0020from\u0020quote.'
}]);
this.isLoading = false;
}
}).then(result => {
window.dispatchMessages && window.dispatchMessages([{
type: result.success ? 'success' : 'error',
text: result.success
? 'You\u0020removed\u0020the\u0020item.'
: result.error_message
}], result.success ? 5000 : 0)
window.dispatchEvent(new CustomEvent('reload-customer-section-data'));
});
},
toggleCartDrawer(event) {
if (event.detail && event.detail.isOpen !== undefined) {
if (event.detail.isOpen) {
this.openCartDrawer()
} else {
this.open = false
this.$refs && this.$refs.cartDialogContent && hyva.releaseFocus(this.$refs.cartDialogContent)
}
} else {
this.openCartDrawer()
}
},
openCartDrawer() {
this.open = true;
this.$nextTick(() => {
this.$refs && this.$refs.cartDialogContent && hyva.trapFocus(this.$refs.cartDialogContent)
})
},
closeCartDrawer() {
this.$dispatch('toggle-cart', { isOpen: false })
}
}
}
</script>
<section x-show="cart" id="cart-drawer" x-data="initCartDrawer()" @private-content-loaded.window="getData($event.detail.data)" @toggle-cart.window="toggleCartDrawer($event)" @keydown.window.escape="closeCartDrawer">
<div role="dialog" aria-labelledby="cart-drawer-title" aria-modal="true" :aria-hidden="!open" class="fixed inset-y-0 right-0 z-30 flex max-w-full" aria-hidden="true">
<div class="backdrop" x-show="open" x-transition:enter="ease-in-out duration-500" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in-out duration-500" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" role="button" @click="closeCartDrawer" aria-label="Close minicart" style="display: none;"></div>
<div class="relative w-screen max-w-md shadow-2xl" x-show="open" x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" x-transition:enter-start="translate-x-full" x-transition:enter-end="translate-x-0" x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" x-transition:leave-start="translate-x-0" x-transition:leave-end="translate-x-full" x-ref="cartDialogContent" role="region" :tabindex="open ? 0 : -1" aria-label="My Cart" tabindex="-1" style="display: none;">
<div class="flex flex-col h-full max-h-screen bg-white shadow-xl">
<header class="relative px-4 py-6 sm:px-6">
<h2 id="cart-drawer-title" class="text-lg font-medium leading-7 text-gray-900">
My Cart <span class="items-total text-xs" x-show="maxItemsToDisplay && maxItemsToDisplay < itemsCount" x-text="getItemCountTitle()" style="display: none;">10 of 0 products in cart displayed</span>
</h2>
</header>
<template x-if="!itemsCount">
<div class="relative px-4 py-6 bg-white border-bs sm:px-6 border-container">
Cart is empty </div>
</template><div class="relative px-4 py-6 bg-white border-bs sm:px-6 border-container">
Cart is empty </div>
<template x-if="itemsCount">
<div class="relative grid gap-6 px-4 py-6 overflow-y-auto overscroll-y-contain bg-white border-b
sm:gap-8 sm:px-6 border-container">
<template x-for="item in cartItems">
<div class="flex items-start p-3 -m-3 space-x-4 transition duration-150
ease-in-out rounded-lg hover:bg-gray-100">
<a :href="item.product_url" class="w-1/4" :aria-label="hyva.strf('Product\u0020\u0022\u00250\u0022', item.product_name)">
<img :src="item.product_image.src" :width="item.product_image.width" :height="item.product_image.height" loading="lazy" alt="">
</a>
<div class="w-3/4 space-y-2">
<div>
<p class="text-xl">
<span x-html="item.qty"></span> x <span x-html="item.product_name"></span>
</p>
<p class="text-sm"><span x-html="item.product_sku"></span></p>
</div>
<template x-for="option in item.options">
<div class="pt-2">
<p class="font-semibold" x-text="option.label + ':'"></p>
<p class="text-secondary" x-html="option.value"></p>
</div>
</template>
<p><span x-html="item.product_price"></span></p>
<div class="pt-4">
<a :href="item.configure_url" x-show="item.product_type !== 'grouped'" class="inline-flex p-2 mr-2 btn btn-primary" :aria-label="hyva.strf('Edit\u0020product\u0020\u0022\u00250\u0022', item.product_name)">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" width="20" height="20" aria-hidden="true" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m15.232 5.232 3.536 3.536m-2.036-5.036a2.5 2.5 0 1 1 3.536 3.536L6.5 21.036H3v-3.572L16.732 3.732Z"></path><title>pencil</title></svg>
</a>
<button type="button" class="inline-flex p-2 btn btn-primary" @click="deleteItemFromCart(item.item_id)" :aria-label="hyva.strf('Remove\u0020product\u0020\u0022\u00250\u0022\u0020from\u0020cart', item.product_name)">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" width="20" height="20" aria-hidden="true" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 7-.867 12.142A2 2 0 0 1 16.138 21H7.862a2 2 0 0 1-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v3M4 7h16"></path><title>trash</title></svg>
</button>
</div>
</div>
</div>
</template>
</div>
</template>
<template x-if="itemsCount">
<div>
<div class="relative grid gap-6 px-4 py-6 bg-white sm:gap-8 sm:px-6">
<div class="w-full p-3 -m-3 space-x-4 transition duration-150 ease-in-out rounded-lg
hover:bg-gray-100">
<p>Subtotal: <span x-html="cart.subtotal"></span></p>
</div>
<div class="w-full p-3 -m-3 space-x-4 transition duration-150 ease-in-out rounded-lg
hover:bg-gray-100">
<a @click.prevent.stop="$dispatch('toggle-authentication',
{url: 'https://www.onahole.com/checkout/'});" href="https://www.onahole.com/checkout/" class="inline-flex btn btn-primary">
Checkout </a>
<span>or</span>
<a href="https://www.onahole.com/checkout/cart/" class="underline">
View and Edit Cart </a>
</div>
</div>
</div>
</template>
</div>
<button type="button" @click="closeCartDrawer" aria-label="Close minicart" class="absolute top-0 right-0 p-4 mt-2 text-gray-300 transition-colors hover:text-black">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"></path><title>x</title></svg>
</button>
</div>
<div class="flex flex-row justify-center items-center w-full h-full fixed select-none z-50" style="left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%); background: rgba(255, 255, 255, 0.7); display: none;" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0">
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 57 57" stroke="currentColor" class="text-primary" width="57" height="57" role="img">
<g fill="none" fill-rule="evenodd">
<g transform="translate(1 1)" stroke-width="2">
<circle cx="5" cy="50" r="5">
<animate attributeName="cy" begin="0s" dur="2.2s" values="50;5;50;50" calcMode="linear" repeatCount="indefinite"></animate>
<animate attributeName="cx" begin="0s" dur="2.2s" values="5;27;49;5" calcMode="linear" repeatCount="indefinite"></animate>
</circle>
<circle cx="27" cy="5" r="5">
<animate attributeName="cy" begin="0s" dur="2.2s" from="5" to="5" values="5;50;50;5" calcMode="linear" repeatCount="indefinite"></animate>
<animate attributeName="cx" begin="0s" dur="2.2s" from="27" to="27" values="27;49;5;27" calcMode="linear" repeatCount="indefinite"></animate>
</circle>
<circle cx="49" cy="50" r="5">
<animate attributeName="cy" begin="0s" dur="2.2s" values="50;50;5;50" calcMode="linear" repeatCount="indefinite"></animate>
<animate attributeName="cx" from="49" to="49" begin="0s" dur="2.2s" values="49;5;27;49" calcMode="linear" repeatCount="indefinite"></animate>
</circle>
</g>
</g>
<title>loader</title></svg>
<div class="ml-10 text-primary text-xl">
Loading... </div>
</div>
</div>
</section>
<!--Authentication Pop-Up-->
<script>
function initAuthentication() {
return {
open: false,
forceAuthentication: false,
checkoutUrl: 'https://www.onahole.com/checkout/index/',
errors: 0,
hasCaptchaToken: 0,
displayErrorMessage: false,
errorMessages: [],
setErrorMessages: function setErrorMessages(messages) {
this.errorMessages = [messages];
this.displayErrorMessage = this.errorMessages.length;
},
submitForm: function () {
// Do not rename $form, the variable is expected to be declared in the recaptcha output
const $form = document.querySelector('#login-form');
if (!this.hasCaptchaToken) {
this.errors = 1;
const executeGreCaptcha = () => {
grecaptcha.ready(() => {
grecaptcha.execute(
'6Ldu4YopAAAAAHqA8_HcRgpcHIAhG5R_tKYDclgQ',
{action: 'submit'}
).then((token) => {
if (token && token.length > 0) {
$form['g\u002Drecaptcha\u002Dresponse'].value = token;
this.errors = 0;
this.hasCaptchaToken = 1;
(this.submitForm || $form.submit).call(this);
} else {
this.errors = 1;
const error = 'ReCaptcha\u0020validation\u0020failed,\u0020please\u0020try\u0020again';
if (this.setErrorMessages) {
this.setErrorMessages([error])
this.displayErrorMessage = true;
} else {
window.dispatchMessages && window.dispatchMessages([{type: "error", text: error}], 5000);
}
}
}).catch(exception => {
console.error(exception || `An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?`)
});
})
}
if (window.grecaptcha) {
executeGreCaptcha();
} else {
const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6Ldu4YopAAAAAHqA8_HcRgpcHIAhG5R_tKYDclgQ";
const script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', recaptchaUrl);
document.head.appendChild(script);
script.addEventListener("load", executeGreCaptcha, false);
}
}
if (this.errors === 0) {
this.dispatchLoginRequest($form);
}
},
onPrivateContentLoaded: function (data) {
const isLoggedIn = data.customer && data.customer.firstname;
if (data.cart && !isLoggedIn) {
this.forceAuthentication = !data.cart.isGuestCheckoutAllowed;
}
},
redirectIfAuthenticated: function (event) {
if (event.detail && event.detail.url) {
this.checkoutUrl = event.detail.url;
}
if (!this.forceAuthentication) {
window.location.href = this.checkoutUrl;
}
},
dispatchLoginRequest: function(form) {
this.isLoading = true;
const username = this.$refs['customer-email'].value;
const password = this.$refs['customer-password'].value;
const formKey = hyva.getFormKey();
const bodyFields = {
'username': username,
'password': password,
'formKey': formKey
};
const fieldName = 'g\u002Drecaptcha\u002Dresponse';
const recaptchaField = fieldName && form[fieldName];
if (recaptchaField) {
bodyFields[fieldName] = recaptchaField.value;
}
fetch('https://www.onahole.com/customer/ajax/login/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
},
body: JSON.stringify(bodyFields)
}
).then(response => {
return response.json()
}
).then(data=> {
this.isLoading = false;
if (data.errors) {
dispatchMessages([{
type: 'error',
text: data.message
}], 5000);
this.errors = 1;
this.hasCaptchaToken = 0;
} else {
window.location.href = this.checkoutUrl;
}
});
}
}
}
</script>
<section id="authentication-popup" x-data="initAuthentication()" @private-content-loaded.window="onPrivateContentLoaded($event.detail.data)" @toggle-authentication.window="open = forceAuthentication; redirectIfAuthenticated(event)" @keydown.window.escape="open = false">
<div role="dialog" aria-modal="true" @click.outside="open = false" class="inset-y-0 right-0 z-30 flex max-w-full" :class="{'fixed': open }" x-show="open" style="display: none;">
<div class="relative w-screen max-w-md pt-16 bg-container-lighter" x-show="open" x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" x-transition:enter-start="translate-x-full" x-transition:enter-end="translate-x-0" x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" x-transition:leave-start="translate-x-0" x-transition:leave-end="translate-x-full" style="display: none;">
<div x-show="open" x-transition:enter="ease-in-out duration-500" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in-out duration-500" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" class="absolute top-0 right-0 flex p-2 mt-2" style="display: none;">
<button @click="open = false;" aria-label="Close panel" class="p-2 text-gray-300 transition duration-150 ease-in-out hover:text-black">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"></path><title>x</title></svg>
</button>
</div>
<div class="flex flex-col h-full py-6 space-y-6 bg-white shadow-xl overflow-y-auto">
<div class="block-customer-login bg-container border border-container mx-4 p-4 shadow-sm">
<p id="authenticate-customer-login" class="text-lg leading-7 text-gray-900">
<strong class="font-medium">Checkout using your account</strong>
</p>
<form class="form form-login" method="post" @submit.prevent="submitForm();" id="login-form">
<div class="control">
<input type="hidden" value="" name="g-recaptcha-response">
</div>
<div class="fieldset login">
<div class="field email required">
<label class="label" for="form-login-username" form="login-form">
<span>Email Address</span>
</label>
<div class="control">
<input name="username" id="form-login-username" x-ref="customer-email" @change="errors = 0" type="email" required="" class="form-input input-text">
</div>
</div>
<div class="field password required">
<label for="form-login-password" class="label" form="login-form">
<span>Password</span>
</label>
<div class="control">
<input name="password" id="form-login-password" type="password" class="form-input input-text" required="" x-ref="customer-password" @change="errors = 0">
</div>
</div>
<input name="context" type="hidden" value="checkout">
<div class="actions-toolbar flex justify-between pt-6 pb-2 items-center">
<button type="submit" disabled="disabled" data-recaptcha-btn="" class="inline-flex btn btn-primary disabled:opacity-75">
Sign In </button>
<a href="https://www.onahole.com/customer/account/forgotpassword/">
Forgot Your Password? </a>
</div>
</div>
</form>
</div>
<div class="mx-4">
<p class="my-4 text-sm text-gray-900">
This 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>
</div>
<div class="block-new-customer bg-container border border-container mx-4 p-4 shadow-sm">
<p id="authenticate-new-customer" class="text-lg mb-2 leading-7 text-gray-900">
<strong class="font-medium">Checkout as a new customer</strong>
</p>
<div class="block-content">
<p class="mb-1">
Creating an account has many benefits: </p>
<ul class="list-disc pl-5">
<li> See order and shipping status</li>
<li> Track order history</li>
<li> Check out faster</li>
</ul>
<div class="actions-toolbar flex justify-between mt-6 mb-2 items-center">
<a href="https://www.onahole.com/customer/account/create/" class="inline-flex btn btn-primary">
Create an Account </a>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
<script type="application/javascript" async="" src="https://static.klaviyo.com/onsite/js/klaviyo.js?company_id=TZZDb6"></script>
<div x-data="initKlaviyoCustomerTracking()" @private-content-loaded.window="sendCustomerDataToKlaviyo(event.detail.data)"></div>
<script>
function initKlaviyoCustomerTracking() {
return {
sendCustomerDataToKlaviyo(data) {
let _learnq = window._learnq || [];
let customer = data.customer;
if(customer.email) {
_learnq.push(['identify', {
$email: customer.email,
$first_name: customer.firstname ? customer.firstname : '',
$last_name: customer.lastname ? customer.lastname : ''
}]);
}
}
}
}
</script>
</header><main id="maincontent" class="page-main"><div id="contentarea" tabindex="-1"></div>
<div class="page messages"><script>
function initMessages() {
"use strict";
return {
messages: window.mageMessages || [],
isEmpty() {
return this.messages.reduce(
function (isEmpty, message) {
return isEmpty && message === undefined
}, true
)
},
removeMessage(messageIndex) {
this.messages[messageIndex] = undefined;
},
addMessages(messages, hideAfter) {
messages.map((message) => {
this.messages = this.messages.concat(message);
if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) {
hideAfter = window.defaultSuccessMessageTimeout;
}
if (hideAfter) {
this.setHideTimeOut(this.messages.length -1, hideAfter);
}
});
},
setHideTimeOut(messageIndex, hideAfter) {
setTimeout((messageIndex) => {
this.removeMessage(messageIndex);
}, hideAfter, messageIndex);
},
eventListeners: {
['@messages-loaded.window'](event) {
this.addMessages(event.detail.messages, event.detail.hideAfter)
},
['@private-content-loaded.window'](event) {
const data = event.detail.data;
if (
data.messages &&
data.messages.messages &&
data.messages.messages.length
) {
this.addMessages(data.messages.messages);
}
},
['@clear-messages.window']() {
this.messages = [];
}
}
}
}
</script>
<section id="messages" x-data="initMessages()" x-bind="eventListeners" aria-live="assertive" role="alert">
<template x-if="!isEmpty()">
<div class="w-full">
<div class="messages container mx-auto py-3">
<template x-for="(message, index) in messages" :key="index">
<div>
<template x-if="message">
<div class="message" :class="message.type" :ui-id="'message-' + message.type">
<span x-html="message.text"></span>
<button type="button" class="text-white" aria-label="Close message" @click.prevent="removeMessage(index)">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-current" width="18" height="18" aria-hidden="true" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"></path><title>x</title></svg>
</button>
</div>
</template>
</div>
</template>
</div>
</div>
</template>
</section></div><div class="columns"><div class="column main"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="icons-slider bg-grey-125 px-5 py-6 lg:py-9" x-data="initSlider()" x-init="init()">
<div class="flex flex-row mb-6 md:gap-5 md:grid md:grid-cols-2 md:mb-0 lg:flex lg:justify-around">
<div class="flex items-center home-icons-block justify-center md:justify-start" x-show="activeSlide === 1 || isMobile === false">
<div class="mr-3.5">
<svg class="w-10 h-10" viewBox="0 0 32 32"><path d="M 29.871 6.026 l -13.871 -5.1 l -14.394 5.283 v 19.642 l 14.394 5.222 l 14.394 -5.222 v -19.634 l -0.524 -0.192 Z M 15.467 29.746 l -12.795 -4.642 v -17.747 l 12.795 4.642 v 17.747 Z M 16 11.058 l -12.326 -4.472 l 12.326 -4.524 l 12.315 4.528 l -12.315 4.468 Z M 29.328 25.104 l -12.795 4.642 v -17.747 l 12.795 -4.623 v 17.728 Z"></path>
</svg>
</div>
<div class="text-sm">
<h3 class="leading-5 font-semibold tracking-wider">Fast Shipping</h3>
<p>From our US warehouse</p>
</div>
</div>
<div class="flex items-center home-icons-block justify-center md:justify-start" x-show="activeSlide === 2 || isMobile === false">
<div class="mr-3.5">
<svg class="w-10 h-10" viewBox="0 0 32 32"><path d="M 22.544 9.602 c 0.889 -0.782 1.453 -1.924 1.453 -3.198 c 0 -2.352 -1.913 -4.265 -4.265 -4.265 c -1.605 0 -3.004 0.892 -3.732 2.205 c -0.728 -1.313 -2.127 -2.205 -3.732 -2.205 c -2.352 0 -4.265 1.913 -4.265 4.265 c 0 1.274 0.564 2.416 1.453 3.198 h -6.251 v 20.259 h 25.59 v -20.259 h -6.251 Z M 27.729 10.668 v 8.53 h -11.196 v -8.53 h 0.681 l 2.588 4.53 l 0.926 -0.529 l -2.286 -4.001 h 9.287 Z M 16 8.544 l 0.604 1.058 h -1.209 l 0.604 -1.058 Z M 19.732 3.205 c 1.764 0 3.199 1.435 3.199 3.199 s -1.435 3.198 -3.199 3.198 c -1.764 0 -3.199 -1.434 -3.199 -3.198 s 1.435 -3.199 3.199 -3.199 Z M 9.069 6.404 c 0 -1.764 1.435 -3.199 3.199 -3.199 s 3.199 1.435 3.199 3.199 c 0 1.763 -1.435 3.198 -3.199 3.198 s -3.199 -1.434 -3.199 -3.198 Z M 13.558 10.668 l -2.286 4 l 0.926 0.529 l 2.588 -4.53 h 0.681 v 8.53 h -11.196 v -8.53 h 9.287 Z M 4.271 20.265 h 11.196 v 8.53 h -11.196 v -8.53 Z M 16.533 28.794 v -8.53 h 11.196 v 8.53 h -11.196 Z"></path>
</svg>
</div>
<div class="text-sm">
<h3 class="leading-5 font-semibold tracking-wider">Discreet Shipping</h3>
<p>Nobody Will Know Your Order</p>
</div>
</div>
<div class="flex items-center home-icons-block justify-center md:justify-start" x-show="activeSlide === 3 || isMobile === false">
<div class="mr-3.5">
<svg class="w-10 h-10" viewBox="0 0 508 508"><g><g><path d="M254,0C128.3,0,26.1,102.2,26.1,227.9c0,122.9,97.9,223.4,219.8,227.7V508l60.3-60.3l-60.3-60.3v52 c-113-4.4-203.5-97.5-203.5-211.5c0-116.7,94.9-211.6,211.6-211.6s211.6,94.9,211.6,211.6h16.3C481.9,102.2,379.7,0,254,0z M262.1,426.6l21,21l-21,21V426.6z"></path></g></g><g><g><path d="M131.9,105.8V350h244.2V105.8H131.9z M229.6,122.1L229.6,122.1h48.8v32.6h-48.8V122.1z M359.8,333.7H148.2V122.1h65.1 v48.8h81.4v-48.8h65.1V333.7z"></path></g></g><g> <g> <polygon points="319.1,248.2 291.2,279.5 303.4,290.3 311,281.8 311,317.4 327.3,317.4 327.3,281.8 334.8,290.3 347,279.5 "></polygon> </g></g><g> <g> <polygon points="251.4,248.2 223.5,279.5 235.7,290.3 243.2,281.8 243.2,317.4 259.5,317.4 259.5,281.8 267.1,290.3 279.2,279.5 "></polygon></g></g>
</svg>
</div>
<div class="text-sm">
<h3 class="leading-5 font-semibold tracking-wider">14 Days Return</h3>
<p>14 Days Return & Exchange</p>
</div>
</div>
<div class="flex items-center home-icons-block justify-center md:justify-start" x-show="activeSlide === 4 || isMobile === false">
<div class="mr-3.5">
<svg class="w-10 h-10" viewBox="0 0 508 508"><g><g><path d="M376.7,0H131.3c2,61.4-43.6,101.1-98.2,98.2v68.4C37.6,423,254,508,254,508s214.3-85,220.9-341.4V98.2 C407.9,103.9,371.7,41.3,376.7,0z M49.5,166.6v-52.4c52.1-4,93.9-45.7,97.9-97.9h98.5v106.8c-47.6,4-85.6,42-89.6,89.6H52.6 C50.6,197.5,49.5,182.1,49.5,166.6z M245.8,485.9C144.9,434.8,74.6,338.7,55,229h101.2c4,47.6,42,85.6,89.6,89.6V485.9z M172.2,220.9c0-45.1,36.7-81.8,81.8-81.8c45.1,0,81.8,36.7,81.8,81.8c0,45.1-36.7,81.8-81.8,81.8 C208.9,302.7,172.2,266,172.2,220.9z M262.2,485.9V318.6c47.6-4,85.6-42,89.6-89.6H453C433.4,338.7,363.1,434.8,262.2,485.9z M458.5,166.6c0,15.5-1.1,30.9-3.1,46.1H351.7c-4-47.6-42-85.6-89.6-89.6V16.4h98.5c4,52.1,45.8,93.8,97.9,97.8V166.6z"></path></g></g><g><g><polygon points="295.8,182.4 236.2,242 212.2,218.1 200.6,229.6 236.2,265.2 307.4,193.9"></polygon></g></g>
</svg>
</div>
<div class="text-sm">
<h3 class="leading-5 font-semibold tracking-wider">Secure Payment</h3>
<p>Safe & Secure Checkout</p>
</div>
</div>
</div>
<div class="flex justify-center gap-2 md:hidden min-h-3">
<template x-for="slide in slides" :key="slide">
<button class="inline-block w-3 h-3 rounded-full border border-grey-200" :class="{'bg-primary': activeSlide === slide}" x-on:click="activeSlide = slide"></button>
</template><button class="inline-block w-3 h-3 rounded-full border border-grey-200 bg-primary" :class="{'bg-primary': activeSlide === slide}" x-on:click="activeSlide = slide"></button><button class="inline-block w-3 h-3 rounded-full border border-grey-200" :class="{'bg-primary': activeSlide === slide}" x-on:click="activeSlide = slide"></button><button class="inline-block w-3 h-3 rounded-full border border-grey-200" :class="{'bg-primary': activeSlide === slide}" x-on:click="activeSlide = slide"></button><button class="inline-block w-3 h-3 rounded-full border border-grey-200" :class="{'bg-primary': activeSlide === slide}" x-on:click="activeSlide = slide"></button>
</div>
</div>
<script>
function initSlider() {
return {
isMobile: true,
activeSlide: 1,
slides: [1, 2, 3, 4],
init() {
const matchMedia = window.matchMedia('(max-width: 768px)');
this.isMobile = matchMedia.matches;
matchMedia.addEventListener('change', (event) => this.isMobile = event.matches);
var startX
var startY
var endX
var endY
var treshold = 100;
function handleTouch(start,end, cbL, cbR){
if(endX - startX < 0){
cbL();
}else{
cbR();
}
}
var left = () =>{
this.activeSlide = this.activeSlide === 4 ? 1 : this.activeSlide + 1;
}
var right = () =>{
this.activeSlide = this.activeSlide === 1 ? 4 : this.activeSlide - 1;
}
window.onload = function(){
document.querySelector('.icons-slider').addEventListener('touchstart', function(event){
startX = event.touches[0].clientX;
startY = event.touches[0].clientY;
})
document.querySelector('.icons-slider').addEventListener('touchend', function(event){
endX = event.changedTouches[0].clientX;
endY = event.changedTouches[0].clientY;
handleTouch(startX, endX, left, right)
})
}
},
}
}
</script></div><div data-content-type="block" data-appearance="default" data-element="main"><div class="widget block block-static-block">
<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><section class="hero-image text-gray-700 body-font -mt-8 mb-8" style="min-height: unset !important;">
<div class="relative">
<div class="container max-w-screen-2xl mx-auto px-0">
<div class="relative shadow-xl sm:overflow-hidden items-center justify-center">
<div class="inset-0 mt-6"><a href="https://www.onahole.com/naughtychristmaslist"><img src="https://cdn.onahole.com/media/wysiwyg/Banners/christmas2024/1_Onahole_Banner_copy.jpg" alt="12 Days of Pleasure: Mrs. Claus' Naughty Christmas" width="1600" height="533"></a></div>
</div>
</div>
</div>
</section></div></div>
</div>
<script>
if (window.require) {
require(['jquery', 'domReady!'], function($){
if ($('.mfblogunveil').length) {
require(['Magefan_Blog/js/lib/mfblogunveil'], function(){
$('.mfblogunveil').mfblogunveil();
});
}
});
} else {
/* e.g. hyva theme */
document.addEventListener("DOMContentLoaded", function(){
var items = document.getElementsByClassName('mfblogunveil');
var el, url;
if (items.length) {
for (var i=0; i<items.length;i++) {
el = items[i];
url = el.getAttribute('data-original');
if (!url) {
continue;
}
if ('IMG' == el.tagName) {
el.src = url;
} else {
el.style.backgroundImage = "url('" + url + "')";
}
}
}
});
}
</script>
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "WebSite",
"url": "https://www.onahole.com/",
"potentialAction": {
"@type": "SearchAction",
"target": "https://www.onahole.com/catalogsearch/result/index/?q={search_term_string}",
"query-input": "required name=search_term_string"
}
}
</script>
<script>
function initSliderComponent_67633c5692d44() {
return {
active: 0,
items: [],
currency: [],
loading: true,
itemCount: 0,
pageSize: 4,
pageFillers: 0,
minHeight() {
return 'min-height: ' + ((this.loading && '491px') || 0);
},
getItems($nextTick) {
this.items = [{"image":"https:\/\/cdn.onahole.com\/media\/.renditions\/wysiwyg\/homepage\/m8477-3-670x.png","url":"onaholes","title":"Onaholes"},{"image":"https:\/\/cdn.onahole.com\/media\/.renditions\/wysiwyg\/homepage\/onahips_1.png","url":"onahip","title":"Onahips"},{"image":"https:\/\/cdn.onahole.com\/media\/.renditions\/wysiwyg\/homepage\/tit-sex-toys.png","url":"tit-sex-toys","title":"Tit sex toys"},{"image":"https:\/\/cdn.onahole.com\/media\/.renditions\/wysiwyg\/homepage\/sex-doll-torso.png","url":"sex-doll-torso","title":"Sex Doll Torso"},{"image":"https:\/\/cdn.onahole.com\/media\/.renditions\/wysiwyg\/homepage\/mini-sex-dolls.png","url":"mini-sex-dolls","title":"Mini Sex Dolls"},{"image":"https:\/\/cdn.onahole.com\/media\/.renditions\/wysiwyg\/homepage\/onahole-cleaning.png","url":"onahole-cleaning","title":"Onahole Cleaning"},{"image":"https:\/\/cdn.onahole.com\/media\/.renditions\/wysiwyg\/homepage\/vibrator_for_men.png","url":"vibrator-for-men","title":"Vibrator for Men"},{"image":"https:\/\/cdn.onahole.com\/media\/.renditions\/wysiwyg\/homepage\/japanese_lube.png","url":"japanese-lube","title":"Japanese Lube"}] || [];
this.loading = false;
$nextTick(() => this.calcPageSize());
return this.items;
},
getSlider() {
return this.$root.querySelector('.js_slides');
},
calcPageSize() {
const slider = this.getSlider();
if (slider) {
this.itemCount = slider.querySelectorAll('.js_slide').length;
this.pageSize = Math.round(slider.clientWidth / slider.querySelector('.js_slide').clientWidth);
this.pageFillers = (
this.pageSize * Math.ceil(this.itemCount / this.pageSize)
) - this.itemCount;
}
},
calcActive() {
const slider = this.getSlider();
if (slider) {
const sliderItems = this.itemCount + this.pageFillers;
const calculatedActiveSlide = slider.scrollLeft / (slider.scrollWidth / sliderItems);
this.active = Math.round(calculatedActiveSlide / this.pageSize) * this.pageSize;
}
},
scrollPrevious() {
this.scrollTo(this.active - this.pageSize);
},
scrollNext() {
this.scrollTo(this.active + this.pageSize);
},
scrollTo(idx) {
const slider = this.getSlider();
if (slider) {
const slideWidth = slider.scrollWidth / (this.itemCount + this.pageFillers);
slider.scrollLeft = Math.floor(slideWidth) * idx;
this.active = idx;
}
}
}
}
</script>
<section class="flex items-center my-1 text-gray-700 body-font" x-data="initSliderComponent_67633c5692d44()" x-init="getItems($nextTick);" @resize.window.debounce="calcPageSize(); $nextTick( function() { calcActive() })" style="min-height: 550px">
<template x-if="items && items.length">
<div class="relative w-full">
<div class="flex flex-col items-center md:items-start pt-6 pb-3 mx-auto mb-6 border-b-2
border-gray-300">
<h3 class="text-2xl font-medium text-gray-900 title-font">
Find Your Desires </h3>
<p>Get the real feel of Japanese porn stars and hentai characters
with the exact replicate of their private parts.<br></p>
<p>Looking for other special desires? We
have all the toys that will surely satistfy your out-of-this-world kinks!</p>
</div>
<div class="relative w-full overflow-x-hidden">
<button aria-label="Previous" tabindex="-1" :disabled="active === 0" style="top: 125px; left: -15px; border-radius: 56%; height: 55px; width: 55px;" class="absolute left-0 z-20 bg-white shadow-2xl w-8 h-8 mx-4 text-gray-300 outline-none focus:outline-none" :class="{ 'opacity-25 pointer-events-none' : active === 0 }" @click="scrollPrevious">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-25 h-25 inline-block" width="40" height="40" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m15 19-7-7 7-7"></path><title>chevron-left</title></svg>
</button>
<div class="relative flex flex-nowrap w-full overflow-auto transition-all js_slides snap" @scroll.debounce="calcActive">
<template x-for="item in items">
<div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/5">
<div class="relative mx-1 card-interactive rounded-lg border border-zinc-300">
<a :href="'https://www.onahole.com/' + item.url" class="relative flex items-center bg-white rounded-lg" style="padding-top:100%" tabindex="-1">
<span class="absolute top-0 left-0 flex flex-wrap content-center w-full h-full p-1
overflow-hidden align-center hover:shadow-sm">
<img class="self-center w-full h-auto" :src="item.image" :alt="item.label" loading="lazy" width="400" height="400">
</span>
</a>
<div class="absolute inset-x-0 w-full bottom-0 rounded-b-lg h-60 flex items-center justify-center px-1 pt-0.5 text-primary" style="background: rgba(255,255,255,.9); height: 40px;">
<a class="truncate product-item-link" :href="'https://www.onahole.com/' + item.url">
<span x-html="item.title"></span>
</a>
</div>
</div>
</div>
</template>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex-none py-1' : pageFillers > 0
}"></div>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex-none py-1' : pageFillers > 1
}"></div>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex-none py-1' : pageFillers > 2
}"></div>
</div>
<button aria-label="Next" tabindex="-1" :disabled="active >= itemCount-pageSize" style="top: 125px; right: -15px; border-radius: 56%; height: 55px; width: 55px;" class="absolute z-20 bg-white shadow-2xl w-8 h-8 mx-4 text-gray-300 outline-none focus:outline-none" :class="{ 'opacity-25 pointer-events-none' : active >= itemCount-pageSize }" @click="scrollNext">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-25 h-25 inline-block" width="40" height="40" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m9 5 7 7-7 7"></path><title>chevron-right</title></svg>
</button>
</div>
</div>
</template><div class="relative w-full">
<div class="flex flex-col items-center md:items-start pt-6 pb-3 mx-auto mb-6 border-b-2
border-gray-300">
<h3 class="text-2xl font-medium text-gray-900 title-font">
Find Your Desires </h3>
<p>Get the real feel of Japanese porn stars and hentai characters
with the exact replicate of their private parts.<br></p>
<p>Looking for other special desires? We
have all the toys that will surely satistfy your out-of-this-world kinks!</p>
</div>
<div class="relative w-full overflow-x-hidden">
<button aria-label="Previous" tabindex="-1" :disabled="active === 0" style="top: 125px; left: -15px; border-radius: 56%; height: 55px; width: 55px;" class="absolute left-0 z-20 bg-white shadow-2xl w-8 h-8 mx-4 text-gray-300 outline-none focus:outline-none opacity-25 pointer-events-none" :class="{ 'opacity-25 pointer-events-none' : active === 0 }" @click="scrollPrevious" disabled="disabled">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-25 h-25 inline-block" width="40" height="40" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m15 19-7-7 7-7"></path><title>chevron-left</title></svg>
</button>
<div class="relative flex flex-nowrap w-full overflow-auto transition-all js_slides snap" @scroll.debounce="calcActive">
<template x-for="item in items">
<div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/5">
<div class="relative mx-1 card-interactive rounded-lg border border-zinc-300">
<a :href="'https://www.onahole.com/' + item.url" class="relative flex items-center bg-white rounded-lg" style="padding-top:100%" tabindex="-1">
<span class="absolute top-0 left-0 flex flex-wrap content-center w-full h-full p-1
overflow-hidden align-center hover:shadow-sm">
<img class="self-center w-full h-auto" :src="item.image" :alt="item.label" loading="lazy" width="400" height="400">
</span>
</a>
<div class="absolute inset-x-0 w-full bottom-0 rounded-b-lg h-60 flex items-center justify-center px-1 pt-0.5 text-primary" style="background: rgba(255,255,255,.9); height: 40px;">
<a class="truncate product-item-link" :href="'https://www.onahole.com/' + item.url">
<span x-html="item.title"></span>
</a>
</div>
</div>
</div>
</template><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/5">
<div class="relative mx-1 card-interactive rounded-lg border border-zinc-300">
<a :href="'https://www.onahole.com/' + item.url" class="relative flex items-center bg-white rounded-lg" style="padding-top:100%" tabindex="-1" href="https://www.onahole.com/onaholes">
<span class="absolute top-0 left-0 flex flex-wrap content-center w-full h-full p-1
overflow-hidden align-center hover:shadow-sm">
<img class="self-center w-full h-auto" :src="item.image" :alt="item.label" loading="lazy" width="400" height="400" src="https://cdn.onahole.com/media/.renditions/wysiwyg/homepage/m8477-3-670x.png" alt="">
</span>
</a>
<div class="absolute inset-x-0 w-full bottom-0 rounded-b-lg h-60 flex items-center justify-center px-1 pt-0.5 text-primary" style="background: rgba(255,255,255,.9); height: 40px;">
<a class="truncate product-item-link" :href="'https://www.onahole.com/' + item.url" href="https://www.onahole.com/onaholes">
<span x-html="item.title">Onaholes</span>
</a>
</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/5">
<div class="relative mx-1 card-interactive rounded-lg border border-zinc-300">
<a :href="'https://www.onahole.com/' + item.url" class="relative flex items-center bg-white rounded-lg" style="padding-top:100%" tabindex="-1" href="https://www.onahole.com/onahip">
<span class="absolute top-0 left-0 flex flex-wrap content-center w-full h-full p-1
overflow-hidden align-center hover:shadow-sm">
<img class="self-center w-full h-auto" :src="item.image" :alt="item.label" loading="lazy" width="400" height="400" src="https://cdn.onahole.com/media/.renditions/wysiwyg/homepage/onahips_1.png" alt="">
</span>
</a>
<div class="absolute inset-x-0 w-full bottom-0 rounded-b-lg h-60 flex items-center justify-center px-1 pt-0.5 text-primary" style="background: rgba(255,255,255,.9); height: 40px;">
<a class="truncate product-item-link" :href="'https://www.onahole.com/' + item.url" href="https://www.onahole.com/onahip">
<span x-html="item.title">Onahips</span>
</a>
</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/5">
<div class="relative mx-1 card-interactive rounded-lg border border-zinc-300">
<a :href="'https://www.onahole.com/' + item.url" class="relative flex items-center bg-white rounded-lg" style="padding-top:100%" tabindex="-1" href="https://www.onahole.com/tit-sex-toys">
<span class="absolute top-0 left-0 flex flex-wrap content-center w-full h-full p-1
overflow-hidden align-center hover:shadow-sm">
<img class="self-center w-full h-auto" :src="item.image" :alt="item.label" loading="lazy" width="400" height="400" src="https://cdn.onahole.com/media/.renditions/wysiwyg/homepage/tit-sex-toys.png" alt="">
</span>
</a>
<div class="absolute inset-x-0 w-full bottom-0 rounded-b-lg h-60 flex items-center justify-center px-1 pt-0.5 text-primary" style="background: rgba(255,255,255,.9); height: 40px;">
<a class="truncate product-item-link" :href="'https://www.onahole.com/' + item.url" href="https://www.onahole.com/tit-sex-toys">
<span x-html="item.title">Tit sex toys</span>
</a>
</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/5">
<div class="relative mx-1 card-interactive rounded-lg border border-zinc-300">
<a :href="'https://www.onahole.com/' + item.url" class="relative flex items-center bg-white rounded-lg" style="padding-top:100%" tabindex="-1" href="https://www.onahole.com/sex-doll-torso">
<span class="absolute top-0 left-0 flex flex-wrap content-center w-full h-full p-1
overflow-hidden align-center hover:shadow-sm">
<img class="self-center w-full h-auto" :src="item.image" :alt="item.label" loading="lazy" width="400" height="400" src="https://cdn.onahole.com/media/.renditions/wysiwyg/homepage/sex-doll-torso.png" alt="">
</span>
</a>
<div class="absolute inset-x-0 w-full bottom-0 rounded-b-lg h-60 flex items-center justify-center px-1 pt-0.5 text-primary" style="background: rgba(255,255,255,.9); height: 40px;">
<a class="truncate product-item-link" :href="'https://www.onahole.com/' + item.url" href="https://www.onahole.com/sex-doll-torso">
<span x-html="item.title">Sex Doll Torso</span>
</a>
</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/5">
<div class="relative mx-1 card-interactive rounded-lg border border-zinc-300">
<a :href="'https://www.onahole.com/' + item.url" class="relative flex items-center bg-white rounded-lg" style="padding-top:100%" tabindex="-1" href="https://www.onahole.com/mini-sex-dolls">
<span class="absolute top-0 left-0 flex flex-wrap content-center w-full h-full p-1
overflow-hidden align-center hover:shadow-sm">
<img class="self-center w-full h-auto" :src="item.image" :alt="item.label" loading="lazy" width="400" height="400" src="https://cdn.onahole.com/media/.renditions/wysiwyg/homepage/mini-sex-dolls.png" alt="">
</span>
</a>
<div class="absolute inset-x-0 w-full bottom-0 rounded-b-lg h-60 flex items-center justify-center px-1 pt-0.5 text-primary" style="background: rgba(255,255,255,.9); height: 40px;">
<a class="truncate product-item-link" :href="'https://www.onahole.com/' + item.url" href="https://www.onahole.com/mini-sex-dolls">
<span x-html="item.title">Mini Sex Dolls</span>
</a>
</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/5">
<div class="relative mx-1 card-interactive rounded-lg border border-zinc-300">
<a :href="'https://www.onahole.com/' + item.url" class="relative flex items-center bg-white rounded-lg" style="padding-top:100%" tabindex="-1" href="https://www.onahole.com/onahole-cleaning">
<span class="absolute top-0 left-0 flex flex-wrap content-center w-full h-full p-1
overflow-hidden align-center hover:shadow-sm">
<img class="self-center w-full h-auto" :src="item.image" :alt="item.label" loading="lazy" width="400" height="400" src="https://cdn.onahole.com/media/.renditions/wysiwyg/homepage/onahole-cleaning.png" alt="">
</span>
</a>
<div class="absolute inset-x-0 w-full bottom-0 rounded-b-lg h-60 flex items-center justify-center px-1 pt-0.5 text-primary" style="background: rgba(255,255,255,.9); height: 40px;">
<a class="truncate product-item-link" :href="'https://www.onahole.com/' + item.url" href="https://www.onahole.com/onahole-cleaning">
<span x-html="item.title">Onahole Cleaning</span>
</a>
</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/5">
<div class="relative mx-1 card-interactive rounded-lg border border-zinc-300">
<a :href="'https://www.onahole.com/' + item.url" class="relative flex items-center bg-white rounded-lg" style="padding-top:100%" tabindex="-1" href="https://www.onahole.com/vibrator-for-men">
<span class="absolute top-0 left-0 flex flex-wrap content-center w-full h-full p-1
overflow-hidden align-center hover:shadow-sm">
<img class="self-center w-full h-auto" :src="item.image" :alt="item.label" loading="lazy" width="400" height="400" src="https://cdn.onahole.com/media/.renditions/wysiwyg/homepage/vibrator_for_men.png" alt="">
</span>
</a>
<div class="absolute inset-x-0 w-full bottom-0 rounded-b-lg h-60 flex items-center justify-center px-1 pt-0.5 text-primary" style="background: rgba(255,255,255,.9); height: 40px;">
<a class="truncate product-item-link" :href="'https://www.onahole.com/' + item.url" href="https://www.onahole.com/vibrator-for-men">
<span x-html="item.title">Vibrator for Men</span>
</a>
</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/5">
<div class="relative mx-1 card-interactive rounded-lg border border-zinc-300">
<a :href="'https://www.onahole.com/' + item.url" class="relative flex items-center bg-white rounded-lg" style="padding-top:100%" tabindex="-1" href="https://www.onahole.com/japanese-lube">
<span class="absolute top-0 left-0 flex flex-wrap content-center w-full h-full p-1
overflow-hidden align-center hover:shadow-sm">
<img class="self-center w-full h-auto" :src="item.image" :alt="item.label" loading="lazy" width="400" height="400" src="https://cdn.onahole.com/media/.renditions/wysiwyg/homepage/japanese_lube.png" alt="">
</span>
</a>
<div class="absolute inset-x-0 w-full bottom-0 rounded-b-lg h-60 flex items-center justify-center px-1 pt-0.5 text-primary" style="background: rgba(255,255,255,.9); height: 40px;">
<a class="truncate product-item-link" :href="'https://www.onahole.com/' + item.url" href="https://www.onahole.com/japanese-lube">
<span x-html="item.title">Japanese Lube</span>
</a>
</div>
</div>
</div>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex-none py-1' : pageFillers > 0
}"></div>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex-none py-1' : pageFillers > 1
}"></div>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex-none py-1' : pageFillers > 2
}"></div>
</div>
<button aria-label="Next" tabindex="-1" :disabled="active >= itemCount-pageSize" style="top: 125px; right: -15px; border-radius: 56%; height: 55px; width: 55px;" class="absolute z-20 bg-white shadow-2xl w-8 h-8 mx-4 text-gray-300 outline-none focus:outline-none" :class="{ 'opacity-25 pointer-events-none' : active >= itemCount-pageSize }" @click="scrollNext">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-25 h-25 inline-block" width="40" height="40" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m9 5 7 7-7 7"></path><title>chevron-right</title></svg>
</button>
</div>
</div>
</section><div class="product-slider">
<div>
<script>
'use strict';
function initSliderComponent() {
return {
active: 0,
itemCount: 0,
getSlider() {
return this.$root.querySelector('.js_slides');
},
pageSize: 4,
pageFillers: 0,
calcPageSize() {
const slider = this.getSlider();
if (slider) {
this.itemCount = slider.querySelectorAll('.js_slide').length;
this.pageSize = Math.round(slider.clientWidth / slider.querySelector('.js_slide').clientWidth);
this.pageFillers = (
this.pageSize * Math.ceil(this.itemCount / this.pageSize)
) - this.itemCount;
}
},
calcActive() {
const slider = this.getSlider();
if (slider) {
const sliderItems = this.itemCount + this.pageFillers;
const calculatedActiveSlide = slider.scrollLeft / (slider.scrollWidth / sliderItems);
this.active = Math.round(calculatedActiveSlide / this.pageSize) * this.pageSize;
}
},
scrollPrevious() {
this.scrollTo(this.active - this.pageSize);
},
scrollNext() {
this.scrollTo(this.active + this.pageSize);
},
scrollTo(idx) {
const slider = this.getSlider();
if (slider) {
const slideWidth = slider.scrollWidth / (this.itemCount + this.pageFillers);
slider.scrollLeft = Math.floor(slideWidth) * idx;
this.active = idx;
}
},
skipCarouselToNavigation(navSelector) {
const element = document.getElementById(navSelector)
if (element) {
element.scrollIntoView({behavior: 'smooth', block: 'end'});
const button = element.querySelector('button:not([disabled])');
this.$nextTick(() => button && button.focus({preventScroll: true}))
}
}
}
}
</script>
<section class="my-12 text-gray-700 body-font" x-data="initSliderComponent()" x-init="calcPageSize();" x-id="['slider-nav', 'slider-end', 'slider-desc', 'slider-id']" @resize.window.debounce="calcPageSize(); $nextTick( function() { calcActive() })" role="group" aria-roledescription="Carousel" aria-label="Carousel Trending right now" :aria-describedby="$id('slider-desc')" aria-describedby="slider-desc-1">
<div class="relative">
<div class="container flex flex-col items-center pt-6 pb-3 mx-auto mb-6 border-b-2
border-gray-300 md:flex-row">
<h3 class="text-2xl font-medium text-gray-900 title-font">
Trending right now </h3>
</div>
<span class="sr-only" :id="$id('slider-desc')" tabindex="-1" id="slider-desc-1">
Navigating through the elements of the carousel is possible using the tab key. You can skip the carousel or go straight to carousel navigation using the skip links. </span>
<a :href="`#${$id('slider-end')}`" class="action skip sr-only focus:not-sr-only focus:absolute focus:z-30 focus:bg-white" href="#slider-end-1">
Press to skip carousel </a>
<button x-show="itemCount > pageSize" type="button" class="action skip sr-only focus:not-sr-only focus:absolute focus:z-30 focus:bg-white" @click.prevent="skipCarouselToNavigation($id('slider-nav'))">
Press to go to carousel navigation </button>
<div class="flex-none relative w-full overflow-x-hidden focus-within:ring-2 ring-offset-2 active:ring-0 ring-blue-500/50">
<div class="relative flex flex-nowrap w-full overflow-auto js_slides snap md:px-1 xl:px-2" @scroll.debounce="calcActive">
<div class="flex shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="1 > active && 1 <= (active + pageSize) ? 'false' : 'true'" aria-label="Item 1" :aria-describedby="`slide-desc-126-${$id('slider-id')}`" aria-hidden="false" aria-describedby="slide-desc-126-slider-id-1">
<form method="post" action="https://www.onahole.com/checkout/cart/add/uenc/%25uenc%25/product/126/" class="item product product-item product_addtocart_form card flex flex-col w-full ">
<input name="form_key" type="hidden" value="ecdWqIDEprHSHapn"> <input type="hidden" name="product" value="126">
<div class="flex items-center justify-between mb-4">
<div class="flex items-center text-blue-700 text-sm font-semibold whitespace-nowrap">
<p class="flex items-center justify-end align-middle available gap-x-2 stock" title="Availability">
<span class="w-3 h-3 bg-green-350 rounded-full shrink-0"></span>
<span>in stock</span>
</p>
</div>
<div class="wrp-add-wish-list-add-to-compare flex flex-row gap-2">
<button x-data="initCompareOnProductList()" @click.prevent="addToCompare(126)" aria-label="Add to Compare" type="button" class="p-0 border-0 inline-flex flex-shrink-0 items-center justify-center">
<i class="m-0 bg-compare-icon w-5 h-5"></i>
</button>
<button x-data="initWishlist()" @click.prevent="addToWishlist(126)" aria-label="Add to Wish List" type="button" class="p-0 border-0 inline-flex flex-shrink-0 items-center justify-center">
<i class="m-0 bg-heart-icon w-5 h-5"></i>
</button>
</div>
</div>
<a href="https://www.onahole.com/onaeki-lubricant" class="product photo product-item-photo block mx-auto mb-4 " tabindex="-1">
<img class="hover:shadow-sm object-contain product-image-photo" x-data="" @update-gallery-126.window="$root.src = $event.detail" src="https://cdn.onahole.com/media/catalog/product//9/_/9_1.jpg?width=360&height=360&store=default&image-type=small_image" loading="lazy" width="360" height="360" alt="OnaEki Lubricant non-irritating lube" title="OnaEki Lubricant non-irritating lube">
</a>
<div class="product-info flex flex-col flex-grow">
<div class="items-center font-semibold mb-1 text-blue-700 text-base">
<a class="product-item-link" href="https://www.onahole.com/onaeki-lubricant">
OnaEki 370 </a>
</div>
<script>
function initPriceBox__676333ce2298b()
{
return {
updatePrice(priceData) {
const regularPriceLabel = this.$el.querySelector('.normal-price .price-label');
const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price');
if (priceData.finalPrice.amount < priceData.oldPrice.amount) {
regularPriceLabel.classList.add('hidden');
} else {
regularPriceLabel.classList.remove('hidden');
}
regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount);
}
}
}
</script>
<div class="mt-auto mb-2 text-blue-700 text-xl" x-data="initPriceBox__676333ce2298b()" @update-prices-126.window="updatePrice($event.detail);">
<div class="price-box price-final_price" data-role="priceBox" data-product-id="126" data-price-box="product-id-126">
<span x-data="" x-id="['product\u002Dprice\u002D126']" class="price-container price-final_price tax weee rewards_earn">
<span :id="$id('product\u002Dprice\u002D126')" data-price-amount="17.95" data-price-type="finalPrice" class="price-wrapper " id="product-price-126-1"><span class="price">$17.95</span></span>
</span>
</div> </div>
<div class="mb-5">
<div class="rating-summary flex items-center cursor-pointer text-grey-175 text-sm gap-1" onclick="(
document.getElementById('customer-review-list') ||
document.getElementById('customer-reviews') ||
document.getElementById('review-form')).scrollIntoView({behavior: 'smooth'}
)">
<span class="hidden">4.8</span>
<span class="hidden">11</span>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor">
<defs>
<linearGradient id="partialFill126">
<stop offset="0%" stop-color="#E7BD2B"></stop>
<stop offset="80%" stop-color="#E7BD2B"></stop>
<stop offset="80%" stop-color="#E0E0E0"></stop>
<stop offset="100%" stop-color="#E0E0E0"></stop>
</linearGradient>
</defs>
<g fill="url(#partialFill126)">
<path d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</g>
</svg>
(11)
</div>
</div>
<button class="w-auto btn btn-orange" aria-label="Add to cart">
Add to cart </button>
</div>
</form>
</div>
<div class="flex shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="2 > active && 2 <= (active + pageSize) ? 'false' : 'true'" aria-label="Item 2" :aria-describedby="`slide-desc-111-${$id('slider-id')}`" aria-hidden="false" aria-describedby="slide-desc-111-slider-id-1">
<form method="post" action="https://www.onahole.com/checkout/cart/add/uenc/%25uenc%25/product/111/" class="item product product-item product_addtocart_form card flex flex-col w-full ">
<input name="form_key" type="hidden" value="ecdWqIDEprHSHapn"> <input type="hidden" name="product" value="111">
<div class="flex items-center justify-between mb-4">
<div class="flex items-center text-blue-700 text-sm font-semibold whitespace-nowrap">
<p class="flex items-center justify-end align-middle available gap-x-2 stock" title="Availability">
<span class="w-3 h-3 bg-green-350 rounded-full shrink-0"></span>
<span>in stock</span>
</p>
</div>
<div class="wrp-add-wish-list-add-to-compare flex flex-row gap-2">
<button x-data="initCompareOnProductList()" @click.prevent="addToCompare(111)" aria-label="Add to Compare" type="button" class="p-0 border-0 inline-flex flex-shrink-0 items-center justify-center">
<i class="m-0 bg-compare-icon w-5 h-5"></i>
</button>
<button x-data="initWishlist()" @click.prevent="addToWishlist(111)" aria-label="Add to Wish List" type="button" class="p-0 border-0 inline-flex flex-shrink-0 items-center justify-center">
<i class="m-0 bg-heart-icon w-5 h-5"></i>
</button>
</div>
</div>
<a href="https://www.onahole.com/slut-angel-dx" class="product photo product-item-photo block mx-auto mb-4 " tabindex="-1">
<img class="hover:shadow-sm object-contain product-image-photo" x-data="" @update-gallery-111.window="$root.src = $event.detail" src="https://cdn.onahole.com/media/catalog/product/s/l/slut-1200dx-main_1.jpg?width=360&height=360&store=default&image-type=small_image" loading="lazy" width="360" height="360" alt="Slut Angel DX" title="Slut Angel DX">
</a>
<div class="product-info flex flex-col flex-grow">
<div class="items-center font-semibold mb-1 text-blue-700 text-base">
<a class="product-item-link" href="https://www.onahole.com/slut-angel-dx">
Slut Angel DX </a>
</div>
<script>
function initPriceBox__676336eaab070()
{
return {
updatePrice(priceData) {
const regularPriceLabel = this.$el.querySelector('.normal-price .price-label');
const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price');
if (priceData.finalPrice.amount < priceData.oldPrice.amount) {
regularPriceLabel.classList.add('hidden');
} else {
regularPriceLabel.classList.remove('hidden');
}
regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount);
}
}
}
</script>
<div class="mt-auto mb-2 text-blue-700 text-xl" x-data="initPriceBox__676336eaab070()" @update-prices-111.window="updatePrice($event.detail);">
<div class="price-box price-final_price" data-role="priceBox" data-product-id="111" data-price-box="product-id-111">
<span x-data="" x-id="['product\u002Dprice\u002D111']" class="price-container price-final_price tax weee rewards_earn">
<span :id="$id('product\u002Dprice\u002D111')" data-price-amount="49.95" data-price-type="finalPrice" class="price-wrapper " id="product-price-111-1"><span class="price">$49.95</span></span>
</span>
</div> </div>
<div class="mb-5">
<div class="rating-summary flex items-center cursor-pointer text-grey-175 text-sm gap-1" onclick="(
document.getElementById('customer-review-list') ||
document.getElementById('customer-reviews') ||
document.getElementById('review-form')).scrollIntoView({behavior: 'smooth'}
)">
<span class="hidden">4.8</span>
<span class="hidden">19</span>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor">
<defs>
<linearGradient id="partialFill111">
<stop offset="0%" stop-color="#E7BD2B"></stop>
<stop offset="80%" stop-color="#E7BD2B"></stop>
<stop offset="80%" stop-color="#E0E0E0"></stop>
<stop offset="100%" stop-color="#E0E0E0"></stop>
</linearGradient>
</defs>
<g fill="url(#partialFill111)">
<path d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</g>
</svg>
(19)
</div>
</div>
<button class="w-auto btn btn-orange" aria-label="Add to cart">
Add to cart </button>
</div>
</form>
</div>
<div class="flex shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="3 > active && 3 <= (active + pageSize) ? 'false' : 'true'" aria-label="Item 3" :aria-describedby="`slide-desc-105-${$id('slider-id')}`" aria-hidden="true" aria-describedby="slide-desc-105-slider-id-1">
<form method="post" action="https://www.onahole.com/checkout/cart/add/uenc/%25uenc%25/product/105/" class="item product product-item product_addtocart_form card flex flex-col w-full ">
<input name="form_key" type="hidden" value="ecdWqIDEprHSHapn"> <input type="hidden" name="product" value="105">
<div class="flex items-center justify-between mb-4">
<div class="flex items-center text-blue-700 text-sm font-semibold whitespace-nowrap">
<p class="flex items-center justify-end align-middle available gap-x-2 stock" title="Availability">
<span class="w-3 h-3 bg-green-350 rounded-full shrink-0"></span>
<span>in stock</span>
</p>
</div>
<div class="wrp-add-wish-list-add-to-compare flex flex-row gap-2">
<button x-data="initCompareOnProductList()" @click.prevent="addToCompare(105)" aria-label="Add to Compare" type="button" class="p-0 border-0 inline-flex flex-shrink-0 items-center justify-center">
<i class="m-0 bg-compare-icon w-5 h-5"></i>
</button>
<button x-data="initWishlist()" @click.prevent="addToWishlist(105)" aria-label="Add to Wish List" type="button" class="p-0 border-0 inline-flex flex-shrink-0 items-center justify-center">
<i class="m-0 bg-heart-icon w-5 h-5"></i>
</button>
</div>
</div>
<a href="https://www.onahole.com/nezukos-double-tooth-blow-job" class="product photo product-item-photo block mx-auto mb-4 " tabindex="-1">
<img class="hover:shadow-sm object-contain product-image-photo" x-data="" @update-gallery-105.window="$root.src = $event.detail" src="https://cdn.onahole.com/media/catalog/product/n/e/nezuko-package.webp?width=360&height=360&store=default&image-type=small_image" loading="lazy" width="360" height="360" alt="nezuko blow job toy" title="nezuko blow job toy">
</a>
<div class="product-info flex flex-col flex-grow">
<div class="items-center font-semibold mb-1 text-blue-700 text-base">
<a class="product-item-link" href="https://www.onahole.com/nezukos-double-tooth-blow-job">
Nezuko's Double Tooth Blowjob </a>
</div>
<script>
function initPriceBox__67632f455615a()
{
return {
updatePrice(priceData) {
const regularPriceLabel = this.$el.querySelector('.normal-price .price-label');
const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price');
if (priceData.finalPrice.amount < priceData.oldPrice.amount) {
regularPriceLabel.classList.add('hidden');
} else {
regularPriceLabel.classList.remove('hidden');
}
regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount);
}
}
}
</script>
<div class="mt-auto mb-2 text-blue-700 text-xl" x-data="initPriceBox__67632f455615a()" @update-prices-105.window="updatePrice($event.detail);">
<div class="price-box price-final_price" data-role="priceBox" data-product-id="105" data-price-box="product-id-105">
<span x-data="" x-id="['product\u002Dprice\u002D105']" class="price-container price-final_price tax weee rewards_earn">
<span :id="$id('product\u002Dprice\u002D105')" data-price-amount="59.95" data-price-type="finalPrice" class="price-wrapper " id="product-price-105-1"><span class="price">$59.95</span></span>
</span>
</div> </div>
<div class="mb-5">
<div class="rating-summary flex items-center cursor-pointer text-grey-175 text-sm gap-1" onclick="(
document.getElementById('customer-review-list') ||
document.getElementById('customer-reviews') ||
document.getElementById('review-form')).scrollIntoView({behavior: 'smooth'}
)">
<span class="hidden">4.6</span>
<span class="hidden">26</span>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor">
<defs>
<linearGradient id="partialFill105">
<stop offset="0%" stop-color="#E7BD2B"></stop>
<stop offset="60%" stop-color="#E7BD2B"></stop>
<stop offset="60%" stop-color="#E0E0E0"></stop>
<stop offset="100%" stop-color="#E0E0E0"></stop>
</linearGradient>
</defs>
<g fill="url(#partialFill105)">
<path d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</g>
</svg>
(26)
</div>
</div>
<button class="w-auto btn btn-orange" aria-label="Add to cart">
Add to cart </button>
</div>
</form>
</div>
<div class="flex shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="4 > active && 4 <= (active + pageSize) ? 'false' : 'true'" aria-label="Item 4" :aria-describedby="`slide-desc-116-${$id('slider-id')}`" aria-hidden="true" aria-describedby="slide-desc-116-slider-id-1">
<form method="post" action="https://www.onahole.com/checkout/cart/add/uenc/%25uenc%25/product/116/" class="item product product-item product_addtocart_form card flex flex-col w-full ">
<input name="form_key" type="hidden" value="ecdWqIDEprHSHapn"> <input type="hidden" name="product" value="116">
<div class="flex items-center justify-between mb-4">
<div class="flex items-center text-blue-700 text-sm font-semibold whitespace-nowrap">
<p class="flex items-center justify-end align-middle available gap-x-2 stock" title="Availability">
<span class="w-3 h-3 bg-green-350 rounded-full shrink-0"></span>
<span>in stock</span>
</p>
</div>
<div class="wrp-add-wish-list-add-to-compare flex flex-row gap-2">
<button x-data="initCompareOnProductList()" @click.prevent="addToCompare(116)" aria-label="Add to Compare" type="button" class="p-0 border-0 inline-flex flex-shrink-0 items-center justify-center">
<i class="m-0 bg-compare-icon w-5 h-5"></i>
</button>
<button x-data="initWishlist()" @click.prevent="addToWishlist(116)" aria-label="Add to Wish List" type="button" class="p-0 border-0 inline-flex flex-shrink-0 items-center justify-center">
<i class="m-0 bg-heart-icon w-5 h-5"></i>
</button>
</div>
</div>
<a href="https://www.onahole.com/nupu-3-pussy-lips" class="product photo product-item-photo block mx-auto mb-4 " tabindex="-1">
<img class="hover:shadow-sm object-contain product-image-photo" x-data="" @update-gallery-116.window="$root.src = $event.detail" src="https://cdn.onahole.com/media/catalog/product/n/u/nupu3-pussy-lips-01_1_1.jpg?width=360&height=360&store=default&image-type=small_image" loading="lazy" width="360" height="360" alt="NUPU 3 Pussy Lips" title="NUPU 3 Pussy Lips">
</a>
<div class="product-info flex flex-col flex-grow">
<div class="items-center font-semibold mb-1 text-blue-700 text-base">
<a class="product-item-link" href="https://www.onahole.com/nupu-3-pussy-lips">
NUPU 3 Pussy Lips </a>
</div>
<script>
function initPriceBox__676333ce2635a()
{
return {
updatePrice(priceData) {
const regularPriceLabel = this.$el.querySelector('.normal-price .price-label');
const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price');
if (priceData.finalPrice.amount < priceData.oldPrice.amount) {
regularPriceLabel.classList.add('hidden');
} else {
regularPriceLabel.classList.remove('hidden');
}
regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount);
}
}
}
</script>
<div class="mt-auto mb-2 text-blue-700 text-xl" x-data="initPriceBox__676333ce2635a()" @update-prices-116.window="updatePrice($event.detail);">
<div class="price-box price-final_price" data-role="priceBox" data-product-id="116" data-price-box="product-id-116">
<span x-data="" x-id="['product\u002Dprice\u002D116']" class="price-container price-final_price tax weee rewards_earn">
<span :id="$id('product\u002Dprice\u002D116')" data-price-amount="29.95" data-price-type="finalPrice" class="price-wrapper " id="product-price-116-1"><span class="price">$29.95</span></span>
</span>
</div> </div>
<div class="mb-5">
<div class="rating-summary flex items-center cursor-pointer text-grey-175 text-sm gap-1" onclick="(
document.getElementById('customer-review-list') ||
document.getElementById('customer-reviews') ||
document.getElementById('review-form')).scrollIntoView({behavior: 'smooth'}
)">
<span class="hidden">5</span>
<span class="hidden">9</span>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-18 h-15" viewBox="0 0 18 15" fill="currentColor" style="color: #E7BD2B">
<path fill="currentColor" d="m9.016 0 2.412 4.88 5.72.633-4.229 3.65 1.122 5.271-5.025-2.625-5.025 2.626 1.123-5.272-4.228-3.65 5.718-.632L9.016 0Z"></path>
</svg>
(9)
</div>
</div>
<button class="w-auto btn btn-orange" aria-label="Add to cart">
Add to cart </button>
</div>
</form>
</div>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex shrink-0 py-1' : pageFillers > 0
}"></div>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex shrink-0 py-1' : pageFillers > 1
}"></div>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex shrink-0 py-1' : pageFillers > 2
}"></div>
</div>
</div>
<div style="min-height: 65px">
<template x-if="itemCount > pageSize">
<div class="flex items-center justify-center py-4" :id="$id('slider-nav')">
<button type="button" aria-label="Previous slide" :disabled="active === 0" class="text-black flex-none p-3" :class="{ 'opacity-25 pointer-events-none' : active === 0 }" @click="scrollPrevious">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-5 h-5" width="25" height="25" aria-hidden="true" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m15 19-7-7 7-7"></path><title>chevron-left</title></svg>
</button>
<div class="flex flex-wrap w-full md:w-auto justify-center">
<button type="button" :class="{
'hidden': (pageSize !== 1 && !!(0 % pageSize))
}" :aria-current="active === 0" :aria-label="hyva.str('Display\u0020slide\u0020\u00251', (0 / pageSize) + 1)" @click="scrollTo(0)">
<span class="shrink-0 block w-3 h-3 m-4 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{
'bg-opacity-100': active === 0,
'bg-opacity-25': active !== 0,
'hidden': (pageSize !== 1 && !!(0 % pageSize))
}" @click="scrollTo(0)"></span>
</button>
<button type="button" :class="{
'hidden': (pageSize !== 1 && !!(1 % pageSize))
}" :aria-current="active === 1" :aria-label="hyva.str('Display\u0020slide\u0020\u00251', (1 / pageSize) + 1)" @click="scrollTo(1)">
<span class="shrink-0 block w-3 h-3 m-4 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{
'bg-opacity-100': active === 1,
'bg-opacity-25': active !== 1,
'hidden': (pageSize !== 1 && !!(1 % pageSize))
}" @click="scrollTo(1)"></span>
</button>
<button type="button" :class="{
'hidden': (pageSize !== 1 && !!(2 % pageSize))
}" :aria-current="active === 2" :aria-label="hyva.str('Display\u0020slide\u0020\u00251', (2 / pageSize) + 1)" @click="scrollTo(2)">
<span class="shrink-0 block w-3 h-3 m-4 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{
'bg-opacity-100': active === 2,
'bg-opacity-25': active !== 2,
'hidden': (pageSize !== 1 && !!(2 % pageSize))
}" @click="scrollTo(2)"></span>
</button>
<button type="button" :class="{
'hidden': (pageSize !== 1 && !!(3 % pageSize))
}" :aria-current="active === 3" :aria-label="hyva.str('Display\u0020slide\u0020\u00251', (3 / pageSize) + 1)" @click="scrollTo(3)">
<span class="shrink-0 block w-3 h-3 m-4 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{
'bg-opacity-100': active === 3,
'bg-opacity-25': active !== 3,
'hidden': (pageSize !== 1 && !!(3 % pageSize))
}" @click="scrollTo(3)"></span>
</button>
</div>
<button aria-label="Next slide" :disabled="active >= itemCount-pageSize" class="text-black flex-none p-3" :class="{ 'opacity-25 pointer-events-none' : active >= itemCount-pageSize }" @click="scrollNext">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-5 h-5" width="25" height="25" aria-hidden="true" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m9 5 7 7-7 7"></path><title>chevron-right</title></svg>
</button>
</div>
</template><div class="flex items-center justify-center py-4" :id="$id('slider-nav')" id="slider-nav-1">
<button type="button" aria-label="Previous slide" :disabled="active === 0" class="text-black flex-none p-3 opacity-25 pointer-events-none" :class="{ 'opacity-25 pointer-events-none' : active === 0 }" @click="scrollPrevious" disabled="disabled">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-5 h-5" width="25" height="25" aria-hidden="true" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m15 19-7-7 7-7"></path><title>chevron-left</title></svg>
</button>
<div class="flex flex-wrap w-full md:w-auto justify-center">
<button type="button" :class="{
'hidden': (pageSize !== 1 && !!(0 % pageSize))
}" :aria-current="active === 0" :aria-label="hyva.str('Display\u0020slide\u0020\u00251', (0 / pageSize) + 1)" @click="scrollTo(0)" aria-current="true" aria-label="Display slide 1">
<span class="shrink-0 block w-3 h-3 m-4 bg-black rounded-full shadow cursor-pointer bg-opacity-100" :class="{
'bg-opacity-100': active === 0,
'bg-opacity-25': active !== 0,
'hidden': (pageSize !== 1 && !!(0 % pageSize))
}" @click="scrollTo(0)"></span>
</button>
<button type="button" :class="{
'hidden': (pageSize !== 1 && !!(1 % pageSize))
}" :aria-current="active === 1" :aria-label="hyva.str('Display\u0020slide\u0020\u00251', (1 / pageSize) + 1)" @click="scrollTo(1)" class="hidden" aria-label="Display slide 1.5">
<span class="shrink-0 block w-3 h-3 m-4 bg-black bg-opacity-25 rounded-full shadow cursor-pointer hidden" :class="{
'bg-opacity-100': active === 1,
'bg-opacity-25': active !== 1,
'hidden': (pageSize !== 1 && !!(1 % pageSize))
}" @click="scrollTo(1)"></span>
</button>
<button type="button" :class="{
'hidden': (pageSize !== 1 && !!(2 % pageSize))
}" :aria-current="active === 2" :aria-label="hyva.str('Display\u0020slide\u0020\u00251', (2 / pageSize) + 1)" @click="scrollTo(2)" aria-label="Display slide 2">
<span class="shrink-0 block w-3 h-3 m-4 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{
'bg-opacity-100': active === 2,
'bg-opacity-25': active !== 2,
'hidden': (pageSize !== 1 && !!(2 % pageSize))
}" @click="scrollTo(2)"></span>
</button>
<button type="button" :class="{
'hidden': (pageSize !== 1 && !!(3 % pageSize))
}" :aria-current="active === 3" :aria-label="hyva.str('Display\u0020slide\u0020\u00251', (3 / pageSize) + 1)" @click="scrollTo(3)" class="hidden" aria-label="Display slide 2.5">
<span class="shrink-0 block w-3 h-3 m-4 bg-black bg-opacity-25 rounded-full shadow cursor-pointer hidden" :class="{
'bg-opacity-100': active === 3,
'bg-opacity-25': active !== 3,
'hidden': (pageSize !== 1 && !!(3 % pageSize))
}" @click="scrollTo(3)"></span>
</button>
</div>
<button aria-label="Next slide" :disabled="active >= itemCount-pageSize" class="text-black flex-none p-3" :class="{ 'opacity-25 pointer-events-none' : active >= itemCount-pageSize }" @click="scrollNext">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-5 h-5" width="25" height="25" aria-hidden="true" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m9 5 7 7-7 7"></path><title>chevron-right</title></svg>
</button>
</div>
</div>
<span :id="$id('slider-end')" tabindex="-1" id="slider-end-1"></span>
</div></section>
</div>
<script>
'use strict';
window.addEventListener('DOMContentLoaded', function() {
if (! window.productSliderEventHandlerInitialized) {
window.productSliderEventHandlerInitialized = true;
window.addEventListener('product-add-to-wishlist', (event) => {
const formKey = hyva.getFormKey();
const postUrl = BASE_URL + 'wishlist/index/add/';
const productId = event.detail.productId;
fetch(postUrl, {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
"body": "form_key=" + formKey + "&product=" + productId + "&uenc=" + hyva.getUenc(),
"method": "POST",
"mode": "cors",
"credentials": "include"
}).then(function (response) {
if (response.redirected) {
window.location.href = response.url;
} else if (response.ok) {
return response.json();
} else {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "warning",
text: "Could not add item to wishlist."
}], 5000
);
}
}).then(function (result) {
if (!result) {
return
}
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: (result.success) ? "success" : "error",
text: (result.success)
? "Product has been added to your Wish List." : result.error_message
}], 5000
);
window.dispatchEvent(new CustomEvent("reload-customer-section-data"));
}).catch(function (error) {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "error",
text: error
}], 5000
);
});
})
window.addEventListener('product-add-to-compare', (event) => {
const productId = event.detail.productId;
hyva.postForm({
action: BASE_URL + 'catalog/product_compare/add/',
data: {product: productId}
})
})
}
});
</script>
</div>
<div class="w-full bg-green-100 py-9 md:py-14 px-6 mb-8">
<form class="form subscribe" action="https://www.onahole.com/newsletter/subscriber/new/" method="post" x-data="initNewsletterForm()" @submit.prevent="submitForm()" id="newsletter-validate-detail" aria-label="Subscribe to Newsletter">
<h2 class="mb-3 text-center font-semibold tracking-wider text-gray-900 uppercase title-font" id="footer-newsletter-heading">
10% Off Your First Order </h2>
<p class="mb-4 text-center">Get secret updates on desires, fetish & promotions</p>
<div class="flex flex-col justify-center gap-4 md:flex-row md:justify-center">
<label for="newsletter-subscribe" class="sr-only">
Email Address </label>
<input name="email" type="email" required="" id="newsletter-subscribe" class="form-input inline-flex w-full md:max-w-sm" placeholder="Your email address" aria-describedby="footer-newsletter-heading">
<input name="form_key" type="hidden" value="ecdWqIDEprHSHapn"> <button class="inline-flex justify-center md:justify-start shrink-0 xl:mt-0 btn btn-primary">
Subscribe </button>
</div>
<div>
<template x-if="displayErrorMessage">
<p class="flex items-center text-red">
<span class="inline-block w-8 h-8 mr-3">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"></path><title>exclamation-circle</title></svg>
</span>
<template x-for="errorMessage in errorMessages">
<span x-html="errorMessage"></span>
</template>
</p>
</template>
</div>
</form>
<div class="w-full">
</div>
<script>
function initNewsletterForm() {
return {
errors: 0,
hasCaptchaToken: 0,
displayErrorMessage: false,
errorMessages: [],
setErrorMessages(messages) {
this.errorMessages = [messages]
this.displayErrorMessage = this.errorMessages.length
},
submitForm() {
// Do not rename $form, the variable is expected to be declared in the recaptcha output
const $form = document.querySelector('#newsletter-validate-detail');
if (this.errors === 0) {
$form.submit();
}
}
}
}
</script>
</div><style>
.product-slider .m-logo {
display: none;
}
.m-logo {
display: inline-block;
}
.m-logo .m-brand-tooltip {
position: relative;
float: left;
margin-right: 10px;
}
.m-logo .m-brand-tooltip .mst_tooltip {
position: absolute;
width: 350px;
padding: 10px;
border: 1px solid #ccc;
bottom: 100%;
margin-bottom: 20px;
left: 10%;
opacity: 1;
text-align: justify;
z-index: 1000;
}
.catalog-product-view .m-logo .m-brand-tooltip .mst_tooltip {
left: 27%;
}
.m-logo .m-brand-tooltip .mst_tooltip img {
width: 100px;
margin: auto;
padding: 0;
}
.m-logo .m-brand-tooltip .mst_tooltip .mst_tooltip__pointer {
position: absolute;
width: 15px;
height: 15px;
border-left: 1px solid #ccc;
border-bottom: 1px solid #ccc;
bottom: -8px;
left: 10px;
transform: rotate(-0.125turn);
}
.m-logo .m-brand-tooltip:hover .mst_tooltip {
display: block;
-webkit-animation: fadeInFromNone 0.5s ease-in-out;
-moz-animation: fadeInFromNone 0.5s ease-in-out;
-o-animation: fadeInFromNone 0.5s ease-in-out;
animation: fadeInFromNone 0.5s ease-in-out;
}
@-webkit-keyframes fadeInFromNone {
0% {
display: none;
opacity: 0;
}
1% {
display: block;
opacity: 0;
}
100% {
display: block;
opacity: 1;
}
}
@-moz-keyframes fadeInFromNone {
0% {
display: none;
opacity: 0;
}
1% {
display: block;
opacity: 0;
}
100% {
display: block;
opacity: 1;
}
}
@-o-keyframes fadeInFromNone {
0% {
display: none;
opacity: 0;
}
1% {
display: block;
opacity: 0;
}
100% {
display: block;
opacity: 1;
}
}
@keyframes fadeInFromNone {
0% {
display: none;
opacity: 0;
}
1% {
display: block;
opacity: 0;
}
100% {
display: block;
opacity: 1;
}
}
</style>
<script>
function initReviewSliderComponent() {
return {
active: 0,
items: [],
currency: [],
loading: true,
itemCount: 0,
pageSize: 3,
pageFillers: 0,
minHeight() {
return 'min-height: ' + ((this.loading && '300px') || 0);
},
getItems($nextTick) {
this.items = [{"review_id":"397","review_date":"12\/14\/2024","reviewer_name":"Drew Baker","review_text":"I didn't realize how bad the pocket pussy's I had were until I experienced this! They had very little texture inside and it wasn't very varied. This thing is top-notch, texture zones are noticeable and awesome. The tentacle like outside and entrance are awesome feeling. I also really like that this doesn't look like a random body part if someone stumbled upon it. I keep it in the medium-size bag offered on this site but others mention it fits in the small one as well. Only issue is I feel I need 2! One at home and one in my travel suitcase. Does not disappoint. ","review_title":"Fantastic texture and quality! ","rating_value":"5"},{"review_id":"396","review_date":"12\/14\/2024","reviewer_name":"Drew Baker","review_text":"I was unsure what size to get for the onahole I have, this fit the bill perfectly though. I have the Sex Slave Sea Monster onahole and it's fairly large. That's what's in the bag in my photos. Have room to spare and could probably fit a bottle of lube in there as well. I keep my Onahole in a small briefcase under my bed and this keeps everything else in my case separate. Definitely going to use this when I'm traveling out of town for work as well. ","review_title":"Perfect for my application","rating_value":"5"},{"review_id":"395","review_date":"12\/14\/2024","reviewer_name":"Drew Baker","review_text":"Switching from regular lube to Japanese was a massive improvement. If you'r if it makes a difference, Heck yes it does! Perfect for use with a onahole, don't need a ton and it stays slick and lasts long. Very happy, I would say it is slightly lighter weight then the TYO lube also offered here. Be careful when applying, the bottle has a larger opening and a little goes allll the way you need it to.","review_title":"Good stuff, no regrets!","rating_value":"5"},{"review_id":"394","review_date":"12\/14\/2024","reviewer_name":"Drew Baker","review_text":"I didn't know what I was missing! I use basic stuff like astroglide that I could find at a local grocery store. This stuff is bomb, thicker without being too thick, and lasts a good session without needing to reapply constantly. Perfect for a Onahole. I will definitely order more as soon as I run out. No real noticeable odor and if it has one it's very neutral. It, true to form does \"reactivate\" with a little moisture. Don't think I'll be going anywhere else for lube. Discrete shipping in a little brown box.","review_title":"Best thicker lube I have used","rating_value":"5"},{"review_id":"393","review_date":"12\/14\/2024","reviewer_name":"First onahole guy","review_text":"Amazing experience for me.","review_title":"Good","rating_value":"5"},{"review_id":"392","review_date":"12\/14\/2024","reviewer_name":"StrangeStation","review_text":"Its a little thing but it makes cleaning easier. ","review_title":"Better to have than not","rating_value":"5"},{"review_id":"391","review_date":"12\/13\/2024","reviewer_name":"Lula","review_text":"It is a life changer when drying your onaholes. At first I was simply using normal paper towels to dry my onaholes and never consider buying a dry stick, but right after i bought this item i decrease my time getting all the extra water in them by at least half. You should 100% buy this (if you dont like spending time clean your onaholes with much time) if you have just a bit to spend with.","review_title":"Should buy along side your Onahole","rating_value":"5"},{"review_id":"389","review_date":"12\/10\/2024","reviewer_name":"Enma","review_text":"There is not much to say about this product, it is a drying stick and it does its job well.\r\n\r\nIt makes the cleaning\/drying process a breeze. I recommend picking up two at a time in case one breaks, they are fragile, or in case your onahole of choice has two holes.\r\n\r\nThank you for reading.","review_title":"Gets the Job Done!","rating_value":"5"},{"review_id":"388","review_date":"12\/10\/2024","reviewer_name":"Enma","review_text":"Let me start by saying that this onahole feels amazing. It is tight, offers great stimulation without being too much or too little. The textures are nice and the onahole is super easy to clean. Well sorta. \r\n\r\nThe reason I gave this onahole a 4\/5 is due to the double layer design. The two layers separate after using once which doesn't affect the onahole in terms of usage but cleaning. Because the layers split you must ensure that the interior of the onahole AND in between the layers are dry. To do so you must begin with turning the onahole inside out which with time can shorten the lifespan of the onahole.\r\n\r\nI really want to recommend this onahole because it feels amazing, it's compact, and easy to clean for the most part. With time, the two layers will mend together again but will split apart just as easy. \r\n\r\nI say pick this one up when they are running a sale but if not they have other amazing onaholes on here.\r\n\r\nThank you for reading.","review_title":"Almost Perfect","rating_value":"4"},{"review_id":"386","review_date":"12\/10\/2024","reviewer_name":"B.B.","review_text":"I have tried many different lubes over the years, but this really does rise above the rest for me. The stringy consistency leads to a very slick, long lasting feel as long as you are careful not to use too much. The design of the bottle is a bit of a problem in this regard as the opening seems far too large for the amounts that you would typically want to dispense, but it works out with some practice. And when I say long lasting, I do mean it even when you might not want it to. Cleaning up afterwards can be surprisingly difficult as it doesn\u2019t immediately wash away with water like many other popular lubes do. However, this is just nitpicking and is well worth the tradeoff for the better experience. Just don\u2019t expect to be able to instantly wipe it off like I did. Also, this is obviously different for everybody, but I find myself mildly allergic to a surprisingly large number of common lubes and this one is perfectly fine for me so I will definitely be returning when I run out.","review_title":"Slick and long lasting but messier than most. ","rating_value":"5"}];
this.loading = false;
$nextTick(() => this.calcPageSize());
return this.items;
},
getSlider() {
return this.$root.querySelector('.js_slides');
},
calcPageSize() {
const slider = this.getSlider();
if (slider) {
this.itemCount = slider.querySelectorAll('.js_slide').length;
this.pageSize = Math.round(slider.clientWidth / slider.querySelector('.js_slide').clientWidth);
this.pageFillers = (
this.pageSize * Math.ceil(this.itemCount / this.pageSize)
) - this.itemCount;
}
},
calcActive() {
const slider = this.getSlider();
if (slider) {
const sliderItems = this.itemCount + this.pageFillers;
const calculatedActiveSlide = slider.scrollLeft / (slider.scrollWidth / sliderItems);
this.active = Math.round(calculatedActiveSlide / this.pageSize) * this.pageSize;
}
},
scrollPrevious() {
this.scrollTo(this.active - this.pageSize);
},
scrollNext() {
this.scrollTo(this.active + this.pageSize);
},
scrollTo(idx) {
const slider = this.getSlider();
if (slider) {
const slideWidth = slider.scrollWidth / (this.itemCount + this.pageFillers);
slider.scrollLeft = Math.floor(slideWidth) * idx;
this.active = idx;
}
}
}
}
</script>
<div class="mb-8">
<div class="container flex flex-col items-center pt-6 pb-3 mx-auto mb-6 border-b-2
border-gray-300 md:flex-row">
<h3 class="text-2xl font-medium text-gray-900 title-font">
Customer Reviews </h3>
</div>
<section class="my-10 text-gray-700 body-font" x-data="initReviewSliderComponent" x-init="getItems($nextTick);" :style="minHeight()" @resize.window.debounce="calcPageSize(); $nextTick( function() { calcActive() })" style="min-height: 0">
<template x-if="items && items.length">
<div class="relative">
<div class="relative w-full overflow-x-hidden">
<button aria-label="Previous" tabindex="-1" :disabled="active === 0" style="top: 125px; left: -15px; border-radius: 56%; height: 55px; width: 55px;" class="absolute left-0 z-20 bg-white shadow-2xl w-8 h-8 mx-4 text-gray-300 outline-none focus:outline-none" :class="{ 'opacity-25 pointer-events-none' : active === 0 }" @click="scrollPrevious">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-25 h-25 inline-block" width="40" height="40" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m15 19-7-7 7-7"></path><title>chevron-left</title></svg>
</button>
<div class="relative flex flex-nowrap w-full overflow-auto transition-all js_slides snap" @scroll.debounce="calcActive">
<template x-for="item in items">
<div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3">
<div class="relative mx-1 py-3 px-4 bg-white card-interactive rounded-lg border border-zinc-300">
<div class="flex flex-nowrap items-center justify-between mb-4">
<template x-if="item.rating_value == 4">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<template x-if="item.rating_value == 5">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<div class="text-sm text-grey-225" x-text="item.review_date"></div>
</div>
<div class="text-lg mb-4 font-medium" x-text="item.review_title"></div>
<p class="mb-4" x-text="item.review_text"></p>
<div class="font-medium" x-text="item.reviewer_name"></div>
</div>
</div>
</template>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex-none py-1' : pageFillers > 0
}"></div>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex-none py-1' : pageFillers > 1
}"></div>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex-none py-1' : pageFillers > 2
}"></div>
</div>
<button aria-label="Next" tabindex="-1" :disabled="active >= itemCount-pageSize" style="top: 125px; right: -15px; border-radius: 56%; height: 55px; width: 55px;" class="absolute z-20 bg-white shadow-2xl w-8 h-8 mx-4 text-gray-300 outline-none focus:outline-none" :class="{ 'opacity-25 pointer-events-none' : active >= itemCount-pageSize }" @click="scrollNext">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-25 h-25 inline-block" width="40" height="40" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m9 5 7 7-7 7"></path><title>chevron-right</title></svg>
</button>
</div>
</div>
</template><div class="relative">
<div class="relative w-full overflow-x-hidden">
<button aria-label="Previous" tabindex="-1" :disabled="active === 0" style="top: 125px; left: -15px; border-radius: 56%; height: 55px; width: 55px;" class="absolute left-0 z-20 bg-white shadow-2xl w-8 h-8 mx-4 text-gray-300 outline-none focus:outline-none opacity-25 pointer-events-none" :class="{ 'opacity-25 pointer-events-none' : active === 0 }" @click="scrollPrevious" disabled="disabled">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-25 h-25 inline-block" width="40" height="40" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m15 19-7-7 7-7"></path><title>chevron-left</title></svg>
</button>
<div class="relative flex flex-nowrap w-full overflow-auto transition-all js_slides snap" @scroll.debounce="calcActive">
<template x-for="item in items">
<div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3">
<div class="relative mx-1 py-3 px-4 bg-white card-interactive rounded-lg border border-zinc-300">
<div class="flex flex-nowrap items-center justify-between mb-4">
<template x-if="item.rating_value == 4">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<template x-if="item.rating_value == 5">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<div class="text-sm text-grey-225" x-text="item.review_date"></div>
</div>
<div class="text-lg mb-4 font-medium" x-text="item.review_title"></div>
<p class="mb-4" x-text="item.review_text"></p>
<div class="font-medium" x-text="item.reviewer_name"></div>
</div>
</div>
</template><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3">
<div class="relative mx-1 py-3 px-4 bg-white card-interactive rounded-lg border border-zinc-300">
<div class="flex flex-nowrap items-center justify-between mb-4">
<template x-if="item.rating_value == 4">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<template x-if="item.rating_value == 5">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template><div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
<div class="text-sm text-grey-225" x-text="item.review_date">12/14/2024</div>
</div>
<div class="text-lg mb-4 font-medium" x-text="item.review_title">Fantastic texture and quality! </div>
<p class="mb-4" x-text="item.review_text">I didn't realize how bad the pocket pussy's I had were until I experienced this! They had very little texture inside and it wasn't very varied. This thing is top-notch, texture zones are noticeable and awesome. The tentacle like outside and entrance are awesome feeling. I also really like that this doesn't look like a random body part if someone stumbled upon it. I keep it in the medium-size bag offered on this site but others mention it fits in the small one as well. Only issue is I feel I need 2! One at home and one in my travel suitcase. Does not disappoint. </p>
<div class="font-medium" x-text="item.reviewer_name">Drew Baker</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3">
<div class="relative mx-1 py-3 px-4 bg-white card-interactive rounded-lg border border-zinc-300">
<div class="flex flex-nowrap items-center justify-between mb-4">
<template x-if="item.rating_value == 4">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<template x-if="item.rating_value == 5">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template><div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
<div class="text-sm text-grey-225" x-text="item.review_date">12/14/2024</div>
</div>
<div class="text-lg mb-4 font-medium" x-text="item.review_title">Perfect for my application</div>
<p class="mb-4" x-text="item.review_text">I was unsure what size to get for the onahole I have, this fit the bill perfectly though. I have the Sex Slave Sea Monster onahole and it's fairly large. That's what's in the bag in my photos. Have room to spare and could probably fit a bottle of lube in there as well. I keep my Onahole in a small briefcase under my bed and this keeps everything else in my case separate. Definitely going to use this when I'm traveling out of town for work as well. </p>
<div class="font-medium" x-text="item.reviewer_name">Drew Baker</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3">
<div class="relative mx-1 py-3 px-4 bg-white card-interactive rounded-lg border border-zinc-300">
<div class="flex flex-nowrap items-center justify-between mb-4">
<template x-if="item.rating_value == 4">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<template x-if="item.rating_value == 5">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template><div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
<div class="text-sm text-grey-225" x-text="item.review_date">12/14/2024</div>
</div>
<div class="text-lg mb-4 font-medium" x-text="item.review_title">Good stuff, no regrets!</div>
<p class="mb-4" x-text="item.review_text">Switching from regular lube to Japanese was a massive improvement. If you'r if it makes a difference, Heck yes it does! Perfect for use with a onahole, don't need a ton and it stays slick and lasts long. Very happy, I would say it is slightly lighter weight then the TYO lube also offered here. Be careful when applying, the bottle has a larger opening and a little goes allll the way you need it to.</p>
<div class="font-medium" x-text="item.reviewer_name">Drew Baker</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3">
<div class="relative mx-1 py-3 px-4 bg-white card-interactive rounded-lg border border-zinc-300">
<div class="flex flex-nowrap items-center justify-between mb-4">
<template x-if="item.rating_value == 4">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<template x-if="item.rating_value == 5">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template><div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
<div class="text-sm text-grey-225" x-text="item.review_date">12/14/2024</div>
</div>
<div class="text-lg mb-4 font-medium" x-text="item.review_title">Best thicker lube I have used</div>
<p class="mb-4" x-text="item.review_text">I didn't know what I was missing! I use basic stuff like astroglide that I could find at a local grocery store. This stuff is bomb, thicker without being too thick, and lasts a good session without needing to reapply constantly. Perfect for a Onahole. I will definitely order more as soon as I run out. No real noticeable odor and if it has one it's very neutral. It, true to form does "reactivate" with a little moisture. Don't think I'll be going anywhere else for lube. Discrete shipping in a little brown box.</p>
<div class="font-medium" x-text="item.reviewer_name">Drew Baker</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3">
<div class="relative mx-1 py-3 px-4 bg-white card-interactive rounded-lg border border-zinc-300">
<div class="flex flex-nowrap items-center justify-between mb-4">
<template x-if="item.rating_value == 4">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<template x-if="item.rating_value == 5">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template><div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
<div class="text-sm text-grey-225" x-text="item.review_date">12/14/2024</div>
</div>
<div class="text-lg mb-4 font-medium" x-text="item.review_title">Good</div>
<p class="mb-4" x-text="item.review_text">Amazing experience for me.</p>
<div class="font-medium" x-text="item.reviewer_name">First onahole guy</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3">
<div class="relative mx-1 py-3 px-4 bg-white card-interactive rounded-lg border border-zinc-300">
<div class="flex flex-nowrap items-center justify-between mb-4">
<template x-if="item.rating_value == 4">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<template x-if="item.rating_value == 5">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template><div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
<div class="text-sm text-grey-225" x-text="item.review_date">12/14/2024</div>
</div>
<div class="text-lg mb-4 font-medium" x-text="item.review_title">Better to have than not</div>
<p class="mb-4" x-text="item.review_text">Its a little thing but it makes cleaning easier. </p>
<div class="font-medium" x-text="item.reviewer_name">StrangeStation</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3">
<div class="relative mx-1 py-3 px-4 bg-white card-interactive rounded-lg border border-zinc-300">
<div class="flex flex-nowrap items-center justify-between mb-4">
<template x-if="item.rating_value == 4">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<template x-if="item.rating_value == 5">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template><div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
<div class="text-sm text-grey-225" x-text="item.review_date">12/13/2024</div>
</div>
<div class="text-lg mb-4 font-medium" x-text="item.review_title">Should buy along side your Onahole</div>
<p class="mb-4" x-text="item.review_text">It is a life changer when drying your onaholes. At first I was simply using normal paper towels to dry my onaholes and never consider buying a dry stick, but right after i bought this item i decrease my time getting all the extra water in them by at least half. You should 100% buy this (if you dont like spending time clean your onaholes with much time) if you have just a bit to spend with.</p>
<div class="font-medium" x-text="item.reviewer_name">Lula</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3">
<div class="relative mx-1 py-3 px-4 bg-white card-interactive rounded-lg border border-zinc-300">
<div class="flex flex-nowrap items-center justify-between mb-4">
<template x-if="item.rating_value == 4">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<template x-if="item.rating_value == 5">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template><div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
<div class="text-sm text-grey-225" x-text="item.review_date">12/10/2024</div>
</div>
<div class="text-lg mb-4 font-medium" x-text="item.review_title">Gets the Job Done!</div>
<p class="mb-4" x-text="item.review_text">There is not much to say about this product, it is a drying stick and it does its job well.
It makes the cleaning/drying process a breeze. I recommend picking up two at a time in case one breaks, they are fragile, or in case your onahole of choice has two holes.
Thank you for reading.</p>
<div class="font-medium" x-text="item.reviewer_name">Enma</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3">
<div class="relative mx-1 py-3 px-4 bg-white card-interactive rounded-lg border border-zinc-300">
<div class="flex flex-nowrap items-center justify-between mb-4">
<template x-if="item.rating_value == 4">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template><div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
<template x-if="item.rating_value == 5">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<div class="text-sm text-grey-225" x-text="item.review_date">12/10/2024</div>
</div>
<div class="text-lg mb-4 font-medium" x-text="item.review_title">Almost Perfect</div>
<p class="mb-4" x-text="item.review_text">Let me start by saying that this onahole feels amazing. It is tight, offers great stimulation without being too much or too little. The textures are nice and the onahole is super easy to clean. Well sorta.
The reason I gave this onahole a 4/5 is due to the double layer design. The two layers separate after using once which doesn't affect the onahole in terms of usage but cleaning. Because the layers split you must ensure that the interior of the onahole AND in between the layers are dry. To do so you must begin with turning the onahole inside out which with time can shorten the lifespan of the onahole.
I really want to recommend this onahole because it feels amazing, it's compact, and easy to clean for the most part. With time, the two layers will mend together again but will split apart just as easy.
I say pick this one up when they are running a sale but if not they have other amazing onaholes on here.
Thank you for reading.</p>
<div class="font-medium" x-text="item.reviewer_name">Enma</div>
</div>
</div><div class="flex-none w-full py-1 js_slide md:w-1/2 lg:w-1/3">
<div class="relative mx-1 py-3 px-4 bg-white card-interactive rounded-lg border border-zinc-300">
<div class="flex flex-nowrap items-center justify-between mb-4">
<template x-if="item.rating_value == 4">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template>
<template x-if="item.rating_value == 5">
<div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
</template><div class="flex flex-nowrap">
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" style="color: #f6e05e">
<path 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
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
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
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"></path>
</svg>
</div>
<div class="text-sm text-grey-225" x-text="item.review_date">12/10/2024</div>
</div>
<div class="text-lg mb-4 font-medium" x-text="item.review_title">Slick and long lasting but messier than most. </div>
<p class="mb-4" x-text="item.review_text">I have tried many different lubes over the years, but this really does rise above the rest for me. The stringy consistency leads to a very slick, long lasting feel as long as you are careful not to use too much. The design of the bottle is a bit of a problem in this regard as the opening seems far too large for the amounts that you would typically want to dispense, but it works out with some practice. And when I say long lasting, I do mean it even when you might not want it to. Cleaning up afterwards can be surprisingly difficult as it doesn’t immediately wash away with water like many other popular lubes do. However, this is just nitpicking and is well worth the tradeoff for the better experience. Just don’t expect to be able to instantly wipe it off like I did. Also, this is obviously different for everybody, but I find myself mildly allergic to a surprisingly large number of common lubes and this one is perfectly fine for me so I will definitely be returning when I run out.</p>
<div class="font-medium" x-text="item.reviewer_name">B.B.</div>
</div>
</div>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex-none py-1' : pageFillers > 0
}"></div>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex-none py-1' : pageFillers > 1
}"></div>
<div :class="{
'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex-none py-1' : pageFillers > 2
}"></div>
</div>
<button aria-label="Next" tabindex="-1" :disabled="active >= itemCount-pageSize" style="top: 125px; right: -15px; border-radius: 56%; height: 55px; width: 55px;" class="absolute z-20 bg-white shadow-2xl w-8 h-8 mx-4 text-gray-300 outline-none focus:outline-none" :class="{ 'opacity-25 pointer-events-none' : active >= itemCount-pageSize }" @click="scrollNext">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-25 h-25 inline-block" width="40" height="40" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m9 5 7 7-7 7"></path><title>chevron-right</title></svg>
</button>
</div>
</div>
</section>
</div>
<div class="home-blog-post">
<div class="container-title">
<h3 class="title">Guides To Get Started</h3>
</div>
<div class="post-wrap">
<div class="last-post">
<div class="image"><a href="#"><img width="312" height="289" src="https://cdn.onahole.com/media/.renditions/wysiwyg/homepage/Mature-Womans-Smell-Kyoko-Ichika.jpg" alt="blog-post"></a></div>
<div class="post-date">Latest Post</div>
<h3 class="post-name"><a href="#">10 Mind-Blowing Hand Job Techniques to Try</a></h3>
</div>
<div class="post-list">
<div class="item">
<div class="image"><a href="#"><img width="260" height="257" src="https://cdn.onahole.com/media/.renditions/wysiwyg/homepage/Kemono-Fox-Girl-Torso--260x257.jpg" alt="blog-post"></a></div>
<div class="item-info">
<h3 class="item-name"><a href="#">10 Kinky Sex Ideas You Should Try</a></h3>
<div class="item-date">April 5, 2023</div>
<p>Don’t let your lovemaking be stuck in a rut. It is nice to have a go-to position or routine when having sex with your partner.</p>
</div>
</div>
<div class="item">
<div class="image"><a href="#"><img width="260" height="257" src="https://cdn.onahole.com/media/.renditions/wysiwyg/homepage/how-to-use-sexdolls-260x260.jpg" alt="blog-post"></a></div>
<div class="item-info">
<h3 class="item-name"><a href="#">Why Do People Use Sex Dolls?</a></h3>
<div class="item-date">March 24, 2023</div>
<p>Table of Contents Top reasons to use sex dolls What are the benefits? Popular types of sex dolls How to use sex dolls? Everything you.</p>
</div>
</div>
<div class="item">
<div class="image"><a href="#"><img width="260" height="257" src="https://cdn.onahole.com/media/.renditions/wysiwyg/homepage/big-ass-fetish-260x260.jpg" alt="blog-post"></a></div>
<div class="item-info">
<h3 class="item-name"><a href="#">Best Big Butt Sex Dolls </a></h3>
<div class="item-date">March 15, 2023</div>
<p>Table of Contents Why should you choose big ass sex dolls Popular types of big butt sex dolls What are the best big ass fetish.</p>
</div>
</div>
</div>
</div>
</div>
<div class="container flex flex-col items-center pt-6 pb-3 mx-auto mb-6 border-b-2
border-gray-300 md:flex-row">
<h3 class="text-2xl font-medium text-gray-900 title-font">FAQs</h3>
</div>
<div class="seo-block border border-container bg-container-darker p-4 md:border-0 md:bg-transparent md:py-0 md:px-0 my-6" x-data="initWelcomeComponent()">
<div class="sm:container">
<div class="card my-4 select-none" x-data="{ open: false }">
<div class="welcome-title flex justify-between items-center cursor-pointer hover:text-secondary-darker border-container" :class="{ 'border-b pb-4': open }" @click="open = !open">
<span class="title text-md md:text-lg font-semibold">
Why Choose Onahole.com?
</span>
<span class="py-1 px-1 rounded border border-container">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="transition-transform transform duration-300 ease-in-out" :class="open ? 'rotate-180' : ''">
<path d="M19 9L12 16L5 9" stroke="#4A5568" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
</svg>
</span>
</div>
<div class="welcome-content pt-3 hidden block" :class="{ 'hidden': !open , 'block': 'open' }">
<p>Onahole.com is your gateway to premium japanese onaholes and other sex toys. We work with only the best and well-known Japanese manufacturers to bring you <strong>high quality vagina replicas of Japanese porn stars and hentai characters.</strong></p>
<p>We take into consideration the right fit for man in USA. Rest assured all our Japanese vaginas will fit you comfortably regardless of the size of your manhood.</p>
<p>Furthermore, we’ve got a <strong>wide variety of onaholes</strong>. From Japanese porn stars to unique and unimaginable toys that will surely satisfy all your desires and fetishes.</p>
<p><strong>Start spanking and banging</strong> on a Japanese onahole now!</p>
</div>
</div>
<div class="card my-4 select-none" x-data="{ open: false }">
<div class="welcome-title flex justify-between items-center cursor-pointer hover:text-secondary-darker border-container" :class="{ 'border-b pb-4': open }" @click="open = !open">
<span class="title text-md md:text-lg font-semibold">
Why Buy Realistic Sex Dolls & Onaholes
</span>
<span class="py-1 px-1 rounded border border-container">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="transition-transform transform duration-300 ease-in-out" :class="open ? 'rotate-180' : ''">
<path d="M19 9L12 16L5 9" stroke="#4A5568" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
</svg>
</span>
</div>
<div class="welcome-content pt-3 hidden block" :class="{ 'hidden': !open , 'block': 'open' }">
<p>Sex toys have gained popularity for various reasons. <strong>Why do people use sex dolls?</strong> Well:</p>
<p>they’re an alternative to real human contact – people who are shy or live in long-distance relationships may find it challenging to engage in sexual activities with others.<br>
they give you comfort and flexibility that can be hard to find with another person. You can choose a doll according to your preferences to experience a completely new level of pleasure and fulfill your wildest sexual fantasies.</p>
</div>
</div>
<div class="card my-4 select-none" x-data="{ open: false }">
<div class="welcome-title flex justify-between items-center cursor-pointer hover:text-secondary-darker border-container" :class="{ 'border-b pb-4': open }" @click="open = !open">
<span class="title text-md md:text-lg font-semibold">
Benefits Of Sex Dolls & Onaholes
</span>
<span class="py-1 px-1 rounded border border-container">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="transition-transform transform duration-300 ease-in-out" :class="open ? 'rotate-180' : ''">
<path d="M19 9L12 16L5 9" stroke="#4A5568" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
</svg>
</span>
</div>
<div class="welcome-content pt-3 hidden block" :class="{ 'hidden': !open , 'block': 'open' }">
<p>enjoy an incredibly high level of realism they offer – modern sex dolls are made with high-quality materials and advanced technologies that make them feel and look like real humans. All this to provide a more immersive and realistic sexual experience for everyone who wants to spice up their sex life.</p>
<p>find a safe and hygienic alternative to engaging in risky or unusual sexual activities with other people – sex dolls are easy to clean and maintain, and users can avoid sexually transmitted infections and other health risks associated with real human contact. Moreover, they’re discreet and won’t judge you. In a nutshell, sex dolls are there for you to cater to your needs and help you climax.</p>
</div>
</div>
<div class="card my-4 select-none" x-data="{ open: false }">
<div class="welcome-title flex justify-between items-center cursor-pointer hover:text-secondary-darker border-container" :class="{ 'border-b pb-4': open }" @click="open = !open">
<span class="title text-md md:text-lg font-semibold">
Fast Local Shipping
</span>
<span class="py-1 px-1 rounded border border-container">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="transition-transform transform duration-300 ease-in-out" :class="open ? 'rotate-180' : ''">
<path d="M19 9L12 16L5 9" stroke="#4A5568" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
</svg>
</span>
</div>
<div class="welcome-content pt-3 hidden block" :class="{ 'hidden': !open , 'block': 'open' }">
<p><strong>Shipping information</strong><br>We ship all products from our USA Warehouse in Boise, ID to all US States. So as a US Customer we ensure you get your orders fast and don't have to worry about customs.</p>
<p>We don't ship to any other countries. If you're from Europe we advise you to shop at <a href="https://www.motsutoys.com/" target="_blank" title="European Onahole Store" aria-describedby="a11y-new-window-external-message" rel="noopener">www.motsutoys.com</a>.</p>
<p><strong>Shipping times:</strong><br>
Orders are shipped on weekdays within 48 hours after payment confirmation.</p>
<p>With economy shipping your order will arrive between 2 to 10 business days after shipping. Economy shipping costs $15 per order and we use either Fedex or USPS to ship your order.</p>
<p>We also offer Fedex overnight and Fedex 2 day shipping. The rates are based on your location and the weight and size of the products in your order.</p>
</div>
</div>
<div class="card my-4 select-none" x-data="{ open: false }">
<div class="welcome-title flex justify-between items-center cursor-pointer hover:text-secondary-darker border-container" :class="{ 'border-b pb-4': open }" @click="open = !open">
<span class="title text-md md:text-lg font-semibold">
Discreet Shipping For All Products
</span>
<span class="py-1 px-1 rounded border border-container">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="transition-transform transform duration-300 ease-in-out" :class="open ? 'rotate-180' : ''">
<path d="M19 9L12 16L5 9" stroke="#4A5568" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
</svg>
</span>
</div>
<div class="welcome-content pt-3 hidden block" :class="{ 'hidden': !open , 'block': 'open' }">
<p>Your privacy is our top priority. We understand that you might not want others to know what you have ordered so here are 3 ways we keep your orders discreet.</p>
<p>1) We will ship your orders in a plain cardboard box. On the outside of the box there are no pictures or text pointing to the content of the shipment.</p>
<p>2) There are no references to our company on the shipping labels and box. We use a third party shipping company and they use a discrete return address which cannot be tracked back to us in anyway.
</p><p>3) The payment invoice is just as discreet. We use simple and general abbreviations on the payment description. </p>
</div>
</div> </div>
</div>
<script>
function initWelcomeComponent() {
return {}
}
</script>
</div></div></main><footer class="page-footer"><div class="footer content"><div class="border-t border-b border-grey-150">
<div class="container py-6 lg:py-8 flex flex-col gap-8 lg:gap-5 md:grid md:grid-cols-2 lg:flex lg:flex-row lg:justify-between">
<div>
<a class="no-underline hover:no-underline inline-block mb-4" href="https://www.onahole.com/" title="Onahole dot Com" aria-label="store logo">
<img src="https://cdn.onahole.com/media/logo/default/onahole_dot_com_logo.jpg" title="Onahole dot Com" alt="Onahole dot Com" width="200" height="150">
</a> <p class="text-sm md:max-w-xs mb-4">
We use encrypted SSL security to ensure that
your payment information is 100% protected.</p>
<div>
<img width="312" height="59" src="https://www.onahole.com/static/frontend/Onaholecom/default/en_US/images/Onahole_Guarantee.png" alt="Onahole_Guarantee">
</div>
</div>
<div class="footer-links">
<h3>Customer Support</h3>
<ul>
<li><a href="/contact">Contact Us</a></li>
<li><a href="/terms-and-conditions">Terms & Conditions</a></li>
<li><a href="/privacy-policy">Privacy Policy</a></li>
</ul> </div>
<div class="footer-links">
<h3>COMPANY INFORMATION</h3>
<ul>
<li><a href="/about-us">About Us</a></li>
<li><a href="/shipping-information">Shipping information</a></li>
<li><a href="https://blog.onahole.com/" target="_blank">Blog</a></li>
<li><a href="/onahole-com-affiliate-program">Affiliate Program</a></li>
</ul> </div>
<div class="footer-links">
<h3>PRODUCT CATEGORIES</h3>
<ul>
<li><a href="/top-10-2023.html">Top Products 2023</a></li>
<li><a href="/onaholes">Onaholes</a></li>
<li><a href="/onahip">Onahips</a></li>
<li><a href="/tit-sex-toys">Boobs Sex Toys</a></li>
<li><a href="/sex-doll-torso">Sex Doll Torso</a></li>
</ul> </div>
</div>
</div>
<div class="container py-4 text-center lg:text-left">
</div></div></footer><div data-mage-init="{"Mirasvit_Related\/js\/track245":{"callbackUrl":"https:\/\/www.onahole.com\/mstRelated\/analytics\/track\/","cookieName":"mst_related_session_id"}}"></div><script data-mfmofile="true">
document.addEventListener("DOMContentLoaded", function() {
if (document.querySelectorAll('.mf-ytw-wrapper').length || document.querySelectorAll('[data-mf-ytw-youtube-link]').length) {
!function (f, b, e, v, t, s) {
if(f.mfytwcss)return;
f.mfytwcss=1;
t = b.createElement(e);
t.rel = 'stylesheet';
t.type = 'text/css';
t.href = v;
s = b.getElementsByTagName('HEAD')[0];
s.appendChild(t)
}(window, document, 'link', 'https://www.onahole.com/static/frontend/Onaholecom/default/en_US/Magefan_YouTubeWidget/css/youtubewidget.css');
}
if (document.querySelectorAll('.mf-ytw-wrapper').length) {
!function (f, b, e, v, t, s) {
if(f.mfytwjs)return;
f.mfytwjs=1;
t = b.createElement(e);
t.type = 'text/javascript';
t.src = v;
s = b.getElementsByTagName('HEAD')[0];
s.appendChild(t)
}(window, document, 'script', 'https://www.onahole.com/static/frontend/Onaholecom/default/en_US/Magefan_YouTubeWidget/js/iframe.js');
}
if (document.querySelectorAll('[data-mf-ytw-youtube-link]').length) {
!function (f, b, e, v, t) {
if(f.mflinkjs)return;
f.mflinkjs=1;
t = b.createElement(e);
t.type = 'text/javascript';
t.src = v;
s = b.getElementsByTagName('HEAD')[0];
s.appendChild(t)
}(window, document, 'script', 'https://www.onahole.com/static/frontend/Onaholecom/default/en_US/Magefan_YouTubeWidget/js/link.js');
}
});
</script>
<!-- BLOCK meetanshi-tapfiliate-body -->
<script type="text/javascript">
(function (t, a, p) {
t.TapfiliateObject = a;
t[a] = t[a] || function () {
(t[a].q = t[a].q || []).push(arguments)
}
})(window, 'tap');
tap('create', '5395-651843', { integration: "magento" });
tap('detect');
</script>
<!-- /BLOCK meetanshi-tapfiliate-body --><script type="application/ld+json">{"@context":"http:\/\/schema.org","@type":"Organization","url":"https:\/\/www.onahole.com\/","logo":"https:\/\/cdn.onahole.com\/media\/logo\/default\/onahole_dot_com_logo.jpg","name":"Onahole.com","telephone":"(208)-923-1700","email":"[email protected]","address":{"@type":"PostalAddress","addressCountry":"United States","addressLocality":"Boise","postalCode":"83716","streetAddress":"9605 S Eisenman Rd","addressRegion":"ID"}}</script><script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"WebSite","url":"https:\/\/www.onahole.com\/","potentialAction":{"@type":"SearchAction","target":"https:\/\/www.onahole.com\/catalogsearch\/result?q={search_term_string}","query-input":"required name=search_term_string"}}</script>
<script>
(() => {
function src_default(Alpine) {
Alpine.directive("intersect", (el, { value, expression, modifiers }, { evaluateLater, cleanup }) => {
let evaluate = evaluateLater(expression);
let options = {
rootMargin: getRootMargin(modifiers),
threshold: getThreshhold(modifiers)
};
let observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting === (value === "leave"))
return;
evaluate();
modifiers.includes("once") && observer.disconnect();
});
}, options);
observer.observe(el);
cleanup(() => {
observer.disconnect();
});
});
}
function getThreshhold(modifiers) {
if (modifiers.includes("full"))
return 0.99;
if (modifiers.includes("half"))
return 0.5;
if (!modifiers.includes("threshold"))
return 0;
let threshold = modifiers[modifiers.indexOf("threshold") + 1];
if (threshold === "100")
return 1;
if (threshold === "0")
return 0;
return Number(`.${threshold}`);
}
function getLengthValue(rawValue) {
let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/);
return match ? match[1] + (match[2] || "px") : void 0;
}
function getRootMargin(modifiers) {
const key = "margin";
const fallback = "0px 0px 0px 0px";
const index = modifiers.indexOf(key);
if (index === -1)
return fallback;
let values = [];
for (let i = 1; i < 5; i++) {
values.push(getLengthValue(modifiers[index + i] || ""));
}
values = values.filter((v) => v !== void 0);
return values.length ? values.join(" ").trim() : fallback;
}
document.addEventListener("alpine:init", () => {
window.Alpine.plugin(src_default);
});
})();
</script>
<script type="module" src="https://www.onahole.com/static/frontend/Onaholecom/default/en_US/Hyva_Theme/js/alpine3.min.js" defer="" crossorigin=""></script>
<script>
'use strict';
function dispatchMessages(messages, hideAfter) {
const messagesEvent = new CustomEvent("messages-loaded", {
detail: {
messages: messages,
hideAfter: hideAfter
}
});
window.dispatchEvent(messagesEvent);
}
if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) {
console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script");
}
(function( hyva, undefined ) {
hyva.initFormKey = () => {
const inputSelector = 'input[name="form_key"]',
formKey = hyva.getFormKey();
Array.from(document.querySelectorAll(inputSelector)).map(function (input) {
input.value = formKey
});
}
hyva.initMessages = () => {
try {
const messages = hyva.getCookie('mage-messages');
window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : [];
dispatchMessages(window.mageMessages);
// empty `mage-messages` cookie
const skipSetDomain = true;
hyva.setCookie('mage-messages','', -1, skipSetDomain);
} catch (error) {
console.warn('Error parsing Cookie Messages:', error);
}
}
window.addEventListener('DOMContentLoaded', hyva.initFormKey);
window.addEventListener('alpine:initialized', hyva.initMessages);
}( window.hyva = window.hyva || {} ));
</script>
<script>
'use strict';
{
const private_content_key = 'mage-cache-storage';
const private_content_expire_key = 'mage-cache-timeout';
const private_content_version_key = 'private_content_version';
const section_data_ids_key = 'section_data_ids';
const mage_cache_session_id_key = 'mage-cache-sessid';
const last_visited_store_key = 'last_visited_store';
const ttl = 3600;
if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) {
console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script");
}
function loadSectionData () {
const browserStorage = hyva.getBrowserStorage();
if (!browserStorage) {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "warning",
text: "Please enable LocalStorage in your browser."
}]
);
return;
}
try {
let isInvalid = false;
if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) {
isInvalid = true;
}
hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false);
if (!hyva.getCookie(mage_cache_session_id_key)) {
isInvalid = true;
const skipSetDomain = true;
const days = false;
hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain)
}
const cookieVersion = hyva.getCookie(private_content_version_key);
const storageVersion = browserStorage.getItem(private_content_version_key);
if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) {
isInvalid = true;
}
const privateContentExpires = browserStorage.getItem(private_content_expire_key);
if (privateContentExpires && new Date(privateContentExpires) < new Date()) {
browserStorage.removeItem(private_content_key);
}
if (isInvalid) {
fetchPrivateContent([]);
} else if (cookieVersion && storageVersion && cookieVersion === storageVersion) {
const privateContent = JSON.parse(browserStorage.getItem(private_content_key));
if (
privateContent &&
privateContentExpires &&
privateContent.cart &&
privateContent.customer
) {
dispatchPrivateContent(privateContent);
} else {
fetchPrivateContent([]);
}
} else {
dispatchPrivateContent({});
}
} catch (error) {
console.warn('Error retrieving Private Content:', error);
}
}
window.addEventListener('alpine:initialized', loadSectionData);
window.addEventListener('reload-customer-section-data', loadSectionData);
function dispatchPrivateContent(data) {
const privateContentEvent = new CustomEvent("private-content-loaded", {
detail: {
data: data
}
});
window.dispatchEvent(privateContentEvent);
}
function fetchPrivateContent(sections) {
fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
}
})
.then(response => response.json())
.then(
data => {
if (data) {
try {
const browserStorage = hyva.getBrowserStorage();
// merge new data preserving non-invalidated sections
const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {};
if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) {
delete oldSectionData['checkout-data'];
}
const newSectionData = Object.assign(oldSectionData, data);
dispatchPrivateContent(newSectionData);
// don't persist messages, they've been dispatched already
if (newSectionData.messages && newSectionData.messages.messages ) {
newSectionData.messages.messages = [];
}
browserStorage.setItem(private_content_key, JSON.stringify(newSectionData));
const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString();
browserStorage.setItem(private_content_expire_key, expiresAt);
const newCookieVersion = hyva.getCookie(private_content_version_key);
browserStorage.setItem(private_content_version_key, newCookieVersion);
// We don't need the section_data_ids in Hyvä, but we store them for compatibility
// with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout
hyva.setCookie(
section_data_ids_key,
JSON.stringify(
Object.keys(data).reduce((sectionDataIds, sectionKey) => {
sectionDataIds[sectionKey] = data[sectionKey]['data_id'];
return sectionDataIds;
}, {})
),
false,
true
);
} catch (error) {
console.warn("Couldn't store privateContent", error);
}
}
}
);
}
}
</script>
<script>
(() => {
document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc()));
})()
</script>
<script>
(events => {
const dispatchUserInteractionEvent = () => {
events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent))
window.dispatchEvent(new Event('init-external-scripts'))
};
events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true}))
})(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown'])
</script>
<script>
function initCompareOnProductList() {
return {
addToCompare(productId) {
const formKey = hyva.getFormKey();
const postUrl = BASE_URL + 'catalog/product_compare/add/';
fetch(postUrl, {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
"body": "form_key=" + formKey + "&product=" + productId + "&uenc=" + hyva.getUenc(),
"method": "POST",
"mode": "cors",
"credentials": "include"
}).then(function (response) {
if (response.redirected) {
window.location.href = response.url;
}
}).catch(function (error) {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "error",
text: error
}], 5000
);
});
}
};
}
</script>
<script>
function initWishlist() {
return {
addToWishlist(productId) {
const formKey = hyva.getFormKey();
const postUrl = BASE_URL + 'wishlist/index/add/';
fetch(postUrl, {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
"body": "form_key=" + formKey + "&product=" + productId + "&uenc=" + hyva.getUenc(),
"method": "POST",
"mode": "cors",
"credentials": "include"
}).then(function (response) {
if (response.redirected) {
window.location.href = response.url;
} else if (response.ok) {
return response.json();
} else {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "warning",
text: "Could not add item to wishlist."
}], 5000
);
}
}).then(function (response) {
if (!response) { return }
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: (response.success) ? "success" : "error",
text: (response.success)
? "Product has been added to your Wish List."
: response.error_message
}], 5000
);
const reloadCustomerDataEvent = new CustomEvent("reload-customer-section-data");
window.dispatchEvent(reloadCustomerDataEvent);
}).catch(function (error) {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "error",
text: error
}], 5000
);
});
}
}
}
</script>
<script>
function initConfigurableOptions(productId, optionConfig) {
function findPathParam(key) {
const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL;
const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/');
const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3);
for (let i = 0; i < pathParts.length; i += 2) {
if (pathParts[i] === key && pathParts.length > i) {
return pathParts[i + 1];
}
}
}
return {
optionConfig,
productId,
itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'),
allowedAttributeOptions: [],
selectedValues: [],
init() {
this.findAllowedAttributeOptions();
this.$nextTick(() => {
if (typeof this.optionConfig.defaultValues === 'object') {
for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) {
this.changeOption(attributeId, value + '');
}
}
});
},
findSimpleIndex() {
this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues);
},
calculateSimpleIndexForPartialSelection(selectedValues) {
if (selectedValues.length === 0) return 0;
let productIndexIds = Object.keys(this.optionConfig.index);
Object.keys(this.optionConfig.attributes).forEach((attribute) => {
const productsWithAttributeMatch = selectedValues[attribute]
? productIndexIds.filter((productIndex) => {
return this.optionConfig.index[productIndex][attribute] === this.selectedValues[attribute]
})
: [];
productIndexIds = productsWithAttributeMatch.length ? productsWithAttributeMatch : productIndexIds
})
return productIndexIds[0];
},
calculateSimpleIndexForFullSelection(selectedValues) {
const productIndexes = this.optionConfig.index;
return Object.keys(productIndexes).find(productIndex => {
const productCandidateOptions = productIndexes[productIndex];
for (const productOption in productCandidateOptions) {
if (
! selectedValues[productOption] ||
selectedValues[productOption] !== productCandidateOptions[productOption]
) {
return false;
}
}
return productIndex;
});
},
productIndex: 0,
findAllowedAttributeOptions() {
this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues);
},
calculateAllowedAttributeOptions(selectedValues) {
const allAttributes = this.optionConfig.attributes;
const allAttributesSorted = Object.values(allAttributes).sort((a,b) => {
return a.position - b.position
});
const newAllowedAttributeOptions = [];
allAttributesSorted.forEach(attribute => {
const selectionWithoutAttr = Object.assign({}, this.removeAttrFromSelection(selectedValues, attribute.id));
const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr);
newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => {
return !!option.products.find(product => {
return availableIndexes.includes(product);
})
});
});
return newAllowedAttributeOptions;
},
calculateAvailableProductIndexes(selectedOptions) {
if (Object.keys(selectedOptions).length === 0) {
if (Object.values(this.optionConfig.salable || {}).length) {
return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i)
}
return Object.keys(this.optionConfig.index);
}
const selectedIds = Object.keys(selectedOptions);
if (Object.values(this.optionConfig.salable || {}).length) {
const selectedOptionIndexes = selectedIds.map(attrId => {
const optionValue = selectedOptions[attrId];
return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || []
})
return selectedOptionIndexes.reduce((acc, optionIndexes) => {
return acc.filter(index => optionIndexes.includes(index));
});
} else {
const productIndexes = this.optionConfig.index;
return Object.keys(productIndexes).filter(index => {
for (const attrId of selectedIds) {
if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false
}
return true
});
}
},
findAttributeByOptionId(optionId) {
for (const attributeId in this.optionConfig.attributes) {
const attributeOptions = this.optionConfig.attributes[attributeId].options || [];
if (attributeOptions.find(option => option.id === optionId)) {
return attributeId;
}
}
},
getAllowedAttributeOptions(attributeId) {
return this.allowedAttributeOptions[attributeId] || []
},
getProductIdsForOption(option) {
const attributeId = this.findAttributeByOptionId(option.id);
const allOptions = this.optionConfig.attributes[attributeId];
const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id);
return opt && opt.products
? opt.products
: [];
},
findProductIdsForPartialSelection(optionSelection) {
const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => {
const newCandidates = this.getProductIdsForOption({id: optionId});
return candidates === null
? newCandidates
: candidates.filter(productId => newCandidates.includes(productId));
}, null);
return candidateProducts || [];
},
findCheapestProductForPartialSelection(optionSelection) {
const candidateProducts = this.findProductIdsForPartialSelection(optionSelection);
return candidateProducts.reduce((cheapest, simpleIdx) => {
// in the first iteration we start with simpleIdx as the currently cheapest product
if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx;
const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount;
return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount
? simpleIdx
: cheapest;
}, 0)
},
findProductIdToUseForOptionPrice(option) {
// try to find a product for a complete selection
const attributeId = this.findAttributeByOptionId(option.id);
const optionSelection = Object.assign({}, this.selectedValues, {[attributeId]: option.id});
const matchingSimpleIndex = this.calculateSimpleIndexForFullSelection(optionSelection);
// if there is no complete selection, use the cheapest product for the option
return matchingSimpleIndex || this.findCheapestProductForPartialSelection(optionSelection);
},
getAttributeOptionLabel(option) {
const optionProduct = this.findProductIdToUseForOptionPrice(option);
if ((! optionProduct) || (optionProduct === this.productIndex)) {
return option.label;
}
const currentPrice = this.getOptionPriceAdjustmentBasePrice();
if (this.optionConfig.optionPrices[optionProduct]) {
const optionPrice = this.optionConfig.optionPrices[optionProduct].finalPrice.amount;
if (optionPrice !== currentPrice){
return option.label + ' ' + hyva.formatPrice(optionPrice - currentPrice, true);
}
}
return option.label;
},
getOptionPriceAdjustmentBasePrice() {
if (this.optionConfig.optionPrices[this.productIndex]) {
return this.optionConfig.optionPrices[this.productIndex].finalPrice.amount
}
const cheapestForSelection = this.findCheapestProductForPartialSelection(this.selectedValues);
return this.optionConfig.optionPrices[cheapestForSelection]
? this.optionConfig.optionPrices[cheapestForSelection].finalPrice.amount
: this.optionConfig.prices.finalPrice.amount; // default price if no option selection
},
clearOptionIfActive(optionId, value) {
if (this.selectedValues[optionId] === value) {
this.blurLabel()
this.changeOption(optionId, '')
}
},
removeAttrFromSelection(selectedValues, attributeId) {
attributeId = parseInt(attributeId);
return selectedValues.reduce((newSelection, val, attr) => {
if (attr !== attributeId) {
newSelection[attr] = val;
}
return newSelection;
}, []);
},
changeOption(attributeId, value) {
if (value === '') {
this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId)
} else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) {
this.selectedValues[attributeId] = value;
}
this.findSimpleIndex();
this.findAllowedAttributeOptions();
this.updatePrices();
this.updateGallery();
window.dispatchEvent(
new CustomEvent(
'configurable-selection-changed',
{
detail: {
productId: this.productId,
optionId: attributeId,
value: value,
productIndex: this.productIndex,
selectedValues: this.selectedValues,
candidates: this.findProductIdsForPartialSelection(this.selectedValues),
}
}
)
);
},
calculateIsMinimalPrice() {
return (
this.selectedValues.filter(value => !!value).length <
Object.keys(this.optionConfig.attributes).length
);
},
updatePrices() {
const value = this.productIndex ?
this.optionConfig.optionPrices[this.productIndex] :
this.optionConfig.prices;
window.dispatchEvent(
new CustomEvent(
"update-prices-" + this.productId,
{
detail: Object.assign(
value,
{ isMinimalPrice: this.calculateIsMinimalPrice() }
)
}
)
);
},
updateGallery () {
if (this.productIndex) {
const images = this.optionConfig.images[this.productIndex];
images && window.dispatchEvent(new CustomEvent(
"update-gallery",
{ detail: this.sortImagesByPosition(images) }
));
} else {
window.dispatchEvent(new Event("reset-gallery"));
}
},
sortImagesByPosition(images) {
return images.sort((x, y) => {
return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1)
});
},
onGetCartData(data) {
},
preselectCartItems(data) {
// pre-select options based on cart data for current (quote) itemId
const cart = data && data.cart;
if (cart && cart.items) {
const cartItem = cart.items.find((item) => {
return (
item.item_id === this.itemId
&& item.product_id === this.productId
)
});
if (cartItem && cartItem.options && cartItem.options.length) {
cartItem.options.map(option => {
this.changeOption(option.option_id, option.option_value);
})
}
}
},
preselectQuerystringItems() {
// pre-select option like ?size=167
const urlQueryParams = new URLSearchParams(window.location.search.replace('?',''));
this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code));
},
preselectLocationHashItems() {
// pre-select option like #144=167
const urlHashParams = new URLSearchParams(window.location.hash.replace('#',''));
this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id));
},
preselectItemsBasedOnLocation(getLocationValue) {
Object.values(this.optionConfig.attributes).map(attribute => {
this.changeOption(attribute.id, getLocationValue(attribute))
});
}
}
}
</script>
<script>
function initSwatchOptions(swatchConfig) {
return {
swatchConfig,
getAttributeSwatchData(attributeId) {
const swatchConfig = Object.assign({}, this.swatchConfig[attributeId]);
swatchConfig['details'] = JSON.parse(swatchConfig['additional_data']);
return swatchConfig;
},
getAllAttributeOptions(attributeId) {
return (
this.optionConfig.attributes[attributeId] &&
this.optionConfig.attributes[attributeId].options
) || []
},
optionIsActive(attributeId, optionId) {
// return true if a product with this option is in stock
return !!this.getAllowedAttributeOptions(attributeId).find(
option => option.id === optionId
)
},
optionIsEnabled(attributeId, optionId) {
// return true if a product with this option is enabled
for (const productId in this.optionConfig.index) {
if (this.optionConfig.index[productId][attributeId] === optionId) {
return true;
}
}
return false;
},
mapSwatchTypeNumberToTypeCode(typeNumber) {
switch ("" + typeNumber) {
case "1":
return "color"
case "2":
return "image"
case "3":
return "empty"
case "0":
default:
return "text"
}
},
getTypeOfFirstOption(attributeId) {
for (const optionId in this.swatchConfig[attributeId]) {
const option = this.swatchConfig[attributeId][optionId];
if (typeof option.type !== 'undefined') {
return this.mapSwatchTypeNumberToTypeCode(option.type);
}
}
},
getVisualSwatchType(attributeId, targetOptionId) {
// If a type configuration is present for the given option id, use it
const config = this.swatchConfig[attributeId];
if (config[targetOptionId] && typeof config[targetOptionId].type !== 'undefined') {
return this.mapSwatchTypeNumberToTypeCode(config[targetOptionId].type);
}
// Otherwise - if no config is present for the target option - use the type of the first option
// with a type property from the attribute, thus assuming its the same type as the target option.
// (This edge case condition can occur on single swatch products if some options are not salable)
return this.getTypeOfFirstOption(attributeId);
},
getSwatchType(attributeId, optionId) {
// Deserialize the attribute details the first time they are used
if (this.swatchConfig[attributeId] && ! this.swatchConfig[attributeId].details) {
this.swatchConfig[attributeId] = this.getAttributeSwatchData(attributeId);
}
const type = this.swatchConfig[attributeId] &&
this.swatchConfig[attributeId].details &&
this.swatchConfig[attributeId].details.swatch_input_type ||
"empty";
return type === 'visual' ? this.getVisualSwatchType(attributeId, optionId) : type;
},
isTextSwatch(attributeId, optionId) {
return this.getSwatchType(attributeId, optionId) === 'text';
},
isVisualSwatch(attributeId, optionId) {
const type = this.getSwatchType(attributeId, optionId);
return ['image', 'color'].includes(type);
},
getSwatchBackgroundStyle(attributeId, optionId) {
const config = this.getSwatchConfig(attributeId, optionId);
const type = this.getSwatchType(attributeId, optionId);
if (type === "color") {
return 'background-color:' + config.value;
} else if (type === "image") {
return "background: #ffffff url('" + config.value + "') no-repeat center";
} else {
return '';
}
},
getSwatchText(attributeId, optionId) {
const config = this.getSwatchConfig(attributeId, optionId);
return config.label || config.value || this.getOptionLabelFromOptionConfig(attributeId, optionId);
},
getOptionLabelFromOptionConfig(attributeId, optionId) {
// Fallback if no value is present in swatchConfig data
// Reference issue https://gitlab.hyva.io/hyva-themes/magento2-default-theme/-/issues/190
const option = this.getAllAttributeOptions(attributeId).filter(option => option.id === optionId);
return option && option[0] && option[0].label ||'';
},
getSwatchConfig(attributeId, optionId) {
return this.swatchConfig[attributeId] && this.swatchConfig[attributeId][optionId]
? this.swatchConfig[attributeId][optionId]
: false;
},
activeTooltipItem: false,
tooltipPositionElement: false,
isTooltipVisible() {
return this.activeTooltipItem &&
this.getSwatchConfig(
this.activeTooltipItem.attribute,
this.activeTooltipItem.item
);
},
isFirstItemCol() {
return this.activeTooltipItem.index === 0;
},
getTooltipImageStyle(attributeId, optionId) {
const config = this.getSwatchConfig(attributeId, optionId);
const type = this.getSwatchType(attributeId, optionId);
if (type === "color") {
return 'background-color:' + config.value + '; width: 110px; height: 90px;';
} else if (type === "image") {
return "background: #ffffff url('" + config.thumb +
"') center center no-repeat; width: 110px; height: 90px;";
} else {
return 'display:none';
}
},
getTooltipPosition() {
return this.tooltipPositionElement ?
`top: ${this.tooltipPositionElement.offsetTop}px;` +
`left: ${
this.tooltipPositionElement.offsetLeft - (
this.tooltipPositionElement.closest('.snap') &&
this.tooltipPositionElement.closest('.snap').scrollLeft ||
0
)
}px;` : ''
},
getTooltipLabel() {
return this.getSwatchConfig(this.activeTooltipItem.attribute, this.activeTooltipItem.item).label
},
focusedLabel: false,
focusLabel(optionId) {
this.focusedLabel = optionId;
},
blurLabel() {
this.focusedLabel = false;
},
showSwatches: false,
initShowSwatchesIntersect() {
if ('IntersectionObserver' in window && !window.scrollY) {
let io = new IntersectionObserver(
entries => {
entries.map(entry => {
if (entry.isIntersecting) {
this.showSwatches = true;
io.unobserve(this.$root);
}
})
}
);
io.observe(this.$root);
} else {
this.showSwatches = true
}
}
}
}
</script>
<script>
'use strict';
(() => {
const equalizeButtonWidths = (buttons) => {
const buttonList = buttons.querySelectorAll('[data-element="link"], [data-element="empty_link"]');
let buttonMinWidth = 0;
buttonList.forEach(button => {
const buttonWidth = button.offsetWidth;
if (buttonWidth > buttonMinWidth) {
buttonMinWidth = buttonWidth;
}
});
buttonList.forEach(button => {
button.style.minWidth = `${buttonMinWidth}px`;
});
};
window.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('[data-content-type="buttons"][data-same-width="true"]').forEach(buttons => {
equalizeButtonWidths(buttons);
});
});
})();
</script>
<script>
'use strict';
(() => {
const initCarousels = (elements) => {
if (!Glider) {
return;
}
const initProductCarousel = (carousel) => {
const gliderElement = carousel.querySelector('[data-role="glider-content"]');
if (!gliderElement) {
return;
}
const gliderDots = carousel.querySelector('.glider-dots');
const gliderPrev = carousel.querySelector('.glider-prev');
const gliderNext = carousel.querySelector('.glider-next');
const glider = new Glider(gliderElement, {
slidesToShow: 2,
slidesToScroll: 2,
scrollLock: true,
draggable: true,
dragVelocity: 2.5,
dots: gliderDots,
arrows: {
prev: gliderPrev,
next: gliderNext,
},
responsive: [
{
breakpoint: 768,
settings: {
slidesToShow: 3,
slidesToScroll: 3,
}
},
{
breakpoint: 1024,
settings: {
slidesToShow: 4,
slidesToScroll: 4,
}
},
],
});
carousel.classList.remove('overflow-x-scroll');
gliderPrev.classList.remove('hidden');
gliderNext.classList.remove('hidden');
if (carousel.dataset.autoplay !== 'false') {
gliderAutoplay(
glider,
carousel.dataset.autoplaySpeed,
carousel.dataset.infiniteLoop
);
}
};
const initSliderCarousel = (slider) => {
slider.innerHTML = `<div data-role="glider-content">${slider.innerHTML}</div>`;
slider.classList.add('glider-contain');
slider.insertAdjacentHTML(
'beforeend',
'\u000A\u003Cdiv\u0020class\u003D\u0022carousel\u002Dnav\u0020flex\u0020items\u002Dcenter\u0020justify\u002Dcenter\u0020flex\u002D1\u0020p\u002D4\u0022\u003E\u000A\u0020\u0020\u0020\u0020\u003Cbutton\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020aria\u002Dlabel\u003D\u0022Previous\u0022\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020class\u003D\u0022glider\u002Dprev\u0020w\u002D8\u0020h\u002D8\u0020mr\u002D1\u0020text\u002Dblack\u0020rounded\u002Dfull\u0020outline\u002Dnone\u0020focus\u003Aoutline\u002Dnone\u0020hidden\u0022\u003E\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u003Csvg\u0020xmlns\u003D\u0022http\u003A\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\u0022\u0020fill\u003D\u0022none\u0022\u0020stroke\u003D\u0022currentColor\u0022\u0020viewBox\u003D\u00220\u00200\u002024\u002024\u0022\u0020width\u003D\u002224\u0022\u0020height\u003D\u002224\u0022\u0020role\u003D\u0022img\u0022\u003E\u003Cpath\u0020stroke\u002Dlinecap\u003D\u0022round\u0022\u0020stroke\u002Dlinejoin\u003D\u0022round\u0022\u0020stroke\u002Dwidth\u003D\u00222\u0022\u0020d\u003D\u0022m15\u002019\u002D7\u002D7\u00207\u002D7\u0022\u002F\u003E\u003Ctitle\u003Echevron\u002Dleft\u003C\u002Ftitle\u003E\u003C\u002Fsvg\u003E\u000A\u0020\u0020\u0020\u0020\u003C\u002Fbutton\u003E\u000A\u0020\u0020\u0020\u0020\u003Cdiv\u0020role\u003D\u0022tablist\u0022\u0020class\u003D\u0022glider\u002Ddots\u0020select\u002Dnone\u0020flex\u0020flex\u002Dwrap\u0020mx\u002D1\u0020justify\u002Dcenter\u0020p\u002D0\u0020focus\u003Aoutline\u002Dnone\u0022\u003E\u003C\u002Fdiv\u003E\u000A\u0020\u0020\u0020\u0020\u003Cbutton\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020aria\u002Dlabel\u003D\u0022Next\u0022\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020class\u003D\u0022glider\u002Dnext\u0020w\u002D8\u0020h\u002D8\u0020ml\u002D1\u0020text\u002Dblack\u0020rounded\u002Dfull\u0020outline\u002Dnone\u0020focus\u003Aoutline\u002Dnone\u0020hidden\u0022\u003E\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u003Csvg\u0020xmlns\u003D\u0022http\u003A\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\u0022\u0020fill\u003D\u0022none\u0022\u0020stroke\u003D\u0022currentColor\u0022\u0020viewBox\u003D\u00220\u00200\u002024\u002024\u0022\u0020width\u003D\u002224\u0022\u0020height\u003D\u002224\u0022\u0020role\u003D\u0022img\u0022\u003E\u003Cpath\u0020stroke\u002Dlinecap\u003D\u0022round\u0022\u0020stroke\u002Dlinejoin\u003D\u0022round\u0022\u0020stroke\u002Dwidth\u003D\u00222\u0022\u0020d\u003D\u0022m9\u00205\u00207\u00207\u002D7\u00207\u0022\u002F\u003E\u003Ctitle\u003Echevron\u002Dright\u003C\u002Ftitle\u003E\u003C\u002Fsvg\u003E\u000A\u0020\u0020\u0020\u0020\u003C\u002Fbutton\u003E\u000A\u003C\u002Fdiv\u003E\u000A'
);
const gliderElement = slider.querySelector('[data-role="glider-content"]');
const gliderDots = slider.querySelector('.glider-dots');
const gliderPrev = slider.querySelector('.glider-prev');
const gliderNext = slider.querySelector('.glider-next');
const glider = new Glider(gliderElement, {
slidesToShow: 1,
slidesToScroll: 1,
scrollLock: true,
scrollLockDelay: 250,
draggable: true,
dragVelocity: 2.5,
dots: gliderDots,
arrows: {
prev: gliderPrev,
next: gliderNext,
},
});
slider.classList.add('glider-initialized');
if (slider.dataset.showArrows === 'true') {
gliderPrev.classList.remove('hidden');
gliderNext.classList.remove('hidden');
}
if (slider.dataset.autoplay !== 'false') {
gliderAutoplay(
glider,
slider.dataset.autoplaySpeed,
slider.dataset.infiniteLoop
);
}
};
const gliderAutoplay = (glider, milliseconds, loop) => {
const pagesCount = glider.track.childElementCount;
let slideTimeout = null;
let nextIndex = 1;
let paused = false;
const slide = () => {
slideTimeout = setTimeout(
() => {
if (loop && nextIndex >= pagesCount) {
nextIndex = 0;
}
glider.scrollItem(nextIndex);
},
parseInt(milliseconds)
);
};
glider.ele.addEventListener('glider-animated', () => {
nextIndex = glider.slide + glider.opt.slidesToScroll;
window.clearInterval(slideTimeout);
if (!paused && (loop || nextIndex < pagesCount)) {
slide();
}
});
const pause = () => {
if (!paused) {
clearInterval(slideTimeout);
paused = true;
}
};
const unpause = () => {
if (paused) {
slide();
paused = false;
}
};
glider.ele.parentElement.addEventListener('mouseover', pause, {passive: true});
glider.ele.parentElement.addEventListener('touchstart', pause, {passive: true});
glider.ele.parentElement.addEventListener('mouseout', unpause, {passive: true});
glider.ele.parentElement.addEventListener('touchend', unpause, {passive: true});
slide();
};
elements.forEach(element => {
if (element.dataset.contentType === 'products') {
initProductCarousel(element);
}
if (element.dataset.contentType === 'slider') {
initSliderCarousel(element);
}
});
};
window.addEventListener('DOMContentLoaded', () => {
const carouselElements = document.querySelectorAll(
`[data-content-type="products"][data-appearance="carousel"],
[data-content-type="slider"]`
);
if (carouselElements.length > 0) {
const script = document.createElement('script');
script.type = 'text/javascript';
script.addEventListener('load', () => {
initCarousels(carouselElements);
});
script.src = 'https\u003A\u002F\u002Fwww.onahole.com\u002Fstatic\u002Ffrontend\u002FOnaholecom\u002Fdefault\u002Fen_US\u002FMagento_PageBuilder\u002Fjs\u002Fglider.min.js';
document.head.appendChild(script);
}
});
})();
</script>
<script>
'use strict';
(() => {
const initMaps = (elements) => {
const renderMap = (element) => {
const dataLocations = element.dataset.locations;
// Hide map if no locations set
if (!dataLocations || dataLocations === '[]') {
element.classList.add('hidden');
return;
}
const map = new google.maps.Map(
element,
getMapOptions(
element.dataset.showControls !== 'true',
element.dataset.showControls === 'true'
)
);
const locations = JSON.parse(dataLocations);
const latitudeLongitudeBounds = new google.maps.LatLngBounds();
const bounds = [];
locations.forEach(location => {
const position = {
lat: parseFloat(location.position.latitude),
lng: parseFloat(location.position.longitude),
};
bounds.push(position);
const infowindow = new google.maps.InfoWindow({
content: getInfoWindowContent(location),
});
const marker = new google.maps.Marker({
position: position,
map,
title: location.location_name,
});
marker.addListener('click', () => {
infowindow.open(map, marker);
});
});
// Set bounds if multiple locations
if (bounds.length > 1) {
bounds.forEach(function (bound) {
latitudeLongitudeBounds.extend(bound);
});
map.fitBounds(latitudeLongitudeBounds);
}
// Center if single location
if (bounds.length === 1) {
map.setCenter(bounds[0]);
}
};
const getMapOptions = (disableDefaultUI, mapTypeControl) => {
const style = '';
return {
zoom: 8,
scrollwheel: false,
disableDoubleClickZoom: false,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.DEFAULT,
},
styles: style ? JSON.parse(style) : [],
disableDefaultUI: disableDefaultUI,
mapTypeControl: mapTypeControl,
};
};
const getInfoWindowContent = (location) => {
const title = location.location_name ?
`<h3 class="text-2xl font-medium text-gray-900 title-font">${location.location_name}</h3>` : '';
const comment = location.comment ? `<p class="px-1 pt-3 text-primary">${location.comment}</p>` : '';
const phone = location.phone ? `<p class="px-1 pt-3 text-primary">Phone: ${location.phone}</p>` : '';
const street = location.address ? `${location.address}<br/>` : '';
const city = location.city ? `${location.city}<br/>` : '';
const state = location.state ? `${location.state}<br/>` : '';
const zipCode = location.zipcode ? `${location.zipcode}<br/>` : '';
const country = location.country ? location.country : '';
return `<div>
${title}
${comment}
${phone}
<p class="px-1 pt-3 text-primary">
${street}
${city}
${state}
${zipCode}
${country}
</p>
</div>`;
};
const hideAllMaps = () => {
document.querySelectorAll('[data-content-type="map"]').forEach(element => {
element.classList.add('hidden');
});
};
window.gm_authFailure = () => {
hideAllMaps();
};
if (typeof google.maps === 'undefined') {
hideAllMaps();
return;
}
elements.forEach(element => {
if (element.dataset.contentType === 'map') {
renderMap(element);
}
});
};
window.addEventListener('DOMContentLoaded', () => {
const mapElements = document.querySelectorAll('[data-content-type="map"]');
if (mapElements.length > 0) {
const script = document.createElement('script');
script.type = 'text/javascript';
script.addEventListener('load', () => {
initMaps(mapElements);
});
script.src = 'https\u003A\u002F\u002Fmaps.googleapis.com\u002Fmaps\u002Fapi\u002Fjs\u003Fv\u003D3\u0026key\u003D';
document.head.appendChild(script);
}
});
})();
</script>
<script>
'use strict';
(() => {
const initParallaxImage = (element) => {
if (!window.jarallax) {
return;
}
element.classList.add('jarallax');
element.dataset.jarallax = '';
const parallaxSpeed = parseFloat(element.dataset.parallaxSpeed) || 0.5;
const elementStyle = window.getComputedStyle(element);
window.jarallax(element, {
imgPosition: elementStyle.backgroundPosition || '50% 50%',
imgRepeat: elementStyle.backgroundRepeat || 'no-repeat',
imgSize: elementStyle.backgroundSize || 'cover',
speed: parallaxSpeed,
});
};
const initVideoBackground = (element) => {
if (!window.jarallax) {
return;
}
let slider = null;
if (element.classList.contains('pagebuilder-slide-wrapper')) {
const viewportElement = document.createElement('div');
slider = element.closest('[data-content-type=slider]');
viewportElement.classList.add('jarallax-viewport-element');
element.dataset.elementInViewport = '.jarallax-viewport-element';
element.appendChild(viewportElement);
}
element.classList.add('jarallax');
element.dataset.jarallax = '';
const parallaxSpeed = parseFloat(element.dataset.parallaxSpeed) || 0.5;
window.jarallax(element, {
imgSrc: element.dataset.videoFallbackSrc,
speed: parallaxSpeed,
videoLoop: element.dataset.videoLoop,
videoPlayOnlyVisible: element.dataset.videoPlayOnlyVisible,
videoLazyLoading: element.dataset.videoLazyLoad,
disableVideo: false,
elementInViewport: element.dataset.elementInViewport &&
element.querySelector(element.dataset.elementInViewport),
});
if (slider) {
if (slider.dataset.afterChangeIsSet) {
return;
}
slider.addEventListener('glider-loaded', () => {
slider.querySelectorAll('.jarallax').forEach(videoSlide => {
videoSlide.jarallax && videoSlide.jarallax.onScroll();
});
});
slider.addEventListener('glider-animated', () => {
slider.querySelectorAll('.jarallax').forEach(videoSlide => {
videoSlide.jarallax && videoSlide.jarallax.onScroll();
});
});
slider.dataset.afterChangeIsSet = true;
}
};
window.addEventListener('DOMContentLoaded', () => {
const parallaxImageElements = document.querySelectorAll(
`[data-content-type="row"][data-background-type="image"][data-enable-parallax="1"],
[data-content-type="row"] > [data-background-type="image"][data-enable-parallax="1"]`
);
const videoBackgroundsElements = document.querySelectorAll(
`[data-content-type="row"][data-background-type="video"][data-enable-parallax="1"],
[data-content-type="row"] > [data-background-type="video"][data-enable-parallax="1"],
[data-content-type="banner"] [data-background-type="video"],
[data-content-type="slide"] [data-background-type="video"]`
);
if (parallaxImageElements.length > 0 || videoBackgroundsElements.length > 0) {
const jarallaxScript = document.createElement('script');
jarallaxScript.type = 'text/javascript';
jarallaxScript.addEventListener('load', () => {
parallaxImageElements.forEach(row => {
initParallaxImage(row);
});
const jarallaxVideoScript = document.createElement('script');
jarallaxVideoScript.type = 'text/javascript';
jarallaxVideoScript.addEventListener('load', () => {
videoBackgroundsElements.forEach(element => {
initVideoBackground(element);
});
});
jarallaxVideoScript.src = 'https\u003A\u002F\u002Fwww.onahole.com\u002Fstatic\u002Ffrontend\u002FOnaholecom\u002Fdefault\u002Fen_US\u002FMagento_PageBuilder\u002Fjs\u002Fjarallax\u002Dvideo.min.js';
document.head.appendChild(jarallaxVideoScript);
});
jarallaxScript.src = 'https\u003A\u002F\u002Fwww.onahole.com\u002Fstatic\u002Ffrontend\u002FOnaholecom\u002Fdefault\u002Fen_US\u002FMagento_PageBuilder\u002Fjs\u002Fjarallax.min.js';
document.head.appendChild(jarallaxScript);
}
});
})();
</script>
<script>
'use strict';
(() => {
const applyShowOnHover = (element) => {
const showOverlayOnHover = (element) => {
const overlay = element.querySelector('.pagebuilder-overlay');
const color = overlay.dataset.overlayColor;
element.addEventListener('mouseover', () => {
overlay.style.backgroundColor = color;
});
element.addEventListener('mouseout', () => {
overlay.style.backgroundColor = 'transparent';
});
};
const showButtonOnHover = (element) => {
const button = element.querySelector('.pagebuilder-banner-button');
element.addEventListener('mouseover', () => {
button.style.opacity = '1';
button.style.visibility = 'visible';
});
element.addEventListener('mouseout', () => {
button.style.opacity = '0';
button.style.visibility = 'hidden';
});
};
if (element.dataset.showOverlay === 'hover') {
showOverlayOnHover(element);
}
if (element.dataset.showButton === 'hover') {
showButtonOnHover(element);
}
};
window.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('[data-content-type="banner"],[data-content-type="slider"]').forEach(element => {
applyShowOnHover(element);
});
});
})();
</script>
<script>
'use strict';
(() => {
document.querySelectorAll('[data-content-type="tab-item"]').forEach(tabItem => {
tabItem.setAttribute('x-show', `tab === '${tabItem.id}'`);
});
document.querySelectorAll('[data-content-type="tabs"]').forEach(tab => {
const defaultActiveTab = parseInt(tab.dataset.activeTab) || 0;
tab.querySelectorAll('.tab-header').forEach((tabHeader, index) => {
const tabLink = tabHeader.querySelector('a');
const tabId = tabLink.getAttribute('href').replace('#', '');
tabHeader.setAttribute(':class', `{ 'active': tab === '${tabId}' }`);
tabLink.setAttribute('x-on:click.prevent', `tab = '${tabId}'`);
if (index === defaultActiveTab) {
tab.setAttribute('x-data', `{ tab: '${tabId}' }`);
}
});
});
})();
</script>
<script>
'use strict';
const grecaptchaV2LoadCallbacks = [];
function executeRecaptchaLoadCallbacks () {
while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) {
const callback = grecaptchaV2LoadCallbacks.pop();
typeof callback === 'string' ? window[callback]() : callback();
}
}
(function() {
const loadRecaptchaScript = (event) => {
if (window.grecaptcha || !event.target.form) {
return;
}
const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks';
const siteKey = '6Ldu4YopAAAAAHqA8_HcRgpcHIAhG5R_tKYDclgQ';
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`;
script.async = true;
document.head.appendChild(script);
script.addEventListener('load', () => {
Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled'));
});
}
window.forceLoadRecaptchaScript = (form) => {
loadRecaptchaScript({target: {form: form || 'dummy'}});
executeRecaptchaLoadCallbacks();
};
document.body.addEventListener('input', loadRecaptchaScript, { once: true });
document.body.addEventListener('focus', loadRecaptchaScript, { once: true });
}());
</script>
<script>
'use strict';
function initMwReminder() {
const jsonConfig = {"ajaxUrl":"https:\/\/www.onahole.com\/reviewreminder\/ajax\/getReminderData\/"};
const ajaxUrl = jsonConfig.ajaxUrl;
return {
init() {
if (!hyva.getCookie('mageworx_review_reminder_popup')) {
this.updateContent();
}
},
updateContent() {
const data = {
email: hyva.getCookie('mageworx_review_reminder_previous_email')
};
fetch(ajaxUrl, {
method: 'POST',
body: JSON.stringify(data),
headers: {
"X-Requested-With": "XMLHttpRequest",
}
})
.then(response => {
if (! response.ok) console.warn('request failed');
return response.json();
})
.then(data => {
if (data.success) {
const content = data.content;
const scripts = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi
let formattedContent = content.replace(scripts, "");
formattedContent = formattedContent.replace('role="dialog"', "");
const link = document.createElement('link')
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = 'https://www.onahole.com/static/frontend/Onaholecom/default/en_US/Hyva_MageWorxXReviewBase/css/popup.css';
document.head.append(link);
this.$refs['mw-reminder-popup'].innerHTML = formattedContent;
this.show('mw-reminder-popup');
const $closeButton = document.querySelector("button.mwrv-modal__close");
$closeButton?.addEventListener('click', () => this.hide());
hyva.setCookie('mageworx_review_reminder_popup', Math.floor(Date.now() / 1000));
}
})
.catch(error => {
console.warn('reminder error');
})
},
}
}
</script>
<div x-data="{...initMwReminder(), ...hyva.modal()}" x-init="init()">
<!--Modal window-->
<div x-spread="overlay('mw-reminder-popup')" x-bind="overlay('mw-reminder-popup')" class="fixed inset-0 z-30 flex items-center justify-center text-left bg-black bg-opacity-50" style="display: none;">
<div role="dialog" aria-labelledby="the-label" class="w-full md:w-5/6 rounded-none md:rounded-lg bg-white max-w-3xl">
<div x-ref="mw-reminder-popup"></div>
</div>
</div>
<!--Modal window-->
</div>
<script>
'use strict';
(function () {
const modals = [];
const excludedFromFocusTrapping = new Set();
function loadInertPolyfill(callback) {
if (window.hyva.modal.disableInertPolyfill) {
callback && callback();
} else {
const polyfill = document.createElement('script');
polyfill.src = 'https\u003A\u002F\u002Fwww.onahole.com\u002Fstatic\u002Ffrontend\u002FOnaholecom\u002Fdefault\u002Fen_US\u002FHyva_Theme\u002Fjs\u002Fwicg\u002Dinert\u002D3.1.1\u002Finert.min.js';
callback && polyfill.addEventListener('load', callback);
const firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(polyfill, firstScriptTag);
}
}
let isInertPolyfillLoaded = 0;
function setSiblingsInert(dialogElement, toState) {
if (isInertPolyfillLoaded === 0) {
isInertPolyfillLoaded = 1;
loadInertPolyfill(() => {
isInertPolyfillLoaded = 2;
setSiblingsInert(dialogElement, toState)
})
return;
}
if (isInertPolyfillLoaded === 1) {
return;
}
let el = dialogElement;
while (el && (el = el.parentElement)) {
if (el === document.body || el.parentElement === null) continue;
Array.from(el.parentElement.children).forEach(sibling => {
if (sibling !== el) {
sibling.inert = toState;
}
})
}
(function setChildrenInert(el, toState) {
if (el) {
el.inert = toState;
Array.from(el.children).forEach(child => setChildrenInert(child, toState));
}
})(findParentWithOverlaySpread(dialogElement), ! toState)
excludedFromFocusTrapping.forEach(selector => {
Array.from(document.querySelectorAll(selector)).map(el => el.inert = false);
})
}
function findParentWithOverlaySpread(el) {
while (el && (el = el.parentElement)) {
if (el === document.body || el.parentElement === null) continue;
if (el.hasAttribute('x-spread') && el.getAttribute('x-spread').indexOf('overlay(') !== -1) {
return el;
}
}
}
function freeFocusFromModalTrap(modal) {
const dialogElement = modal.instance.$refs[modal.name];
isOverlayDisabled(dialogElement) || modal.instance.$nextTick(() => setSiblingsInert(dialogElement, false));
}
function trapFocusInNextModalWithOverlay() {
for (let idx = modals.length -1; idx >= 0; idx--) {
const nextOnStack = modals[idx];
const nextDialogElement = nextOnStack.instance.$refs[nextOnStack.name];
if (! isOverlayDisabled(nextDialogElement)) {
nextOnStack.instance.$nextTick(() => setSiblingsInert(nextDialogElement, true));
break;
}
}
}
function focusables(dialogElement) {
const selector = 'a, button, input, textarea, select, details, [tabindex]:not([tabindex="-1"])';
return Array.from(dialogElement.querySelectorAll(selector))
.filter(el => !el.hasAttribute('disabled'));
}
function firstVisible(elements) {
const a = Array.from(elements);
for (let i = 0; i < a.length; i++) {
if (a[i].offsetWidth || a[i].offsetHeight || a[i].getClientRects().length) return a[i];
}
return null;
}
function isInViewport(element) {
const rect = element && element.getBoundingClientRect();
return rect &&
rect.top >= 0 &&
rect.left >= 0 &&
rect.right <= window.innerWidth &&
rect.bottom <= window.innerHeight;
}
function setFocusAfterTransition(dialogElement, duration) {
window.setTimeout(() => {
const focusElement = firstVisible(dialogElement.querySelectorAll('[x-focus-first]')) ||
focusables(dialogElement)[0] ||
null;
focusElement && isInViewport(focusElement) && focusElement.focus();
}, duration + 1);
}
function determineTrigger($refs, dialog, trigger) {
if (typeof trigger === 'undefined' && typeof dialog === 'object' && dialog.target && dialog.target.focus) {
return dialog.target;
}
if (typeof dialog === 'string' && typeof trigger === 'object' && trigger.target && trigger.target.focus) {
return trigger.target;
}
if (typeof trigger === 'string' && $refs[trigger]) {
return $refs[trigger];
} else {
return null;
}
}
function isOverlayDisabled(dialog) {
return dialog && dialog.hasAttribute('x-no-overlay')
}
function areRemainingModalsWithoutOverlay(modals)
{
const overflowDisabled = modals.map(modal => modal.instance.$refs[modal.name]).filter(isOverlayDisabled);
return overflowDisabled.length === modals.length;
}
window.hyva.modal = function(options) {
const config = Object.assign({
dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300',
transitionEnterStart: 'opacity-0',
transitionEnterEnd: 'opacity-100',
transitionLeave: 'transition ease-in duration-300',
transitionLeaveStart: 'opacity-100',
transitionLeaveEnd: 'opacity-0',
}, options);
let lastHide = 0;
return {
opened: {},
show(dialog, trigger) {
const focusTargetAfterHide = determineTrigger(this.$refs, dialog, trigger);
const name = typeof dialog === 'string' ? dialog : config.dialog;
const dialogElement = this.$refs[name];
if (! dialogElement) {
return;
}
const useOverlay = ! dialogElement.hasAttribute('x-no-overlay');
dialogElement.scrollTop = 0;
if (this.opened[name]) {
return;
}
this.opened[name] = true;
useOverlay && this.$nextTick(() => setSiblingsInert(dialogElement, true));
setFocusAfterTransition(dialogElement, config.duration);
const frame = {name, instance: this, focusTarget: focusTargetAfterHide, time: Date.now()};
modals.push(frame);
if (useOverlay) {
document.body.classList.add('overflow-hidden');
}
return new Promise(resolve => frame.resolve = resolve);
},
cancel() {
this.hide(false);
},
ok() {
this.hide(true);
},
hide(value) {
if (Date.now() - lastHide < config.duration) {
return;
}
lastHide = Date.now();
const modal = modals.pop() || {};
const name = modal.name;
this.opened[name] = false;
freeFocusFromModalTrap(modal)
trapFocusInNextModalWithOverlay();
const nextFocusAfterHide = modal.focusTarget;
nextFocusAfterHide && this.$nextTick(() => nextFocusAfterHide.focus());
if (modals.length === 0 || areRemainingModalsWithoutOverlay(modals)) {
document.body.classList.remove('overflow-hidden');
}
modal.resolve(value);
},
overlay(dialog) {
const name = typeof dialog === 'string' ? dialog : config.dialog;
return {
['x-show']() {
return this.opened[name]
},
['x-transition:enter']: config.transitionEnter,
['x-transition:enter-start']: config.transitionEnterStart,
['x-transition:enter-end']: config.transitionEnterEnd,
['x-transition:leave']: config.transitionLeave,
['x-transition:leave-start']: config.transitionLeaveStart,
['x-transition:leave-end']: config.transitionLeaveEnd,
['@hyva-modal-show.window'](event) {
event.detail && event.detail.dialog === name && this.show(name)
}
};
}
};
}
window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length -1]
window.hyva.modal.pop = function () {
if (modals.length > 0) {
const modal = modals[modals.length -1];
modal.instance.hide();
}
}
window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) {
typeof selectors === 'string' || selectors instanceof String
? excludedFromFocusTrapping.add(selectors)
: selectors.map(selector => excludedFromFocusTrapping.add(selector));
}
window.hyva.modal.eventListeners = {
keydown: event => {
if (event.key === 'Escape') {
window.hyva.modal.pop();
}
},
click: event => {
if (modals.length > 0) {
const modal = modals[modals.length -1];
const dialog = modal.instance.$refs[modal.name];
if (modal.time + 50 < Date.now() && // if last click processing is more than 50ms ago
! isOverlayDisabled(dialog) && // if dialog has overlay
! dialog.contains(event.target)) { // if click is outside of dialog
modal.instance.hide();
}
}
}
};
document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown);
document.addEventListener('click', window.hyva.modal.eventListeners.click);
})();
</script>
<div x-data="dataAmMessage()" x-bind="eventListeners" x-spread="eventListeners" x-init="initAmMessage()"></div>
<script>
function dataAmMessage() {
return {
initAmMessage(){},
eventListeners: {
['@private-content-loaded.window'](event) {
const detail = event.detail.data,
body = document.getElementById('html-body');
const classList = body.classList.value;
if (classList.indexOf('checkout-') === -1
&& detail.ammessages.messages.notice) {
dispatchMessages([
{
type: detail.ammessages.messages.notice.type,
text: detail.ammessages.messages.notice.text
}
]);
}
}
}
}
}
</script>
</div><script>
yireoGoogleTagManager2Pusher({"version":"3.6.4","page_type":"cms\/index\/index","page_path":"https:\/\/www.onahole.com\/","page_title":"Onahole.com - Best Japanese Onahole and Sex Dolls (2024)","virtual_page":"","breadcrumb":[],"user":{"has_transacted":false}}, 'push (initial page) [data-layer.phtml]');
</script>
<script>
function yireoGoogleTagManager2FindParentElementWithName(element, parentTagName) {
if (!element.parentElement) {
return null;
}
if (element.parentElement.tagName.toLowerCase() === parentTagName) {
return element.parentElement;
}
return yireoGoogleTagManager2FindParentElementWithName(element.parentElement, parentTagName);
}
const products = document.querySelectorAll('.products a.product');
if (products) {
products.forEach(function(product) {
product.addEventListener('click', function(event, s) {
let parentElement = yireoGoogleTagManager2FindParentElementWithName(event.target, 'form');
const inputElement = parentElement.querySelector('input[name="product"]');
const productId = inputElement.value;
const productData = window['YIREO_GOOGLETAGMANAGER2_PRODUCT_DATA_ID_' + productId] || {};
productData.item_id = productId;
const eventData = {
'event': 'select_item',
'ecommerce': {
'items': [productData]
}
}
yireoGoogleTagManager2Pusher(eventData, 'push (page event "select_item") [script-product-clicks.phtml]');
if (window['YIREO_GOOGLETAGMANAGER2_DEBUG_CLICKS'] && confirm("Press to continue with redirect") === false) {
event.preventDefault();
}
});
})
}
</script>
<script>
window.addEventListener('private-content-loaded', function(event) {
window.dataLayer = window.dataLayer || [];
var isEmpty = function (variable) {
if (typeof variable === 'undefined') {
return true;
}
if (Array.isArray(variable) && variable.length === 0) {
return true;
}
return typeof variable === 'object' && Object.keys(variable).length === 0;
}
var getSectionNames = function () {
return ['cart', 'customer'];
}
let attributes = {};
getSectionNames().forEach(function (sectionName) {
if (!event.detail.data[sectionName].gtm_events) {
return;
}
const gtmEvents = event.detail.data[sectionName].gtm_events;
for (const [eventId, eventData] of Object.entries(gtmEvents)) {
yireoGoogleTagManager2Logger('found event in section "' + sectionName + '"', eventData);
const metaData = eventData.meta;
yireoGoogleTagManager2Pusher(eventData, 'push (customerData "' + sectionName + '" event "' + eventId + '")');
if (!metaData || metaData.cacheable !== true) {
yireoGoogleTagManager2Logger('removing event "' + eventId + '" from section "' + sectionName + '"')
let mageCacheStorage = window.localStorage.getItem('mage-cache-storage');
if (mageCacheStorage) {
mageCacheStorage = JSON.parse(mageCacheStorage);
}
if (mageCacheStorage !== null
&& typeof mageCacheStorage[sectionName] !== 'undefined'
&& typeof mageCacheStorage[sectionName].gtm_events !== 'undefined'
&& eventId in mageCacheStorage[sectionName].gtm_events) {
delete mageCacheStorage[sectionName].gtm_events[eventId];
}
window.localStorage.setItem('mage-cache-storage', JSON.stringify(mageCacheStorage));
}
}
});
if (false === isEmpty(attributes)) {
yireoGoogleTagManager2Pusher(attributes, 'dataLayer (initial js) [script-additions.phtml]');
}
});
</script>
<iframe id="__OM_native_iframe" style="display: none;"></iframe><iframe style="display: none;"></iframe><div class="om-holder" id="om-holder-campaign-126">
<div class="om-container om-popup-container" id="om-overlay-campaign-126" style="display:none; width: 0; height: 0;">
<div class="om-middle">
<div class="om-iframe-container om-creative-664271ad2d0be200234a4e14" id="om-iframe-container-campaign-126" data-campaign-name="ONA Popup MG (05/2024-ForTesting)">
<div id="om-campaign-126" class="om-workspace-content" style="display:block">
</div>
</div>
</div>
</div>
</div><iframe style="display: none;"></iframe></body></html>