Welcome to the detailed analysis for mr-s-leather.com. This domain is officially recognized as Bondage/BDSM, Sex Toys, Puppy Play and Sports Gear - Mr. S Leather. According to their official web presence, their primary focus is: "Bondage/BDSM Gear, Sex Toys, Ass Play, Harnesses, Pup Play, & Fetish Clothing since 1979. Our Leather & Neoprene gear is designed and manufactured in the heart of San Francisco.".
"By creating an account or logging in, you agree to Our Privacy Policy ."
"Enter your email address and we'll send you a password reset link."
"function initRecentlyViewedProductsComponent_6aa604ebc0564(options) { const defaultOptions = { isSlider: false, useGraphQL: false, noOfProductsToShow: 5 }; const config = Object.assign({}, defaultOptions, options || {}); function ga4GetClientId() { const m = document.cookie.match(/_ga=([^;]+)/); if (!m) return null; const parts = decodeURIComponent(m[1]).split('.'); return parts.length >= 4 ? parts[2] + '.' + parts[3] : null; } function ga4GetPageType() { const c = document.body.className; if (/\bcms-index-index\b/.test(c)) return 'home'; if (/\bcatalog-category-view\b/.test(c)) return 'PLP'; if (/\bcatalogsearch-result-index\b/.test(c)) return 'Search'; if (/\bcatalog-product-view\b/.test(c)) return 'PDP'; return 'others'; } function ga4ToListId(name) { return (name || 'product_list').toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, ''); } const ga4User = {userId: null, userType: 'Guest'}; function ga4SetUserFromCustomer(customer) { if (customer && customer.firstname) { ga4User.userId = customer.id || null; ga4User.userType = 'Logged in'; } else { ga4User.userId = null; ga4User.userType = 'Guest'; } } try { ga4SetUserFromCustomer(JSON.parse(localStorage.getItem('mage-cache-storage') || '{}').customer); } catch (e) { /* fall back to Guest defaults */ } window.addEventListener('private-content-loaded', function (e) { const customer = e.detail && e.detail.data && e.detail.data.customer; if (customer) ga4SetUserFromCustomer(customer); }); const ga4ListName = 'Recently\u0020Viewed\u0020Products'; const ga4ListId = ga4ToListId(ga4ListName); function ga4BuildItem(product, index) { const minPrice = (product.price_range && product.price_range.minimum_price) || {}; const finalPrice = minPrice.final_price ? minPrice.final_price.value : null; const regularPrice = minPrice.regular_price ? minPrice.regular_price.value : null; return { item_id: product.sku, item_name: product.name, index: index, item_brand: null, item_category: null, item_category2: null, item_category3: null, item_category4: null, item_category5: null, item_list_id: ga4ListId, item_list_name: ga4ListName, item_variant: null, item_status: null, price: finalPrice, item_original_price: (regularPrice !== null && regularPrice > finalPrice) ? regularPrice : finalPrice }; } function ga4PushEcommerce(eventName, items) { if (!items.length) return; window.dataLayer = window.dataLayer || []; window.dataLayer.push({ecommerce: null}); window.dataLayer.push({ event: eventName, client_id: ga4GetClientId(), userId: ga4User.userId, userType: ga4User.userType, page_type: ga4GetPageType(), search_term: null, ecommerce: { item_list_id: ga4ListId, item_list_name: ga4ListName, items: items } }); } function readRecentlyViewedFromStorage () { const data = hyva.getBrowserStorage().getItem('recently_viewed_products'); return data ? JSON.parse(data).filter(product => { return config.useGraphQL || product.id; }) : []; } return { products: [], currency: [], noOfProductsToShow: config.noOfProductsToShow, loading: true, minHeight() { return 'min-height: ' + ((this.loading && '491px') || 0); }, getProducts() { const recentlyViewedProductsArray = readRecentlyViewedFromStorage(); let itemsToShow = []; if (recentlyViewedProductsArray.length > 0) { // Avoid showing the current product const start = '' === '' ? 0 : 1; itemsToShow = recentlyViewedProductsArray.slice(start) } itemsToShow = itemsToShow.slice(0, this.noOfProductsToShow); if (!itemsToShow.length) { this.noOfProductsToShow = 0; this.loading = false; return; } config.useGraphQL ? this.fetchProducts(itemsToShow) : this.renderRecentlyViewedProducts(itemsToShow) }, fetchProducts(itemsToShow) { const skusToFetch = itemsToShow.map(product => product.sku); const query = `query ($skus: [String!]!) { products(filter: { sku: { in: $skus } }) { items { sku id name type_id small_image { label url } url_key url_suffix visibility status rating_summary review_count price_range { minimum_price { regular_price { value currency } final_price { value currency } } } } } }`; const variables = JSON.stringify({skus: skusToFetch}); window.fetch(BASE_URL + 'graphql?' + new URLSearchParams({query, variables}), { method: 'GET', headers: { 'Store': 'default', 'Content-Currency': 'USD' }, }) .then((response) => response.json()) .then((result) => { this.currency = (result && result.data && result.data.currency); const responseProducts = ( result && result.data && result.data.products && result.data.products.items ) || []; // fix sorting of the response-products according to the sorting of the requested-products const sortedProducts = []; skusToFetch.forEach(sku => { responseProducts.forEach(productData => { if (sku === productData.sku) { sortedProducts.push(productData); } }); }); this.renderRecentlyViewedProducts(sortedProducts); } ) .finally(() => this.loading = false) }, // end fetchProducts() renderRecentlyViewedProducts(products) { this.products = products; this.loading = false; if (config.isSlider) { this.$nextTick(() => this.calcPageSize()); } this.pushViewItemListOnce(); }, ga4ViewItemListFired: false, pushViewItemListOnce() { if (this.ga4ViewItemListFired || !this.products.length) { return; } this.ga4ViewItemListFired = true; ga4PushEcommerce('view_item_list', this.products.map((product, i) => ga4BuildItem(product, i + 1))); }, trackSelectItem(product) { const index = this.products.indexOf(product) + 1; ga4PushEcommerce('select_item', [ga4BuildItem(product, index || 1)]); }, /** * GA4 items[] payload for a card, read by Ktpl_CustomGA4Events' slider tracker * (plp_slider_tracking.phtml) off the card's data-ga4-product attribute. * * These cards render from the `products` GraphQL query, which returns neither the * brand nor any category names, so only the fields it does return are emitted here. * The shared resolver (window.mslGa4ItemData) fills item_brand, item_category..5, * item_variant and item_status in by SKU before the event is pushed — which is why the * SKU has to reach the DOM at all. */ ga4ProductAttr(product) { const minimumPrice = (product.price_range && product.price_range.minimum_price) || {}; const finalPrice = minimumPrice.final_price ? minimumPrice.final_price.value : null; const regularPrice = minimumPrice.regular_price ? minimumPrice.regular_price.value : null; return JSON.stringify({ item_id: product.sku || null, item_name: product.name || null, price: finalPrice, // item_original_price is the strikethrough/base price; never less than the current price item_original_price: (regularPrice !== null && finalPrice !== null) ? Math.max(regularPrice, finalPrice) : finalPrice }); }, addToCart(event) { const form = event.target; const button = form.querySelector('button[type=submit]'); const formData = new FormData(form); button.disabled = true; fetch(form.action, { method: 'POST', body: new URLSearchParams(formData).toString(), mode: 'cors', credentials: 'include', headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest' } }).then(response => { if (response.redirected) { window.location.href = response.url; return null; } return response.json().catch(() => null); }).then(responseData => { if (!responseData) { return } if (responseData.backUrl) { window.location.href = responseData.backUrl; return; } window.dispatchEvent(new CustomEvent("reload-customer-section-data")); typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: !responseData.error ? "success" : "error", text: !responseData.error ? "You added the product to your cart." : (responseData.message || "There was a problem adding your item to the cart.") }], 5000 ); }).catch(function () { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "error", text: "There was a problem adding your item to the cart." }], 5000 ); }).finally(() => { button.disabled = false; }); }, // end addToCart() 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(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(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 ); window.dispatchEvent(new CustomEvent("reload-customer-section-data")); }).catch(function (error) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "error", text: error }], 5000 ); }); }, // end addToWishlist() 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(response => { if (response.redirected) { window.location.href = response.url; } }).catch(error => { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "error", text: error }], 5000 ); }); }, // slider properties active: 0, getSlider() { return this.$root.querySelector('.js_slides'); }, pageSize: 4, pageFillers: 0, calcPageSize() { const slider = this.getSlider(); if (slider) { this.pageSize = Math.round(slider.clientWidth / slider.querySelector('.js_slide').clientWidth); this.pageFillers = ( this.pageSize * Math.ceil(this.products.length / this.pageSize) ) - this.products.length; } }, calcActive() { const slider = this.getSlider(); if (slider) { this.active = Math.ceil( Math.round( slider.scrollLeft / (slider.scrollWidth / (this.products.length + this.pageFillers)) ) / this.pageSize ) * this.pageSize; } } } }"
By comparing mr-s-leather.com to other leading websites in its niche, marketers and researchers can identify key traffic sources and growth opportunities. Explore our related resources below to find websites similar to mr-s-leather.com.
Yes, according to our latest analysis, we detected a valid SSL certificate ensuring a secure connection.
As of September 13, 2026, mr-s-leather.com holds an estimated domain authority score of 69/100 based on our VisitRank tracking algorithms.
You can find the best alternatives and similar sites to mr-s-leather.com in our explore section, which includes competitors in the E-commerce & Retail sector.
Common Misspellings & Typo Domains for mr-s-leather.com:
"Absolutely amazing service and craftsmanship! Iām beyond excited to wear my new pup hood out. The personal message from Matt included with the package was such a thoughtful touch. Loved every part of the experience from start to finish. Great communication through emails. Huge congrats to the whole team!"