← All opportunities
CampaignGoodr· sportsSourced · Brand Site· 8d agoResponse not guaranteed
Last confirmed 8 days ago

Influencers Pay Double

The money

Requirements

The work

Applying

Original page content
Influencers Pay Double { "settings": { "cart_redirection": false, "gallery_thumbnail_position": "below", "gallery_video_autoplay": true, "gallery_video_looping": true, "gallery_hover_zoom": "disabled", "gallery_click_to_zoom": "always", "money_format": "${{ amount }}", "swatches_enable": true, "sold_out_options": "selectable", "select_first_available_variant": false }, "context": { "select_variant": "Please select a variant", "product_available": "Add to cart", "product_sold_out": "Sold out", "product_unavailable": "Unavailable", "product_preorder": "Pre-order", "request_message_empty": "Quote request" }, "product": {"id":4412795682874,"title":"Influencers Pay Double","handle":"influencers-pay-double","description":"\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cspan data-mce-fragment=\"1\"\u003eRound pink sunglasses with mirrored reflective polarized lenses so stylish you’ll actually want to pay double. Whether you’re rollerskating, running, or golfing, these fashionable bubblegum pink sunglasses have you covered with a no slip, no bounce frame \u0026amp; UV400 protection.\u003c\/span\u003e\u003cbr\u003e","published_at":"2020-03-27T11:03:05-07:00","created_at":"2020-03-23T15:08:47-07:00","vendor":"goodr sunglasses","type":"Circle Gs","tags":["activity-golfing","Best Seller - Circle G","circle frames","circle-g","classic","framecolor-pink","headsize-small","inline","lenscolor-pink","lenstype;reflective","pdqreview","pink-sunglasses","Polarized","shape-round","sports-tennis","Sunglasses","tts"],"price":3000,"price_min":3000,"price_max":3000,"available":true,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":41101396607034,"title":"G00573-CG-01","option1":"G00573-CG-01","option2":null,"option3":null,"sku":"G00573-CG-01","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Influencers Pay Double - G00573-CG-01","public_title":"G00573-CG-01","options":["G00573-CG-01"],"price":3000,"weight":100,"compare_at_price":null,"inventory_management":"shopify","barcode":"840467600029","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":41101396639802,"title":"CG-PK-PK1-RF","option1":"CG-PK-PK1-RF","option2":null,"option3":null,"sku":"CG-PK-PK1-RF","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Influencers Pay Double - CG-PK-PK1-RF","public_title":"CG-PK-PK1-RF","options":["CG-PK-PK1-RF"],"price":3000,"weight":100,"compare_at_price":null,"inventory_management":"shopify","barcode":"810075316612","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":41171712475194,"title":"G00573-CG-02","option1":"G00573-CG-02","option2":null,"option3":null,"sku":"G00573-CG-02","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Influencers Pay Double - G00573-CG-02","public_title":"G00573-CG-02","options":["G00573-CG-02"],"price":3000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"840467604607","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}}],"images":["\/\/goodr.com\/cdn\/shop\/files\/1_InfluencersPayDouble_Side_Transparent_a8847c50-663d-4822-b0a0-daf4cfda2fcd.png?v=1689751162","\/\/goodr.com\/cdn\/shop\/files\/2_InfluencersPayDouble_Lifestyle_67db8d97-a71b-4f96-ac0a-136416131b28.jpg?v=1689751163","\/\/goodr.com\/cdn\/shop\/files\/3_InfluencersPayDouble_Front_Transparent_f5f194eb-a96c-4b13-8056-0a9a98b55632.png?v=1760401763","\/\/goodr.com\/cdn\/shop\/files\/4_InfluencersPayDouble_Packaging_6e639fef-d568-4d2e-afc5-bc5996199687.jpg?v=1689751164","\/\/goodr.com\/cdn\/shop\/files\/5_InfluencersPayDouble_Featured_4d007a76-6671-41ec-9b4c-d7bd7e5ce798.jpg?v=1689751164"],"featured_image":"\/\/goodr.com\/cdn\/shop\/files\/1_InfluencersPayDouble_Side_Transparent_a8847c50-663d-4822-b0a0-daf4cfda2fcd.png?v=1689751162","options":["Choose from available"],"media":[{"alt":"Three-quarter angle view of pink round sunglasses with pink mirrored polarized lenses.","id":21449836462138,"position":1,"preview_image":{"aspect_ratio":1.778,"height":450,"width":800,"src":"\/\/goodr.com\/cdn\/shop\/files\/1_InfluencersPayDouble_Side_Transparent_a8847c50-663d-4822-b0a0-daf4cfda2fcd.png?v=1689751162"},"aspect_ratio":1.778,"height":450,"media_type":"image","src":"\/\/goodr.com\/cdn\/shop\/files\/1_InfluencersPayDouble_Side_Transparent_a8847c50-663d-4822-b0a0-daf4cfda2fcd.png?v=1689751162","width":800},{"alt":"A stylish woman wearing round pink sunglasses and holding a camera looks off to the side, a hot pink wall behind her.","id":21449836494906,"position":2,"preview_image":{"aspect_ratio":1.0,"height":800,"width":800,"src":"\/\/goodr.com\/cdn\/shop\/files\/2_InfluencersPayDouble_Lifestyle_67db8d97-a71b-4f96-ac0a-136416131b28.jpg?v=1689751163"},"aspect_ratio":1.0,"height":800,"media_type":"image","src":"\/\/goodr.com\/cdn\/shop\/files\/2_InfluencersPayDouble_Lifestyle_67db8d97-a71b-4f96-ac0a-136416131b28.jpg?v=1689751163","width":800},{"alt":"Front view of round pink sunglasses with polarized pink reflective lenses.","id":21449836527674,"position":3,"preview_image":{"aspect_ratio":1.778,"height":1152,"width":2048,"src":"\/\/goodr.com\/cdn\/shop\/files\/3_InfluencersPayDouble_Front_Transparent_f5f194eb-a96c-4b13-8056-0a9a98b55632.png?v=1760401763"},"aspect_ratio":1.778,"height":1152,"media_type":"image","src":"\/\/goodr.com\/cdn\/shop\/files\/3_InfluencersPayDouble_Front_Transparent_f5f194eb-a96c-4b13-8056-0a9a98b55632.png?v=1760401763","width":2048},{"alt":"Three-quarter angle view of round pink sunglasses with pink reflective lenses sitting atop a pile of cameras.","id":21449836560442,"position":4,"preview_image":{"aspect_ratio":1.0,"height":800,"width":800,"src":"\/\/goodr.com\/cdn\/shop\/files\/4_InfluencersPayDouble_Packaging_6e639fef-d568-4d2e-afc5-bc5996199687.jpg?v=1689751164"},"aspect_ratio":1.0,"height":800,"media_type":"image","src":"\/\/goodr.com\/cdn\/shop\/files\/4_InfluencersPayDouble_Packaging_6e639fef-d568-4d2e-afc5-bc5996199687.jpg?v=1689751164","width":800},{"alt":"A stylish man in a gold bike helmet wears round pink sunglasses with pink lenses, looking off to the side.","id":21449836593210,"position":5,"preview_image":{"aspect_ratio":1.0,"height":800,"width":800,"src":"\/\/goodr.com\/cdn\/shop\/files\/5_InfluencersPayDouble_Featured_4d007a76-6671-41ec-9b4c-d7bd7e5ce798.jpg?v=1689751164"},"aspect_ratio":1.0,"height":800,"media_type":"image","src":"\/\/goodr.com\/cdn\/shop\/files\/5_InfluencersPayDouble_Featured_4d007a76-6671-41ec-9b4c-d7bd7e5ce798.jpg?v=1689751164","width":800}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cspan data-mce-fragment=\"1\"\u003eRound pink sunglasses with mirrored reflective polarized lenses so stylish you’ll actually want to pay double. Whether you’re rollerskating, running, or golfing, these fashionable bubblegum pink sunglasses have you covered with a no slip, no bounce frame \u0026amp; UV400 protection.\u003c\/span\u003e\u003cbr\u003e"}, "product_recommendation_limit": null } Home / Influencers Pay Double const buyDrawerProductHandle = "influencers-pay-double"; const buyDrawerOptionNames = [ "Choose from available", null, null ].filter(Boolean); const buyDrawerVariants = [ { id: 41101396607034, title: "G00573-CG-01", available: true, inventory_quantity: 7524, cutover: false }, { id: 41101396639802, title: "CG-PK-PK1-RF", available: false, inventory_quantity: 0, cutover: false }, { id: 41171712475194, title: "G00573-CG-02", available: true, inventory_quantity: 2477, cutover: true } ]; // Store original variants before sizing buttons filter them const allBuyDrawerVariants = buyDrawerVariants.slice(); function toggleBuyDrawerNotify(show) { const notifyDiv = document.querySelector('.buy-drawer-container #NotifyStockBtnDrawer'); if (!notifyDiv) return; notifyDiv.style.display = show ? 'block' : 'none'; } function showDrawerSoldOut(sellNew) { const buttons = document.querySelectorAll('.buy-drawer-container .goodr-product-grid-item-button'); if (sellNew) { // Post-cutover and new SKUs depleted — Klaviyo notify replaces the CTA buttons.forEach((button) => { button.classList.add('hide'); button.disabled = true; if (!button.classList.contains('button-circle')) { button.textContent = 'OUT OF STOCK'; } }); toggleBuyDrawerNotify(true); } else { // Pre-cutover (or non-cutover) sold out — keep grey disabled button visible buttons.forEach((button) => { button.classList.remove('hide'); button.classList.add('disabled'); button.disabled = true; } }); toggleBuyDrawerNotify(false); } } async function checkBuyDrawerStock() { const helper = window.selectVariantByInventory; let selectedVariant = buyDrawerVariants[0] || null; if (typeof helper === 'function') { try { const resolved = await helper(buyDrawerVariants, buyDrawerOptionNames, buyDrawerProductHandle); // selectVariantByInventory returns { variant, enriched, sellNew, ... } if (resolved?.variant === null) { showDrawerSoldOut(resolved.sellNew === true); return; } selectedVariant = resolved?.variant || resolved; } catch (error) { console.error('[FIFO] Drawer variant selection failed', error); } } if (!selectedVariant) { // No helper data available — default to grey SOLD OUT (visible button, no Klaviyo) showDrawerSoldOut(false); return; } // Product in stock - show buttons and hide Klaviyo button buttons.forEach((button) => { button.classList.remove('disabled'); button.disabled = false; button.textContent = 'ADD TO BAG +'; } }); } async function addProductBuyDrawer() { // If sizing buttons exist and no size has been selected, show error var sizingContainer = document.querySelector('.sizing-buttons-container'); if (sizingContainer && !window.sizeSelected) { if (typeof window.showSizingError === 'function') { window.showSizingError(); } return; } if (sizingContainer) { var activeBtn = sizingContainer.querySelector('.size-btn--active'); if (activeBtn && activeBtn.dataset.inStock === 'false') { window.showSizingError("Influencers Pay Double" + ' does not come in a ' + activeBtn.dataset.size + ', please choose another size'); } return; } } const quantityInput = document.querySelector('.buy-drawer-container .quantity-selector__input'); const quantity = Number(quantityInput?.value) || 1; // Check for "Hidden" variants logic (FIFO) const hasHiddenVariants = buyDrawerOptionNames.some( (name) => name === 'Hidden: Cutover Variant' || name.startsWith('Choose from available') ); try { if (hasHiddenVariants && window.fifoVariantSelection?.add) { // This handles the complex SKU switching const result = await window.fifoVariantSelection.add( buyDrawerProductHandle, quantity, buyDrawerVariants, buyDrawerOptionNames ); if (result.soldOut) { // fifoVariantSelection.add doesn't return sellNew — derive it from the helper var sellNew = false; if (typeof window.selectVariantByInventory === 'function') { try { const stockState = await window.selectVariantByInventory( buyDrawerVariants, buyDrawerOptionNames, buyDrawerProductHandle ); sellNew = stockState?.sellNew === true; } catch (e) { console.error('[FIFO] Drawer sellNew lookup failed', e); } } showDrawerSoldOut(sellNew); } else { // SUCCESS: Manually trigger the drawer and gift logic if (typeof updateCartData === 'function') updateCartData(); if (typeof openCartDrawer === 'function') openCartDrawer(); } } else { // Standard Variant Logic let targetVariant = buyDrawerVariants[0] || null; if (typeof helper === 'function') { // Handle the nested structure returned by the helper targetVariant = resolved?.variant || resolved; } if (!targetVariant || !targetVariant.id) { console.error("No valid variant found to add."); return; } console.log('Adding item from Buy Drawer:', targetVariant.id); // Use the global addCartItem from theme.liquid // This function ALREADY handles opening the drawer and updating data await addCartItem(targetVariant.id, quantity); } } catch (error) { console.error('[Cart] Error adding from drawer:', error); } } // Check stock on page load if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', checkBuyDrawerStock); } else { checkBuyDrawerStock(); } .dg-chat-bot { right: 8px !important; transition: transform 0.65s ease-in-out; will-change: transform; } .dg-chat-bot-up { transform: translateY(-88px); } .dg-chat-bot-down { transform: translateY(0); } window.addEventListener('scroll', (event) => { const pdp_container = document.querySelector('.goodr-add-container'); const product_container = document.querySelector('.product__container'); const element = isInViewport(pdp_container); const elementTop = isInViewportTop(product_container); const chatBotController = document.getElementById('dg-chat-widget-launcher'); if (chatBotController) { chatBotController.classList.add('dg-chat-bot'); } if (elementTop) { document.querySelector('.buy-drawer-container').classList.remove('visible'); document.querySelector('.buy-drawer-container').classList.add('hidden'); document.querySelector('.buy-drawer-container').setAttribute('aria-hidden', 'true'); document.body.classList.remove('buyDrawer-Open'); if (chatBotController) { console.log('chatbot down'); chatBotController.classList.remove('dg-chat-bot-up'); chatBotController.classList.add('dg-chat-bot-down'); } } else { document.querySelector('.buy-drawer-container').classList.add('visible'); document.querySelector('.buy-drawer-container').setAttribute('aria-hidden', 'false'); document.querySelector('.buy-drawer-container').classList.remove('hidden'); document.body.classList.add('buyDrawer-Open'); if (chatBotController) { console.log('chatbot up'); chatBotController.classList.remove('dg-chat-bot-down'); chatBotController.classList.add('dg-chat-bot-up'); } } }); Influencers Pay Double $30 ADD TO BAG + + // Clone Klaviyo button from main PDP to drawer (function() { let cloned = false; function cloneKlaviyoButton() { if (cloned) return; const mainButton = document.querySelector('#NotifyStockBtn .klaviyo-bis-trigger'); const drawerContainer = document.getElementById('NotifyStockBtnDrawer'); if (mainButton && drawerContainer && !drawerContainer.hasChildNodes()) { const clonedButton = mainButton.cloneNode(true); drawerContainer.appendChild(clonedButton); // Re-bind click event to trigger main button's Klaviyo modal clonedButton.addEventListener('click', function(e) { e.preventDefault(); mainButton.click(); }); // Hide SOLD OUT buttons in drawer when Klaviyo button shows const drawerButtons = document.querySelectorAll('.buy-drawer-container .goodr-product-grid-item-button'); drawerButtons.forEach(btn => btn.classList.add('hide')); cloned = true; } } // Watch for Klaviyo injection const observer = new MutationObserver(function(mutations) { cloneKlaviyoButton(); }); // Start observing if (document.body) { observer.observe(document.body, { childList: true, subtree: true }); } // Also try immediately in case Klaviyo already injected document.addEventListener('DOMContentLoaded', cloneKlaviyoButton); } else { cloneKlaviyoButton(); } })(); #NotifyStockBtn { width: 100%; } #NotifyStockBtn > a { width: 100% !important; } #NotifyStockBtnDrawer > a { margin: 0 !important; } /* Mobile-only: keep the Klaviyo notify button inside the drawer width */ @media screen and (max-width: 678px) { #NotifyStockBtnDrawer { flex: 1 1 auto; min-width: 0; max-width: 100%; box-sizing: border-box; } #NotifyStockBtnDrawer > a { width: 100% !important; max-width: 100% !important; box-sizing: border-box !important; white-space: normal !important; text-align: center !important; line-height: 1.2 !important; overflow-wrap: anywhere; font-size: 12px !important; padding: 10px 8px !important; letter-spacing: 0 !important; } } .mobile-product-gallery { display: none; } #goodr-product-gallery-mobile .slick-dots { font-size: 1.4rem; line-height: normal; letter-spacing: normal; display: flex; justify-content: center; align-items: center; list-style: none; padding: 0; text-align: center; width: 100%; margin: 15px 0px; } #goodr-product-gallery-mobile .slick-dots li { cursor: pointer; display: inline-block; margin: 0 4px; padding: 0; position: relative; vertical-align: middle; width: 100%; height: 4px; max-width: 20px; } #goodr-product-gallery-mobile .slick-dots li button { background: rgba(0, 0, 0, 0.2); border-radius: 2px; border: none; box-shadow: none; cursor: pointer; display: block; padding: 0; text-indent: -9999rem; transition: 0.3s; width: 100%; height: 4px; } #goodr-product-gallery-mobile .slick-dots li.slick-active button { background: #1a1e21; } .goodr-product-pdp .goodr-product-gallery > img { border-radius: 10px; aspect-ratio: 3/3; } .ares-expand-button-logo { display: none; } .ares-expand-button-attribution { font-weight: 400; } .object-viewer-attribution .snap-logo img { display: none; } @media screen and (max-width: 719px) { #goodr-product-gallery-mobile img { max-width: 100%; height: auto; aspect-ratio: 3/3; animation: none; -webkit-animation: none; border-radius: 10px; } .goodr-product-details { position: relative !important; } .mobile-product-gallery { display: block; } .desktop-product-gallery { display: none; } .product-main .product-details { margin-top: 0; } } .accordion-item-box button.accordion { background: transparent; border: none; padding: 0; width: 100%; } .accordion-item-box button.accordion h4 { padding-bottom: 0; } .goodr-product-pdp .goodr-product-description button { color: #0c2340; font-family: 'europa', sans-serif; font-weight: 300; font-style: normal; line-height: 130%; margin: 0; font-size: 14px; background: transparent; padding: 0; border: none; } .accordion.is-open + .accordion-content { padding-top: 5px; } .goodr-product-pdp .goodr-product-description .h5.point-text { font-family: 'GibsonBold'; color: #0c2340; text-transform: uppercase; line-height: 100%; margin: 0; font-size: 12px; text-align: center !important; font-weight: 300; padding-bottom: 4px; } @media screen and (min-width: 768px) { font-size: 16px; } font-size: 16px; } } { "blocks": [".product_image_16_9", ".product_image_3_4"], "elements": [] } let currentDrawer = 'hidden' function viewImage(imgId) { const modal = document.getElementById('goodr-product-gallery-viewer') modal.style.display = 'flex' const img = document.getElementById(imgId) const modalVideo = document.getElementById('modal-player') const mediaType = img.getAttribute('mediatype') const modalImg = document.getElementById('product-01') const body = document.querySelector("body") const buyDrawer = document.getElementById('buy-drawer-selector') const chatBotController = document.getElementById('drift-frame-controller') const chatBotFrameChat = document.getElementById('drift-frame-chat') if (buyDrawer.classList.contains('visible')) { currentDrawer = 'visible' } else { currentDrawer = 'hidden' } document.getElementById('shopify-section-goodr-announcement').style.display = 'none' document.getElementsByClassName('site-header')[0].style.zIndex = '0' body.style.overflow = 'hidden' setTimeout(() => { buyDrawer.classList.remove('hidden') buyDrawer.classList.add('visible') if (chatBotController && chatBotFrameChat) { chatBotController.classList.add('chat-bot-controller-animation-up') chatBotFrameChat.classList.add('chat-bot-frame-animation-up') } }, 0) if (mediaType === 'image') { modalImg.src = img.src modalImg.style.display = 'block' modalVideo.style.display = 'none' } else { modalImg.style.display = 'none' modalVideo.style.display = 'block' modalVideo.setAttribute('src', img.getAttribute('videourl')) } } function closeViewer() { if (currentDrawer == 'hidden') { buyDrawer.classList.remove('visible') buyDrawer.classList.add('hidden') chatBotController.classList.remove('chat-bot-controller-animation-up') chatBotFrameChat.classList.remove('chat-bot-frame-animation-up') } } body.style.overflow = 'auto' modalVideo.setAttribute('src', '') modal.style.display = 'none' document.getElementById('shopify-section-goodr-announcement').style.display = 'block' document.getElementsByClassName('site-header')[0].style.zIndex = '900' } × .template-product main#site-main { overflow: visible; } .goodr-newsletter-main_container { width: 100%; } .product--section.goodr-product-pdp { padding-bottom: 60px; } .product--section.goodr-product-pdp .goodr-product-gallery-viewer { width: 100%; height: 100%; } .goodr-product-gallery-viewer button.close { position: absolute; top: 20px; right: 20px; background: transparent; border: none; font-size: 30px; color: #fff; cursor: pointer; } .desktop-product-gallery { position: sticky; top: 100px; align-self: start; z-index: 5; } .desktop-product-gallery .goodr-product-gallery { display: flex; align-items: center; gap: 30px; flex-direction: row-reverse; max-width: 770px; width: 100%; } .desktop-product-gallery .goodr-product-gallery .goodr-product-gallery-main { width: 86%; border: 1px solid #0C2340 !important; background: #FFF; border-radius: 13.536px; max-width: 640px; aspect-ratio: 1 / 1; display: flex; align-items: center; justify-content: center; overflow: hidden; } .desktop-product-gallery .goodr-product-gallery .goodr-product-gallery-thumbnail { width: 14%; max-width: 100px; display: flex; flex-direction: column; gap: 16px; } .desktop-product-gallery .goodr-product-gallery .goodr-product-gallery-thumbnail .goodr-product-media-item img { margin: 0 !important; width: 100%; max-width: 100%; height: 100%; pointer-events: none; } button.goodr-product-media-item { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; background: transparent; border: none; padding: 0; cursor: pointer; } .desktop-product-gallery .goodr-product-gallery .goodr-product-gallery-main img { height: 100%; width: 100%; max-width: 100%; margin: 0px !important; cursor: pointer; --slide-fade-translate-y: 0px; animation: none; -webkit-animation: none; } .desktop-product-gallery .goodr-product-gallery .auglio-tryon-btn-wrapper { aspect-ratio: 1 / 1; width: calc(86% - 30px) !important; height: auto !important; right: 1px; left: unset; top: 50%; transform: translateY(-50%); max-width: 640px; } .desktop-product-gallery .goodr-product-gallery .goodr-product-gallery-thumbnail .goodr-product-media-item { width: 100%; max-width: 100px; border-radius: 4.062px; border: 1px solid #0C2340; background: #FFF; display: flex; align-items: center; justify-content: center; overflow: hidden; aspect-ratio: 1 / 1; } .desktop-product-gallery .goodr-product-gallery .goodr-product-gallery-thumbnail .goodr-product-media-item.active-item { border-color: #F8A3BC; outline: 2px solid #F8A3BC; } .desktop-product-gallery .goodr-product-gallery .auglio-tryon-btn-wrapper button.auglio-tryon-btn.auglio-tryon-btn-product { bottom: 20px; right: 20px; } .goodr-product-details { } .image-with-text { overflow: hidden; } @media screen and (min-width: 720px) and (max-width: 767px) { .goodr-product-pdp .product--outer .product-main { width: 50%; margin-left: 0; } } .goodr-product-pdp .product--outer { display: grid; grid-template-columns: calc(60% - 30px) 40%; grid-gap: 30px; } margin: 0; } } @media screen and (min-width: 1199px) { display: grid; grid-template-columns: calc(66% - 60px) 34%; grid-gap: 60px; } } @media screen and (max-width: 1023px) { gap: 16px; } width: calc(86% - 16px) !important; } } document.addEventListener('DOMContentLoaded', function() { var mediaItems = document.querySelectorAll('.goodr-product-media-item'); var mainGallery = document.querySelector('.goodr-product-gallery-main'); mediaItems.forEach(function(item) { function activateItem() { mediaItems.forEach(function(i) { i.classList.remove('active-item'); }); item.classList.add('active-item'); var newContent = item.innerHTML; mainGallery.innerHTML = newContent; } item.addEventListener('mouseenter', activateItem); item.addEventListener('focus', activateItem); }); }); { "elements": [] } let currentDrawerMobile = 'hidden' function viewImageMobile(imgId) { const modal = document.getElementById('goodr-product-gallery-viewer-mobile') modal.style.display = 'flex' const modalVideo = document.getElementById('modal-player-mobile') const modalImg = document.getElementById('product-02') currentDrawerMobile = 'visible' } else { currentDrawerMobile = 'hidden' } body.style.overflow = 'hidden' setTimeout(() => { } }, 0) if (mediaType === 'image') { modalImg.src = img.src } else { modalImg.style.display = 'none' } } function closeViewerMobile() { if (currentDrawerMobile == 'hidden') { } } body.style.overflow = 'auto' modal.style.display = 'none' } × "> { "blocks": [".goodr-product-gallery-viewer-content"], "elements": [] } let currentModalDrawer = 'hidden' let lastFocusedElement = null; function viewImageOnModal(imgUrl, showDisclaimer, imgAlt) { const modal = document.getElementById('goodr-global-modal') const modalImg = document.getElementById('goodr-global-image') const disclaimer = document.getElementById('modal-disclaimer') modal.style.display = 'flex' currentModalDrawer = 'visible' } else { currentModalDrawer = 'hidden' } body.style.overflow = 'hidden' setTimeout(() => { } }, 0) modalImg.src = imgUrl if(imgAlt){ modalImg.alt = imgAlt } if (showDisclaimer) { disclaimer.style.display = 'flex' } else { disclaimer.style.display = 'none' } lastFocusedElement = document.activeElement; const focusables = modal.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'); if (focusables.length) { focusables[0].focus(); } } function closeModalViewer() { if (currentModalDrawer == 'hidden') { } } body.style.overflow = 'auto' modal.style.display = 'none' if (lastFocusedElement) { lastFocusedElement.focus(); } } button.close{ background: transparent; border: none; cursor: pointer; } × " > goodr sunglasses have metal screws that can potentially expose you to nickel. Nickel is known to the State of California to cause cancer. For more information go to www.P65Warnings.ca.gov { "blocks": [".goodr-product-details"], "elements": [".goodr-product-details"] } const hasHiddenVariantsDetails = true; const productHandleDetails = "influencers-pay-double"; const productOptionNamesDetails = [ "Choose from available", null, null ].filter(Boolean); const productVariantsDetails = [ { id: 41101396607034, title: "G00573-CG-01", available: true, sku: "G00573-CG-01", inventory_quantity: 7524, cutover: false }, { id: 41101396639802, title: "CG-PK-PK1-RF", available: false, sku: "CG-PK-PK1-RF", inventory_quantity: 0, cutover: false }, { id: 41171712475194, title: "G00573-CG-02", available: true, sku: "G00573-CG-02", inventory_quantity: 2477, cutover: true } ]; const allProductVariantsDetails = productVariantsDetails.slice(); console.log("All Product Variant Details:",allProductVariantsDetails); const addToBagLabel = 'ADD TO BAG'; window.addToBagLabel = addToBagLabel; const soldOutLabel = 'SOLD OUT'; const klavioNotifyLabel = 'NOTIFY ME WHEN BACK IN STOCK' window.soldOutLabel = soldOutLabel; // Expose globally for updateSoldOutUI // Expose variant data for variants() debugging helper (unlisted products can't fetch from GraphQL) window.pdpVariantData = { handle: productHandleDetails, variants: productVariantsDetails, options: productOptionNamesDetails }; function getDetailsQuantityInput() { return document.querySelector('.goodr-add-container .quantity-selector__input'); } function getDetailsButtons() { return document.querySelectorAll('.goodr-add-container .goodr-product-grid-item-button'); } function toggleDetailsNotify(show) { const notifyDiv = document.getElementById('NotifyStockBtn'); if (!notifyDiv) return; } function showDetailsSoldOut(sellNew) { const buttons = getDetailsButtons(); if (sellNew) { buttons.forEach((button) => { button.classList.add('hide'); button.classList.remove('klayvio-tracking-cart'); button.textContent = klavioNotifyLabel; button.disabled = true; }); toggleDetailsNotify(true); } else { buttons.forEach((button) => { button.textContent = soldOutLabel; button.disabled = true; }); toggleDetailsNotify(false); } } function fallbackDetailsVariant() { // Return first variant as fallback (inventory check will happen via selectVariantByInventory) return productVariantsDetails[0] || null; } async function selectHiddenDetailsVariant() { if (typeof helper !== 'function') { return { variant: fallbackDetailsVariant(), sellNew: false }; } try { const result = await helper(productVariantsDetails, productOptionNamesDetails, productHandleDetails); if (result?.variant === null) { return { variant: null, sellNew: result.sellNew === true }; } return { variant: result?.variant || fallbackDetailsVariant(), sellNew: result?.sellNew === true, }; } catch (error) { console.error('[FIFO] PDP variant selection failed', error); } } async function checkDetailsStock() { const { variant: selectedVariant, sellNew } = await selectHiddenDetailsVariant(); if (!selectedVariant) { showDetailsSoldOut(sellNew); return; } buttons.forEach((button) => { button.disabled = false; button.classList.add('klayvio-tracking-cart'); button.textContent = `${addToBagLabel} +`; }); toggleDetailsNotify(false); } async function addProductFromDetails() { window.showSizingError(); } return; } if (sizingContainer) { } return; } } const quantityInput = getDetailsQuantityInput(); if (hasHiddenVariantsDetails && window.fifoVariantSelection?.add) { productHandleDetails, quantity, productVariantsDetails, productOptionNamesDetails ); if (result.soldOut) { const { sellNew } = await selectHiddenDetailsVariant(); } } else { if (!selectedVariant) { return; } addCartItem(selectedVariant.id, quantity); } } // Always check stock on page load (for both hidden and non-hidden variants) document.addEventListener('DOMContentLoaded', checkDetailsStock); } else { checkDetailsStock(); } button.goodr-product-grid-item-button.goodr-button.button-bg-pink.hide { display: none; } function isInViewport(element) { const rect = element.getBoundingClientRect(); const html = document.documentElement; return ( rect.top >= 0 && rect.left >= 0 && rect.bottom = 0; } let variant_lastScrollTop = 0; const pdp_container = document.querySelector('[data-mobile-product-details]'); const scroll_top = window.pageYOffset || document.documentElement.scrollTop; const style = window.getComputedStyle(pdp_container).display; const scroll = scroll_top > variant_lastScrollTop; if (style === 'none') { document.querySelector('.goodr-product-details').style.position = 'relative'; } if (element && scroll && style == 'block') { document.querySelector('.goodr-product-details').classList.remove('visible'); } else if (element && !scroll && style == 'block') { document.querySelector('.goodr-product-details').style.position = 'fixed'; } variant_lastScrollTop = scroll_top CIRCLE G Influencers Pay Double $30 ADD TO BAG + COLOR: Light Pink See More ADD TO BAG + 1 YR Warranty 30 Day Free Returns SMALL NO SLIP NO BOUNCE POLARIZED 1 YR Warranty 30 Day Free Returns a.lcly-primary-trigger span { color: #fff; text-shadow: -2.75px 2.75px 0 #0c2340; -webkit-text-stroke-width: 1px; -webkit-text-stroke-color: #0c2340; font-family: 'GibsonHeavy'; font-size: 15px; font-style: normal; font-weight: 700; line-height: normal; border-radius: 100px; border: 2px solid #0c2340; background: var(--Teal, #49c5b1); box-shadow: -4px 4px 0 0 #0c2340; height: auto; text-transform: uppercase; display: flex; padding: 12px 24px; justify-content: center; align-items: center; gap: 10px; width: 50%; margin-left: 24%; transition: box-shadow 0.2s ease; } .lcly-pl-widget-parent { border-radius: 20px; background: #fafafa; padding: 16px; } #lcly-button-0 { margin-bottom: 20px; } #lcly-link-0{ margin: 10px 0; } a.lcly-primary-trigger span:hover { color: white; background-color: #49c5b1; box-shadow: 0 0 0 0 #0c2340; } .lcly-dealer { background-color: #f0f0f0; text-decoration: underline; } .lcly-location-feature-primary { text-decoration: none; } .goodr-product-details { margin-bottom: 28px; max-width: 420px; } .goodr-product-details-header { display: flex; flex-direction: column; gap: 8px; } .goodr-product-details-header .goodr-product-grid-item-frame { gap: 12px; } .goodr-product-details-header img.goodr-product-grid-item-frame-icon { width: auto; height: 24px; margin: 0; } .goodr-product-details-header .frame-name { margin: 0; color: var(--Navy, #0c2340); text-align: center; font-family: 'GibsonBold'; font-size: 32px; font-style: normal; font-weight: 700; line-height: 24px; text-transform: uppercase; } .goodr-product-details-header .product-title { color: #0c2340; font-family: 'europa'; font-size: 17px; font-style: normal; font-weight: 400; line-height: 17px; letter-spacing: 0.34px; text-transform: uppercase; margin: 0; } .goodr-product-details-header .goodr-reviews-inner_stars { margin-top: 0px; } .goodr-product-details-header .goodr-product-rating .body2 { color: #0c2340; font-size: 14px; font-style: normal; line-height: 110%; } .goodr-product-details .goodr-product-grid-item-price_container { margin-bottom: 28px; margin-top: 28px; } .goodr-product-details form.goodr-add-container { margin-top: 0; margin-bottom: 16px; } .goodr-product-details .order-prescription-wrap { margin: 16px 0px; } .goodr-product-pdp .goodr-product-description { margin-top: 28px; } .goodr-product-description .product-details-title { padding-bottom: 14px !important; margin-top: 14px !important; } .goodr-product-details form.goodr-add-container .quantity-custom-selector { display: none; } .goodr-product-details .goodr-add-container .goodr-product-grid-item-button { width: 100%; font-weight: 900; } .goodr-product-details .disclaimer-container { margin-top: 0px; justify-content: center; } .goodr-product-details .disclaimer-container .body2 { letter-spacing: 0.081px; } .goodr-button.button-bg-yellow.order-prescription-button { width: 100%; } .order-prescription-wrap .desktop-text { margin-top: 16px; } .goodr-product-details .goodr-product-grid-item-badge { max-width: fit-content; } .accordion-content { visibility: hidden; } visibility: visible; } .goodr-color-swatch-container { margin-bottom: 28px; } .color-swatch-label { padding-bottom: 10px; color: #0c2340; font-size: 14px; font-style: normal; font-weight: 400; line-height: normal; } .color-swatch-label span.color-value { text-transform: uppercase; } .color-swatch-items { display: flex; flex-wrap: wrap; gap: 5px; } .color-swatch-items .swatch { flex: 0 1 calc(20% - 4px); border-radius: 3px; box-sizing: border-box; transition: all 0.2s ease; } .color-swatch-items .swatch.hidden { display: none; } .color-swatch-item { width: 100%; height: 100%; background: #f6f6f6; border: 3px solid #f6f6f6; border-radius: 3px; display: grid; padding-bottom: calc(81.25% - 6px); &:focus { border-color: #f8a3bc; } } .color-swatch-item.dragging { user-select: none; } a.color-swatch-item { cursor: pointer; } .color-swatch-item.swatch_active { border-color: #f8a3bc; &:hover { border-color: #f8a3bc; } } .swatch-custom-tooltip { position: absolute; background-color: #fff; padding: 8px 14px; border-radius: 4px; font-size: 14px; white-space: nowrap; pointer-events: none; z-index: 1000; font-family: 'GibsonBold'; color: #0c2340; border: 1px solid #0c2340; text-transform: uppercase; text-align: center; font-style: normal; font-weight: 700; line-height: normal; } max-width: 460px; margin-left: auto; } button.toggle-swatch-btn { flex: 0 1 calc(20% - 4px); border-radius: 3px; background: #fff; border: none; cursor: pointer; color: #0c2340; text-align: center; font-family: 'GibsonBold'; font-size: 14px; font-style: normal; font-weight: 700; line-height: normal; text-decoration-line: underline; text-transform: uppercase; padding: 0 11px; transition: all 0.3s ease; } button.toggle-swatch-btn:hover { color: #3a5373; } @media screen and (max-width: 910px) { button.toggle-swatch-btn { font-size: 13px; } .color-swatch-item.dragging { pointer-events: none; } } @media screen and (min-width: 911px) { display: grid; grid-gap: 30px; } section.product__container.product__container--two-columns { padding-right: 25px; padding-left: 25px; } a.color-swatch-item:hover { border-color: #dddddd; } } @media screen and (max-width: 1024px) { margin-top: 0; } } form.goodr-add-container.prescription-rx button.goodr-product-grid-item-button { margin-top: 0px; } } @media screen and (max-width: 900px) { max-width: 100%; } .product--outer { display: block !important; } .product--outer .desktop-product-gallery { display: none; } .product--outer .mobile-product-gallery { display: block; } .product--outer .goodr-product-details { max-width: 100%; display: flex; flex-direction: column; margin-bottom: 24px; } width: 100%; max-width: 100%; height: auto; aspect-ratio: 3 / 3; animation: none; -webkit-animation: none; border-radius: 10px; margin: 0; } .product--outer .goodr-product-details .goodr-color-swatch-container { order: 2; margin-bottom: 24px; } .product--outer .goodr-product-details-header { order: 1; } .product--outer .goodr-product-details .goodr-product-grid-item-price_container { order: 3; } .product--outer .goodr-product-details form.goodr-add-container { order: 4; margin: 0; } .product--outer .goodr-product-details .disclaimer-container { order: 6; } .product--outer .goodr-product-details .order-prescription-wrap { order: 5; } .product-quick-hits { order: 6; } .color-swatch-items .swatch { flex: auto; width: 100%; max-width: 80px; min-width: 80px; } .color-swatch-items { display: flex; flex-wrap: nowrap; overflow-x: auto; width: calc(100% + 30px); margin-left: -15px; padding: 0px 15px; scrollbar-width: none; scroll-behavior: auto; user-select: none; -ms-overflow-style: none; } .color-swatch-items::-webkit-scrollbar { display: none; } width: 100%; } .goodr-product-details .goodr-product-rating { display: block; } .template-product nav.breadcrumbs-container.goodr-breadcrumbs { display: none !important; } .goodr-rating-mobile.goodr-product-rating.rating-active { display: none; } display: none; } .disclaimer-mobile { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; margin: 0px; } .color-swatch-label { padding-bottom: 8px; } .goodr-product-details { padding-top: 20px; } margin-bottom: 24px; } margin-bottom: 24px; } .swatch-custom-tooltip { display: none; } .goodr-product-details-header .goodr-product-grid-item-badge { font-size: 12px; font-weight: 700; } button.toggle-swatch-btn { display: none; } display: flex; opacity: 1; transform: unset; } } @media screen and (max-width: 767px) { .color-swatch-items { width: calc(100% + 58px); margin-left: -29px; padding: 0px 29px; } .disclaimer-mobile { margin: 0px 14px 40px 14px; } .goodr-product-details { padding: 0 14px; padding-top: 20px; } .product__container { margin-top: 23px; } } .color-swatch-items { width: calc(100% + 48px); margin-left: -24px; padding: 0px 24px; } } /*Custom tooltip swatch hover*/ // Center the active swatch in the swatch container on page load using requestAnimationFrame function centerActiveSwatch() { const activeSwatch = document.querySelector('.swatch_active'); const swatchContainer = document.querySelector('.color-swatch-items'); if (activeSwatch && swatchContainer) { const containerRect = swatchContainer.getBoundingClientRect(); const swatchRect = activeSwatch.getBoundingClientRect(); const offset = swatchRect.left - containerRect.left - containerRect.width / 2 + swatchRect.width / 2; swatchContainer.scrollLeft += offset; } } requestAnimationFrame(centerActiveSwatch); // Add event listeners to swatches for tooltip functionality document.querySelectorAll('.color-swatch-item').forEach(function (swatch) { swatch.addEventListener('mouseenter', function (event) { let tooltip = document.createElement('div'); tooltip.className = 'swatch-custom-tooltip'; tooltip.textContent = this.dataset.title; document.body.appendChild(tooltip); let tooltipWidth = tooltip.offsetWidth; let tooltipHeight = tooltip.offsetHeight; tooltip.style.left = event.pageX - tooltipWidth / 2 + 'px'; tooltip.style.top = event.pageY + tooltipHeight - 7 + 'px'; this.tooltipElement = tooltip; }); swatch.addEventListener('mouseleave', function () { if (this.tooltipElement) { this.tooltipElement.remove(); this.tooltipElement = null; } }); swatch.addEventListener('mousemove', function (event) { if (this.tooltipElement) { let tooltipWidth = this.tooltipElement.offsetWidth; let tooltipHeight = this.tooltipElement.offsetHeight; this.tooltipElement.style.left = event.pageX - tooltipWidth / 2 + 'px'; this.tooltipElement.style.top = event.pageY + tooltipHeight - 7 + 'px'; } }); swatch.addEventListener('click', function (e) { e.preventDefault(); if (this.classList.contains('swatch_active')) { return; // If already active, do nothing } // Remove swatch_active class from all swatches before setting the new one document.querySelectorAll('.color-swatch-item').forEach(function (item) { item.classList.remove('swatch_active'); }); // Add swatch_active class to the clicked swatch this.classList.add('swatch_active'); // Redirect to the product page if it's a link const href = this.getAttribute('href'); setTimeout(() => { window.location.href = href; }, 100); }); }); }); // Grey out of of stock swatches on page load // Get all color swatches on the page const colorSwatchList = document.querySelectorAll('.color-swatch-item'); colorSwatchList.forEach((swatch) => { if (!swatch.dataset.availableSizes) { swatch.closest('.swatch').classList.add('swatch--unavailable'); } }); }); /*swatch see more & seeless code*/ const toggleBtn = document.querySelector('.toggle-swatch-btn'); const extraSwatches = document.querySelectorAll('.extra-swatch'); const storedState = localStorage.getItem('swatchesExpanded') === 'true'; if (toggleBtn) { extraSwatches.forEach((el) => { el.classList.toggle('hidden', !storedState); // show if storedState is true }); toggleBtn.setAttribute('data-expanded', storedState.toString()); toggleBtn.textContent = storedState ? 'See Less' : 'See More'; toggleBtn.addEventListener('click', function () { const expanded = toggleBtn.getAttribute('data-expanded') === 'true'; extraSwatches.forEach((el) => { el.classList.toggle('hidden', expanded); // hide if expanded }); const newState = !expanded; toggleBtn.setAttribute('data-expanded', newState.toString()); toggleBtn.textContent = newState ? 'See Less' : 'See More'; localStorage.setItem('swatchesExpanded', newState.toString()); }); } }); /*Save scroll position before navigating*/ document.addEventListener('click', function (event) { let target = event.target.closest('a'); if (target && target.href.includes('/products/')) { sessionStorage.setItem('scrollPosition', window.scrollY); } }); /*Restore scroll position after page load*/ let scrollPosition = sessionStorage.getItem('scrollPosition'); let horizontalSwatchContainer = document.querySelector('.color-swatch-items'); let storedHorizontalScroll = sessionStorage.getItem('horizontalScroll'); if (scrollPosition !== null) { setTimeout(() => { window.scrollTo(0, parseInt(scrollPosition, 10)); sessionStorage.removeItem('scrollPosition'); }, 50); } horizontalSwatchContainer.scrollTo(storedHorizontalScroll, 0); }); DESCRIPTION Round pink sunglasses with mirrored reflective polarized lenses so stylish you’ll actually want to pay double. Whether you’re rollerskating, running, or golfing, these fashionable bubblegum pink sunglasses have you covered with a no slip, no bounce frame & UV400 protection. UV400 100% UVA & UVB protection REFLECTIVE LENSES Mirrored lenses reduce bright light & hide your peepers STANDARD LENSES Scratch-resistant & built to survive your chaos PREMIUM POLYMER Lightweight frames built for all-day comfort & everyday adventures FRAME MEASUREMENTS goodr sunglasses have metal screws that can potentially expose you to nickel. Nickel is known to the State of California to cause cancer. For more information go to www.P65Warnings.ca.gov document.addEventListener('DOMContentLoaded', () => { const accordions = document.querySelectorAll('.accordion'); accordions.forEach((accordion) => { accordion.addEventListener('click', () => { const content = accordion.closest('.accordion-item-box').querySelector('.accordion-item-box__content'); if (content.classList.contains('open')) { content.style.maxHeight = '0px'; content.classList.remove('open'); } else { content.classList.add('open'); content.style.maxHeight = content.scrollHeight + 'px'; } }); }); const frameImg = document.querySelector('.frame-measurement-image'); if (frameImg) { const urlForSize = (size) => { const key = (size || '').toLowerCase(); if (key === 'small' && frameImg.dataset.small) return frameImg.dataset.small; if (key === 'large' && frameImg.dataset.large) return frameImg.dataset.large; return frameImg.dataset.original; }; const updateFrameImage = (size) => { const newSrc = urlForSize(size); if (newSrc && frameImg.src !== newSrc) { frameImg.src = newSrc; } }; const savedSize = sessionStorage.getItem('goodr-selected-size'); if (savedSize) updateFrameImage(savedSize); document.querySelectorAll('.size-btn').forEach((btn) => { btn.addEventListener('click', () => updateFrameImage(btn.dataset.size)); }); } }); HARD CASE Best Case Scenario *Doesn't fit the Amp G, Astro G, Bolt G, Bug G, Fly G, Mood G, Moon G, Snow G, or Sonic G. $10 | ADD TO BAG + .product-accordions__and__upsell { display: flex; align-items: flex-start; gap: 40px; } .product-case-upsell { min-width: 42%; margin-top: 74px; display: flex; padding: 48px 20px; align-items: center; border-radius: 8px; border: 1.5px solid #0c2349; background: #fff; box-shadow: -4px 4px 0 0 #0c2340; text-decoration: none; color: inherit; } .prodcut-case-upsell__type { color: #0c2340; font-family: 'GibsonBold'; font-size: 20px; font-style: normal; font-weight: 700; line-height: 100%; letter-spacing: 0.1px; } .product-case-upsell__image { width: 150px; object-fit: cover; flex-shrink: 0; } .product-case-upsell__content { display: flex; flex-direction: column; gap: 2px; } .product-case-upsell__title { color: #0c2340; font-family: 'europa'; font-size: 16px; font-style: normal; font-weight: 300; line-height: 100%; /* 16px */ letter-spacing: 0.08px; margin: 0; } .product-case-upsell__decsription { margin-top: 10px; color: #0c2340; font-family: 'europa'; font-size: 12px; font-style: normal; font-weight: 300; line-height: 100%; /* 12px */ letter-spacing: 0.06px; } @media (max-width: 899px) { flex-direction: column; gap: 8px; } .product-case-upsell { margin: 14px; padding: 23px 20px; gap: 4px; min-width: 98%; } .product-case-upsell__image { width: 130px; height: 120px; } } @media (max-width: 768px) { .product-case-upsell { min-width: 95%; } } @media (max-width: 375px) { .product-case-upsell__image { width: 80px; height: 72px; } .product-case-upsell { min-width: 92%; } } // SKU of the variant currently on the page (ShopAR catalog is keyed by Shopify SKU). var shopARSku = "G00573-CG-01"; console.log("Current SKU:",shopARSku); // Size variants (Small/Original/Large) and their Shopify SKUs. Drives the in-AR // size switcher. Empty when the product has no "Size" option -> no size buttons. var shopARSizeVariants = []; var wrapper = document.getElementById("shopAR-anchor"); var target = document.getElementById("shopAR"); if (!wrapper || !target) return; // One overlay, two galleries (desktop/mobile) that swap by viewport. Move the // wrapper into whichever gallery is currently visible so it always overlays the // main image the user actually sees. offsetParent === null => display:none ancestor. // // The mobile gallery is a slick carousel. slick treats EVERY direct child present // at init time as a slide (and clones it for infinite mode), so if we attach the // overlay before slick runs it gets swallowed into the carousel and renders as a // bare panel. This inline script runs before goodr.js inits slick, so for the // mobile gallery we wait until .slick-initialized before attaching — then the // wrapper lands as a sibling of .slick-list, never as a slide. var placeRetries = 0; function placeShopAR() { var desktop = document.querySelector(".desktop-product-gallery .goodr-product-gallery"); var mobile = document.getElementById("goodr-product-gallery-mobile"); if (desktop && desktop.offsetParent !== null) { if (wrapper.parentElement !== desktop) desktop.appendChild(wrapper); return; } if (mobile && mobile.offsetParent !== null) { if (!mobile.classList.contains("slick-initialized")) { if (placeRetries++ loading -> AR/error) the overlay goes active // and covers the gallery to capture interaction. function setActive(on) { wrapper.classList.toggle("shopar-active", on); } // Body-level flag for the live-camera state. The desktop thumbnail column is a // sibling of the moved overlay, so a class on is what CSS can reach to // disable thumbnail clicks/hover while the camera is on, then restore them. function setCameraOn(on) { document.body.classList.toggle("shopar-camera-on", on); } var SHOPAR_API_KEY = "69fc373a14c5aa8590ee9fc1"; var SIZE_ORDER = { Small: 0, Original: 1, Large: 2 }; // setup() both initializes AR and (per ShopAR docs) switches the active model // when called again with a new sku, reusing the same targetElement. function setupSku(sku) { return ShopAR.plugin.setup({ apiKey: SHOPAR_API_KEY, sku: sku, targetElement: target, defaultUI: false, }); } // launchAR is only a function when AR is actually available for the sku/device, // so it doubles as the "this sku exists in the ShopAR catalog" signal. function isReady(s) { return !!(s && typeof s.launchAR === "function"); } // Resolve a possibly-hanging probe to null after a timeout so one bad sku can't // stall the whole boot chain. function withTimeout(p, ms) { return new Promise(function (resolve) { var t = setTimeout(function () { resolve(null); }, ms); p.then( function (v) { clearTimeout(t); resolve(v); }, function () { clearTimeout(t); resolve(null); } ); }); } var currentAR = null; // most recent setup() result — drives launch/switch/close var activeSku = shopARSku; var validSizes = []; // [{size, sku}] confirmed present in the ShopAR catalog function showAdjustToast() { show(adjusting); clearTimeout(adjustingTimer); adjustingTimer = setTimeout(function () { hide(adjusting); }, 2500); } function markActive(sku) { if (!sizesBox) return; sizesBox.querySelectorAll(".shopar-size-btn").forEach(function (b) { b.classList.toggle("shopar-size-btn--active", b.dataset.sku === sku); }); } // Tap a size -> swap the live model. Per the ShopAR docs, switching models is done // by calling setup() again with the new sku (same targetElement); the open camera // picks up the new model. Do NOT call launchAR() here — while the camera is live it // re-renders the model currently in the viewer (the previous one) before the newly // set-up model finishes loading, which makes each switch lag by one. function switchSize(c) { if (c.sku === activeSku) return; showAdjustToast(); withTimeout(setupSku(c.sku), 8000).then(function (s) { if (!isReady(s)) { hide(adjusting); return; } currentAR = s; console.log("[ShopAR] showing DeepAR model for size '" + c.size + "', sku:", c.sku); activeSku = c.sku; markActive(activeSku); showAdjustToast(); }); } function buildSizeButtons() { if (!sizesBox || sizesBox.dataset.built) return; validSizes.forEach(function (c) { var b = document.createElement("button"); b.type = "button"; b.className = "shopar-size-btn"; b.dataset.sku = c.sku; b.textContent = c.size; b.addEventListener("click", function () { switchSize(c); }); sizesBox.appendChild(b); }); sizesBox.dataset.built = "1"; } // A single button can't switch anything, so only surface the switcher when at // least two size variants resolved in the ShopAR catalog. function revealSizes() { if (validSizes.length 2 launchBtn.addEventListener("click", function () { hide(launchBtn); show(consent); setActive(true); }); // Stage 2 -> 1 (Go Back, also used by the error screen) backBtns.forEach(function (btn) { btn.addEventListener("click", function () { hide(consent); hide(errorBox); show(launchBtn); setActive(false); }); }); // Stage 2 -> 3. The camera permission prompt only fires inside launchAR(), // so it can never run before the user taps "I Agree". agreeBtn.addEventListener("click", function () { hide(consent); show(loading); currentAR.launchAR() .then(function () { show(closeBtn); setCameraOn(true); // Real-size calibration lags the camera opening by ~3s; reassure meanwhile. showAdjustToast(); // Size buttons only exist once the camera is live (per the requirement). revealSizes(); }) .catch(function () { show(errorBox); }) .finally(function () { hide(loading); }); }); // Stage 3 -> 1 (X closes the camera) closeBtn.addEventListener("click", function () { var done = currentAR && (currentAR.closeAR || currentAR.close); hide(adjusting); hideSizes(); setCameraOn(false); Promise.resolve(done && done.call(currentAR)).finally(function () { hide(closeBtn); show(launchBtn); setActive(false); }); }); } // The plugin script loads later in , so it may not be ready yet — retry on load. (function bootShopAR() { if (!(window.ShopAR && ShopAR.plugin)) { window.addEventListener("load", bootShopAR, { once: true }); return; } setupSku(shopARSku).then(function (shopAR) { // Not in the catalog for this sku/device — AR isn't offered, leave UI hidden. if (!isReady(shopAR)) return; currentAR = shopAR; // The page variant is known-good; seed it so it doesn't get re-probed. var pageSize = null; shopARSizeVariants.forEach(function (c) { if (c.sku === shopARSku) pageSize = c; }); if (pageSize) validSizes.push(pageSize); // Probe the OTHER size variants one at a time to see which resolve in the // catalog. Each probe swaps the active model (setup == switch), so we restore // the page sku once probing finishes. var toProbe = shopARSizeVariants.filter(function (c) { return c.sku && c.sku !== shopARSku; }); (function probe(i) { if (i >= toProbe.length) { validSizes.sort(function (a, b) { return (SIZE_ORDER[a.size] || 0) - (SIZE_ORDER[b.size] || 0); }); // Restore the page variant as the active model before launch, then wire UI. withTimeout(setupSku(shopARSku), 8000).then(function (s) { if (isReady(s)) currentAR = s; }).then(wireUI); return; } var c = toProbe[i]; if (isReady(s)) validSizes.push(c); }).then(function () { probe(i + 1); }); })(0); }).catch(function (err) { console.error("ShopAR setup failed", err); }); })(); }) /* Positioning context — the gallery that's currently visible holds the overlay. */ #goodr-product-gallery-mobile { position: relative; } /* ===== ShopAR overlay ====================================================== #shopAR-anchor is moved by JS into the visible gallery and sized to overlay the MAIN gallery image exactly (so consent + camera live inside its borders). */ /* Desktop: main image is right-aligned (row-reverse), 86% wide, max 640px, 1:1. */ .desktop-product-gallery .goodr-product-gallery #shopAR-anchor { position: absolute; right: 0; top: 50%; transform: translateY(-50%); width: 86%; max-width: 640px; aspect-ratio: 1 / 1; border-radius: 13.536px; /* matches .goodr-product-gallery-main */ } /* Mobile (slick): slides are full-width, 1:1. Overlay the visible slide. */ #goodr-product-gallery-mobile #shopAR-anchor { position: absolute; top: 0; left: 0; width: 100%; aspect-ratio: 1 / 1; border-radius: 10px; /* matches mobile gallery image */ } #shopAR-anchor { z-index: 6; overflow: hidden; /* Idle: don't intercept touch — let swipe/scroll reach the slick gallery beneath. Only the launch pill opts back in (below). When the flow is active (.shopar-active, set by JS once TRY-ON is tapped) the whole overlay captures interaction again. */ pointer-events: none; } #shopAR-anchor.shopar-active { pointer-events: auto; } /* The launch pill stays tappable even while the overlay is idle. */ .shopar-launch { pointer-events: auto; } #shopAR-anchor [hidden] { display: none !important; } /* Plugin renders its viewer (#shopar-main canvas) into this target; it must stay position:relative (plugin rejects absolute) and fill the wrapper so the camera fills the gallery borders. */ #shopAR { position: relative; width: 100%; height: 100%; /* Plugin-internal AR asset loader + in-AR "position your face" prompt (still apply under defaultUI:false). */ --shopar-ar-loading-container-bg: #ffffff; --shopar-ar-loading-bar-fg: linear-gradient(90deg, #f8a3bc, #49c5af); --shopar-ar-loading-bar-bg: #e5e7eb; --shopar-ar-prompt-bg: #eeea1b; --shopar-ar-prompt-text-color: #0c2340; } /* Stage 1: launch pill — bottom-right of the gallery image. */ .shopar-launch { position: absolute; right: 16px; bottom: 19px; z-index: 3; display: inline-flex; align-items: center; gap: 8px; padding: 10px 16px; background: #fff; border: 2px solid #0c2340; border-radius: 8px; cursor: pointer; color: #0c2340; font-family: 'GibsonBold', 'Gibson', sans-serif; font-size: 13px; font-weight: 700; line-height: 100%; letter-spacing: 0.065px; text-transform: uppercase; -webkit-appearance: none; appearance: none; } .shopar-launch__icon { width: 23px; height: 17px; } /* Smaller launch pill (icon + label) on narrow viewports. */ .shopar-launch { gap: 6px; padding: 7px 12px; font-size: 11px; } .shopar-launch__icon { width: 22px!important; height: 13px!important; } } /* Stage 2: consent — full-cover yellow overlay. */ .shopar-consent, .shopar-error { position: absolute; inset: 0; z-index: 4; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1.75rem; padding: 8%; background: #eeea1b; color: #0c2340; text-align: center; } .shopar-consent__copy p { color: #0c2340; font-size: 16px; font-weight: 700; line-height: normal; text-transform: uppercase; } .shopar-consent__copy p:last-child { margin-bottom: 0; } .shopar-consent__copy a { color: inherit; text-decoration: underline; } .shopar-consent__actions { display: flex; gap: 1rem; flex-wrap: wrap; justify-content: center; } .shopar-btn-back, .shopar-btn-agree { padding: 14px 32px; border: none; border-radius: calc(infinity * 1px); color: #0c2340; font-size: 14px; font-weight: 700; text-transform: uppercase; cursor: pointer; } .shopar-btn-back { background: #f8a3bc; } /* goodr pink */ .shopar-btn-agree { background: #49c5af; } /* goodr teal */ /* Tighten the pre-camera consent prompt on very small screens so the copy and buttons fit without overflowing the gallery square. */ @media screen and (max-width: 400px) { .shopar-consent { gap: 18px; } .shopar-consent__copy p { font-size: 13px; } .shopar-consent__actions { gap: 0.625rem; } .shopar-btn-back, .shopar-btn-agree { padding: 11px 24px; font-size: 12px; } } /* Loading bridge between "I Agree" and the camera being ready. */ .shopar-loading { position: absolute; inset: 0; z-index: 4; display: flex; align-items: center; justify-content: center; background: #fff; } .shopar-loading__bar { width: 80%; height: 1.5rem; background: #e5e7eb; overflow: hidden; } .shopar-loading__bar span { display: block; height: 100%; width: 40%; border-radius: inherit; background: linear-gradient(90deg, #f8a3bc, #49c5af); animation: shopar-indeterminate 1.1s ease-in-out infinite; } @keyframes shopar-indeterminate { 0% { margin-left: -40%; } 100% { margin-left: 100%; } } /* Stage 3: close (X) — shown while the camera is live. */ .shopar-close { position: absolute; top: 12px; right: 12px; z-index: 5; display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; padding: 0; border: none; background-color: transparent; cursor: pointer; } .shopar-close__icon { display: block; width: 26px; height: 26px; } /* Real-size calibration toast — over the live camera, bottom-center, non-blocking. */ .shopar-adjusting { position: absolute; left: 50%; bottom: 19px; transform: translateX(-50%); z-index: 5; display: inline-flex; align-items: center; gap: 8px; max-width: calc(100% - 32px); padding: 10px 16px; background: rgba(12, 35, 64, 0.85); /* goodr navy, translucent */ color: #fff; font-size: 13px; font-weight: 700; line-height: 100%; letter-spacing: 0.065px; text-transform: uppercase; text-align: center; white-space: nowrap; pointer-events: none; /* never block the camera view */ } .shopar-adjusting__dot { flex: none; width: 8px; height: 8px; border-radius: 50%; background: #49c5af; /* goodr teal */ animation: shopar-pulse 1s ease-in-out infinite; } @keyframes shopar-pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.4; transform: scale(0.6); } } /* Stage 3: size switcher — bottom-center over the live camera. Raises the adjusting toast above itself while present so the two don't overlap. */ .shopar-sizes { position: absolute; left: 50%; bottom: 19px; transform: translateX(-50%); z-index: 5; display: flex; gap: 8px; } .shopar-tryon-wrapper.shopar-has-sizes .shopar-adjusting { bottom: 64px; } .shopar-size-btn { padding: 9px 16px; border: 2px solid #fff; color: #fff; font-size: 13px; font-weight: 700; line-height: 100%; letter-spacing: 0.065px; text-transform: uppercase; cursor: pointer; -webkit-appearance: none; appearance: none; } .shopar-size-btn--active { border-color: #49c5af; color: #0c2340; } .shopar-size-btn { padding: 7px 12px; font-size: 11px; } } /* While the camera is live (desktop), freeze the thumbnail column: no clicks, no pointer cursor. Removing .shopar-camera-on restores the defaults from the gallery snippet. */ body.shopar-camera-on .desktop-product-gallery .goodr-product-gallery .goodr-product-gallery-thumbnail button.goodr-product-media-item { pointer-events: none; cursor: default; opacity: 0.5; } { "blocks": [".goodr-reviews-headline", ".goodr-reviews-call_to_actions", ".goodr-reviews-cards_container"], "elements": [] } function openForm() { const modal = document.getElementById('goodr-reviews-new-review') modal.style.display = 'flex' document.body.style.overflow = 'hidden' }; function closeForm() { modal.style.display = 'none' document.body.style.overflow = 'scroll' }; × const url = 'https://api.yotpo.com/v1/widget/reviews' const productInfo = { 'product_url': "/products/influencers-pay-double", 'product_title': "Influencers Pay Double", 'sku': "4412795682874", 'appkey': "LwcXk2p1JfdcclS8iwE7VIgcJVxtTMxYocfhYckI" } const postScore = (data) => { const options = { method: 'POST', headers: {accept: 'application/json', 'Content-Type': 'application/json'}, body: JSON.stringify(data) }; fetch(url, options) .then(response => response.json()) .then((result) => { if(result.code == 200) { showMessage('success', 'Thanks!') } else { showMessage('error', 'Something went wrong! Try again later.') } }) .catch(error => showMessage('error', 'Something went wrong! Try again later.')); } function showMessage(type, text) { var message = document.getElementById('message') message.classList.remove('visible') message.classList.remove('goodr-background-success') message.classList.remove('goodr-background-error') message.classList.add('hidden') if(type == 'success') { message.addEventListener('transitionend', cleanForm) message.innerHTML=` ${text} ` message.classList.add('goodr-background-success') } else { message.innerHTML=` ${text} ` message.classList.add('goodr-background-error') } message.classList.remove('hidden') message.classList.add('visible') return false }; function hoverScore(element) { element.setAttribute('src', '//goodr.com/cdn/shop/t/229/assets/star-pink.svg?v=96021292921839442721785536623'); var previousElementSibling = element.previousElementSibling; while(previousElementSibling) { previousElementSibling.setAttribute('src', '//goodr.com/cdn/shop/t/229/assets/star-pink.svg?v=96021292921839442721785536623') previousElementSibling = previousElementSibling.previousElementSibling } }; function unhoverScore(element) { element.setAttribute('src', '//goodr.com/cdn/shop/t/229/assets/star-pink-empty.svg?v=414625444810559221785536627'); previousElementSibling.setAttribute('src', '//goodr.com/cdn/shop/t/229/assets/star-pink-empty.svg?v=414625444810559221785536627') } }; function selectScore(rate, element) { document.getElementById('score').setAttribute('value', rate); document.querySelectorAll('.score').forEach(function (element) { element.removeAttribute("onmouseover") element.removeAttribute("onmouseout") }) var nextElementSibling = element.nextElementSibling; while(nextElementSibling) { nextElementSibling.setAttribute('src', '//goodr.com/cdn/shop/t/229/assets/star-pink-empty.svg?v=414625444810559221785536627') nextElementSibling = nextElementSibling.nextElementSibling } hoverScore(element) }; function sendScore() { var name = document.getElementById('name').value var email = document.getElementById('email').value var title = document.getElementById('title').value var review = document.getElementById('review').value var score = document.getElementById('score').value if (name != '' && email != '' && title != '' && review != '' && score != '') { const regEx = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; if(regEx.test(email)) { var reviewInfo = { ...productInfo, 'review_score': score, 'review_title': title, 'review_content': review, 'email': email, 'display_name': name, } postScore(reviewInfo) } else { showMessage('error', 'Invalid email address format.') return false } } else { showMessage('error', 'All fields are required.') return false } }; function cleanForm() { message.removeEventListener('transitionend', cleanForm) document.getElementById('name').value = '' document.getElementById('email').value = '' document.getElementById('title').value = '' document.getElementById('review').value = '' document.getElementById('score').value = '' }) modal.style.display = 'none' } .goodr-reviews-form { background: #ffffff; } .goodr-background-success { background: #046236; } .goodr-background-error { background: #b30000; } Write a review Cancel Post Reviews Write a review let currentPage = 1 let loading = false // Static, trusted asset URL captured once for rebuilt DOM const certifiedIconSrc = "//goodr.com/cdn/shop/t/229/assets/certified.svg?v=40176318764232235871785536623" // Helper: create an element with class + safe text (textContent never parses HTML) const el = (tag, className, text) => { const node = document.createElement(tag) if (className) node.className = className if (text != null) node.textContent = text return node } const starsTemplate = (score, isBig) => { const div = document.createElement('div') div.className = 'goodr-reviews-inner_stars' div.innerHTML = ` `.trim() if (isBig) { const stars = div.querySelectorAll('img') for (let starsIterator = 0; starsIterator { const figure = document.createElement('figure') // --- author / figcaption --- const figcaption = el('figcaption', 'goodr-reviews-author') figcaption.append(el('cite', 'title5 goodr-reviews-cite', user?.display_name ?? '')) if (verified_buyer) { const verified = el('span', 'body4 goodr-reviews-verified') const icon = el('img') icon.width = 12 icon.height = 12 icon.loading = 'lazy' icon.src = certifiedIconSrc verified.append(icon, el('span', null, 'Verified Buyer')) figcaption.append(verified) } figcaption.append( el('div', 'body3 goodr-reviews-published_date', dayjs(created_at).format('MM/DD/YYYY')) ) const headerWrap = document.createElement('div') headerWrap.append(figcaption) // --- review body / blockquote --- const blockquote = el('blockquote', 'goodr-reviews-card_review') blockquote.append(el('div', 'js-goodr-stars')) const imagesWrap = el('div', 'goodr-reviews-review_images') ;(images_data || []).forEach(image => { const img = el('img') img.src = image.thumb_url img.width = 80 img.alt = `Yotpo Review Image ID: ${image.id}` imagesWrap.append(img) }) blockquote.append(imagesWrap) blockquote.append(el('h3', 'title4', title)) blockquote.append(el('p', 'goodr-reviews-review_body body3', content)) figure.append(headerWrap, blockquote, el('div', 'goodr-reviews-bottom_block')) figure.querySelector('.js-goodr-stars').append(starsTemplate(score)) return figure } const fetchReviews = page => { const productId = '4412795682874' const appKey = 'LwcXk2p1JfdcclS8iwE7VIgcJVxtTMxYocfhYckI' // Real code const url = `https://api-cdn.yotpo.com/v1/widget/${appKey}/products/${productId}/reviews.json?per_page=3&page=${page}` const options = { method: 'GET', } if (!loading) { fetch(url, options) .then(res => res.json()) .then(({ response }) => { document.getElementById('template--16603631681594__product_reviews-reviews_container').innerHTML = '' response?.reviews?.map(review => { document.getElementById('template--16603631681594__product_reviews-reviews_container').append(reviewTemplate(review)) }) if(response?.pagination?.total > 0 ){ document.getElementById('template--16603631681594__product_reviews-reviews_count').innerText = `${ (response?.pagination?.page - 1) * response?.pagination?.per_page + 1 } - ${response?.pagination?.total 1) { document.getElementById('template--16603631681594__product_reviews-arrow_left').style.display = 'inline' document.getElementById('template--16603631681594__product_reviews-reviews_pagination').style.marginLeft = '0' } else { document.getElementById('template--16603631681594__product_reviews-arrow_left').style.display = '' document.getElementById('template--16603631681594__product_reviews-reviews_pagination').style.marginLeft = '50px' } if (response?.pagination?.page console.error('error:' + err)) } } fetchReviews(currentPage) document.getElementById('template--16603631681594__product_reviews-button_left').addEventListener('click', () => { fetchReviews(currentPage - 1) }) document.getElementById('template--16603631681594__product_reviews-button_right').addEventListener('click', () => { fetchReviews(currentPage + 1) }) // Get the button and update its aria-label set_button_aria_label(currentPage); function set_button_aria_label(currentPage){ currentPage = parseInt(currentPage, 10); if (isNaN(currentPage)) return; var nextPage = currentPage + 1; var prevPage = currentPage - 1; var nextButton = document.getElementById('template--16603631681594__product_reviews-button_right'); if (nextButton) { nextButton.setAttribute('aria-label', 'go to page ' + nextPage); } var prevButton = document.getElementById('template--16603631681594__product_reviews-button_left'); if (prevButton) { prevButton.setAttribute('aria-label', 'go to page ' + prevPage); } } #shopify-section-template--16603631681594__newsletter_image.goodr-newsletter-image-padding , #shopify-section-template--16603631681594__newsletter_image .goodr-newsletter-image-padding { padding-top:148px !important; padding-bottom: 96px !important; } padding-top:180px !important; padding-bottom: 128px !important; } } { "blocks": [".goodr-newsletter-image_container", ".container"], "elements": [] } #shopify-section-template--16603631681594__newsletter_image { margin-top: -52px; } .template--16603631681594__newsletter_image-goodr_newsletter { -webkit-mask-image: url("data:image/svg+xml;utf8, "); mask-image: url("data:image/svg+xml;utf8, "); -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-position: top left; mask-position: top left; } background: #49c5b1; overflow-x: hidden; } .goodr-newsletter-bubble { background-image: url('//goodr.com/cdn/shop/t/229/assets/bubble-mask.svg?v=134361369307301898971785536625'); background-repeat: no-repeat; } input.goodr-newsletter-email_input::placeholder { color: #6B6B6B !important; } input.goodr-newsletter-email_input::-webkit-input-placeholder { color: #6B6B6B !important; } input.goodr-newsletter-email_input::-moz-placeholder { color: #6B6B6B !important; } input.goodr-newsletter-email_input:-ms-input-placeholder { color: #6B6B6B !important; } Yes please! stay up to date On our latest shades and exclusive deals Join the Crew!

Reading only — this is not the application. View the full original page ↗ · Source captured 2026-08-22

More in this category

Always openSourced · Affiliate Program
Response not guaranteed

Salomon

Join Our Affiliate Program

Suits creators with websites or platforms who want to earn commissions on Salomon outdoor gear sales with minimal ongoing effort.

CommissionLow effort
sports

Story on Instagram

Any sizeOpen indefinitely
Last confirmed today
Always openSourced · Affiliate Program
Response not guaranteed

Titan

Affiliate Program

Suits online publishers, bloggers, social media marketers, and influencers of any size who want to earn recurring commission by linking to fitness equipment.

CommissionLow effort
sports

Dedicated Video + Shorts on Instagram, TikTok

Any sizeOpen indefinitely
Last confirmed today
Always openSourced · Affiliate Program⚑ check terms
Response not guaranteed

Beyondyoga

Affiliate Page - Beyond Yoga

Suits fitness and wellness creators of any size who want to earn commission on activewear sales with minimal ongoing effort.

CommissionLow effort
sports

Shorts

Any sizeOpen indefinitely
Last confirmed today