PageSourceSearch

https://carnivoresnax.com/cdn/shop/t/347/assets/theme.js?v=148633547659944927461789066514

js carnivoresnax.com collected 2026-09-29 10:50:08 UTC 21,640 bytes, 1 lines download raw bytes

1"use strict";function updateViewportDimensions(){var e=window,t=document,r=t.documentElement,o=t.getElementsByTagName("body")[0];return{width:e.innerWidth||r.clientWidth||o.clientWidth,height:e.innerHeight||r.clientHeight||o.clientHeight}}var viewport=updateViewportDimensions(),waitForFinalEvent=function(){var e={};return function(t,r,o){o||(o="Don't call this twice without a uniqueId"),e[o]&&clearTimeout(e[o]),e[o]=setTimeout(t,r)}}(),timeToWaitForLast=100;$(function(){$(".qtyplus").click(function(e){e.preventDefault();var t=$(this).attr("field"),r=parseInt($("input[id="+t+"]").val());isNaN(r)?$("input[id="+t+"]").val(0):$("input[id="+t+"]").val(r+1)}),$(".qtyminus").click(function(e){e.preventDefault();var t=$(this).attr("field"),r=parseInt($("input[id="+t+"]").val());!isNaN(r)&&r>1?$("input[id="+t+"]").val(r-1):$("input[id="+t+"]").val(1)})}),document.addEventListener("DOMContentLoaded",()=>{let e=document.documentElement;function t(){e.style.setProperty("--real-vh",window.innerHeight/100+"px")}t();["scroll","resize","fullscreenchange","fullscreenerror","touchcancel","touchend","touchmove","touchstart","mozbrowserscroll","mozbrowserscrollareachanged","mozbrowserscrollviewchange","mozbrowserresize","MozScrolledAreaChanged","mozbrowserresize","orientationchange"].forEach(function(e){window.addEventListener(e,e=>t())});let r=document.querySelectorAll(".inview-element");let o=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&(e.target.classList.add("inview"),setTimeout(()=>{e.target.style.transitionDelay="0s"},400))})},{threshold:.25});function s(e){return e.offsetWidth>0||e.offsetHeight>0||e.getClientRects().length>0}r.forEach(e=>{let t=e.getAttribute("data-delay");e.style.transitionDelay=t+"ms",o.observe(e)});let i=document.querySelector(".rtnu-header__desktop"),c=i.offsetTop,a=document.querySelector(".rtnu-header__mobile"),n=a.offsetTop,d=document.querySelector(".rtnu-top-bar");if(document.body.classList.contains("rtnu-sticky-header")){if(s(i)){function S(){window.scrollY>c?(document.body.classList.add("fixed-nav"),document.body.style.paddingTop=i.offsetHeight+"px"):(document.body.style.paddingTop=0,document.body.classList.remove("fixed-nav"))}window.addEventListener("scroll",S)}if(s(a)){function M(){window.scrollY>n?(document.body.classList.add("fixed-nav"),document.body.style.paddingTop=a.offsetHeight+"px"):(document.body.style.paddingTop=0,document.body.classList.remove("fixed-nav"))}window.addEventListener("scroll",M)}}const l=document.querySelector(".rtnu-header__menu-trigger"),m=gsap.timeline({paused:!0,onStart:()=>l.classList.add("active"),onComplete:()=>l.classList.add("active")}),h=document.querySelector(".rtnu-header__mobile-nav"),u=(h.querySelectorAll("li"),h.querySelectorAll(".rtnu-header__mobile-nav--has-nav")),p=h.querySelector(".rtnu-header__mobile-nav > ul"),b=h.querySelector(".rtnu-header__mobile-nav-expanded"),g=h.querySelectorAll(".rtnu-header__mobile-nav-links"),y=h.querySelectorAll(".rtnu-header__mobile-nav-back");h.querySelector(".rtnu-header__mobile-nav-secondary");let v=a.offsetHeight,C=d?d.offsetHeight:0;document.documentElement.style.setProperty("--mobileHeightpx",v+"px"),d?document.documentElement.style.setProperty("--mobileHeight",v+C+"px"):document.documentElement.style.setProperty("--mobileHeight",v+"px"),gsap.set(h,{height:0,opacity:0,pointerEvents:"none"}),m.to(h,{duration:.6,height:"calc(100dvh - var(--mobileHeight))",opacity:1,ease:"power3.out",pointerEvents:"auto"}),l.addEventListener("click",function(e){m.play(),l.classList.toggle("active"),document.body.classList.toggle("mobile-menu-open"),l.classList.contains("active")||m.timeScale(3).reverse()}),u.forEach(e=>{let t=e.getAttribute("data-menu-id");e.addEventListener("click",function(e){e.preventDefault(),p.style.opacity=0,b.classList.add("active"),g.forEach(e=>{e.style.display="none",e.getAttribute("data-nav-id")===t&&(e.style.display="flex")})}),y.forEach(e=>{e.addEventListener("click",function(e){e.preventDefault(),p.style.opacity=1,b.classList.remove("active")})})})});class MembershipCartHandler{constructor(){this.membershipVariantId="44168397324528",this.membershipSellingPlan="3226730736",this.localStorageKeys={tempMemberState:"cs_temp_member_status",cartId:"cs_cart_id"},this.cartEndpoints=["/cart/add","/cart/update","/cart/change","/cart/clear","/cart/add.js","/cart/update.js","/cart/change.js","/cart/clear.js"],this.init()}init(){console.log("🔧 Initializing Membership Cart Handler..."),this.patchXMLHttpRequest(),this.patchFetch(),this.validateCartState(),console.log("✅ Membership Cart Handler initialized")}patchXMLHttpRequest(){if(!window.XMLHttpRequest)return;const e=window.XMLHttpRequest.prototype.open,t=this;window.XMLHttpRequest.prototype.open=function(){const r=arguments[1];return this.addEventListener("load",function(){if(t.isShopifyCartURL(r)&&this.status>=200&&this.status<300)try{const e=JSON.parse(this.response);t.handleCartEvent(r,e)}catch(e){console.warn("Failed to parse cart response:",e)}}),this.addEventListener("error",function(){console.warn("Cart request failed:",r)}),e.apply(this,arguments)}}patchFetch(){if(!window.fetch||"function"!=typeof window.fetch)return;const e=window.fetch,t=this;window.fetch=function(){const r=e.apply(this,arguments),o=arguments[0];return t.isShopifyCartURL(o)&&r.then(e=>{e.ok&&e.clone().json().then(r=>{t.handleCartEvent(e.url,r)}).catch(e=>{console.warn("Failed to parse fetch cart response:",e)})}).catch(e=>{console.warn("Cart fetch request failed:",e)}),r}}isShopifyCartURL(e){if(!e)return!1;const t=e.split("?")[0],r=t.includes("/cart/")?t:new URL(e,window.location.origin).pathname;return this.cartEndpoints.some(e=>r.includes(e))}async handleCartEvent(e,t){console.log("🛒 Cart event detected:",e);const r=this.getEventType(e);if("add"===r){console.log("🔍 Add operation detected - fetching full cart state...");try{const e=await fetch("/cart.js"),t=await e.json();this.updateMembershipState(t),this.dispatchCartEvent(r,t)}catch(e){console.error("Failed to fetch full cart state:",e),this.updateMembershipState(t),this.dispatchCartEvent(r,t)}}else this.updateMembershipState(t),this.dispatchCartEvent(r,t);this.updateUIState()}getEventType(e){return e.includes("/add")?"add":e.includes("/update")?"update":e.includes("/change")?"change":e.includes("/clear")?"clear":"mutate"}updateMembershipState(e){const t=this.cartContainsMembership(e),r=this.getTempMemberState();t&&!r?(console.log("🎯 Membership added to cart - enabling temporary member state"),this.setTempMemberState(!0),this.storeCartId(e.token||e.id)):!t&&r&&(console.log("❌ Membership removed from cart - disabling temporary member state"),this.setTempMemberState(!1),this.clearCartId(),this.autoRemoveMemberProducts(e))}cartContainsMembership(e){return!(!e||!e.items)&&e.items.some(e=>e.variant_id.toString()===this.membershipVariantId||e.id.toString()===this.membershipVariantId)}async autoRemoveMemberProducts(e){if(!e||!e.items)return;const t=e.items.filter(e=>this.isMemberOnlyProduct(e));if(t.length>0){console.log("🔄 Auto-removing member-only products:",t.length),console.log("Products to remove:",t.map(e=>({title:e.product_title,id:e.variant_id,key:e.key})));let e=0;for(const r of t)try{const t=await fetch("/cart/change.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:r.key||r.variant_id.toString(),quantity:0})});t.ok?(e++,console.log(`✅ Removed: ${r.product_title}`)):console.error(`❌ Failed to remove: ${r.product_title}`,t.status)}catch(e){console.error(`❌ Error removing member product: ${r.product_title}`,e)}if(e>0){try{window.Boost?.Cart?.refresh&&(console.log("🔄 Refreshing Boost Cart after auto-removal"),window.Boost.Cart.refresh())}catch(e){console.error("❌ Failed to refresh Boost Cart:",e)}document.dispatchEvent(new CustomEvent("cs:member:products:auto-removed",{detail:{removedCount:e,originalCount:t.length}}))}console.log(`✅ Auto-removal complete: ${e}/${t.length} products removed`)}}isMemberOnlyProduct(e){return e.variant_id.toString()!==this.membershipVariantId&&"Hunt Membership"===e.product_type}async validateCartState(){try{console.log("🔍 Validating cart state...");const e=await fetch("/cart.js"),t=await e.json(),r=this.cartContainsMembership(t),o=this.getTempMemberState(),s=this.getStoredCartId(),i=t.token||t.id;if(s&&s!==i)return console.log("🔄 Cart ID mismatch - clearing stored state"),void this.clearAllState();await this.validateCartContents(t,r),r&&!o?(console.log("🔧 Found membership in cart - enabling temp state"),this.setTempMemberState(!0),this.storeCartId(i)):!r&&o&&(console.log("🔧 No membership in cart - clearing temp state"),this.setTempMemberState(!1),this.clearCartId()),this.updateUIState(),console.log("✅ Cart state validation complete")}catch(e){console.error("❌ Failed to validate cart state:",e)}}async validateCartContents(e,t){if(!e||!e.items)return;e.items.filter(e=>this.isMemberOnlyProduct(e)).length>0&&!t&&(console.log("⚠️ Invalid cart state detected: member products without membership"),await this.autoRemoveMemberProducts(e))}async validateBeforeAdd(e,t=null){try{if(e===this.membershipVariantId)return!0;
1if(t?this.isMemberOnlyProduct(t):await this.checkIfMemberProduct(e)){const e=await this.isMembershipInCart(),t=document.body.classList.contains("inveterate-subscriber")||this.getTempMemberState();if(!e&&!t)return console.log("❌ Blocking member product addition - no membership"),!1}return!0}catch(e){return console.error("❌ Error validating product add:",e),!0}}async checkIfMemberProduct(e){try{return!1}catch(e){return console.error("❌ Error checking member product status:",e),!1}}dispatchCartEvent(e,t){const r=this.cartContainsMembership(t);r?document.dispatchEvent(new CustomEvent("cs:membership:added",{detail:{cartData:t,eventType:e}})):this.getTempMemberState()&&document.dispatchEvent(new CustomEvent("cs:membership:removed",{detail:{cartData:t,eventType:e}})),document.dispatchEvent(new CustomEvent("cs:membership:statechange",{detail:{hasMembership:r,isTempMember:this.getTempMemberState(),cartData:t,eventType:e}}))}updateUIState(){const e=this.getTempMemberState();e?(document.body.classList.add("cs-temp-member"),document.body.classList.remove("cs-non-member")):(document.body.classList.remove("cs-temp-member"),document.body.classList.add("cs-non-member")),console.log(`🎨 UI state updated - temp member: ${e}`)}getTempMemberState(){try{return"true"===localStorage.getItem(this.localStorageKeys.tempMemberState)}catch(e){return!1}}setTempMemberState(e){try{e?localStorage.setItem(this.localStorageKeys.tempMemberState,"true"):localStorage.removeItem(this.localStorageKeys.tempMemberState),console.log(`💾 Temp member state set to: ${e}`)}catch(e){console.error("Failed to set temp member state:",e)}}storeCartId(e){try{e&&localStorage.setItem(this.localStorageKeys.cartId,e)}catch(e){console.error("Failed to store cart ID:",e)}}getStoredCartId(){try{return localStorage.getItem(this.localStorageKeys.cartId)}catch(e){return null}}clearCartId(){try{localStorage.removeItem(this.localStorageKeys.cartId)}catch(e){console.error("Failed to clear cart ID:",e)}}clearAllState(){try{Object.values(this.localStorageKeys).forEach(e=>{localStorage.removeItem(e)}),console.log("🗑️ All membership state cleared")}catch(e){console.error("Failed to clear all state:",e)}}async isMembershipInCart(){try{const e=await fetch("/cart.js"),t=await e.json();return this.cartContainsMembership(t)}catch(e){return console.error("Failed to check cart for membership:",e),!1}}isTempMember(){return this.getTempMemberState()}getMembershipVariantId(){return this.membershipVariantId}clearMembershipState(){this.clearAllState(),this.updateUIState()}debug(){return{isTempMember:this.getTempMemberState(),storedCartId:this.getStoredCartId(),membershipVariantId:this.membershipVariantId,cartEndpoints:this.cartEndpoints}}}class MembershipUIController{constructor(){this.memberProductSelectors=[".cs-member-product",'[data-member-product="true"]','.rtnu-collection-product__card[data-member-product="true"]'],this.membershipProductSelectors=[".cs-membership-product",'[data-membership-product="true"]'],this.init()}init(){console.log("🎨 Initializing Membership UI Controller..."),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>this.setup()):this.setup()}setup(){this.bindCartEvents(),this.syncWithCartState(),console.log("✅ Membership UI Controller initialized")}bindCartEvents(){document.addEventListener("cs:membership:statechange",e=>{this.handleMembershipStateChange(e.detail)}),document.addEventListener("cs:membership:added",e=>{this.handleMembershipAdded(e.detail)}),document.addEventListener("cs:membership:removed",e=>{this.handleMembershipRemoved(e.detail)})}handleMembershipStateChange(e){const{hasMembership:t,isTempMember:r}=e,o=window.CSSettings?.promotionalPeriod||!1,s=this.isCustomerExistingMember();console.log("🔄 UI: Membership state changed",{hasMembership:t,isTempMember:r,isPromotionalPeriod:o,isExistingMember:s}),t||r||o||s?this.unlockMemberProducts():this.lockMemberProducts()}isCustomerExistingMember(){return!!document.body.classList.contains("inveterate-subscriber")||!!document.querySelector('[data-customer-member="true"]')}handleMembershipAdded(e){console.log("🎯 UI: Membership added to cart"),this.unlockMemberProducts(),this.showMembershipAddedFeedback()}handleMembershipRemoved(e){console.log("❌ UI: Membership removed from cart"),this.lockMemberProducts(),this.showMembershipRemovedFeedback()}unlockMemberProducts(){const e=this.getAllMemberProducts();
1e.forEach(e=>{this.unlockSingleMemberProduct(e)}),console.log(`🔓 Unlocked ${e.length} member products`)}lockMemberProducts(){const e=this.getAllMemberProducts();e.forEach(e=>{this.lockSingleMemberProduct(e)}),console.log(`🔒 Locked ${e.length} member products`)}unlockSingleMemberProduct(e){e.classList.remove("cs-member-locked","cs-member-product-locked"),e.classList.add("cs-member-unlocked","cs-member-product-unlocked");const t=e.querySelector(".cs-member-unlocked");t&&(t.style.display="",t.classList.remove("cs-hidden"));const r=e.querySelector(".cs-member-locked");r&&(r.style.display="none",r.classList.add("cs-hidden"));e.querySelectorAll('.cs-member-atc-btn, [data-member-atc="true"]').forEach(e=>{e.disabled=!1,e.classList.remove("cs-member-product-locked"),e.classList.add("cs-member-product-unlocked")})}lockSingleMemberProduct(e){e.classList.remove("cs-member-unlocked","cs-member-product-unlocked"),e.classList.add("cs-member-locked","cs-member-product-locked");const t=e.querySelector(".cs-member-unlocked");t&&(t.style.display="none",t.classList.add("cs-hidden"));const r=e.querySelector(".cs-member-locked");r&&(r.style.display="",r.classList.remove("cs-hidden"));e.querySelectorAll('.cs-member-atc-btn, [data-member-atc="true"]').forEach(e=>{e.disabled=!0,e.classList.remove("cs-member-product-unlocked"),e.classList.add("cs-member-product-locked")})}getAllMemberProducts(){const e=[];return this.memberProductSelectors.forEach(t=>{document.querySelectorAll(t).forEach(t=>{e.includes(t)||e.push(t)})}),e}async syncWithCartState(){const e=this.isCustomerExistingMember(),t=window.CSSettings?.promotionalPeriod||!1;if(e||t)return this.unlockMemberProducts(),void console.log("🔄 UI synced - existing member or promo period",{isExistingMember:e,isPromotionalPeriod:t});if(window.membershipCartHandler){const t=window.membershipCartHandler.isTempMember(),r=await window.membershipCartHandler.isMembershipInCart();t||r?this.unlockMemberProducts():this.lockMemberProducts(),console.log("🔄 UI synced with cart state",{isTempMember:t,hasMembershipInCart:r,isExistingMember:e})}}showMembershipAddedFeedback(){console.log("🎉 Showing membership added feedback");this.getAllMemberProducts().forEach(e=>{e.classList.add("cs-newly-unlocked"),setTimeout(()=>{e.classList.remove("cs-newly-unlocked")},3e3)})}showMembershipRemovedFeedback(){console.log("ℹ️ Showing membership removed feedback");this.getAllMemberProducts().forEach(e=>{e.classList.add("cs-newly-locked"),setTimeout(()=>{e.classList.remove("cs-newly-locked")},3e3)})}updateUIForMembershipState(e){e?(document.body.classList.add("cs-has-membership"),document.body.classList.remove("cs-no-membership")):(document.body.classList.remove("cs-has-membership"),document.body.classList.add("cs-no-membership"));document.querySelectorAll(".cs-membership-indicator").forEach(t=>{t.textContent=e?"Member Access Active":"Member Access Required",t.className=e?"cs-membership-indicator cs-active":"cs-membership-indicator cs-inactive"})}refreshUIForNewContent(){console.log("🔄 Refreshing UI for new content"),this.syncWithCartState()}debug(){const e=this.getAllMemberProducts();return{memberProductCount:e.length,memberProductSelectors:this.memberProductSelectors,currentBodyClasses:Array.from(document.body.classList),memberProductStates:e.map(e=>({element:e,isLocked:e.classList.contains("cs-member-locked"),isUnlocked:e.classList.contains("cs-member-unlocked")}))}}}class MembershipCollectionHandler{constructor(){this.memberProductCards=[],this.membershipProductCards=[],this.init()}init(){console.log("[CS Collection] Initializing Membership Collection Handler"),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>this.setup()):this.setup()}setup(){this.cacheElements(),this.bindEvents(),this.syncWithCurrentState(),console.log("[CS Collection] Setup complete - tracking",this.memberProductCards.length,"member products")}cacheElements(){this.memberProductCards=Array.from(document.querySelectorAll('[data-member-product="true"]')),this.membershipProductCards=Array.from(document.querySelectorAll('[data-membership-product="true"]')),console.log("[CS Collection] Found",this.memberProductCards.length,"member products and",this.membershipProductCards.length,"membership products")}bindEvents(){document.addEventListener("cs:membershipStateChanged",e=>{console.log("[CS Collection] Membership state changed:",e.detail),this.handleMembershipStateChange(e.detail)}),document.addEventListener("cs:cartUpdated",e=>{console.log("[CS Collection] Cart updated, checking membership state"),this.syncWithCurrentState()})}syncWithCurrentState(){const e=window.membershipCartHandler?.isTempMember()||!1,t=null!==document.querySelector('[data-customer-member="true"]'),r=window.CSSettings?.promotionalPeriod||!1,o=e||t||r;console.log("[CS Collection] Syncing state - temp:",e,"customer:",t,"promo:",r,"unlock:",o),this.updateMemberProductsUI(o)}handleMembershipStateChange(e){const{isMember:t,reason:r}=e,o=window.CSSettings?.promotionalPeriod||!1;console.log("[CS Collection] Handling membership state change:",{isMember:t,reason:r,isPromotionalPeriod:o}),this.updateMemberProductsUI(t||o)}updateMemberProductsUI(e){this.memberProductCards.forEach(t=>{this.updateSingleMemberProduct(t,e)})}updateSingleMemberProduct(e,t){const r=e.dataset.productTitle||"product",o=e.querySelector(".cs-member-product-control
1s");if(!o)return void console.warn("[CS Collection] No member controls found for",r);const s=o.querySelector(".cs-member-unlocked"),i=o.querySelector(".cs-member-locked"),c=o.querySelector(".cs-member-atc-btn");if(t)e.classList.add("cs-temp-member-active"),s&&(s.classList.remove("cs-member-product-locked"),s.classList.add("cs-member-product-unlocked")),i&&(i.classList.add("cs-member-product-unlocked"),i.classList.remove("cs-member-product-locked")),c&&(console.log("[CS Collection] Enabling button for:",r,"disabled before:",c.disabled),c.disabled=!1,c.classList.remove("cs-member-product-locked"),c.classList.add("cs-member-product-unlocked"),console.log("[CS Collection] Button enabled for:",r,"disabled after:",c.disabled)),console.log("[CS Collection] Unlocked member product:",r);else{if(e.classList.remove("cs-temp-member-active"),s&&(s.classList.add("cs-member-product-locked"),s.classList.remove("cs-member-product-unlocked")),i&&(i.classList.remove("cs-member-product-unlocked"),i.classList.add("cs-member-product-locked")),c){c.classList.contains("rtnu-btn--sold-out")||(c.disabled=!0),c.classList.add("cs-member-product-locked"),c.classList.remove("cs-member-product-unlocked")}console.log("[CS Collection] Locked member product:",r)}}debug(){return{memberProducts:this.memberProductCards.length,membershipProducts:this.membershipProductCards.length,tempMemberActive:window.membershipCartHandler?.isTempMember()||!1,currentState:this.memberProductCards.map(e=>({title:e.dataset.productTitle,unlocked:e.classList.contains("cs-temp-member-active")}))}}refresh(){this.cacheElements(),this.syncWithCurrentState()}destroy(){this.memberProductCards=[],this.membershipProductCards=[]}}document.addEventListener("DOMContentLoaded",function(){console.log("🚀 Initializing Carnivore Snax Membership System..."),window.membershipCartHandler||(window.membershipCartHandler=new MembershipCartHandler),window.membershipUIController||(window.membershipUIController=new MembershipUIController),window.MembershipCollectionHandler||(window.MembershipCollectionHandler=new MembershipCollectionHandler),console.log("✅ All membership handlers initialized")}),"loading"!==document.readyState&&(console.log("🚀 DOM already ready - initializing Carnivore Snax Membership System..."),window.membershipCartHandler||(window.membershipCartHandler=new MembershipCartHandler),window.membershipUIController||(window.membershipUIController=new MembershipUIController),window.MembershipCollectionHandler||(window.MembershipCollectionHandler=new MembershipCollectionHandler),console.log("✅ All membership handlers initialized"));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.