1<!doctype html> 2<html 3 data-wf-page="609ce7e7a1044616badc4fa6" 4 data-wf-site="60084d90d4fc5e33ff1d1976" 5 lang="en" 6 data-money-format="£{{amount}}" 7> 8 <head> 9
9<script type="application/vnd.locksmith+json" data-locksmith>{"version":"v346","locked":false,"initialized":true,"scope":"blog","access_granted":true,"access_denied":false,"requires_customer":false,"manual_lock":false,"remote_lock":false,"has_timeout":false,"remote_rendered":null,"hide_resource":false,"hide_links_to_resource":false,"hide_price":false,"hide_add_to_cart":false,"transparent":true,"locks":{"all":[],"opened":[]},"keys":[],"keys_signature":"15d09211b1bbfdbd8f25548b13e98102faa6732795fc8be562bae46e3ebbace8","state":{"template":"blog","theme":199928807801,"product":null,"collection":null,"page":null,"blog":"articles","article":null,"app":null},"now":1791235920,"path":"\/blogs\/articles","locale_root_url":"\/","canonical_url":"https:\/\/cartwheelcoffee.com\/blogs\/articles","customer_id":null,"customer_id_signature":"15d09211b1bbfdbd8f25548b13e98102faa6732795fc8be562bae46e3ebbace8","cart":null}</script>
9<script data-locksmith>!function(){undefined;!function(){var s=window.Locksmith={},e=document.querySelector('script[type="application/vnd.locksmith+json"]'),n=e&&e.innerHTML;if(s.state={},s.util={},s.loading=!1,n)try{s.state=JSON.parse(n)}catch(d){}if(document.addEventListener&&document.querySelector){var o,i,a,t=[76,79,67,75,83,77,73,84,72,49,49],c=function(){i=t.slice(0)},l="style",r=function(e){e&&27!==e.keyCode&&"click"!==e.type||(document.removeEventListener("keydown",r),document.removeEventListener("click",r),o&&document.body.removeChild(o),o=null)};c(),document.addEventListener("keyup",function(e){if(e.keyCode===i[0]){if(clearTimeout(a),i.shift(),0<i.length)return void(a=setTimeout(c,1e3));c(),r(),(o=document.createElement("div"))[l].width="50%",o[l].maxWidth="1000px",o[l].height="85%",o[l].border="1px rgba(0, 0, 0, 0.2) solid",o[l].background="rgba(255, 255, 255, 0.99)",o[l].borderRadius="4px",o[l].position="fixed",o[l].top="50%",o[l].left="50%",o[l].transform="translateY(-50%) translateX(-50%)",o[l].boxShadow="0 2px 5px rgba(0, 0, 0, 0.3), 0 0 100vh 100vw rgba(0, 0, 0, 0.5)",o[l].zIndex="2147483645";var t=document.createElement("textarea");t.value=JSON.stringify(JSON.parse(n),null,2),t[l].border="none",t[l].display="block",t[l].boxSizing="border-box",t[l].width="100%",t[l].height="100%",t[l].background="transparent",t[l].padding="22px",t[l].fontFamily="monospace",t[l].fontSize="14px",t[l].color="#333",t[l].resize="none",t[l].outline="none",t.readOnly=!0,o.appendChild(t),document.body.appendChild(o),t.addEventListener("click",function(e){e.stopImmediatePropagation()}),t.select(),document.addEventListener("keydown",r),document.addEventListener("click",r)}})}s.isEmbedded=-1!==window.location.search.indexOf("_ab=0&_fd=0&_sc=1"),s.path=s.state.path||window.location.pathname,s.basePath=s.state.locale_root_url.concat("/apps/locksmith").replace(/^\/\//,"/"),s.reloading=!1,s.util.console=window.console||{log:function(){},error:function(){}},s.util.makeUrl=function(e,t){var n,o=s.basePath+e,i=[],a=s.cache();for(n in a)i.push(n+"="+encodeURIComponent(a[n]));for(n in t)i.push(n+"="+encodeURIComponent(t[n]));return s.state.customer_id&&(i.push("customer_id="+encodeURIComponent(s.state.customer_id)),i.push("customer_id_signature="+encodeURIComponent(s.state.customer_id_signature))),o+=(-1===o.indexOf("?")?"?":"&")+i.join("&")},s._initializeCallbacks=[],s.on=function(e,t){if("initialize"!==e)throw'Locksmith.on() currently only supports the "initialize" event';s._initializeCallbacks.push(t)},s.initializeSession=function(e){if(!s.isEmbedded){var t=!1,n=!0,o=!0;(e=e||{}).silent&&(o=n=!(t=!0)),s.ping({silent:t,spinner:n,reload:o,callback:function(){s._initializeCallbacks.forEach(function(e){e()})}})}},s.cache=function(e){var t={};try{var n=function i(e){return(document.cookie.match("(^|; )"+e+"=([^;]*)")||0)[2]};t=JSON.parse(decodeURIComponent(n("locksmith-params")||"{}"))}catch(d){}if(e){for(var o in e)t[o]=e[o];document.cookie="locksmith-params=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/",document.cookie="locksmith-params="+encodeURIComponent(JSON.stringify(t))+"; path=/"}return t},s.cache.cart=s.state.cart,s.cache.cartLastSaved=null,s.params=s.cache(),s.util.reload=function(){s.reloading=!0;try{window.location.href=window.location.href.replace(/#.*/,"")}catch(d){s.util.console.error("Preferred reload method failed",d),window.location.reload()}},s.cache.saveCart=function(e){if(!s.cache.cart||s.cache.cart===s.cache.cartLastSaved)return e?e():null;var t=s.cache.cartLastSaved;s.cache.cartLastSaved=s.cache.cart,fetch("/cart/update.js",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({attributes:{locksmith:s.cache.cart}})}).then(function(e){if(!e.ok)throw new Error("Cart update failed: "+e.status);return e.json()}).then(function(){e&&e()})["catch"](function(e){if(s.cache.cartLastSaved=t,!s.reloading)throw e})},s.util.spinnerHTML='<style>body{background:#FFF}@keyframes spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}#loading{display:flex;width:100%;height:50vh;
9color:#777;align-items:center;justify-content:center}#loading .spinner{display:block;animation:spin 600ms linear infinite;position:relative;width:50px;height:50px}#loading .spinner-ring{stroke:currentColor;stroke-dasharray:100%;stroke-width:2px;stroke-linecap:round;fill:none}</style><div id="loading"><div class="spinner"><svg width="100%" height="100%"><svg preserveAspectRatio="xMinYMin"><circle class="spinner-ring" cx="50%" cy="50%" r="45%"></circle></svg></svg></div></div>',s.util.clobberBody=function(e){document.body.innerHTML=e},s.util.clobberDocument=function(e){e.responseText&&(e=e.responseText),document.documentElement&&document.removeChild(document.documentElement);var t=document.open("text/html","replace");t.writeln(e),t.close(),setTimeout(function(){var e=t.querySelector("[autofocus]");e&&e.focus()},100)},s.util.serializeForm=function(e){if(e&&"FORM"===e.nodeName){var t,n,o={};for(t=e.elements.length-1;0<=t;t-=1)if(""!==e.elements[t].name)switch(e.elements[t].nodeName){case"INPUT":switch(e.elements[t].type){default:case"text":case"hidden":case"password":case"button":case"reset":case"submit":o[e.elements[t].name]=e.elements[t].value;break;case"checkbox":case"radio":e.elements[t].checked&&(o[e.elements[t].name]=e.elements[t].value);break;case"file":}break;case"TEXTAREA":o[e.elements[t].name]=e.elements[t].value;break;case"SELECT":switch(e.elements[t].type){case"select-one":o[e.elements[t].name]=e.elements[t].value;break;case"select-multiple":for(n=e.elements[t].options.length-1;0<=n;n-=1)e.elements[t].options[n].selected&&(o[e.elements[t].name]=e.elements[t].options[n].value)}break;case"BUTTON":switch(e.elements[t].type){case"reset":case"submit":case"button":o[e.elements[t].name]=e.elements[t].value}}return o}},s.util.on=function(e,a,s,t){t=t||document;var c="locksmith-"+e+a,n=function(e){var t=e.target,n=e.target.parentElement,o=t&&t.className&&(t.className.baseVal||t.className)||"",i=n&&n.className&&(n.className.baseVal||n.className)||"";("string"==typeof o&&-1!==o.split(/\s+/).indexOf(a)||"string"==typeof i&&-1!==i.split(/\s+/).indexOf(a))&&!e[c]&&(e[c]=!0,s(e))};t.attachEvent?t.attachEvent(e,n):t.addEventListener(e,n,!1)},s.util.enableActions=function(e){s.util.on("click","locksmith-action",function(e){e.preventDefault();var t=e.target;t.dataset.confirmWith&&!confirm(t.dataset.confirmWith)||(t.disabled=!0,t.innerText=t.dataset.disableWith,s.post("/action",t.dataset.locksmithParams,{spinner:!1,type:"text",success:function(e){(e=JSON.parse(e.responseText)).message&&alert(e.message),s.util.reload()}}))},e)},s.util.inject=function(e,t){var n=["data","locksmith","append"];if(-1!==t.indexOf(n.join("-"))){var o=document.createElement("div");o.innerHTML=t,e.appendChild(o)}else e.innerHTML=t;var i,a,s=e.querySelectorAll("script");for(a=0;a<s.length;++a){i=s[a];var c=document.createElement("script");if(i.type&&(c.type=i.type),i.src)c.src=i.src;else{var l=document.createTextNode(i.innerHTML);c.appendChild(l)}e.appendChild(c)}var r=e.querySelector("[autofocus]");r&&r.focus()},s.post=function(e,t,n){!1!==(n=n||{}).spinner&&s.util.clobberBody(s.util.spinnerHTML);var o={};n.container===document?(o.layout=1,n.success=function(e){s.util.clobberDocument(e)}):n.container&&(o.layout=0,n.success=function(e){var t="string"==typeof n.container?document.getElementById(n.container):n.container;t&&(s.util.inject(t,e),t.id===t.firstChild.id&&t.parentElement.replaceChild(t.firstChild,t))}),n.form_type&&(t.form_type=n.form_type),n.include_layout_classes!==undefined&&(t.include_layout_classes=n.include_layout_classes),n.lock_id!==undefined&&(t.lock_id=n.lock_id),s.loading=!0;var i=s.util.makeUrl(e,o),a="json"===n.type||"text"===n.type;fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Accept:a?"application/json":"text/html"},body:JSON.stringify(t)}).then(function(e){if(!e.ok)throw new Error("Request failed: "+e.status);return e.text()}).then(function(e){var t=n.success||s.util.clobberDocument;t(a?{responseText:e}:e)})["catch"](function(e){if(!s.reloading)if("dashboard.weglot.com"!==window.location.host){if(!n.silent)throw alert("Something went wrong! Please refresh and try again."),e;console.error(e)}else console.error(e)})["finally"](function(){s.loading=!1})},s.postResource=function(e,t){e.path=s.path,e.search=window.location.search,e.state=s.state,e.passcode&&(e.passcode=e.passcode.trim()),e.email&&(e.email=e.email.trim()),e.state.cart=s.cache.cart,e.locksmith_json=s.jsonTag,e.locksmith_json_signature=s.jsonTagSignature,s.post("/resource",e,t)},s.ping=function(e){if(!s.isEmbedded){e=e||{};s.post("/ping",{path:s.path,search:window.location.search,state:s.state},{spinner:!!e.spinner,silent:"undefined"==typeof e.silent||e.silent,type:"text",success:function(e){e&&e.responseText?(e=JSON.parse(e.responseText)).messages&&0<e.messages.length&&s.showMessages(e.messages):console.error("[Locksmith] Invalid result in ping callback:",e)}})}},s.timeoutMonitor=function(){var e=s.cache.cart;s.ping({callback:function(){e!==s.cache.cart||setTimeout(function(){s.timeoutMonitor()},6e4)}})},s.showMessages=function(e){var t=document.createElement("div");t.style.position="fixed",t.style.left=0,t.style.right=0,t.style.bottom="-50px",t.style.opacity=0,t.style.background="#191919",t.style.color="#ddd",t.style.transition="bottom 0.2s, opacity 0.2s",t.style.zIndex=999999,t.innerHTML=["<style>"," .locksmith-ab .locksmith-b { display: none; }"," .locksmith-ab.toggled .locksmith-b { display: flex; }"," .locksmith-ab.toggled .locksmith-a { display: none; }"," .locksmith-flex { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; padding: 10px 20px; }"," .locksmith-message + .locksmith-message { border-top: 1px #555 solid; }"," .locksmith-message a { color: inherit; font-weight: bold; }"," .locksmith-message a:hover { color: inherit; opacity: 0.8; }"," a.locksmith-ab-toggle { font-weight: inherit; text-decoration: underline; }"," .locksmith-text { flex-grow: 1; }"," .locksmith-cta { flex-grow: 0; text-align: right; }"," .locksmith-cta button { transform: scale(0.8); transform-origin: left; }"," .locksmith-cta > * { display: block; }"," .locksmith-cta > * + * { margin-top: 10px; }"," .locksmith-message a.locksmith-close { flex-grow: 0; text-decoration: none; margin-left: 15px; font-size: 30px; font-family: monospace; display: block; padding: 2px 10px; }"," @media screen and (max-width: 600px) {"," .locksmith-wide-only { display: none !important; }"," .locksmith-flex { padding: 0 15px; }"," .locksmith-flex > * { margin-top: 5px; margin-bottom: 5px; }"," .locksmith-cta { text-align: left; }"," }"," @media screen and (min-width: 601px) {"," .locksmith-narrow-only { display: none !important; }"," }","</style>"].join("")+e.map(function(e){return'<div class="locksmith-message">'+e+"</div>"}).join(""),document.body.appendChild(t),document.body.style.position="relative",document.body.parentElement.style.paddingBottom=t.offsetHeight+"px",setTimeout(function(){t.style.bottom=0,t.style.opacity=1},50),s.util.on("click","locksmith-ab-toggle",function(e){e.preventDefault();for(var t=e.target.parentElement;-1===t.className.split(" ").indexOf("locksmith-ab");)t=t.parentElement;-1!==t.className.split(" ").indexOf("toggled")?t.className=t.className.replace("toggled",""):t.className=t.className+" toggled"}),s.util.enableActions(t)}}()}();</script>
9 10
10<script data-locksmith>Locksmith.cache.cart=null</script>
10 11 12
12<script data-locksmith>Locksmith.jsonTag="{\"version\":\"v346\",\"locked\":false,\"initialized\":true,\"scope\":\"blog\",\"access_granted\":true,\"access_denied\":false,\"requires_customer\":false,\"manual_lock\":false,\"remote_lock\":false,\"has_timeout\":false,\"remote_rendered\":null,\"hide_resource\":false,\"hide_links_to_resource\":false,\"hide_price\":false,\"hide_add_to_cart\":false,\"transparent\":true,\"locks\":{\"all\":[],\"opened\":[]},\"keys\":[],\"keys_signature\":\"15d09211b1bbfdbd8f25548b13e98102faa6732795fc8be562bae46e3ebbace8\",\"state\":{\"template\":\"blog\",\"theme\":199928807801,\"product\":null,\"collection\":null,\"page\":null,\"blog\":\"articles\",\"article\":null,\"app\":null},\"now\":1791235920,\"path\":\"\\\/blogs\\\/articles\",\"locale_root_url\":\"\\\/\",\"canonical_url\":\"https:\\\/\\\/cartwheelcoffee.com\\\/blogs\\\/articles\",\"customer_id\":null,\"customer_id_signature\":\"15d09211b1bbfdbd8f25548b13e98102faa6732795fc8be562bae46e3ebbace8\",\"cart\":null}";Locksmith.jsonTagSignature="a4ddb02192662506c8822a8c22a26d9e997750f9d97e6da1324f7dc4c02eebfa"</script>
12 13 <!-- Added by AVADA SEO Suite --> 14 15 16 17 <!-- /Added by AVADA SEO Suite --> 18 19 <meta charset="utf-8"> 20 21 <meta content="Home | Cartwheel" property="twitter:title"> 22 <meta content="width=device-width, initial-scale=1" name="viewport"> 23 <title>Cartwheel Coffee Corner 24| Cartwheel Coffee Roasters</title><meta name="description" content="The Cartwheel Coffee Corner blog. News and updates from our Roastery and views on the coffee industry"> 25 26 27 28 29<meta property="og:site_name" content="Cartwheel Coffee Roasters"> 30<meta property="og:url" content="https://cartwheelcoffee.com/blogs/articles"><meta property="og:title" content="Cartwheel Coffee Corner"> 31<meta property="og:type" content="website"> 32<meta property="og:description" content="The Cartwheel Coffee Corner blog. News and updates from our Roastery and views on the coffee industry"> 33<meta property="og:image" content="http://cartwheelcoffee.com/cdn/shop/files/subscribe-tablet.jpg?v=1636446479"> 34<meta property="og:image:secure_url" content="https://cartwheelcoffee.com/cdn/shop/files/subscribe-tablet.jpg?v=1636446479"> 35<meta property="og:image:width" content="2752"> 36 <meta property="og:image:height" content="1600"> 37 <meta property="og:image:alt" content=""> 38 39<meta name="twitter:site" content="@"> 40 41<meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Cartwheel Coffee Corner"> 42<meta name="twitter:description" content="The Cartwheel Coffee Corner blog. News and updates from our Roastery and views on the coffee industry"> 43 44 <link href="https://cartwheelcoffee.com/blogs/articles" rel="canonical"> 45 <link href="//cartwheelcoffee.com/cdn/shop/t/29/assets/normalize.css?v=48445716682461949491790863894" rel="stylesheet" type="text/css" media="all" /> 46 <link href="//cartwheelcoffee.com/cdn/shop/t/29/assets/webflow.css?v=44735808800464552661790863894" rel="stylesheet" type="text/css" media="all" /> 47 <style data-shopify> 48 @media (min-width: 992px) { 49 html.w-mod-js:not(.w-mod-ix) [data-w-id='33d2f058-eb0a-6998-ec91-9b3b9afa65c6'] { 50 background-color: rgb(26, 26, 26); 51 opacity: 0; 52 } 53 html.w-mod-js:not(.w-mod-ix) [data-w-id='6565eafa-0f63-799d-c6a8-dbffe9fce840'] { 54 opacity: 0; 55 } 56 html.w-mod-js:not(.w-mod-ix) [data-w-id='23d6e3f6-7b8f-bba5-5a05-2ef58f00b3b6'] { 57 -webkit-transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 58 -moz-transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 59 -ms-transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 60 transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 61 } 62 html.w-mod-js:not(.w-mod-ix) [data-w-id='88fe1ca0-cc3b-c37e-61ea-16329d6ffa58'] { 63 -webkit-transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 64 -moz-transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 65 -ms-transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 66 transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 67 } 68 } 69 @media (max-width: 991px) and (min-width: 768px) { 70 html.w-mod-js:not(.w-mod-ix) [data-w-id='33d2f058-eb0a-6998-ec91-9b3b9afa65c6'] { 71 background-color: rgb(26, 26, 26); 72 opacity: 0; 73 } 74 html.w-mod-js:not(.w-mod-ix) [data-w-id='87c03d52-80de-c1d0-59b5-74f7cc135721'] { 75 -webkit-transform: translate3d(-100%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 76 -moz-transform: translate3d(-100%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 77 -ms-transform: translate3d(-100%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 78 transform: translate3d(-100%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 79 } 80 html.w-mod-js:not(.w-mod-ix) [data-w-id='6565eafa-0f63-799d-c6a8-dbffe9fce840'] { 81 opacity: 0; 82 } 83 html.w-mod-js:not(.w-mod-ix) [data-w-id='23d6e3f6-7b8f-bba5-5a05-2ef58f00b3b6'] { 84 -webkit-transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 85 -moz-transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 86 -ms-transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 87 transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 88 } 89 html.w-mod-js:not(.w-mod-ix) [data-w-id='88fe1ca0-cc3b-c37e-61ea-16329d6ffa58'] { 90 -webkit-transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 91 -moz-transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 92 -ms-transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 93 transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 94 } 95 } 96 @media (max-width: 767px) and (min-width: 480px) { 97 html.w-mod-js:not(.w-mod-ix) [data-w-id='33d2f058-eb0a-6998-ec91-9b3b9afa65c6'] { 98 background-color: rgb(26, 26, 26); 99 opacity: 0; 100 } 101 html.w-mod-js:not(.w-mod-ix) [data-w-id='87c03d52-80de-c1d0-59b5-74f7cc135721'] { 102 -webkit-transform: translate3d(-100%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 103 -moz-transform: translate3d(-100%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 104 -ms-transform: translate3d(-100%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 105 transform: translate3d(-100%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 106 } 107 html.w-mod-js:not(.w-mod-ix) [data-w-id='6565eafa-0f63-799d-c6a8-dbffe9fce840'] { 108 opacity: 0; 109 } 110 html.w-mod-js:not(.w-mod-ix) [data-w-id='23d6e3f6-7b8f-bba5-5a05-2ef58f00b3b6'] { 111 -webkit-transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 112 -moz-transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 113 -ms-transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 114 transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 115 } 116 html.w-mod-js:not(.w-mod-ix) [data-w-id='88fe1ca0-cc3b-c37e-61ea-16329d6ffa58'] { 117 -webkit-transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 118 -moz-transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 119 -ms-transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 120 transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 121 } 122 } 123 @media (max-width: 479px) { 124 html.w-mod-js:not(.w-mod-ix) [data-w-id='33d2f058-eb0a-6998-ec91-9b3b9afa65c6'] { 125 background-color: rgb(26, 26, 26); 126 opacity: 0; 127 } 128 html.w-mod-js:not(.w-mod-ix) [data-w-id='87c03d52-80de-c1d0-59b5-74f7cc135721'] { 129 -webkit-transform: translate3d(-100%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 130 -moz-transform: translate3d(-100%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 131 -ms-transform: translate3d(-100%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 132 transform: translate3d(-100%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 133 } 134 html.w-mod-js:not(.w-mod-ix) [data-w-id='6565eafa-0f63-799d-c6a8-dbffe9fce840'] { 135 opacity: 0; 136 } 137 html.w-mod-js:not(.w-mod-ix) [data-w-id='23d6e3f6-7b8f-bba5-5a05-2ef58f00b3b6'] { 138 -webkit-transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 139 -moz-transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 140 -ms-transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 141 transform: translate3d(0, 100%, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 142 } 143 html.w-mod-js:not(.w-mod-ix) [data-w-id='88fe1ca0-cc3b-c37e-61ea-16329d6ffa58'] { 144 -webkit-transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 145 -moz-transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 146 -ms-transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 147 transform: translate3d(120%, 0, 0) scale3d(1, 1, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); 148 } 149 } 150 </style> 151 152 <!-- 153 [if lt IE 9]>
153<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js" type="text/javascript"></script>
153<![endif] 154 --> 155
155<script type="text/javascript"> 156 !(function (o, c) { 157 var n = c.documentElement, 158 t = ' w-mod-'; 159 (n.className += t + 'js'), 160 ('ontouchstart' in o || (o.DocumentTouch && c instanceof DocumentTouch)) && (n.className += t + 'touch'); 161 })(window, document); 162 </script>
162 163 164 <link rel="shortcut icon" type="image/png" href="//cartwheelcoffee.com/cdn/shop/files/Social_Logo.png?crop=center&height=32&v=1636480431&width=32"> 165 166 <link 167 rel="apple-touch-icon" 168 type="image/png" 169 href="//cartwheelcoffee.com/cdn/shop/files/webclip.jpg?crop=center&height=32&v=1636127215&width=32" 170 > 171 172 <style data-shopify> 173 @font-face { 174 font-family: 'Basis Grotesque'; 175 src: url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Medium.eot?v=164825106692870903561790863894); 176 src: url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Medium.eot?%23iefix&v=164825106692870903561790863894) format('embedded-opentype'), 177 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Medium.woff2?v=162212711411337106711790863894) format('woff2'), 178 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Medium.woff?v=100983406614717903221790863894) format('woff'), 179 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Medium.ttf?v=143002744720422893981790863894) format('truetype'), 180 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Medium.svg%23BasisGrotesque-Medium?v=11706) format('svg'); 181 font-weight: 500; 182 font-style: normal; 183 } 184 185 @font-face { 186 font-family: 'Basis Grotesque'; 187 src: url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Bold.eot?v=91057086445631105081790863894); 188 src: url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Bold.eot?%23iefix&v=91057086445631105081790863894) format('embedded-opentype'), 189 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Bold.woff2?v=166711040568982304391790863894) format('woff2'), 190 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Bold.woff?v=166905365487593816181790863894) format('woff'), 191 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Bold.ttf?v=175970886715785253621790863894) format('truetype'), 192 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Bold.svg%23BasisGrotesque-Bold?v=11706) format('svg'); 193 font-weight: bold; 194 font-style: normal; 195 } 196 197 @font-face { 198 font-family: 'Basis Grotesque Mono'; 199 src: url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesqueMono-Medium.eot?v=49012285592589494701790863894); 200 src: url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesqueMono-Medium.eot?%23iefix&v=49012285592589494701790863894) format('embedded-opentype'), 201 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesqueMono-Medium.woff2?v=32480205011916126851790863894) format('woff2'), 202 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesqueMono-Medium.woff?v=9349903634994251331790863894) format('woff'), 203 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesqueMono-Medium.ttf?v=132319040781507416901790863894) format('truetype'), 204 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesqueMono-Medium.svg%23BasisGrotesqueMono-Medium?v=11706) format('svg'); 205 font-weight: 500; 206 font-style: normal; 207 } 208 209 @font-face { 210 font-family: 'Basis Grotesque Mono'; 211 src: url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesqueMono-Regular.eot?v=19527043577924451921790863894); 212 src: url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesqueMono-Regular.eot?%23iefix&v=19527043577924451921790863894) format('embedded-opentype'), 213 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesqueMono-Regular.woff2?v=142443341604778610991790863894) format('woff2'), 214 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesqueMono-Regular.woff?v=103303142668235553181790863894) format('woff'), 215 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesqueMono-Regular.ttf?v=94104866716969994521790863894) format('truetype'), 216 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesqueMono-Regular.svg%23BasisGrotesqueMono-Regular?v=11706) format('svg'); 217 font-weight: normal; 218 font-style: normal; 219 } 220 221 @font-face { 222 font-family: 'Basis Grotesque'; 223 src: url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Regular.eot?v=74655399457815505041790863894); 224 src: url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Regular.eot?%23iefix&v=74655399457815505041790863894) format('embedded-opentype'), 225 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Regular.woff2?v=62773314693348829041790863894) format('woff2'), 226 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Regular.woff?v=192182861609290441790863894) format('woff'), 227 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Regular.ttf?v=103874343569193977421790863894) format('truetype'), 228 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/BasisGrotesque-Regular.svg%23BasisGrotesque-Regular?v=11706) format('svg'); 229 font-weight: normal; 230 font-style: normal; 231 } 232 233 @font-face { 234 font-family: 'Editor'; 235 src: url(//cartwheelcoffee.com/cdn/shop/t/29/assets/Editor-Light.eot?v=74660355022140884501790863894); 236 src: url(//cartwheelcoffee.com/cdn/shop/t/29/assets/Editor-Light.eot?%23iefix&v=74660355022140884501790863894) format('embedded-opentype'), 237 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/Editor-Light.woff2?v=89857844373961451481790863894) format('woff2'), 238 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/Editor-Light.woff?v=39122913923748869581790863894) format('woff'), 239 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/Editor-Light.ttf?v=120656842121759304261790863894) format('truetype'), 240 url(//cartwheelcoffee.com/cdn/shop/t/29/assets/Editor-Light.svg%23Editor-Light?v=11706) format('svg'); 241 font-weight: 300; 242 font-style: normal; 243 } 244 245 :root, 246 .color-scheme-1 { 247 --color-background: 245,245,245; 248 249 --gradient-background: #f5f5f5; 250 251 252 253 254 --color-foreground: 26,26,26; 255 --color-background-contrast: 181,181,181; 256 --color-shadow: ,,; 257 --color-button: 26,26,26; 258 --color-button-text: 255,255,255; 259 --color-secondary-button: 245,245,245; 260 --color-secondary-button-text: ,,; 261 --color-link: ,,; 262 --color-border: 0,0,0; 263 --color-badge-foreground: 26,26,26; 264 --color-badge-background: 245,245,245; 265 --color-badge-border: 26,26,26; 266 --payment-terms-background-color: rgb(245 245 245); 267 } 268 269 270 .color-scheme-2 {
271 --color-background: 26,26,26; 272 273 --gradient-background: #1a1a1a; 274 275 276 277 278 --color-foreground: 255,255,255; 279 --color-background-contrast: 154,154,154; 280 --color-shadow: ,,; 281 --color-button: 255,255,255; 282 --color-button-text: 26,26,26; 283 --color-secondary-button: 26,26,26; 284 --color-secondary-button-text: ,,; 285 --color-link: ,,; 286 --color-border: 0,0,0; 287 --color-badge-foreground: 255,255,255; 288 --color-badge-background: 26,26,26; 289 --color-badge-border: 255,255,255; 290 --payment-terms-background-color: rgb(26 26 26); 291 } 292 293 294 .color-scheme-ccd913bf-166f-42e3-b9bd-8d9c82972c62 { 295 --color-background: 255,255,255; 296 297 --gradient-background: #ffffff; 298 299 300 301 302 --color-foreground: 26,26,26; 303 --color-background-contrast: 191,191,191; 304 --color-shadow: ,,; 305 --color-button: 26,26,26; 306 --color-button-text: 255,255,255; 307 --color-secondary-button: 255,255,255; 308 --color-secondary-button-text: ,,; 309 --color-link: ,,; 310 --color-border: 0,0,0; 311 --color-badge-foreground: 26,26,26; 312 --color-badge-background: 255,255,255; 313 --color-badge-border: 26,26,26; 314 --payment-terms-background-color: rgb(255 255 255); 315 } 316 317 318 .color-scheme-586520cf-28ab-4963-baac-a0289157f5ba { 319 --color-background: 239,239,239; 320 321 --gradient-background: #efefef; 322 323 324 325 326 --color-foreground: 0,0,0; 327 --color-background-contrast: 175,175,175; 328 --color-shadow: ,,; 329 --color-button: 0,0,0; 330 --color-button-text: 255,255,255; 331 --color-secondary-button: 239,239,239; 332 --color-secondary-button-text: ,,; 333 --color-link: ,,; 334 --color-border: 192,192,192; 335 --color-badge-foreground: 0,0,0; 336 --color-badge-background: 239,239,239; 337 --color-badge-border: 0,0,0; 338 --payment-terms-background-color: rgb(239 239 239); 339 } 340 341 342 body, .color-scheme-1, .color-scheme-2, .color-scheme-ccd913bf-166f-42e3-b9bd-8d9c82972c62, .color-scheme-586520cf-28ab-4963-baac-a0289157f5ba { 343 color: rgba(var(--color-foreground)); 344 background-color: rgb(var(--color-background)); 345 } 346 * { 347 -webkit-font-smoothing: antialiased; 348 -moz-osx-font-smoothing: grayscale; 349 } 350 /* Hide scrollbar for Chrome, Safari and Opera */ 351 .nav-full::-webkit-scrollbar {
352 display: none; 353 } 354 /* Hide scrollbar for IE and Edge */ 355 .nav-full { 356 -ms-overflow-style: none; 357 } 358 .mobile-overflow { 359 overflow: hidden; 360 } 361 /* Change Autocomplete styles in Chrome*/ 362 input:-webkit-autofill, 363 input:-webkit-autofill:hover, 364 input:-webkit-autofill:focus, 365 textarea:-webkit-autofill, 366 textarea:-webkit-autofill:hover, 367 textarea:-webkit-autofill:focus, 368 select:-webkit-autofill, 369 select:-webkit-autofill:hover, 370 select:-webkit-autofill:focus { 371 background: #f4ebd9 !important; 372 } 373 input:focus { 374 outline: none; 375 } 376 /* Custom Quantity */ 377 /* remove form styles & set margin at 0 */ 378 input[type='number']::-webkit-inner-spin-button, 379 input[type='number']::-webkit-outer-spin-button { 380 -webkit-appearance: none; 381 margin: 0; 382 } 383 </style> 384 <link href="//cartwheelcoffee.com/cdn/shop/t/29/assets/cartwheel.webflow.css?v=29262971244519534471790865812" rel="stylesheet" type="text/css" media="all" /> 385 <link href="//cartwheelcoffee.com/cdn/shop/t/29/assets/layout.css?v=137167470492540966841790863894" rel="stylesheet" type="text/css" media="all" /> 386 <style data-shopify> 387 [udy-el='compare-price']:empty { 388 display: none; 389 } 390 .arrow-left, 391 .arrow-right { 392 -webkit-touch-callout: none; /* iOS Safari */ 393 -webkit-user-select: none; /* Safari */ 394 -khtml-user-select: none; /* Konqueror HTML */ 395 -moz-user-select: none; /* Firefox */ 396 -ms-user-select: none; /* Internet Explorer/Edge */ 397 user-select: none; /* Non-prefixed version, currently 398 supported by Chrome and Opera */ 399 } 400 .slick-item, 401 .slick-item-guides { 402 display: inline-block; 403 } 404 .slick-list, 405 .slick-list-guides { 406 display: block !important; 407 } 408 .slick-prev:hover, 409 .slick-prev:focus, 410 .slick-next:hover, 411 .slick-next:focus { 412 outline: none; 413 } 414 .slick-slide, 415 .slick-slide * { 416 outline: none !important; 417 } 418 .slick-track { 419 display: flex; 420 } 421 .slick-list { 422 padding-right: 56px !important; 423 padding-left: 0px !important; 424 } 425 426 /* Assemble Overrides */ 427 .assemble-grid--header > h1 { 428 font-size: 40px !important; 429 margin-top: 80px; 430 margin-bottom: 40px; 431 } 432 span.assemble--individual---hero-box-status { 433 font-size: 18px !important; 434 } 435 h2.assemble--billing-title { 436 font-size: 26px; 437 } 438 .assemble-grid--header > h2 { 439 font-size: 26px !important; 440 margin-top: 24px; 441 margin-bottom: 24px; 442 } 443 .assemble-grid--25.assemble-grid--m-100 > h3 { 444 font-size: 20px; 445 margin-bottom: 10px; 446 } 447 form#assemble--form-payment_method { 448 margin-bottom: 10px; 449 } 450 </style> 451 452
452<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
452<meta name="facebook-domain-verification" content="bnewecvstcl8enomp1cr55eqkjqgpv"> 453<meta name="google-site-verification" content="KmTpWYvb2TRpLquZr-jHAtdyyg3H1NvTtgPsR5o-r3s"> 454<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/58695024805/digital_wallets/dialog"> 455<meta id="in-context-paypal-metadata" data-shop-id="58695024805" data-venmo-supported="false" data-environment="production" data-locale="en_US" data-paypal-v4="true" data-currency="GBP"> 456<link rel="ucp" href="/.well-known/ucp" version="2026-08-25"><link rel="alternate" type="application/atom+xml" title="Feed" href="/blogs/articles.atom" /> 457<link rel="next" href="/blogs/articles?page=2">
458<script async="async" src="/checkouts/internal/preloads.js?locale=en-GB"></script>
458 459<link rel="preconnect" href="https://shop.app" crossorigin="anonymous">
460<script async="async" src="https://shop.app/checkouts/internal/preloads.js?locale=en-GB&shop_id=58695024805" crossorigin="anonymous"></script>
vendor: 1 bytes, line 460
460
461<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":58695024805,"countryCode":"GB","currencyCode":"GBP","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/58695024805","merchantName":"Cartwheel Coffee Roasters","requiredBillingContactFields":["postalAddress","email"],"requiredShippingContactFields":["postalAddress","email"],"shippingType":"shipping","supportedNetworks":["visa","maestro","masterCard","amex","discover","elo"],"total":{"type":"pending","label":"Cartwheel Coffee Roasters","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
vendor: 1 bytes, line 461
461
462<script id="shopify-features" type="application/json">{"accessToken":"edcf220723a9a912e22989361e43cde6","betas":["rich-media-storefront-analytics"],"domain":"cartwheelcoffee.com","predictiveSearch":true,"shopId":58695024805,"locale":"en"}</script>
vendor: 1 bytes, line 462
462
463<script>var Shopify = Shopify || {}; 464Shopify.shop = "cartwheelcoffee.myshopify.com"; 465Shopify.locale = "en"; 466Shopify.currency = {"active":"GBP","rate":"1.0"}; 467Shopify.country = "GB"; 468Shopify.theme = {"name":"Cartwheel | Cart preview | 1 Oct 2026","id":199928807801,"schema_name":"cartwheel","schema_version":"2.0.0","theme_store_id":null,"role":"main"}; 469Shopify.theme.handle = "null"; 470Shopify.theme.style = {"id":null,"handle":null}; 471Shopify.cdnHost = "cartwheelcoffee.com/cdn"; 472Shopify.routes = Shopify.routes || {}; 473Shopify.routes.root = "/"; 474Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js"; 475Shopify.SignInWithShop = Shopify.SignInWithShop || {}; 476Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {}; 477Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 477
477
478<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 478
478
479<script>!function(o){function n(){var o=[];function n(){o.push(Array.prototype.slice.apply(arguments))}return n.q=o,n}var t=o.Shopify=o.Shopify||{};t.loadFeatures=n(),t.autoloadFeatures=n()}(window);</script>
vendor: 1 bytes, line 479
479
480<script> 481 window.ShopifyPay = window.ShopifyPay || {}; 482 window.ShopifyPay.apiHost = "shop.app\/pay"; 483 window.ShopifyPay.redirectState = null; 484</script>
vendor: 1 bytes, line 484
484
485<script> 486 window.Shopify = window.Shopify || {}; 487 window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {}; 488 window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 }; 489 window.Shopify.SignInWithShop.eligible = true; 490</script>
vendor: 1 bytes, line 490
490
491<script id="shop-js-analytics" type="application/json">{"pageType":"blog"}</script>
vendor: 1 bytes, line 491
491
492<script defer="defer" async type="module" src="https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"></script>
vendor: 1 bytes, line 492
492
493<script type="module"> 494 await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"); 495 496 window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true}); 497 498</script>
vendor: 1 bytes, line 498
498
499<script> 500 window.Shopify = window.Shopify || {}; 501 if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {}; 502 window.Shopify.featureAssets['shop-js'] = {"avatar":["modules/v2/loader.avatar.en.esm.js"],"checkout-modal":["modules/v2/loader.checkout-modal.en.esm.js"],"init-customer-accounts-sign-up":["modules/v2/loader.init-customer-accounts-sign-up.en.esm.js"],"init-customer-accounts":["modules/v2/loader.init-customer-accounts.en.esm.js"],"init-fed-cm":["modules/v2/loader.init-fed-cm.en.esm.js"],"init-shop-cart-sync":["modules/v2/loader.init-shop-cart-sync.en.esm.js"],"init-shop-email-lookup-coordinator":["modules/v2/loader.init-shop-email-lookup-coordinator.en.esm.js"],"init-shop-for-new-customer-accounts":["modules/v2/loader.init-shop-for-new-customer-accounts.en.esm.js"],"init-shop-user-recognition":["modules/v2/loader.init-shop-user-recognition.en.esm.js"],"init-windoid":["modules/v2/loader.init-windoid.en.esm.js"],"lead-capture":["modules/v2/loader.lead-capture.en.esm.js"],"listener":["modules/v2/loader.listener.en.esm.js"],"pay-button":["modules/v2/loader.pay-button.en.esm.js"],"payment-terms":["modules/v2/loader.payment-terms.en.esm.js"],"shop-button":["modules/v2/loader.shop-button.en.esm.js"],"shop-cart-sync":["modules/v2/loader.shop-cart-sync.en.esm.js"],"shop-cash-offers":["modules/v2/loader.shop-cash-offers.en.esm.js"],"shop-follow-button":["modules/v2/loader.shop-follow-button.en.esm.js"],"shop-login-button":["modules/v2/loader.shop-login-button.en.esm.js"],"shop-login":["modules/v2/loader.shop-login.en.esm.js"],"shop-toast-manager":["modules/v2/loader.shop-toast-manager.en.esm.js"],"shop-user-recognition":["modules/v2/loader.shop-user-recognition.en.esm.js"]}; 503</script>
vendor: 1 bytes, line 503
503
504<script>(function() { 505 var isLoaded = false; 506 function asyncLoad() { 507 if (isLoaded) return; 508 isLoaded = true; 509 var urls = ["\/\/cdn.shopify.com\/proxy\/21b5fb92c447bed04a27729ae4fa165ffa2b59ae2df413523356e770a632c2a9\/cartwheelcoffee.activehosted.com\/js\/site-tracking.php?shop=cartwheelcoffee.myshopify.com\u0026sp-cache-control=cHVibGljLCBtYXgtYWdlPTkwMA","https:\/\/seo.apps.avada.io\/scripttag\/avada-seo-installed.js?shop=cartwheelcoffee.myshopify.com","https:\/\/cdn1.avada.io\/flying-pages\/module.js?shop=cartwheelcoffee.myshopify.com","https:\/\/cdn-app.sealsubscriptions.com\/shopify\/public\/js\/sealsubscriptions.js?shop=cartwheelcoffee.myshopify.com","https:\/\/widgets.automizely.com\/loyalty\/v1\/main.js?connection_id=1a6322f6a4fd4f7e853e902b79644bb1\u0026mapped_org_id=3939d0090621530b91af687c80bdedf9_v1\u0026shop=cartwheelcoffee.myshopify.com","https:\/\/cdn.hextom.com\/js\/quickannouncementbar.js?shop=cartwheelcoffee.myshopify.com"]; 510 for (var i = 0; i < urls.length; i++) { 511 var s = document.createElement('script'); 512 s.type = 'text/javascript'; 513 s.async = true; 514 s.src = urls[i]; 515 var x = document.getElementsByTagName('script')[0]; 516 x.parentNode.insertBefore(s, x); 517 } 518 }; 519 if(window.attachEvent) { 520 window.attachEvent('onload', asyncLoad); 521 } else { 522 window.addEventListener('load', asyncLoad, false); 523 } 524})();</script>
vendor: 1 bytes, line 524
524
525<script id="__st">var __st={"a":58695024805,"offset":3600,"reqid":"17ea0285-3056-4a98-ba22-7576e2bc0eaa-1791235920","pageurl":"cartwheelcoffee.com\/blogs\/articles","s":"blogs-81063936165","u":"a017fbf60f84","p":"blog","rtyp":"blog","rid":81063936165};</script>
vendor: 1 bytes, line 525
525
526<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 526
526
527<script id="captcha-bootstrap">!function(){'use strict';const t='contact',e='account',n='new_comment',o=[[t,t],['blogs',n],['comments',n],[t,'customer']],c=[[e,'customer_login'],[e,'guest_login'],[e,'recover_customer_password'],[e,'create_customer']],r=t=>t.map((([t,e])=>`form[action*='/${t}']:not([data-nocaptcha='true']) input[name='form_type'][value='${e}']`)).join(','),a=t=>()=>t?[...document.querySelectorAll(t)].map((t=>t.form)):[];function s(){const t=[...o],e=r(t);return a(e)}const i='password',u='form_key',d=['recaptcha-v3-token','g-recaptcha-response','h-captcha-response',i],f=()=>{try{return window.sessionStorage}catch{return}},m='__shopify_v',_=t=>t.elements[u];function p(t,e,n=!1){try{const o=window.sessionStorage,c=JSON.parse(o.getItem(e)),{data:r}=function(t){const{data:e,action:n}=t;return t[m]||n?{data:e,action:n}:{data:t,action:n}}(c);for(const[e,n]of Object.entries(r))t.elements[e]&&(t.elements[e].value=n);n&&o.removeItem(e)}catch(o){console.error('form repopulation failed',{error:o})}}const l='form_type',E='cptcha';function T(t){t.dataset[E]=!0}const w=window,h=w.document,L='Shopify',v='ce_forms',y='captcha';let A=!1;((t,e)=>{const n=(g='f06e6c50-85a8-45c8-87d0-21a2b65856fe',I='https://cdn.shopify.com/shopifycloud/storefront-forms-hcaptcha/ce_storefront_forms_captcha_hcaptcha.v1.5.3.iife.js',D={infoText:'Protected by hCaptcha',privacyText:'Privacy',termsText:'Terms'},(t,e,n)=>{const o=w[L][v],c=o.bindForm;if(c)return c(t,g,e,D).then(n);var r;o.q.push([[t,g,e,D],n]),r=I,A||(h.body.append(Object.assign(h.createElement('script'),{id:'captcha-provider',async:!0,src:r})),A=!0)});var g,I,D;w[L]=w[L]||{},w[L][v]=w[L][v]||{},w[L][v].q=[],w[L][y]=w[L][y]||{},w[L][y].protect=function(t,e){n(t,void 0,e),T(t)},Object.freeze(w[L][y]),function(t,e,n,w,h,L){const[v,y,A,g]=function(t,e,n){const i=e?o:[],u=t?c:[],d=[...i,...u],f=r(d),m=r(i),_=r(d.filter((([t,e])=>n.includes(e))));return[a(f),a(m),a(_),s()]}(w,h,L),I=t=>{const e=t.target;return e instanceof HTMLFormElement?e:e&&e.form},D=t=>v().includes(t);t.addEventListener('submit',(t=>{const e=I(t);if(!e)return;const n=D(e)&&!e.dataset.hcaptchaBound&&!e.dataset.recaptchaBound,o=_(e),c=g().includes(e)&&(!o||!o.value);(n||c)&&t.preventDefault(),c&&!n&&(function(t){try{if(!f())return;!function(t){const e=f();if(!e)return;const n=_(t);if(!n)return;const o=n.value;o&&e.removeItem(o)}(t);const e=Array.from(Array(32),(()=>Math.random().toString(36)[2])).join('');!function(t,e){_(t)||t.append(Object.assign(document.createElement('input'),{type:'hidden',name:u})),t.elements[u].value=e}(t,e),function(t,e){const n=f();if(!n)return;const o=[...t.querySelectorAll(`input[type='${i}']`)].map((({name:t})=>t)),c=[...d,...o],r={};for(const[a,s]of new FormData(t).entries())c.includes(a)||(r[a]=s);n.setItem(e,JSON.stringify({[m]:1,action:t.action,data:r}))}(t,e)}catch(e){console.error('failed to persist form',e)}}(e),e.submit())}));const S=(t,e)=>{t&&!t.dataset[E]&&(n(t,e.some((e=>e===t))),T(t))};for(const o of['focusin','change'])t.addEventListener(o,(t=>{const e=I(t);D(e)&&S(e,y())}));const B=e.get('form_key'),M=e.get(l),P=B&&M;t.addEventListener('DOMContentLoaded',(()=>{const t=y();if(P)for(const e of t)e.elements[l].value===M&&p(e,B);[...new Set([...A(),...v().filter((t=>'true'===t.dataset.shopifyCaptcha))])].forEach((e=>S(e,t)))}))}(h,new URLSearchParams(w.location.search),n,t,e,['guest_login'])})(!0,!0)}();</script>
vendor: 1 bytes, line 527
527
528<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//cartwheelcoffee.com/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 528
528
529<script>(function () {var userAgent = navigator.userAgent;var platform = navigator.platform;var maxTouchPoints = navigator.maxTouchPoints || 0;var isIOS = /iPad|iPhone|iPod/.test(platform) || (platform === 'MacIntel' && maxTouchPoints > 1);var isMacSafari = platform.indexOf('Mac') === 0 && /Safari/.test(userAgent) && !/Chrome|Chromium|CriOS|FxiOS|Edg|OPR|Android/.test(userAgent);var isAppleSafari = isIOS || isMacSafari;if (isAppleSafari) {fetch('/sf_private_access_tokens' + location.search).catch(function () {});}function browserMajorVersion(pattern) {var match = userAgent.match(pattern);return match ? parseInt(match[1], 10) : null;}function shouldLoadAutosizesPolyfill() {if (!window.PerformanceObserver?.supportedEntryTypes?.includes('paint')) {return false;}var chromeVersion = browserMajorVersion(/Chrome\/(\d+)/);if (chromeVersion !== null) {return chromeVersion < 126;}var firefoxVersion = browserMajorVersion(/Firefox\/(\d+)/);if (firefoxVersion !== null) {return firefoxVersion < 150;}var safariVersion = isAppleSafari ? browserMajorVersion(/Version\/(\d+).*Safari\//) : null;if (safariVersion !== null) {return safariVersion < 27;}return true;}if (shouldLoadAutosizesPolyfill()) {var autosizesScript = document.createElement('script');autosizesScript.async = true;autosizesScript.crossOrigin = 'anonymous';autosizesScript.src = "//cartwheelcoffee.com/cdn/shopifycloud/storefront/assets/storefront/autosizes-84416378.js";(document.head || document.documentElement).appendChild(autosizesScript);}window.ShopifyAnalytics = window.ShopifyAnalytics || {};window.ShopifyAnalytics.performance = window.ShopifyAnalytics.performance || {};(function () {var LONG_FRAME_THRESHOLD = 50;var longAnimationFrames = [];var activeRafId = null;function collectLongFrames() {var previousTime = null;function rafMonitor(now) {if (activeRafId === null) {return;}var delta = now - previousTime;if (delta > LONG_FRAME_THRESHOLD) {longAnimationFrames.push({startTime: previousTime,endTime: now,});}previousTime = now;activeRafId = requestAnimationFrame(rafMonitor);}previousTime = performance.now();activeRafId = requestAnimationFrame(rafMonitor);}if (!window.PerformanceObserver?.supportedEntryTypes?.includes('long-animation-frame')) {collectLongFrames();var timeoutId = setTimeout(function () {cancelAnimationFrame(activeRafId);}, 10000);window.ShopifyAnalytics.performance.getLongAnimationFrames = function (stopCollection) {if (stopCollection === undefined) {stopCollection = false;}if (stopCollection) {clearTimeout(timeoutId);cancelAnimationFrame(activeRafId);}return longAnimationFrames;};}})();})();</script>
529<script crossorigin="anonymous" defer="defer" src="//cartwheelcoffee.com/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-616277c7.js?v=20250812"></script>
vendor: 1 bytes, line 529
529
530<script id="shopify-origin-trials" async="async" integrity="sha256-qJbe/jEZBHtr5W/BlA2cKAz3vkXu6vJQyLjgvgCC86g=" src="//cdn.shopify.com/shopifycloud/storefront/assets/storefront/origin_trials-318ab40a.js" crossorigin="anonymous" onload="window.__shopifyOriginTrialsDone = true" onerror="window.__shopifyOriginTrialsDone = true"></script>
vendor: 1 bytes, line 530
530
531<script> 532 window.Shopify = window.Shopify || {}; 533 window.Shopify.MCP = window.Shopify.MCP || {}; 534 window.Shopify.MCP.enabled = true; 535 window.Shopify.MCP.shop = "cartwheelcoffee.myshopify.com"; 536 window.Shopify.MCP.mcpEndpoint = "https:\/\/cartwheelcoffee.com\/api\/mcp"; 537 window.Shopify.MCP.tools = [{"name":"search_shop_policies_and_faqs","description":"Used to get facts about the stores policies, products, or services.\nSome examples of questions you can ask are:\n - What is your return policy?\n - What is your shipping policy?\n - What is your phone number?\n - What are your hours of operation?\"\nSet policy_types to also get the store's written policies (full text and URL).\n","inputSchema":{"$schema":"https:\/\/json-schema.org\/draft\/2020-12\/schema","type":"object","properties":{"query":{"type":"string","description":"A natural language query."},"context":{"type":"string","description":"Additional information about the request such as user demographics, mood, location, or other relevant details that could help in tailoring the response appropriately."},"policy_types":{"type":"array","items":{"type":"string","enum":["refund","shipping","privacy","terms_of_service","terms_of_sale","subscription","legal_notice","contact"]},"description":"Policy kinds to fetch, chosen from the user's question â e.g. [\"refund\"] for returns\/exchanges\/damaged items, [\"contact\"] for phone\/hours\/address. Include every kind the question touches. Omit it to get only FAQ answers."}},"required":["query"]}}]; 538</script>
vendor: 1 bytes, line 538
538
539<script>(()=>{var d="shopify:webmcp_adapter_loaded",n=Symbol.for("shopify.webmcp_adapter_loading");function s(c,a,{win:r=window,doc:o=document}={}){function p(){try{return r.localStorage.getItem(d)==="true"}catch{return!1}}function l(){try{r.localStorage.setItem(d,"true")}catch{}}function u(){return typeof(o.modelContext||r.navigator?.modelContext)?.registerTool=="function"}function f(){if(r[n]||!u())return;let t=o.head||o.getElementsByTagName("head")[0];if(!t)return;let e=o.createElement("script");e.type="module",e.crossOrigin="anonymous",a&&(e.integrity=a),e.src=c,e.addEventListener("load",l,{once:!0}),e.addEventListener("error",()=>{r[n]=!1},{once:!0}),t.appendChild(e),r[n]=!0}function _(t){let e=o.getElementById("shopify-origin-trials");if(!e||r.__shopifyOriginTrialsDone){t();return}e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}function i(){_(()=>r.setTimeout(f,0))}function m(){o.addEventListener("DOMContentLoaded",i,{once:!0})}p()?i():m()}s("\/\/cartwheelcoffee.com\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})(); 540</script>
vendor: 1 bytes, line 540
540
541<script data-source-attribution="shopify.dynamic_checkout.dynamic.init">var Shopify=Shopify||{};Shopify.PaymentButton=Shopify.PaymentButton||{isStorefrontPortableWallets:!0,init:function(){window.Shopify.PaymentButton.init=function(){};var t=document.createElement("script");t.src="https://cartwheelcoffee.com/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}}; 542</script>
vendor: 1 bytes, line 542
542
543<script data-source-attribution="shopify.dynamic_checkout.buyer_consent"> 544 function portableWalletsHideBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.add("hidden"),t.setAttribute("aria-hidden","true"),n.removeEventListener("click",e))}function portableWalletsShowBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.remove("hidden"),t.removeAttribute("aria-hidden"),n.addEventListener("click",e))}window.Shopify?.PaymentButton&&(window.Shopify.PaymentButton.hideBuyerConsent=portableWalletsHideBuyerConsent,window.Shopify.PaymentButton.showBuyerConsent=portableWalletsShowBuyerConsent); 545</script>
vendor: 1 bytes, line 545
545
546<script data-source-attribution="shopify.dynamic_checkout.cart.bootstrap">document.addEventListener("DOMContentLoaded",(function(){function t(){return document.querySelector("shopify-accelerated-checkout-cart, shopify-accelerated-checkout")}if(t())Shopify.PaymentButton.init();else{new MutationObserver((function(e,n){t()&&(Shopify.PaymentButton.init(),n.disconnect())})).observe(document.body,{childList:!0,subtree:!0})}})); 547</script>
547 548<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://cartwheelcoffee.com/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous"> 549<style id="shopify-accelerated-checkout-cart"> 550 #shopify-buyer-consent { 551 margin-top: 1em; 552 display: inline-block; 553 width: 100%; 554} 555 556#shopify-buyer-consent.hidden { 557 display: none; 558} 559 560#shopify-subscription-policy-button { 561 background: none; 562 border: none; 563 padding: 0; 564 text-decoration: underline; 565 font-size: inherit; 566 cursor: pointer; 567} 568 569#shopify-subscription-policy-button::before { 570 box-shadow: none; 571} 572 573 </style> 574
575<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
575 576 577 <link href="//cartwheelcoffee.com/cdn/shop/t/29/assets/udesly-common.min.css?v=46349505408170597361790863894" rel="stylesheet" type="text/css" media="all" /> 578 <meta name="google-site-verification" content="H36mZlafvHgkXKlW6ANZeINdBsPUKw5mQ6joPDidJIU"> 579 580 581
581<script src="//cartwheelcoffee.com/cdn/shop/t/29/assets/jquery-3.5.1.min.js?v=133494139889153862371790863894"></script>
581 582 583 584 585 586
586<script async src="https://cdn.sparklayer.io/spark-redirect.js"></script>
586<!-- BEGIN app block: shopify://apps/hoppy-free-shipping/blocks/shipping_bar/66159626-1fb8-4d18-901f-af7b6a63adaa --> 587<link href="//cdn.shopify.com/extensions/01a10abf-3266-789b-b4b3-609356375067/hoppy-free-shipping-356/assets/swiper-scoped.css" rel="stylesheet" type="text/css" media="all" /> 588<link href="https://cdn.shopify.com/extensions/01a10abf-3266-789b-b4b3-609356375067/hoppy-free-shipping-356/assets/swiper.js" as="script" rel="preload"> 589<link href="https://cdn.shopify.com/extensions/01a10abf-3266-789b-b4b3-609356375067/hoppy-free-shipping-356/assets/script.js" as="script" rel="preload"> 590 591 592
593<script async>window.hoppy_free_shipping = { 594 shipping: [] 595 };</script>
595 596 597 598
599<script defer> 600 // =============================== 601 // Currency Handling 602 // =============================== 603 function getStoredRates() { 604 const storedRates = sessionStorage.getItem("currencyRates"); 605 return storedRates ? JSON.parse(storedRates) : null; 606 } 607 608 function storeRates(rates) { 609 sessionStorage.setItem("currencyRates", JSON.stringify(rates)); 610 } 611 612 const cachedRates = getStoredRates(); 613 614 if (cachedRates) { 615 window.futureBlink_currencyRates = cachedRates; 616 } else { 617 fetch(window.Shopify.routes.root + "services/javascripts/currencies.js") 618 .then(response => { 619 if (!response.ok) throw new Error("Failed to load currency data"); 620 return response.text(); 621 }) 622 .then(scriptContent => { 623 const scriptFunction = new Function(scriptContent + "; return Currency.rates;"); 624 window.futureBlink_currencyRates = scriptFunction(); 625 storeRates(window.futureBlink_currencyRates); 626 }) 627 .catch(error => console.error("Error loading currency rates:", error)); 628 } 629 630 window.futureBlink_storeCurrency = "GBP"; 631 window.futureBlink_country = "GB"; 632 window.futureBlink_primaryCurrency = "GBP"; 633 window.futureBlink_money_format = "£{{amount}}"; 634</script>
634 635
636<script defer> 637 // =============================== 638 // Cart info 639 // =============================== 640 window.futureBlink_cart = {"note":null,"attributes":{},"original_total_price":0,"total_price":0,"total_discount":0,"total_weight":0.0,"item_count":0,"items":[],"requires_shipping":false,"currency":"GBP","items_subtotal_price":0,"cart_level_discount_applications":[],"checkout_charge_amount":0}; 641 642 // Collections attached to this product 643 window.futureblink_free_shipping_products = { 644 collections: [], 645 }; 646 647 // Shop language 648 window.futureblink_free_shipping_shopLanguage = "en"; 649 650 window.futureblink_free_shipping_collection = { 651 id: "" 652 }; 653 654 // Current store page details (for specific store pages targeting) 655 window.futureblink_free_shipping_pageDetails = { 656 id: "", 657 handle: "" 658 }; 659 660 window.futureblink_free_shipping_upsellProd = null; 661 // Product details 662 window.futureblink_free_shipping_productDetails = { 663 id:"", 664 price: null, 665 currency: "GBP", 666 handle:"", 667 id:"", 668 tags:null, 669 variants: [ 670 671 ] 672 }; 673 674 // Customer info (if logged in) 675 676 window.futureblink_free_shipping_customerInfo = null; 677 678 679 // =============================== 680 // Product Recommendations (via JSON API) 681 // =============================== 682 window.hoppy_free_shipping_productRecommendations = { 683 product_page:[], 684 cart_page:[] 685 } 686</script>
686 687
688<script src="https://cdn.shopify.com/extensions/01a10abf-3266-789b-b4b3-609356375067/hoppy-free-shipping-356/assets/currencies.js" defer></script>
vendor: 1 bytes, line 688
688
689<script src="https://cdn.shopify.com/extensions/01a10abf-3266-789b-b4b3-609356375067/hoppy-free-shipping-356/assets/countriesWithCurrencycodes.js" defer></script>
vendor: 1 bytes, line 689
689
690<script src="https://cdn.shopify.com/extensions/01a10abf-3266-789b-b4b3-609356375067/hoppy-free-shipping-356/assets/tracker.js" defer></script>
690 691
692<script src="https://cdn.shopify.com/extensions/01a10abf-3266-789b-b4b3-609356375067/hoppy-free-shipping-356/assets/swiper.js" defer></script>
vendor: 1 bytes, line 692
692
693<script src="https://cdn.shopify.com/extensions/01a10abf-3266-789b-b4b3-609356375067/hoppy-free-shipping-356/assets/purify.min.js" defer></script>
vendor: 1 bytes, line 693
693
694<script src="https://cdn.shopify.com/extensions/01a10abf-3266-789b-b4b3-609356375067/hoppy-free-shipping-356/assets/script.js" defer></script>
vendor: 1 bytes, line 694
694
695<script src="https://cdn.shopify.com/extensions/01a10abf-3266-789b-b4b3-609356375067/hoppy-free-shipping-356/assets/interceptor.js" defer></script>
695 696 697 698<!-- END app block --><!-- BEGIN app block: shopify://apps/klaviyo-email-marketing-sms/blocks/klaviyo-onsite-embed/2632fe16-c075-4321-a88b-50b567f42507 --> 699 700 701 702 703 704 705 706 707 708 709 710 711
711<script async src="https://static.klaviyo.com/onsite/js/UTt6hf/klaviyo.js?company_id=UTt6hf"></script>
711 712
712<script>!function(){if(!window.klaviyo){window._klOnsite=window._klOnsite||[];try{window.klaviyo=new Proxy({},{get:function(n,i){return"push"===i?function(){var n;(n=window._klOnsite).push.apply(n,arguments)}:function(){for(var n=arguments.length,o=new Array(n),w=0;w<n;w++)o[w]=arguments[w];var t="function"==typeof o[o.length-1]?o.pop():void 0,e=new Promise((function(n){window._klOnsite.push([i].concat(o,[function(i){t&&t(i),n(i)}]))}));return e}}})}catch(n){window.klaviyo=window.klaviyo||[],window.klaviyo.push=function(){var n;(n=window._klOnsite).push.apply(n,arguments)}}}}();</script>
712 713 714 715 716 717 718 719
719<script> 720 window.klaviyoReviewsProductDesignMode = false 721 </script>
721 722 723 724 725 726 727 728 729 730 731<!-- END app block --><link href="https://cdn.shopify.com/extensions/01a10abf-3266-789b-b4b3-609356375067/hoppy-free-shipping-356/assets/styles.css" rel="stylesheet" type="text/css" media="all"> 732<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
733<script>(function(){if ("sendBeacon" in navigator && "performance" in window) {try {var session_token_from_headers = performance.getEntriesByType('navigation')[0].serverTiming.find(x => x.name == '_s').description;} catch {var session_token_from_headers = undefined;}var session_cookie_matches = document.cookie.match(/_shopify_s=([^;]*)/);var session_token_from_cookie = session_cookie_matches && session_cookie_matches.length === 2 ? session_cookie_matches[1] : "";var session_token = session_token_from_headers || session_token_from_cookie || "";function handle_abandonment_event(e) {var entries = performance.getEntries().filter(function(entry) {return /monorail-edge.shopifysvc.com/.test(entry.name);});if (!window.abandonment_tracked && entries.length === 0) {window.abandonment_tracked = true;var currentMs = Date.now();var navigation_start = performance.timing.navigationStart;var payload = {shop_id: 58695024805,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "blog"};window.navigator.sendBeacon("https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script>
vendor: 1 bytes, line 733
733
734<script> 735 window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || []; 736</script>
vendor: 1 bytes, line 736
736
737<script>(function(){var wpmLoader=function(){"use strict";var e=/Googlebot|Storebot-Google|bingbot|Baiduspider|YandexBot|DuckDuckBot|Slurp|facebookexternalhit|Twitterbot|LinkedInBot|Applebot|AdsBot-Google|Mediapartners-Google|APIs-Google|PetalBot|SemrushBot|AhrefsBot|MJ12bot|DotBot|Acunetix|PerplexityBot|Perplexity-User/i,t=/bytedance/i;function i(){try{var e=document.cookie;if(!e||"string"!=typeof e)return;for(var t=0,i=e.split(";");t<i.length;t++){var n=i[t],r=n.indexOf("=");if(-1!==r){var o=n.slice(0,r).trim();if(o){var a=void 0;try{a=decodeURIComponent(o)}catch(e){a=o}if("_shopify_s"===a){var d=n.slice(r+1).trim();try{return decodeURIComponent(d)}catch(e){return d}}}}}return}catch(e){return}}function n(e){try{"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn(e)}catch(e){}}function r(e,t){return"string"==typeof e&&e.length>0&&e.length<=t?e:void 0}function o(e){var t;switch(null==(t=null==e?void 0:e.navigation)?void 0:t.type){case 0:return"navigate";case 1:return"reload";case 2:return"back_forward";default:return}}function a(){var e,t,i;try{var n=null==(i=null==(t=null==(e=self.ShopifyAnalytics)?void 0:e.lib)?void 0:t.trekkie)?void 0:i.state;return"awaiting-consent"===n||"initialized"===n?n:void 0}catch(e){return}}return function(d,s,u,l){var c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};try{var p=c.trekkieShim;!0!==p&&"true"!==p||null!=window.__TREKKIE_SHIM_QUEUE||(window.__TREKKIE_SHIM_QUEUE=[])}catch(e){}var f,v,h,y,g=(v=(f={modern:/Edge?\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(9{2}|\d{3,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(15\.\d+|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(9{2}|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]\d+|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/([2-9]\d|\d{3,})\.\d+/,legacy:/Edge?\/(1[6-9]|[2-9]\d|\d{3,})\.\d+(\.\d+|)|Firefox\/(5[4-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)|Chrom(ium|e)\/(5[1-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)([\d.]+$|.*Safari\/(?![\d.]+ Edge\/[\d.]+$))|(Maci|X1{2}).+ Version\/(10\.\d+|(1[1-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(3[89]|[4-9]\d|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(10[._]\d+|(1[1-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(5\.\d+|([6-9]|\d{2,})\.\d+)|Android.+MQ{2}Browser\/(14(\.(9|\d{2,})|)|(1[5-9]|[2-9]\d|\d{3,})(\.\d+|))(\.\d+|)|K[Aa][Ii]OS\/(3\.\d+|([4-9]|\d{2,})\.\d+)(\.\d+|)/}).modern,h=f.legacy,(y=navigator.userAgent).match(e)?"bot":y.match(v)?"modern":y.match(h)?"legacy":y.match(t)?"bot":"unknown"),m=function(e){var t,i,n=r(e,128);try{var a=window.performance,d=null==(t=null==a?void 0:a.getEntriesByType)?void 0:t.call(a,"navigation")[0];if(!d)return{requestId:n,navigationType:o(a)};var s="type"in d?r(d.type,64):void 0,u="serverTiming"in d&&Array.isArray(d.serverTiming)?d.serverTiming:[];return{requestId:null!=n?n:r(null==(i=u.find(function(e){return"requestID"===e.name}))?void 0:i.description,128),navigationType:s}}catch(e){return{requestId:n}}}(c.requestId),w=function(e){var t=e.version,r=e.browserTarget,o=e.surface,a=e.shopId,d=e.monorailEndpoint,s=window.location.href;return{emit:function(e){var u=e.status,l=e.errorMsg,c=e.failureReason,p=e.useKeepaliveFallback,f=void 0!==p&&p,v=e.navigationType,h=e.pagehidePersisted,y=e.requestId,g=e.trekkieState;if(d){var m,w;try{var b=(new Date).getTime();m=JSON.stringify({metadata:{event_sent_at_ms:b},events:[{schema_id:"web_pixels_manager_load/3.3",payload:{version:t,bundle_target:r,page_url:s,status:u,surface:o,error_msg:l,failure_reason:c,navigation_type:v,pagehide_persisted:h,request_id:y,trekkie_state:g,shop_id:a,visit_token:i()},metadata:{event_created_at_ms:b}}]})}catch(e){return}try{if("function"==typeof window.navigator.sendBeacon&&-1===(w=window.navigator.userAgent).indexOf("iPhone; CPU iPhone OS 12_")&&-1===w.indexOf("iPad; CPU OS 12_")&&-1===w.indexOf("iPod touch; CPU iPhone OS 12_")&&window.navigator.sendBeacon.bind(window.navigator)(d,m))return}catch(e){}if(f)try{"function"==typeof window.fetch&&window.fetch(d,{method:"POST",headers:{"Content-Type":"text/plain"},body:m,keepalive:!0}
737).catch(function(){})}catch(e){}else try{var _=new XMLHttpRequest;_.open("POST",d,!0),_.setRequestHeader("Content-Type","text/plain"),_.send(m)}catch(e){n("[Web Pixels Manager] Got an unhandled error while logging to Monorail.")}}else n("[Web Pixels Manager] No Monorail endpoint provided, skipping logging.")}}}({version:u,browserTarget:g,surface:d.surface,shopId:d.shopId,monorailEndpoint:d.monorailEndpoint});if(Boolean(null==(_=null==(b=window.Shopify)?void 0:b.analytics)?void 0:_.replayQueue))w.emit({status:"setup-skipped",errorMsg:"replay queue already initialized."});else{var b,_;w.emit({status:"setup-started"}),window.Shopify=window.Shopify||{};var S=window.Shopify;S.analytics=S.analytics||{};var P=S.analytics;P.replayQueue=[],P.publish=function(e,t,i){return P.replayQueue.push([e,t,i]),!0};try{self.performance.mark("wpm:start")}catch(e){}var k,C="modern"===g?"modern":"legacy",E=(null!=l?l:{modern:"",legacy:""})[C],I=[(k={baseUrl:s,hashVersion:u,buildTarget:C}).baseUrl,"/wpm","/b",k.hashVersion,"modern"===k.buildTarget?"m":"l",".js"].join(""),O=!1,T=!1;try{c.browserTarget=g,function(){O=!0;try{window.addEventListener("pagehide",M)}catch(e){O=!1}}(),R(function(){try{R(x)}catch(e){D(e)}}),w.emit({status:"loading",requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()})}catch(e){D(e)}}function U(){var e;if(q(),!function(){var e,t;return Boolean(null==(t=null==(e=window.Shopify)?void 0:e.analytics)?void 0:t.initialized)}()){var t,i,n;try{if("function"!=typeof(null==(e=window.webPixelsManager)?void 0:e.init))return void A();if(!(null!==(n=i=t=window.webPixelsManager.init(d))&&"function"!=typeof n&&Object(n)===n&&"publish"in i&&"function"==typeof i.publish&&"publishCustomEvent"in i&&"function"==typeof i.publishCustomEvent&&"visitor"in i&&"function"==typeof i.visitor))return void A()}catch(e){return void A(e)}var r=window.Shopify.analytics;r.replayQueue.forEach(function(e){var i=e[0],n=e[1],r=e[2];t.publishCustomEvent(i,n,r)}),r.replayQueue=[],r.publish=t.publishCustomEvent,r.visitor=t.visitor,r.initialized=!0}}function A(e){B("manager_api_unavailable",void 0===e?void 0:Q(e))}function x(){B("script_load_failed","".concat(I," has failed to load"))}function B(e,t){T||(T=!0,q(),w.emit({status:"failed",errorMsg:t,failureReason:e,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function M(e){O&&(q(),w.emit({status:"pagehide-while-loading",useKeepaliveFallback:!0,pagehidePersisted:e.persisted,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function q(){O=!1;try{window.removeEventListener("pagehide",M)}catch(e){}}function R(e){var t;!function(e){var t=e.src,i=e.async,n=void 0===i||i,r=e.onload,o=e.onerror,a=e.sri,d=e.scriptDataAttributes,s=void 0===d?{}:d,u=document.createElement("script"),l=document.querySelector("head"),c=document.querySelector("body");if(u.async=n,u.src=t,a&&(u.integrity=a,u.crossOrigin="anonymous"),s)for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))try{u.dataset[p]=String(s[p])}catch(e){}if(r&&u.addEventListener("load",r),o&&u.addEventListener("error",o),l)l.appendChild(u);else{if(!c)throw new Error("Did not find a head or body element to append the script");c.appendChild(u)}}({src:I,async:!0,onload:U,onerror:e,sri:(t=E,"string"==typeof t&&/^sha384-[A-Za-z0-9+/=]+$/.test(t)?E:""),scriptDataAttributes:c})}function D(e){B("script_append_failed",Q(e))}function Q(e){return e instanceof Error?e.message:"Unknown error"}}}();wpmLoader({shopId: 58695024805,storefrontBaseUrl: "https://cartwheelcoffee.com",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://cartwheelcoffee.com/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["4c64608a","16072cab","8450a54b","7ee89bf1"],webPixelsConfigList: [{"id":"3983442297","configuration":"{\"apiKey\":\"3N6A1k0a8S\",\"host\":\"searchserverapi1.com\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"5559ea45e47b67d15b30b79e7c6719da","type":"APP","apiClientId":578825,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_personal_data"],"dataSharingControls":["share_all_events"]}
737,"dataSharingState":"unrestricted"},{"id":"2983199097","configuration":"{\"appDomain\":\"app.sparklayer.io\", \"siteId\":\"cartwheelcoffeeroasters\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"6a76237eeb1360eba576db0f81c798cb","type":"APP","apiClientId":4974139,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"2844655993","configuration":"{\"accountID\":\"UTt6hf\",\"webPixelConfig\":\"eyJlbmFibGVBZGRlZFRvQ2FydEV2ZW50cyI6IHRydWV9\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"c63c5b72c8d77be5f2d27d14c081da38","type":"APP","apiClientId":123074,"privacyPurposes":["ANALYTICS","MARKETING"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"1751155065","configuration":"{\"hashed_organization_id\":\"3939d0090621530b91af687c80bdedf9_v1\",\"app_key\":\"cartwheelcoffee\",\"allow_collect_personal_data\":\"true\",\"connection_id\":\"1a6322f6a4fd4f7e853e902b79644bb1\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"3f0fd3f7354ca64f6bba956935131bea","type":"APP","apiClientId":5362669,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"624558245","configuration":"{\"config\":\"{\\\"pixel_id\\\":\\\"G-050FMVK2EH\\\",\\\"target_country\\\":\\\"GB\\\",\\\"gtag_events\\\":[{\\\"type\\\":\\\"search\\\",\\\"action_label\\\":[\\\"G-050FMVK2EH\\\",\\\"AW-11359697582\\\/HhJpCOWAlekYEK713Kgq\\\"]},{\\\"type\\\":\\\"begin_checkout\\\",\\\"action_label\\\":[\\\"G-050FMVK2EH\\\",\\\"AW-11359697582\\\/CU6KCOuAlekYEK713Kgq\\\"]},{\\\"type\\\":\\\"view_item\\\",\\\"action_label\\\":[\\\"G-050FMVK2EH\\\",\\\"AW-11359697582\\\/lAtcCOKAlekYEK713Kgq\\\",\\\"MC-DSCN7XPJD2\\\"]},{\\\"type\\\":\\\"purchase\\\",\\\"action_label\\\":[\\\"G-050FMVK2EH\\\",\\\"AW-11359697582\\\/-8ZwCNyAlekYEK713Kgq\\\",\\\"MC-DSCN7XPJD2\\\"]},{\\\"type\\\":\\\"page_view\\\",\\\"action_label\\\":[\\\"G-050FMVK2EH\\\",\\\"AW-11359697582\\\/nHBGCN-AlekYEK713Kgq\\\",\\\"MC-DSCN7XPJD2\\\"]},{\\\"type\\\":\\\"add_payment_info\\\",\\\"action_label\\\":[\\\"G-050FMVK2EH\\\",\\\"AW-11359697582\\\/PwfRCO6AlekYEK713Kgq\\\"]},{\\\"type\\\":\\\"add_to_cart\\\",\\\"action_label\\\":[\\\"G-050FMVK2EH\\\",\\\"AW-11359697582\\\/je5MCOiAlekYEK713Kgq\\\"]}],\\\"enable_monitoring_mode\\\":false}\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"a3321ca85cf5aaf6b57585fcd8d67b3a","type":"APP","apiClientId":1780363,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"173342885","configuration":"{\"pixel_id\":\"600372217248825\",\"pixel_type\":\"facebook_pixel\",\"metaapp_system_user_token\":\"-\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"bd2f978c17a94bbb8a74d43de2165dc5","type":"APP","apiClientId":2329312,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"28967077","configuration":"{\"myshopifyDomain\":\"cartwheelcoffee.myshopify.com\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"23b97d18e2aa74363140dc29c9284e87","type":"APP","apiClientId":2775569,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_phone","read_customer_personal_data"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"}
737,{"id":"173605241","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"1","type":"CUSTOM","privacyPurposes":["ANALYTICS"],"name":"Google Analytics tag (migrated)"},{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"Cartwheel Coffee Roasters","paymentSettings":{"currencyCode":"GBP"},"myshopifyDomain":"cartwheelcoffee.myshopify.com","countryCode":"GB","storefrontUrl":"https:\/\/cartwheelcoffee.com"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[],"purchasingCompany":null},},"https://cartwheelcoffee.com/cdn","5982071ew7ea472e3p69b68784m2150dfea",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"true","themeId":"199928807801","themePublished":"true","eventMetadataId":"79bb5225-0110-4687-ba37-a9c9d43bd22e","pageType":"blog","resourceId":"81063936165","shopId":"58695024805","storefrontBaseUrl":"https:\/\/cartwheelcoffee.com","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"4c64608a\", \"16072cab\", \"8450a54b\", \"7ee89bf1\"]","isMerchantRequest":"false","hashVersion":"5982071ew7ea472e3p69b68784m2150dfea","publish":"custom","events":"[[\"page_viewed\",{}]]"});})();</script>
737<script> 738 window.ShopifyAnalytics = window.ShopifyAnalytics || {}; 739 window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; 740 window.ShopifyAnalytics.meta.currency = 'GBP'; 741 var meta = {"page":{"pageType":"blog","resourceType":"blog","resourceId":81063936165,"requestId":"17ea0285-3056-4a98-ba22-7576e2bc0eaa-1791235920"}}; 742 for (var attr in meta) { 743 window.ShopifyAnalytics.meta[attr] = meta[attr]; 744 } 745</script>
vendor: 1 bytes, line 745
745
746<script class="analytics"> 747 (function () { 748 var customDocumentWrite = function(content) { 749 var jquery = null; 750 751 if (window.jQuery) { 752 jquery = window.jQuery; 753 } else if (window.Checkout && window.Checkout.$) { 754 jquery = window.Checkout.$; 755 } 756 757 if (jquery) { 758 jquery('body').append(content); 759 } 760 }; 761 762 var hasLoggedConversion = function(token) { 763 if (token) { 764 return document.cookie.indexOf('loggedConversion=' + token) !== -1; 765 } 766 return false; 767 } 768 769 var setCookieIfConversion = function(token) { 770 if (token) { 771 var twoMonthsFromNow = new Date(Date.now()); 772 twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2); 773 774 document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow; 775 } 776 } 777 778 var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || []; 779 window.ShopifyAnalytics.lib.trekkie = window.trekkie; 780 if (trekkie.integrations) { 781 return; 782 } 783 trekkie.methods = [ 784 'identify', 785 'page', 786 'ready', 787 'track', 788 'trackForm', 789 'trackLink' 790 ]; 791 trekkie.factory = function(method) { 792 return function() { 793 var args = Array.prototype.slice.call(arguments); 794 args.unshift(method); 795 trekkie.push(args); 796 if (method == 'track' || method == 'page') { 797 var pageUrl; 798 try { 799 pageUrl = window.location.href; 800 } catch (e) {} 801 var pageReferrer; 802 try { 803 pageReferrer = document.referrer; 804 } catch (e) {} 805 try { 806 if (window.__TREKKIE_SHIM_QUEUE == null) { 807 window.__TREKKIE_SHIM_QUEUE = []; 808 } 809 window.__TREKKIE_SHIM_QUEUE.push({ 810 from: 'trekkie-stub', 811 method: method, 812 args: args.slice(1), 813 pageContext: { 814 url: pageUrl, 815 referrer: pageReferrer 816 } 817 }); 818 } catch (e) { 819 // no-op 820 } 821 } 822 return trekkie; 823 }; 824 }; 825 for (var i = 0; i < trekkie.methods.length; i++) { 826 var key = trekkie.methods[i]; 827 trekkie[key] = trekkie.factory(key); 828 } 829 trekkie.load = function(config) { 830 trekkie.config = config || {}; 831 trekkie.config.initialDocumentCookie = document.cookie; 832 var first = document.getElementsByTagName('script')[0]; 833var script = document.createElement('script'); 834script.type = 'text/javascript'; 835script.onerror = function(e) { 836 var scriptFallback = document.createElement('script'); 837 scriptFallback.type = 'text/javascript'; 838 scriptFallback.onerror = function(error) { 839 var Monorail = { 840 produce: function produce(monorailDomain, schemaId, payload) { 841 var currentMs = new Date().getTime(); 842 var event = { 843 schema_id: schemaId, 844 payload: payload, 845 metadata: { 846 event_created_at_ms: currentMs, 847 event_sent_at_ms: currentMs 848 } 849 }; 850 return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event)); 851 }, 852 sendRequest: function sendRequest(endpointUrl, payload) { 853 // Try the sendBeacon API 854 if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) { 855 var blobData = new window.Blob([payload], { 856 type: 'text/plain' 857 }); 858 859 if (window.navigator.sendBeacon(endpointUrl, blobData)) { 860 return true; 861 } // sendBeacon was not successful 862 863 } // XHR beacon 864 865 var xhr = new XMLHttpRequest(); 866 867 try { 868 xhr.open('POST', endpointUrl); 869 xhr.setRequestHeader('Content-Type', 'text/plain'); 870 xhr.send(payload); 871 } catch (e) { 872 console.log(e); 873 } 874 875 return false; 876 }, 877 isIos12: function isIos12() { 878 return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1; 879 } 880 }; 881 Monorail.produce('monorail-edge.shopifysvc.com', 882 'trekkie_storefront_load_errors/1.1', 883 {shop_id: 58695024805, 884 theme_id: 199928807801, 885 app_name: "storefront", 886 context_url: window.location.href, 887 source_url: "//cartwheelcoffee.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js"}); 888 889 }; 890 scriptFallback.async = true; 891 scriptFallback.src = '//cartwheelcoffee.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js'; 892 first.parentNode.insertBefore(scriptFallback, first); 893}; 894script.async = true; 895script.src = '//cartwheelcoffee.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js'; 896first.parentNode.insertBefore(script, first); 897 898 }; 899 trekkie.load( 900 {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":58695024805,"isMerchantRequest":null,"themeId":199928807801,"themeCityHash":"13611227471835496061","contentLanguage":"en","currency":"GBP","eventMetadataId":"79bb5225-0110-4687-ba37-a9c9d43bd22e"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b","7ee89bf1","4c64608a"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":true,"source":"trekkie-storefront-renderer","apiClientId":580111}} 901 ); 902 903 var loaded = false;
904 trekkie.ready(function() { 905 if (loaded) return; 906 loaded = true; 907 908 window.ShopifyAnalytics.lib = window.trekkie; 909 910 var originalDocumentWrite = document.write; 911 document.write = customDocumentWrite; 912 try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {}; 913 document.write = originalDocumentWrite; 914 915 var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/) 916 var token = match? match[1]: undefined; 917 if (!hasLoggedConversion(token)) { 918 setCookieIfConversion(token); 919 920 } 921 }); 922 923 window.ShopifyAnalytics.lib.page(null,{"pageType":"blog","resourceType":"blog","resourceId":81063936165,"requestId":"17ea0285-3056-4a98-ba22-7576e2bc0eaa-1791235920","shopifyEmitted":true}); 924 925 var eventsListenerScript = document.createElement('script'); 926 eventsListenerScript.async = true; 927 eventsListenerScript.src = "//cartwheelcoffee.com/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js"; 928 document.getElementsByTagName('head')[0].appendChild(eventsListenerScript); 929})();</script>
929 930
930<script> 931 if (!window.ga || (window.ga && typeof window.ga !== 'function')) { 932 window.ga = function ga() { 933 (window.ga.q = window.ga.q || []).push(arguments); 934 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 935 window.Shopify.analytics.publish("ga_stub_called", {}, {sendTo: "google_osp_migration"}); 936 } 937 console.error("Shopify's Google Analytics stub called with:", Array.from(arguments), "\nSee https://help.shopify.com/manual/promoting-marketing/pixels/pixel-migration#google for more information."); 938 }; 939 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 940 window.Shopify.analytics.publish("ga_stub_initialized", {}, {sendTo: "google_osp_migration"}); 941 } 942 } 943</script>
vendor: 1 bytes, line 943
943
944<script 945 defer 946 src="https://cartwheelcoffee.com/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.4.min.js" 947 data-application="storefront-renderer" 948 data-shop-id="58695024805" 949 data-render-region="gcp-us-west1" 950 data-page-type="blog" 951 data-theme-instance-id="199928807801" 952 data-theme-name="cartwheel" 953 data-theme-version="2.0.0" 954 data-monorail-region="shop_domain" 955 data-resource-timing-sampling-rate="10" 956 data-shs="true" 957 data-shs-beacon="true" 958 data-shs-export-with-fetch="true" 959 data-shs-logs-sample-rate="1" 960 data-shs-beacon-endpoint="https://cartwheelcoffee.com/api/collect" 961></script>
961 962<meta name="shopify-y" content="a2f288af-671e-4fa9-bd48-7b2398ccf7ba" data-expiration="1822793520000"><meta name="shopify-s" content="e12be5ae-fd54-4a77-b920-b1ae75e4634e" data-expiration="1791237720000"><meta name="new-cookie-storage-activated" content="t"> 963</head> 964 <body 965 class="template-blog" 966 967 > 968 969 970 <div class="tag tag-wrap"></div> 971 <div class="global-styles"> 972<style data-shopify> 973 974 .cart_price.recurring_price { 975 margin-left: 0; 976 } 977 .cart-items { 978 height: initial; 979 min-height: 140px; 980 } 981 982 983 984 /* Brew Guides Text (Cards) */ 985 .h2-brew { 986 width: min-intrinsic; 987 width: -webkit-min-content; 988 width: -moz-min-content; 989 width: min-content; 990 display: table-caption; 991 display: -ms-grid; 992 -ms-grid-columns: min-content; 993 } 994 /* Custom Grid lines */ 995 .shop_collection.w-dyn-item:nth-child(0n + 3) { 996 border-right: none; 997 } 998 .shop_collection.w-dyn-item:nth-child(3n + 3) { 999 border-right: none; 1000 } 1001 /* List Styles */ 1002 .subscription_ul { 1003 list-style-type: "-"; 1004 } 1005 /* Last of Type */ 1006 .cart_products-wrapper:last-of-type { 1007 border-bottom: none; 1008 } 1009 .blog-margin:last-of-type { 1010 margin-bottom: 0; 1011 } 1012 .cart_products-wrapper:last-of-type { 1013 margin-bottom: 0; 1014 } 1015 .rich-text-field p:last-of-type { 1016 margin-bottom: 0; 1017 } 1018 /* Pointer Events */ 1019 .product-label, 1020 .q-num2 { 1021 pointer-events: none; 1022 } 1023 #product, 1024 #guides { 1025 pointer-events: auto; 1026 } 1027 /* Quantity Buttons */ 1028 .q-icon, { 1029 user-select: none !important; 1030 } 1031 /* Slider Cards (Brew Guides) */ 1032 /* .brew-guides-item, .slick-item-guides {aspect-ratio:1/1;} */ 1033 /* Nav */ 1034 .nav-menu-full_overflow { 1035 height: calc(100vh - 80px); 1036 } 1037 .menu-area_bk { 1038 min-height: calc(100% + 1px); 1039 } 1040 /* Hide Scrollbars */ 1041 .filters-wrapper::-webkit-scrollbar, 1042 .product-options-m-wrapper::-webkit-scrollbar, 1043 .store-tabs-menu::-webkit-scrollbar, 1044 .subscription-wrapper::-webkit-scrollbar {
1045 display: none; 1046 } 1047 /* Media Queries */ 1048 @media only screen and (max-width: 991px) { 1049 /* Nav */ 1050 .nav-menu-full_overflow { 1051 height: auto; 1052 } 1053 /* Images */ 1054 .full-width-img, 1055 .locations-img { 1056 aspect-ratio: 16 / 9; 1057 } 1058 } 1059 /* 1921px (super large resolution) */ 1060 @media only screen and (min-width: 1921px) { 1061 .about-img, 1062 .about-img-2 { 1063 max-width: 15em; 1064 max-height: none; 1065 } 1066 body { 1067 font-size: 16px; 1068 } 1069 .section.wholesale-full-img.overflow-hidden { 1070 padding-top: 20em; 1071 }; 1072 /* .main-hero {min-height:70vh;} */ 1073 } 1074 /* 2400px (super large resolution) */ 1075 @media only screen and (min-width: 2000px) { 1076 ; 1077 /* .main-hero {min-height:100vh;} */ 1078 } 1079 /* Menu ellipsis animation */ 1080 .roasting-time-ful-nav:after, 1081 .load-text-mono:after, 1082 .loader_load-text-mono:after { 1083 content: "..."; 1084 overflow: hidden; 1085 display: inline-block; 1086 vertical-align: bottom; 1087 animation: ellipsis-dot 1s infinite 0.3s; 1088 animation-fill-mode: fowards; 1089 width: 1.25em; 1090 } 1091 @keyframes ellipsis-dot { 1092 25% { 1093 content: ""; 1094 } 1095 50% { 1096 content: "."; 1097 } 1098 75% { 1099 content: ".."; 1100 } 1101 100% { 1102 content: "..."; 1103 } 1104 } 1105</style> 1106</div> 1107 1108 <main id="wrapper" data-w-id="33d2f058-eb0a-6998-ec91-9b3b9afa65c6" class="main" role="main" tabindex="-1"> 1109 <!-- BEGIN sections: header-group --> 1110<div id="shopify-section-sections--30520046453113__full-menu-component" class="shopify-section shopify-section-group-header-group nav-header"><div class="nav-full"> 1111 <div class="nav-wrapper full-menu"> 1112 <a href="https://cartwheelcoffee.com" aria-current="page" class="logo-brand w-nav-brand w--current"> 1113 1114 <img src="//cartwheelcoffee.com/cdn/shop/files/logo-mark-white.svg?crop=center&height=48&v=1747733750&width=48" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/logo-mark-white.svg?crop=center&height=48&v=1747733750&width=48 48w" width="48" height="48" loading="eager" class="logo-mark-nav-full"> 1115 1116 </a> 1117 <div class="menu_roasting-info-top"> 1118 <div id="timeMobile" class="time">10:03am</div> 1119 <div class="div-block-382"> 1120 <div class="coffee-time-text"> 1121 Currently <span class="span_editor-time">/ </span 1122 ><span id="roastingMobile" class="span_editor-time roasting-time-ful-nav">RoastinG</span> 1123 </div> 1124 </div> 1125 </div><a data-w-id="b37eb6e6-2026-5dfe-1ee8-b1f01c10bdca" href="#" class="nav-link-block menu_close w-inline-block"> 1126 <img src="//cartwheelcoffee.com/cdn/shop/t/29/assets/nav-close.svg?v=106155978684426472691790863894" loading="lazy" alt="" class="nav-burger" width="32" height="32"> 1127 </a> 1128 </div> 1129 <div class="nav-menu-full_overflow"> 1130 <div class="w-layout-grid grid-full_nav"><img src="//cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&width=3840" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&width=375 375w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&width=550 550w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&width=750 750w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&width=1100 1100w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&width=1500 1500w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&width=1780 1780w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&width=2000 2000w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&width=3000 3000w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&width=3840 3840w" height="664" loading="lazy" sizes="100vw" class="menu-area_bk image-grid"> 1131<div id="w-node-ee93a0b9-aeab-f774-c421-508181c26edb-1c10bdc5" class="menu-area_links"> 1132 <ul role="list" class="nav-full_menu-list"> 1133 1134 <li class="nav-item-list"> 1135 <a href="/pages/store" class="nav-li-link is--large">Store</a> 1136 </li> 1137 1138 <li class="nav-item-list"> 1139 <a href="/pages/subscription" class="nav-li-link is--large">Subscriptions</a> 1140 </li> 1141 1142 <li class="nav-item-list"> 1143 <a href="/pages/wholesale" class="nav-li-link is--large">Wholesale</a> 1144 </li> 1145 1146 <li class="nav-item-list"> 1147 <a href="/pages/locations" class="nav-li-link is--large">Locations</a> 1148 </li> 1149 1150 </ul> 1151 </div> 1152 <div id="w-node-_37fada93-d12a-c891-7c30-e8360c6d78e7-1c10bdc5" class="menu-area_slinks"> 1153 <ul role="list" class="nav-full_menu-list-nav"><li class="megamenu-block list-item full-menu" > 1154 <div class="menu-area_text"> 1155 <div class="menu-area_text-title">say hello</div> 1156 <div class="menu-area_text-text"><p><a href="mailto:[email protected]" title="mailto:[email protected]">[email protected]</a></p></div> 1157 </div> 1158 </li><li class="megamenu-block list-item full-menu" > 1159 <div class="menu-area_text-title">Social</div><a href="https://www.instagram.com/cartwheelcoffee/" target="_blank" class="nav-menu-full-social" 1160 ><span class="nav-menu-full_span">insta</span></a 1161 > <span class="nav-menu-full_span">/</span><a href="https://www.facebook.com/cartwheelcoffee" target="_blank" class="nav-menu-full-social" 1162 ><span class="nav-menu-full_span">fb</span></a 1163 > <span class="nav-menu-full_span">/</span> <a 1164 href="https://www.tiktok.com/@cartwheelcoffee" 1165 target="_blank" 1166 class="nav-menu-full-social" 1167 ><span class="nav-menu-full_span">tiktok</span></a 1168 ></li><li class="megamenu-block list-item full-menu" > 1169 <div class="menu-area_text"> 1170 <div class="menu-area_text-title">Wholesale</div> 1171 <div class="menu-area_text-text"><p><a href="mailto:[email protected]" title="mailto:[email protected]">[email protected]</a></p></div> 1172 </div> 1173 </li><li class="megamenu-block list-item full-menu" > 1174 <div class="menu-area_text"> 1175 <div class="menu-area_text-title">Roasted in</div> 1176 <div class="menu-area_text-text"><p><a href="https://www.google.com/maps/place/Cartwheel+Cafe+and+Roastery/@52.9514354,-1.1498795,17z/data=!3m1!4b1!4m5!3m4!1s0x4879c3d4e0d4ef71:0xcd61c2d44e70ea57!8m2!3d52.9514322!4d-1.1476908" target="_blank" title="https://www.google.com/maps/place/Cartwheel+Cafe+and+Roastery/@52.9514354,-1.1498795,17z/data=!3m1!4b1!4m5!3m4!1s0x4879c3d4e0d4ef71:0xcd61c2d44e70ea57!8m2!3d52.9514322!4d-1.1476908">Nottingham, UK</a></p></div> 1177 </div> 1178 </li></ul> 1179 </div> 1180 <div id="w-node-fde16777-767a-1621-4577-7e013ee9dfba-1c10bdc5" class="menu-area_small-links"> 1181 <div class="small-links"> 1182 1183 <a href="/pages/about" class="nav-li-link text-lowercase">About</a> 1184 1185 <a href="/pages/brew-guides" class="nav-li-link text-lowercase">Brew Guides</a> 1186 1187 <a href="/pages/workshops" class="nav-li-link text-lowercase">Workshops</a> 1188 1189 <a href="/blogs/articles" class="nav-li-link text-lowercase">Blog</a> 1190 1191 <a href="/pages/faq" class="nav-li-link text-lowercase">FAQ</a> 1192 1193 </div> 1194 </div> 1195 <div id="w-node-_02dcaa8e-1e2c-230e-be19-f3f1b91e2457-1c10bdc5" class="menu-area_info"> 1196 <div class="menu_roasting-info"> 1197 <div id="timeDesktop" class="time">10:03am</div> 1198 <div class="div-block-369"> 1199 <div class="coffee-time-text">Currently </div> 1200 <div class="span_editor-time roasting-time-ful-nav">/ <span id="roastingDesktop">Roaster</span></div> 1201 </div> 1202
1202<script> 1203 document.addEventListener('DOMContentLoaded', function () { 1204 function formatAMPM(date) { 1205 var hours = date.getHours(); 1206 var minutes = date.getMinutes(); 1207 var ampm = hours >= 12 ? 'pm' : 'am'; 1208 hours = hours % 12; 1209 hours = hours ? hours : 12; // the hour '0' should be '12' 1210 minutes = minutes < 10 ? '0' + minutes : minutes; 1211 var strTime = hours + ':' + minutes + '' + ampm; 1212 return strTime; 1213 } 1214 var roastingTime = 14; 1215 var roastingText = document.getElementById('roastingDesktop') 1216 ? document.getElementById('roastingDesktop').textContent 1217 : ''; 1218 var menuButtons = document.querySelectorAll('.menu'); 1219 menuButtons.forEach(function (menuBtn) { 1220 menuBtn.addEventListener('click', function () { 1221 console.log('Menu clicked'); 1222 var checkHours = new Date().getHours(); 1223 var timeStr = formatAMPM(new Date()); 1224 var timeDesktop = document.getElementById('timeDesktop'); 1225 var timeMobile = document.getElementById('timeMobile'); 1226 if (timeDesktop) timeDesktop.textContent = timeStr; 1227 if (timeMobile) timeMobile.textContent = timeStr; 1228 var roastingDesktop = document.getElementById('roastingDesktop'); 1229 var roastingMobile = document.getElementById('roastingMobile'); 1230 if (roastingDesktop) roastingDesktop.innerHTML = checkHours >= 15 ? 'Delivering' : 'Roasting'; 1231 if (roastingMobile) roastingMobile.innerHTML = checkHours >= 15 ? 'Delivering' : 'Roasting'; 1232 }); 1233 }); 1234 }); 1235 </script>
1235 1236 </div><div class="w-layout-grid copyright-full-menu is--desktop"> 1237 1238 1239 1240 1241 1242<div class="copyright-text" > 1243 cartwheel coffee roasters © <span class="copyright-date">2026</span> 1244 </div> 1245<a class="copyright-text" href="/pages/delivery-and-shipping" > 1246 Shipping 1247 </a> 1248<a class="copyright-text" href="/pages/terms-and-conditions" > 1249 terms & conditions 1250 </a> 1251 </div> 1252 </div> 1253 <div id="w-node-_02dcaa8e-1e2c-230e-be19-f3f1b91e2461-1c10bdc5" class="menu_copyright"> 1254 <div class="w-layout-grid copyright-full-menu"> 1255 1256 1257 1258 1259 1260<div class="copyright-text"> 1261 cartwheel coffee roasters © <span class="copyright-date">2026</span> 1262 </div> 1263<a class="copyright-text" href="/pages/delivery-and-shipping"> 1264 Shipping 1265 </a> 1266<a class="copyright-text" href="/pages/terms-and-conditions"> 1267 terms & conditions 1268 </a> 1269 </div> 1270 </div> 1271 </div> 1272 </div> 1273 <div class="bk"></div> 1274</div> 1275
1276<script> 1277 var currentSection = document.currentScript.closest('.shopify-section'); 1278 currentSection.setAttribute('class', 'nav-header'); 1279</script>
1279 1280 1281 1282</div><div id="shopify-section-sections--30520046453113__dark-nav-styles" class="shopify-section shopify-section-group-header-group enable-dark-nav w-embed"><style data-shopify> 1283 .is--dark { 1284 color: var(--color-foreground); 1285 } 1286 1287 .is--dark-logo { 1288 filter: invert(100%) !important; 1289 } 1290 .is--dark.w-nav-link.w--current { 1291 color: var(--color-foreground); 1292 } 1293 1294 .logo-mark-nav.is--home { 1295 opacity: 1 !important; 1296 } 1297 1298</style> 1299
1300<script> 1301 var currentSection = document.currentScript.closest('.shopify-section'); 1302 currentSection.setAttribute('class', 'enable-dark-nav w-embed'); 1303</script>
1303 1304 1305 1306</div><div id="shopify-section-sections--30520046453113__nav-home-component" class="shopify-section shopify-section-group-header-group header"> 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319<div 1320 data-collapse="none" 1321 data-animation="default" 1322 data-duration="400" 1323 data-w-id="b6432bd8-3dc1-714e-9459-00ca67bfb221" 1324 role="banner" 1325 class="navbar w-nav" 1326 x-data="{ 1327 openSubmenuIndex: null, 1328 isDesktop: true, 1329 menuOpen: false, 1330 1331 init() { 1332 const mq = window.matchMedia('(min-width: 1024px)'); 1333 this.isDesktop = mq.matches; 1334 const update = (e) => { 1335 this.isDesktop = e.matches; 1336 if (this.isDesktop) { 1337 // ensure body scrolling is restored when switching to desktop 1338 document.body.style.overflow = ''; 1339 } else { 1340 // if mobile and a menu is open, keep body locked 1341 if (this.menuOpen || this.openSubmenuIndex !== null) { 1342 document.body.style.overflow = 'hidden'; 1343 } 1344 } 1345 }; 1346 if (mq.addEventListener) mq.addEventListener('change', update); else mq.addListener(update); 1347 1348 // Watch menuOpen to lock body scroll when mobile menu opens 1349 this.$watch('menuOpen', (value) => { 1350 if (!this.isDesktop) { 1351 document.body.style.overflow = value ? 'hidden' : (this.openSubmenuIndex !== null ? 'hidden' : ''); 1352 } 1353 }); 1354 1355 // Watch openSubmenuIndex to lock body scroll when a submenu is opened on mobile 1356 this.$watch('openSubmenuIndex', (value) => { 1357 if (!this.isDesktop) { 1358 // lock if submenu opened, or keep locked if menuOpen is true 1359 document.body.style.overflow = (value !== null || this.menuOpen) ? 'hidden' : ''; 1360 } 1361 }); 1362 }, 1363 toggleSubmenu(index) { 1364 // desktop keeps hover behaviour; mobile toggles submenu index 1365 if (this.isDesktop) return; 1366 this.openSubmenuIndex = this.openSubmenuIndex === index ? null : index; 1367 } 1368 }" 1369 x-init="init()" 1370 @mouseleave="if(isDesktop) openSubmenuIndex = null" 1371> 1372 <div 1373 class="nav-wrapper" 1374 :class="{ 'menu-open': menuOpen, 'expand-menu-open': !isDesktop && openSubmenuIndex !== null }" 1375 > 1376 <a 1377 href="/" 1378 id="header-logo" 1379 aria-current="page" 1380 class="logo-brand is--home w-nav-brand w--current" 1381 > 1382 1383<img src="//cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_small-svg.svg?v=1748615125&width=600" alt="Cartwheel Coffee Roasters" srcset="//cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_small-svg.svg?v=1748615125&width=150 150w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_small-svg.svg?v=1748615125&width=225 225w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_small-svg.svg?v=1748615125&width=300 300w" width="150" height="32.39564428312159" loading="eager" class="logo-mark-nav is--home" sizes="(max-width: 300px) 50vw, 150px" data-w-id="b6432bd8-3dc1-714e-9459-00ca67bfb225"> 1384 1385</a> 1386 <button 1387 data-w-id="b6432bd8-3dc1-714e-9459-00ca67bfb227" 1388 class="nav-back-button" 1389 aria-label="Back to menu" 1390 @click="if(!isDesktop) { openSubmenuIndex = null } else { menuOpen = !menuOpen }" 1391 > 1392 <img 1393 src="//cartwheelcoffee.com/cdn/shop/t/29/assets/icon-caret.svg?v=49853205159198249131790863894" 1394 loading="lazy" 1395 data-w-id="b6432bd8-3dc1-714e-9459-00ca67bfb283" 1396 alt="Back" 1397 class="nav-back" 1398 width="32" 1399 height="32" 1400 > 1401 </button> 1402 <div class="nav-menu--items"> 1403 <nav 1404 role="navigation" 1405 class="nav-menu-main w-nav-menu" 1406 style="--menu-column: 6;" 1407 > 1408 1409 1410 1411 1412<a 1413 href="/collections/coffee" 1414 class="nav-link is--dark w-nav-link" 1415 @mouseenter="if(isDesktop) openSubmenuIndex = 0" 1416 @click="if(!isDesktop){ $event.preventDefault(); toggleSubmenu(0) }" 1417 >Coffee</a> 1418 1419<a 1420 href="/collections/equipment" 1421 class="nav-link is--dark w-nav-link" 1422 @mouseenter="if(isDesktop) openSubmenuIndex = 1" 1423 @click="if(!isDesktop){ $event.preventDefault(); toggleSubmenu(1) }" 1424 >Equipment</a> 1425 1426 1427 1428 <a 1429 href="/pages/subscription" 1430 class="nav-link is--dark w-nav-link " 1431 aria-current="false" 1432 @mouseenter="if (checkMenu('Subscriptions')) showExpanded = true" 1433 1434 1435 1436 data-spark="b2c-only" 1437 1438 >Subscriptions</a> 1439 1440 <a 1441 href="/pages/about" 1442 class="nav-link is--dark w-nav-link " 1443 aria-current="false" 1444 @mouseenter="if (checkMenu('About')) showExpanded = true" 1445 1446 1447 1448 >About</a> 1449 1450 <a 1451 href="/pages/locations" 1452 class="nav-link is--dark w-nav-link " 1453 aria-current="false" 1454 @mouseenter="if (checkMenu('Locations')) showExpanded = true" 1455 1456 1457 1458 data-spark="b2c-only" 1459 1460 >Locations</a> 1461 1462 <a 1463 href="/pages/wholesale" 1464 class="nav-link is--dark w-nav-link " 1465 aria-current="false" 1466 @mouseenter="if (checkMenu('Wholesale')) showExpanded = true" 1467 1468 1469 1470 data-spark="b2c-only" 1471 1472 >Wholesale</a> 1473 1474 1475 1476 <div class="separator-mobile-menu"></div> 1477 <div> 1478 <a href="/account/login" class="nav-link-mobile w-button">Log in</a> 1479 1480 1481 </div> 1482 </nav> 1483 </div> 1484 <div class="nav-items"> 1485 1486 <a href="/account/login" class="nav-link-block w-inline-block" 1487 ><img 1488 src="//cartwheelcoffee.com/cdn/shop/t/29/assets/account-white.svg?v=145592677635118054171790863894" 1489 loading="lazy" 1490 data-w-id="b6432bd8-3dc1-714e-9459-00ca67bfb23a" 1491 alt="Account" 1492 class="account-icon is--dark-logo" 1493 width="26" 1494 height="24" 1495 ></a> 1496 1497 1498 <div 1499 data-node-type="commerce-cart-wrapper" 1500 data-wf-cart-type="rightSidebar" 1501 data-wf-cart-query="" 1502 data-wf-page-link-href-prefix="" 1503 data-wf-cart-easing="ease-in-out-quad" 1504 data-wf-cart-duration="400" 1505 class="w-commerce-commercecartwrapper nav-cart-wrapper" 1506 ><a 1507 href="#" 1508 data-node-type="commerce-cart-open-link" 1509 class="w-commerce-commercecartopenlink nav-cart-button w-inline-block" 1510 id="cartOpen" 1511 role="button" 1512 tabindex="0" 1513 aria-label="Open cart" 1514 @keydown.enter.prevent="$el.click()" 1515 @keydown.space.prevent="$el.click()" 1516 data-spark="b2c-only" 1517 > 1518 <div 1519 data-w-id="090629e1-b1c9-836c-173c-f68a391f4ab0" 1520 class="w-commerce-commercecartopenlinkcount nav-cart-qty is--dark" 1521 udy-el="cart-count" 1522 > 1523 0 1524 </div> 1525 <img 1526 src="//cartwheelcoffee.com/cdn/shop/t/29/assets/cart-white.svg?v=52053577201332103291790863894" 1527 loading="lazy" 1528 data-w-id="090629e1-b1c9-836c-173c-f68a391f4ab1" 1529 alt="Cart" 1530 class="nav-cart-icon is--dark-logo" 1531 width="20" 1532 height="26" 1533 > 1534 </a><style data-shopify> 1535 /* ââ Free Shipping Progress Bar ââ */ 1536 .free-shipping-bar { 1537 padding-inline: 1rem; 1538 background-color: rgba(var(--color-background)); 1539 1540 @media(width>=768px){ 1541 padding-inline: 2.5rem; 1542 } 1543 } 1544 1545 .free-shipping-bar__wrapper { 1546 padding-block: 1.125rem 1.5rem; 1547 display: flex; 1548 flex-direction: column; 1549 gap: .75rem; 1550 border-top: 1px solid rgba(var(--color-border)); 1551 } 1552 1553 .free-shipping-bar__message { 1554 font-size: .8rem; 1555 text-align: left; 1556 margin: 0; 1557 color: rgba(var(--color-foreground)); 1558 } 1559 1560 .free-shipping-bar__message--earned { 1561 color: rgba(var(--color-foreground)); 1562 font-weight: 600; 1563 } 1564 1565 .free-shipping-bar__track { 1566 width: 100%; 1567 height: 9px; 1568 background-color: #d9d9d9; 1569 border-radius: 9999px; 1570 overflow: hidden; 1571 } 1572 1573 .free-shipping-bar__fill { 1574 height: 100%; 1575 width: var(--free-shipping-progress, 0%); 1576 background-color: rgba(var(--color-foreground)); 1577 border-radius: 9999px; 1578 transition: width 0.4s ease; 1579 } 1580 1581 .free-shipping-bar__fill--complete { 1582 background-color: rgba(var(--color-foreground)); 1583 } 1584 1585 /* ââ Cart Upsell â You May Also Like ââ */
1586 .line-item.cart-upsell.is--cart-upsell { 1587 border: none; 1588 padding-top: 0; 1589 } 1590 1591 .cart-upsell[hidden] { 1592 display: none !important; 1593 } 1594 1595 .cart-upsell { 1596 display: flex; 1597 flex-direction: column; 1598 align-items: flex-start; 1599 padding-block: 1rem; 1600 } 1601 1602 .cart-upsell__heading { 1603 margin-block-end: 1rem; 1604 padding-inline: 0; 1605 text-transform: none; 1606 font-size: .8rem; 1607 } 1608 1609 .cart-upsell__close, 1610 .cart-gift-note__panel-close { 1611 background: none; 1612 border: none; 1613 cursor: pointer; 1614 padding: 4px; 1615 color: rgba(var(--color-foreground)); 1616 opacity: 0.5; 1617 flex-shrink: 0; 1618 position: absolute; 1619 right: 2.25rem; 1620 top: -4px; 1621 } 1622 1623 @media screen and (max-width: 390px) { 1624 .cart-upsell__close, 1625 .cart-gift-note__panel-close { 1626 right: .75rem; 1627 top: 4px; 1628 } 1629 } 1630 1631 .cart-upsell__close:hover, 1632 .cart-gift-note__panel-close:hover { 1633 opacity: 1; 1634 } 1635 1636 .cart-upsell__recommendations { 1637 display: block; 1638 width: 100%; 1639 } 1640 1641 /* Horizontal scrolling list â cards sit side by side, last one peeks */ 1642 .cart-upsell__list { 1643 display: flex; 1644 gap: 1rem; 1645 list-style: none; 1646 padding: 0; 1647 margin: 0; 1648 margin-left: 0; 1649 overflow-x: auto; 1650 } 1651 1652 /* ââ Card row ââ */ 1653 .cart-upsell__item { 1654 display: grid; 1655 align-items: flex-start; 1656 gap: 12px; 1657 padding: 0; 1658 width: 100%; 1659 -webkit-justify-content: flex-start; 1660 -ms-flex-pack: start; 1661 justify-content: flex-start; 1662 -webkit-box-align: stretch; 1663 -webkit-align-items: stretch; 1664 -ms-flex-align: stretch; 1665 align-items: stretch; 1666 grid-auto-columns: 1fr; 1667 -ms-grid-columns: repeat(5, minmax(0, 1fr)); 1668 grid-template-columns: repeat(5, minmax(0, 1fr)); 1669 -ms-grid-rows: auto; 1670 grid-template-rows: auto; 1671 } 1672 1673 .cart-upsell__item:last-child { 1674 border-bottom: none; 1675 } 1676 1677 /* ââ Thumbnail ââ */ 1678 .cart-upsell__card-thumb { 1679 display: block; 1680 flex-shrink: 0; 1681 width: auto; 1682 height: auto; 1683 aspect-ratio: 1/1; 1684 border-radius: var(--style-border-radius-cards); 1685 overflow: hidden; 1686 background-color: rgb(var(--color-foreground-rgb) / 0.04); 1687 } 1688 1689 .cart-upsell__card-image { 1690 display: block; 1691 width: 100%; 1692 height: 100%; 1693 object-fit: cover; 1694 transition: opacity var(--animation-speed) ease; 1695 } 1696 1697 .cart-upsell__card-thumb:hover .cart-upsell__card-image { 1698 opacity: 0.85; 1699 } 1700 1701 .cart-upsell__card-image-placeholder { 1702 width: 100%; 1703 height: 100%; 1704 background-color: rgb(var(--color-foreground-rgb) / 0.06); 1705 } 1706 1707 /* ââ Middle: title + button ââ */ 1708 .cart-upsell__card-middle { 1709 display: flex; 1710 flex-direction: column; 1711 justify-content: space-around; 1712 width: 100%; 1713 height: 100%; 1714 grid-column: span 3 / span 3; 1715 } 1716 1717 .cart-upsell__card-title { 1718 display: -webkit-box; 1719 -webkit-line-clamp: 2; 1720 -webkit-box-orient: vertical; 1721 overflow: hidden; 1722 font-size: clamp(1rem, 0.95rem + 0.25vw, 1.125rem); 1723 font-weight: 500; 1724 line-height: 1; 1725 text-decoration: none; 1726 color: rgb(var(--color-foreground)); 1727 text-transform: uppercase; 1728 margin: 0; 1729 } 1730 1731 .cart-upsell__card-title:hover { 1732 opacity: 0.7; 1733 } 1734 1735 /* ââ Add + button ââ */ 1736 .cart-upsell__atc { 1737 padding: 5.5px 22px; 1738 background: #1A1A1A; 1739 color: #f5f5f5; 1740 text-transform: uppercase; 1741 font-size: .75rem; 1742 font-weight: 500; 1743 text-wrap-mode: nowrap; 1744 display: flex; 1745 align-items: center; 1746 max-width: 118px; 1747 text-align: center; 1748 align-items: center; 1749 justify-content: center; 1750 } 1751 1752 1753 1754 .cart-upsell__atc:hover:not(:disabled) { 1755 background-color: rgb(var(--color-foreground)); 1756 color: rgb(var(--color-background)); 1757 } 1758 1759 .cart-upsell__atc:disabled { 1760 opacity: 0.4; 1761 cursor: not-allowed; 1762 } 1763 1764 .cart-upsell__atc-plus { 1765 font-size: 1.1em; 1766 line-height: 1; 1767 font-weight: 400; 1768 } 1769 1770 /* Loading spinner */ 1771 .cart-upsell__atc[data-loading] { 1772 pointer-events: none; 1773 } 1774 1775 .cart-upsell__atc[data-loading]::after { 1776 content: ''; 1777 display: inline-block; 1778 width: 9px; 1779 height: 9px; 1780 border: 1.5px solid currentColor; 1781 border-top-color: transparent; 1782 border-radius: 50%; 1783 animation: cart-upsell-spin 0.6s linear infinite; 1784 } 1785 1786 /* Success state */ 1787 .cart-upsell__atc[data-added] { 1788 background-color: rgb(var(--color-foreground)); 1789 color: rgb(var(--color-background)); 1790 pointer-events: none; 1791 } 1792 1793 @keyframes cart-upsell-spin { 1794 to { transform: rotate(360deg); } 1795 } 1796 1797 /* ââ Price block (right column) ââ */ 1798 .cart-upsell__card-price-block { 1799 display: flex; 1800 flex-direction: column; 1801 align-items: flex-end; 1802 gap: 2px; 1803 flex-shrink: 0; 1804 height: 100%; 1805 } 1806 1807 .cart-upsell__card-price { 1808 font-size: .8rem; 1809 font-weight: 700; 1810 color: rgb(var(--color-foreground)); 1811 white-space: nowrap; 1812 margin-block-start: auto; 1813 } 1814 1815 .cart-upsell__card-price--sale { 1816 color: rgb(var(--color-foreground)); 1817 } 1818 1819 .cart-upsell__card-price-compare { 1820 font-size: var(--font-size--2xs); 1821 font-weight: 400; 1822 color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 1823 text-decoration: line-through; 1824 white-space: nowrap; 1825 } 1826 1827 /* ââ Skeleton loading state ââ */ 1828 .cart-upsell__item--skeleton { 1829 height: 88px; 1830 border-radius: var(--style-border-radius-cards); 1831 border-bottom: none; 1832 background: linear-gradient( 1833 90deg, 1834 rgb(var(--color-foreground-rgb) / 0.06) 25%,
1835 rgb(var(--color-foreground-rgb) / 0.12) 50%, 1836 rgb(var(--color-foreground-rgb) / 0.06) 75% 1837 ); 1838 background-size: 200% 100%; 1839 animation: cart-upsell-shimmer 1.4s infinite; 1840 margin-inline: var(--cart-drawer-padding); 1841 1842 @media screen and (min-width: 750px) { 1843 margin-inline: var(--cart-drawer-padding-desktop); 1844 } 1845 } 1846 1847 @keyframes cart-upsell-shimmer { 1848 0% { background-position: 200% 0; } 1849 100% { background-position: -200% 0; } 1850 } 1851 1852 .cart-upsell__recommendations[data-recommendations-performed='true'] 1853 .cart-upsell__item--skeleton { 1854 display: none; 1855 } 1856 1857 /* ââ Cart Line-Item Subscribe & Save ââ */ 1858 .cart-subscribe { 1859 width: 100%; 1860 margin-block-start: 1rem; 1861 padding-block-start: 1rem; 1862 border-top: 1px solid rgba(var(--color-border)); 1863 display: grid; 1864 grid-template-columns: repeat(5, minmax(0, 1fr)); 1865 } 1866 1867 .cart-subscribe__row { 1868 display: flex; 1869 align-items: flex-start; 1870 gap: .75rem; 1871 cursor: pointer; 1872 grid-column: span 4 / span 4; 1873 grid-column-start: 2; 1874 } 1875 1876 .cart-subscribe__checkbox { 1877 flex-shrink: 0; 1878 appearance: none; 1879 width: 22px; 1880 height: 22px; 1881 margin: 1px 0 0 0; 1882 border: 1.5px solid #121212; 1883 border-radius: 4px; 1884 background-color: rgba(var(--color-background)); 1885 cursor: pointer; 1886 position: relative; 1887 } 1888 1889 .cart-subscribe__checkbox:checked { 1890 border-color: var(--color-cart-subscribe-accent, #1A7A4C); 1891 background-color: var(--color-cart-subscribe-accent, #1A7A4C); 1892 } 1893 1894 .cart-subscribe__checkbox:checked::after { 1895 content: ''; 1896 position: absolute; 1897 inset: 0; 1898 margin: auto; 1899 width: 6px; 1900 height: 10px; 1901 border: solid #fff; 1902 border-width: 0 2px 2px 0; 1903 transform: translate(0, -1px) rotate(45deg); 1904 } 1905 1906 .cart-subscribe__checkbox[data-loading] { 1907 opacity: 0.5; 1908 pointer-events: none; 1909 } 1910 1911 .cart-subscribe__copy { 1912 display: flex; 1913 flex-direction: column; 1914 gap: 2px; 1915 flex: 1 1 auto; 1916 min-width: 0; 1917 } 1918 1919 .cart-subscribe__title { 1920 font-size: .65rem; 1921 font-weight: 700; 1922 line-height: 1.3; 1923 text-transform: uppercase; 1924 letter-spacing: .01em; 1925 color: var(--color-cart-subscribe-accent, #1A7A4C); 1926 1927 @media (width>390px) { 1928 font-size: .8rem; 1929 } 1930 } 1931 1932 .cart-subscribe__subtitle { 1933 font-size: .625rem; 1934 line-height: 1.3; 1935 color: rgba(var(--color-foreground)); 1936 1937 @media (width>390px) { 1938 font-size: .8rem; 1939 } 1940 } 1941 1942 .cart-subscribe__price { 1943 flex-shrink: 0; 1944 display: flex; 1945 align-items: baseline; 1946 gap: .4rem; 1947 font-weight: 700; 1948 font-size: .9rem; 1949 white-space: nowrap; 1950 padding-block-start: 2px; 1951 } 1952 1953 .cart-subscribe__compare { 1954 font-weight: 400; 1955 color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text, 0.5)); 1956 text-decoration: line-through; 1957 } 1958 1959 .cart-subscribe__sale { 1960 color: var(--color-cart-subscribe-accent, #1A7A4C); 1961 } 1962 1963 .cart-subscribe__frequency-wrap { 1964 display: flex; 1965 flex-direction: column; 1966 gap: .35rem; 1967 } 1968 1969 .cart-subscribe__frequency-wrap[hidden] { 1970 display: none; 1971 } 1972 1973 .cart-subscribe__frequency-label { 1974 font-size: .75rem; 1975 color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text, 0.6)); 1976 } 1977 1978 .cart-subscribe__frequency { 1979 width: 100%; 1980 padding: .55rem .75rem; 1981 border: 1px solid rgba(var(--color-border)); 1982 border-radius: 0; 1983 background-color: rgba(var(--color-background)); 1984 color: rgba(var(--color-foreground)); 1985 font-size: .85rem; 1986 font-weight: 400; 1987 -webkit-appearance: none; 1988 appearance: none; 1989 } 1990 1991 .cart-subscribe[data-loading] { 1992 opacity: 0.6; 1993 pointer-events: none; 1994 } 1995</style>
1996<script type="module" src="//cartwheelcoffee.com/cdn/shop/t/29/assets/cart-controls.js?v=76504510311455815011790866153"></script>
1996 1997<div 1998 data-node-type="commerce-cart-container-wrapper" 1999 style="display:none" 2000 class="w-commerce-commercecartcontainerwrapper w-commerce-commercecartcontainerwrapper--cartType-rightSidebar cart-wrapper" 2001> 2002 <div 2003 data-node-type="commerce-cart-container" 2004 id="cartWrapper" 2005 class="w-commerce-commercecartcontainer cart-content color-scheme-586520cf-28ab-4963-baac-a0289157f5ba" 2006 id="cartClose" 2007 > 2008 <div class="w-commerce-commercecartheader cart-head"> 2009 <h4 class="w-commerce-commercecartheading h1-48px is--cart-header">Cart</h4> 2010 <a 2011 href="#" 2012 data-node-type="commerce-cart-close-link" 2013 class="w-commerce-commercecartcloselink cart-close image w-inline-block" 2014 ><img 2015 src="//cartwheelcoffee.com/cdn/shop/t/29/assets/nav-close.svg?v=106155978684426472691790863894" 2016 loading="lazy" 2017 alt="" 2018 loading="lazy" 2019 alt="Cart" 2020 width="26" 2021 height="25" 2022 ></a> 2023 </div><div 2024 class="free-shipping-bar" 2025 aria-live="polite" 2026 data-free-shipping-bar 2027 data-threshold="3000" 2028 data-message-progress="You are XX away from FREE SHIPPING!" 2029 data-message-earned="You've earned FREE SHIPPING!" 2030 style="display:none" 2031 > 2032 <div class="free-shipping-bar__wrapper"><p class="free-shipping-bar__message" data-fsb-message>You are £30.00 away from FREE SHIPPING!</p><div 2033 class="free-shipping-bar__track" 2034 role="progressbar" 2035 aria-valuemin="0" 2036 aria-valuemax="100" 2037 aria-valuenow="0" 2038 data-fsb-track 2039 > 2040 <div 2041 class="free-shipping-bar__fill" 2042 style="--free-shipping-progress: 0%;" 2043 data-fsb-fill 2044 ></div> 2045 </div> 2046 </div> 2047 </div><div class="w-commerce-commercecartformwrapper cart-body color-scheme-586520cf-28ab-4963-baac-a0289157f5ba"> 2048 <form 2049 data-node-type="commerce-cart-form" 2050 class="w-commerce-commercecartform udesly-display-none" 2051 action="/cart" 2052 id="cart-form" 2053 method="post" 2054 > 2055 <ul role="list" class="cart-list_items pb-10" udy-el="items-list"> 2056 2057 </ul>
2057<script> 2058 window.cartSubscribeSettings = { 2059 enabled: true, 2060 title: "Subscribe and save", 2061 activeTitle: "Subscribed \u0026 saving", 2062 subtitle: "Edit, skip or cancel anytime", 2063 frequencyLabel: "Deliver every" 2064 }; 2065 2066 window.cartSubscribeData = window.cartSubscribeData || {};/** 2067 * Builds the "Subscribe and save X%" widget markup for a single 2068 * cart line item, mirroring the server-rendered Liquid block 2069 * above. Called from window.udeslyMiniCartTemplate after every 2070 * AJAX cart update (/cart/change.js etc.). 2071 */ 2072 window.buildCartSubscribeWidget = function (item) { 2073 var settings = window.cartSubscribeSettings || {}; 2074 if (!settings.enabled) return ''; 2075 2076 var available = (window.cartSubscribeData && window.cartSubscribeData[item.variant_id]) || []; 2077 var current = item.selling_plan_allocation || null; 2078 var defaultPlan = available[0] || null; 2079 2080 var active = current 2081 ? { 2082 id: current.selling_plan.id, 2083 compare_at_price: current.compare_at_price, 2084 price: current.price, 2085 } 2086 : defaultPlan; 2087 2088 if (!active) return ''; 2089 2090 var compareUnit = active.compare_at_price != null ? active.compare_at_price : item.original_price; 2091 var saleUnit = active.price; 2092 2093 if (!compareUnit || saleUnit >= compareUnit) return ''; 2094 2095 var discountPct = 100 - Math.floor((saleUnit * 100) / compareUnit); 2096 if (discountPct <= 0) return ''; 2097 2098 var compareTotal = compareUnit * item.quantity; 2099 var saleTotal = saleUnit * item.quantity; 2100 2101 var money = function (cents) { 2102 return '£' + (cents / 100).toFixed(2); 2103 }; 2104 2105 var checkedAttr = current ? ' checked' : ''; 2106 var titleText = current 2107 ? settings.activeTitle + ' ' + discountPct + '%' 2108 : settings.title + ' ' + discountPct + '%'; 2109 2110 var subtitleHtml = ''; 2111 var frequencyHtml = ''; 2112 2113 if (current) { 2114 if (available.length > 1) { 2115 var options = available 2116 .map(function (plan) { 2117 var selected = active.id == plan.id ? ' selected' : ''; 2118 return '<option value="' + plan.id + '"' + selected + '>' + plan.name + '</option>'; 2119 }) 2120 .join(''); 2121 2122 frequencyHtml = 2123 '<div class="cart-subscribe__frequency-wrap">' + 2124 '<label class="cart-subscribe__frequency-label" for="cart-subscribe-frequency-' + item.key + '">' + 2125 settings.frequencyLabel + 2126 '</label>' + 2127 '<select id="cart-subscribe-frequency-' + item.key + '" class="cart-subscribe__frequency" data-subscribe-frequency>' + 2128 options + 2129 '</select>' + 2130 '</div>'; 2131 } 2132 } else { 2133 subtitleHtml = 2134 '<span class="cart-subscribe__subtitle" id="cart-subscribe-subtitle-' + item.key + '">' + 2135 settings.subtitle + 2136 '</span>'; 2137 } 2138 2139 var priceHtml = current 2140 ? '' 2141 : '<span class="cart-subscribe__price">' + 2142 '<s class="cart-subscribe__compare">' + money(compareTotal) + '</s>' + 2143 '<span class="cart-subscribe__sale">' + money(saleTotal) + '</span>' + 2144 '</span>'; 2145 2146 return ( 2147 '<div class="cart-subscribe" data-cart-subscribe data-line="' + item.line + '" data-key="' + item.key + '" data-default-selling-plan="' + (defaultPlan ? defaultPlan.id : '') + '">' + 2148 '<label class="cart-subscribe__row">' + 2149 '<input type="checkbox" class="cart-subscribe__checkbox" data-subscribe-toggle' + checkedAttr + ' aria-describedby="cart-subscribe-subtitle-' + item.key + '">' + 2150 '<span class="cart-subscribe__copy">' + 2151 '<span class="cart-subscribe__title">' + titleText + '</span>' + 2152 subtitleHtml + 2153 frequencyHtml + 2154 '</span>' + 2155 priceHtml + 2156 '</label>' + 2157 '</div>' 2158 ); 2159 }; 2160 </script>
2160 2161 2162
2162<script 2163 type="module" 2164 src="//cartwheelcoffee.com/cdn/shop/t/29/assets/cart-subscribe.js?v=78937335796675838811790865203" 2165 fetchpriority="low" 2166 ></script>
2166 2167 2168 <div 2169 class="w-commerce-commercecartfooter cart-footer-main udesly-display-none" 2170 udy-el="cart-actions" 2171 > 2172
2173<script type="module" src="//cartwheelcoffee.com/cdn/shop/t/29/assets/cart-upsell.js?v=145361160028485290561790872804" fetchpriority="low"></script>
2173 2174 2175 <div 2176 class="w-commerce-commercecartlineitem line-item cart-upsell is--cart-upsell" 2177 data-cart-upsell-wrapper 2178 style="display:none" 2179 > 2180 <div class="cart-note-borderline"></div> 2181 <p class="cart-upsell__heading">Recommended for you</p> 2182 <button 2183 type="button" 2184 class="cart-upsell__close" 2185 aria-label="Close recommendations" 2186 onclick="this.closest('[data-cart-upsell-wrapper]').style.display='none'" 2187 > 2188 <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 2189 <path d="M1 1L13 13M13 1L1 13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/> 2190 </svg> 2191 </button> 2192 2193 <cart-upsell-recommendations 2194 id="cart-upsell-recommendations-sections--30520046453113__nav-home-component" 2195 class="cart-upsell__recommendations" 2196 data-product-id="" 2197 data-limit="1" 2198 data-fetch-limit="1" 2199 data-cart-product-ids="" 2200 data-aspect-ratio="adapt" 2201 data-is-wholesale="false" 2202 style="--resource-card-corner-radius: 0px;" 2203 > 2204 <ul class="cart-upsell__list list-unstyled" aria-busy="true"><li class="cart-upsell__item cart-upsell__item--skeleton"></li></ul> 2205 </cart-upsell-recommendations> 2206 </div><div class="w-commerce-commercecartlineitem line-item is--cart-note"> 2207 <div class="cart-note-borderline"></div> 2208 <label 2209 class="form-label-default" 2210 for="cart-note" 2211 style="cursor: pointer;" 2212 onclick="document.getElementById('cart-note').classList.toggle('udesly-display-none')" 2213 > 2214 <svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg"> 2215 <path d="M18.3103 4.62915L14.1216 0.439461C13.9823 0.300137 13.8169 0.189617 13.6349 0.114213C13.4529 0.03881 13.2578 0 13.0608 0C12.8638 0 12.6687 0.03881 12.48
221567 0.114213C12.3047 0.189617 12.1393 0.300137 12 0.439461L0.439695 12.0007C0.299801 12.1395 0.188889 12.3047 0.113407 12.4867C0.0379245 12.6688 -0.000621974 12.864 7.58902e-06 13.061V17.2507C7.58902e-06 17.6485 0.158043 18.0301 0.439347 18.3114C0.720652 18.5927 1.10218 18.7507 1.50001 18.7507H5.6897C5.88675 18.7513 6.08197 18.7128 6.26399 18.6373C6.44602 18.5618 6.61122 18.4509 6.75001 18.311L18.3103 6.75071C18.4496 6.61142 18.5602 6.44604 18.6356 6.26403C18.711 6.08202 18.7498 5.88694 18.7498 5.68993C18.7498 5.49292 18.711 5.29784 18.6356 5.11582C18.5602 4.93381 18.4496 4.76844 18.3103 4.62915ZM1.81032 12.7507L9.75001 4.81102L11.3147 6.37571L3.37501 14.3145L1.81032 12.7507ZM1.50001 14.561L4.1897 17.2507H1.50001V14.561ZM6.00001 16.9404L4.43532 15.3757L12.375 7.43602L13.9397 9.00071L6.00001 16.9404ZM15 7.9404L10.8103 3.75071L13.0603 1.50071L17.25 5.68946L15 7.9404Z" fill="black"/> 2216 </svg> Add a note 2217 </label> 2218 <textarea 2219 form="cart-form" 2220 on:input="/updateCartNote" 2221 id="cart-note" 2222 class="cart-note udesly-display-none" 2223 name="note" 2224 placeholder="Write your message..." 2225 ></textarea> <div class="cart-gift-note" id="cart-gift-note-section" data-variant-id="63812483121529"> 2226 2227 <button 2228 type="button" 2229 class="form-label-default custom-gift-note cart-gift-note__toggle" 2230 id="cart-gift-note-toggle" 2231 aria-expanded="false" 2232 aria-controls="cart-gift-note-panel" 2233 > 2234 <svg width="20" height="19" viewBox="0 0 20 19" fill="none" xmlns="http://www.w3.org/2000/svg"> 2235 <path d="M18 5.25131H14.7113C14.7478 5.22037 14.7853 5.19037 14.8209 5.15756C15.1057 4.9046 15.3351 4.59561 15.495 4.24992C15.6549 3.90423 15.7417 3.52927 15.75 3.1485C15.7623 2.73194 15.6894 2.31726 15.5356 1.92992C15.3819 1.54258 15.1506 1.19075 14.856 0.896026C14.5613 0.601304 14.2096 0.369911 13.8223 0.216053C13.435 0.0621946 13.0203 -0.0108821 12.6038 0.00130888C12.2228 0.00951374 11.8477 0.0962635 11.5018 0.256128C11.156 0.415992 10.8468 0.645529 10.5938 0.930371C10.2436 1.33621 9.9589 1.79422 9.75 2.28787C9.5411 1.79422 9.25642 1.33621 8.90625 0.930371C8.65318 0.645529 8.34405 0.415992 7.99818 0.256128C7.65232 0.0962635 7.27718 0.00951374 6.89625 0.00130888C6.47969 -0.0108821 6.06503 0.0621946 5.67774 0.216053C5.29044 0.369911 4.93868 0.601304 4.64405 0.896026C4.34941 1.19075 4.11812 1.54258 3.96438 1.92992C3.81064 2.31726 3.73768 2.73194 3.75 3.1485C3.75833 3.52927 3.84514 3.90423 4.005 4.24992C4.16486 4.59561 4.39434 4.9046 4.67906 5.15756C4.71469 5.1885 4.75219 5.2185 4.78875 5.25131H1.5C1.10218 5.25131 0.720644 5.40934 0.43934 5.69065C0.158035 5.97195 0 6.35348 0 6.75131V9.75131C0 10.1491 0.158035 10.5307 0.43934 10.812C0.720644 11.0933 1.10218 11.2513 1.5 11.2513V17.2513C1.5 17.6491 1.65804 18.0307 1.93934 18.312C2.22064 18.5933 2.60218 18.7513 3 18.7513H16.5C16.8978 18.7513 17.2794 18.5933 17.5607 18.312C17.842 18.0307 18 17.6491 18 17.2513V11.2513C18.3978 11.2513 18.7794 11.0933 19.0607 10.812C19.342 10.5307 19.5 10.1491 19.5 9.75131V6.75131C19.5 6.35348 19.342 5.97195 19.0607 5.69065C18.7794 5.40934 18.3978 5.25131 18 5.25131ZM11.7188 1.92412C11.8375 1.79298 11.9821 1.68781 12.1434 1.61522C12.3047 1.54262 12.4793 1.50415 12.6562 1.50225H12.7022C12.9095 1.50354 13.1145 1.54621 13.3052 1.62775C13.4958 1.70929 13.6683 1.82806 13.8124 1.9771C13.9566 2.12615 14.0695 2.30246 14.1447 2.49572C14.2198 2.68898 14.2556 2.89529 14.25 3.10256C14.2481 3.27946 14.2096 3.45406 14.137 3.6154C14.0644 3.77673 13.9593 3.92131 13.8281 4.04006C12.9384 4.82756 11.4619 5.10506 10.5469 5.20256C10.6594 4.20975 10.9688 2.76693 11.7188 1.92412ZM5.71031 1.95787C6.00088 1.66733 6.39441 1.50325 6.80531 1.50131H6.85125C7.02815 1.50322 7.20275 1.54168 7.36409 1.61428C7.52542 1.68688 7.67 1.79205 7.78875 1.92318C8.57531 2.81193 8.85281 4.28568 8.95031 5.19693C8.03906 5.10318 6.56531 4.82193 5.67656 4.03537C5.54543 3.91662 5.44026 3.77204 5.36766 3.61071C5.29506 3.44938 5.2566 3.27478 5.25469 3.09787C5.24887 2.88715 5.28593 2.67745 5.36361 2.48149C5.44128 2.28552 5.55796 2.10738 5.70656 1.95787H5.71031ZM1.5 6.75131H9V9.75131H1.5V6.75131ZM3 11.2513H9V17.2513H3V11.2513ZM16.5 17.2513H10.5V11.2513H16.5V17.2513ZM18 9.75131H10.5V6.75131H18V9.75131Z" fill="black"/> 2236 </svg> 2237 <span id="cart-gift-note-toggle-label">'Add custom gift card' £1.50</span> 2238 </button> 2239 2240 <div 2241 id="cart-gift-note-panel" 2242 class="cart-gift-note__panel" 2243 hidden 2244 ><button 2245 type="button" 2246 class="cart-gift-note__panel-close" 2247 id="cart-gift-note-panel-close" 2248 aria-label="Close gift note" 2249 > 2250 <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 2251 <path d="M1 1L13 13M13 1L1 13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/> 2252 </svg> 2253 </button> 2254 2255 <textarea 2256 id="cart-gift-note-input" 2257 class="cart-gift-note__textarea" 2258 placeholder="Write your gift note..." 2259 maxlength="200" 2260 aria-label="Gift note message" 2261 ></textarea> 2262 2263 <div class="cart-gift-note__footer">
2264 <span class="cart-gift-note__char-count"> 2265 <span id="cart-gift-note-chars">0</span>/200 2266 </span> 2267 <div class="cart-gift-note__actions"> 2268 <button type="button" id="cart-gift-note-cancel" class="cart-gift-note__btn-cancel" hidden> 2269 2270 </button> 2271 <button type="button" id="cart-gift-note-submit" class="cart-gift-note__btn-submit"> 2272 ADD+ 2273 </button> 2274 </div> 2275 </div> 2276 </div> 2277 2278</div> 2279
2280<script> 2281(function () { 2282 const VARIANT_ID = '63812483121529'; 2283 2284 const toggle = document.getElementById('cart-gift-note-toggle'); 2285 const toggleLabel = document.getElementById('cart-gift-note-toggle-label'); 2286 const panel = document.getElementById('cart-gift-note-panel'); 2287 const panelClose = document.getElementById('cart-gift-note-panel-close'); 2288 const textarea = document.getElementById('cart-gift-note-input'); 2289 const charCount = document.getElementById('cart-gift-note-chars'); 2290 const submitBtn = document.getElementById('cart-gift-note-submit'); 2291 const cancelBtn = document.getElementById('cart-gift-note-cancel'); 2292 2293 const ADD_LABEL = "'Add custom gift card' £1.50"; 2294 const EDIT_LABEL = 'Edit gift note'; 2295 2296 let isOpen = false; 2297 let isAdded = false; 2298 let savedNote = ''; 2299 2300 // ââ UI state helpers âââââââââââââââââââââââââââââââââââââ 2301 2302 function openPanel() { 2303 isOpen = true; 2304 panel.removeAttribute('hidden'); 2305 toggle.setAttribute('aria-expanded', 'true'); 2306 // While panel is open, hide the toggle button entirely 2307 toggle.setAttribute('hidden', ''); 2308 2309 setTimeout(function () { 2310 textarea.focus({ preventScroll: true }); 2311 textarea.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); 2312 }, 150); 2313 } 2314 2315 // Close panel only â no cart removal 2316 function closePanel() { 2317 isOpen = false; 2318 textarea.blur(); 2319 panel.setAttribute('hidden', ''); 2320 toggle.removeAttribute('hidden'); 2321 toggle.setAttribute('aria-expanded', 'false'); 2322 2323 // Label reflects whether a note is saved or not 2324 toggleLabel.textContent = isAdded ? EDIT_LABEL : ADD_LABEL; 2325 2326 restoreViewport(); 2327 } 2328 2329 function restoreViewport() { 2330 setTimeout(function () { 2331 var drawerBody = document.querySelector('.w-commerce-commercecartformwrapper'); 2332 if (drawerBody) drawerBody.scrollTop = 0; 2333 2334 var drawerWrapper = document.querySelector('.w-commerce-commercecartcontainerwrapper'); 2335 if (drawerWrapper) { 2336 drawerWrapper.style.removeProperty('transform'); 2337 drawerWrapper.style.removeProperty('top'); 2338 } 2339 }, 350); 2340 } 2341 2342 function resetUI() { 2343 isAdded = false; 2344 savedNote = ''; 2345 textarea.value = ''; 2346 textarea.removeAttribute('readonly'); 2347 charCount.textContent = '0'; 2348 submitBtn.textContent = 'ADD+'; 2349 submitBtn.removeAttribute('hidden'); 2350 cancelBtn.setAttribute('hidden', ''); 2351 // Reset toggle label to "Add" when note is gone 2352 toggleLabel.textContent = ADD_LABEL; 2353 toggle.removeAttribute('hidden'); 2354 } 2355 2356 function setAddedState(note) { 2357 isAdded = true; 2358 savedNote = note; 2359 textarea.value = note; 2360 textarea.setAttribute('readonly', ''); 2361 charCount.textContent = note.length; 2362 submitBtn.textContent = '\u2714 Added'; 2363 submitBtn.removeAttribute('hidden'); 2364 cancelBtn.setAttribute('hidden', ''); 2365 } 2366 2367 function setEditState() { 2368 textarea.removeAttribute('readonly'); 2369 submitBtn.textContent = 'SAVE NOTE'; 2370 submitBtn.removeAttribute('hidden'); 2371 cancelBtn.removeAttribute('hidden'); 2372 textarea.focus(); 2373 } 2374 2375 // ââ Cart API helpers âââââââââââââââââââââââââââââââââââââ 2376 2377 async function getCart() { 2378 const res = await fetch('/cart.js'); 2379 return res.json(); 2380 } 2381 2382 async function removeGiftNoteFromCart() { 2383 const cart = await getCart(); 2384 const giftItem = cart.items.find(item => String(item.variant_id) === String(VARIANT_ID)); 2385 if (!giftItem) return; 2386 await fetch('/cart/change.js', { 2387 method: 'POST', 2388 headers: { 'Content-Type': 'application/json' }, 2389 body: JSON.stringify({ id: giftItem.key, quantity: 0 }) 2390 }); 2391 } 2392 2393 async function refreshCart() { 2394 const cart = await getCart(); 2395 2396 if (typeof window.updateFreeShippingBar === 'function') window.updateFreeShippingBar(cart); 2397 if (typeof window.updateCartUpsell === 'function') window.updateCartUpsell(cart); 2398 2399 const itemsList = document.querySelector('.cart-list_items'); 2400 if (itemsList && typeof window.udeslyMiniCartTemplate === 'function') { 2401 itemsList.innerHTML = cart.items.map(function (item, index) { 2402 item.line = index + 1; 2403 item.remove = '/cart/change?line=' + (index + 1) + '&quantity=0'; 2404 return window.udeslyMiniCartTemplate(item); 2405 }).join(''); 2406 } 2407 2408 const totalEls = document.querySelectorAll('[udy-el="cart-total"]');
2409 totalEls.forEach(function (el) { 2410 el.textContent = '£' + (cart.total_price / 100).toFixed(2); 2411 }); 2412 2413 const countEl = document.querySelector('[udy-el="cart-count"]'); 2414 if (countEl) countEl.textContent = cart.item_count; 2415 2416 const cartForm = document.querySelector('.w-commerce-commercecartform'); 2417 const cartFooter = document.querySelector('.cart-footer-main'); 2418 if (cartForm) cartForm.classList.toggle('udesly-display-none', cart.item_count === 0); 2419 if (cartFooter) cartFooter.classList.toggle('udesly-display-none', cart.item_count === 0); 2420 } 2421 2422 async function addGiftNote(message) { 2423 submitBtn.disabled = true; 2424 submitBtn.textContent = 'SAVING...'; 2425 2426 try { 2427 await removeGiftNoteFromCart(); 2428 2429 const res = await fetch('/cart/add.js', { 2430 method: 'POST', 2431 headers: { 'Content-Type': 'application/json' }, 2432 body: JSON.stringify({ 2433 items: [{ id: VARIANT_ID, quantity: 1, properties: { 'Gift Message': message } }] 2434 }) 2435 }); 2436 2437 if (!res.ok) throw new Error('Cart add failed'); 2438 2439 setAddedState(message); 2440 await refreshCart(); 2441 closePanel(); 2442 2443 } catch (err) { 2444 console.error('Gift note error:', err); 2445 submitBtn.textContent = 'Try again'; 2446 } finally { 2447 submitBtn.disabled = false; 2448 } 2449 } 2450 2451 // ââ Event listeners ââââââââââââââââââââââââââââââââââââââ 2452 2453 // Toggle button: opens panel (or re-opens to edit if note already added) 2454 toggle.addEventListener('click', () => { 2455 openPanel(); 2456 if (isAdded) { 2457 // Restore saved note into textarea before switching to edit state 2458 textarea.value = savedNote; 2459 charCount.textContent = savedNote.length; 2460 setEditState(); 2461 } 2462 }); 2463 2464 // Close icon: just closes the panel, no cart changes 2465 panelClose.addEventListener('click', () => closePanel()); 2466 2467 textarea.addEventListener('input', () => { 2468 charCount.textContent = textarea.value.length; 2469 }); 2470 2471 textarea.addEventListener('blur', function () { 2472 setTimeout(function () { 2473 var drawerBody = document.querySelector('.w-commerce-commercecartformwrapper'); 2474 if (drawerBody) drawerBody.scrollTop = 0; 2475 }, 350); 2476 }); 2477 2478 submitBtn.addEventListener('click', () => { 2479 const message = textarea.value.trim(); 2480 if (!message) { textarea.focus(); return; } 2481 addGiftNote(message); 2482 }); 2483 2484 cancelBtn.addEventListener('click', () => { 2485 textarea.value = savedNote; 2486 charCount.textContent = savedNote.length; 2487 setAddedState(savedNote); 2488 }); 2489 2490 // ââ Init âââââââââââââââââââââââââââââââââââââââââââââââââ 2491 2492 async function init() { 2493 const cart = await getCart(); 2494 const giftItem = cart.items.find(item => String(item.variant_id) === String(VARIANT_ID)); 2495 if (giftItem) { 2496 const savedMessage = giftItem.properties?.['Gift Message'] || ''; 2497 // Note exists in cart but panel starts closed â just update the toggle label 2498 isAdded = true; 2499 savedNote = savedMessage; 2500 toggleLabel.textContent = EDIT_LABEL; 2501 } 2502 } 2503 2504 // Called by fetch interceptor when gift note line item is removed via trash icon 2505 window.resetGiftNoteUI = function () { 2506 if (isOpen) { 2507 panel.setAttribute('hidden', ''); 2508 toggle.removeAttribute('hidden'); 2509 isOpen = false; 2510 } 2511 resetUI(); 2512 }; 2513 2514 init(); 2515})(); 2516</script>
2516 2517</div><div class="w-commerce-commercecartlineitem line-item is--checkout-btn"> 2518 <button 2519 type="submit" 2520 id="checkout" 2521 class="w-commerce-commercecartcheckoutbutton button checkout is--cart-open" 2522 data-loading-text="Hang Tight..." 2523 name="checkout" 2524 2525 disabled 2526 2527 form="cart-form" 2528 > 2529 Checkout - <span item="total" class="w-commerce-commercecartordervalue sidecart_price" udy-el="cart-total"> £0.00</span> 2530 </button> 2531 2532 </div> 2533 <div class="checkout-sticky"> 2534 <div data-node-type="commerce-cart-quick-checkout-actions" class="display-none"> 2535 <a 2536 data-node-type="commerce-cart-apple-pay-button" 2537 style="background-image:-webkit-named-image(apple-pay-logo-white);background-size:100% 50%;background-position:50% 50%;background-repeat:no-repeat" 2538 class="w-commerce-commercecartapplepaybutton" 2539 > 2540 <div></div> 2541 </a> 2542 <a 2543 data-node-type="commerce-cart-quick-checkout-button" 2544 style="display:none" 2545 class="w-commerce-commercecartquickcheckoutbutton" 2546 > 2547 <svg 2548 class="w-commerce-commercequickcheckoutgoogleicon" 2549 xmlns="http://www.w3.org/2000/svg" 2550 xmlns:xlink="http://www.w3.org/1999/xlink" 2551 width="16" 2552 height="16"
2553 viewBox="0 0 16 16" 2554 > 2555 <defs> 2556 <polygon id="google-mark-a" points="0 .329 3.494 .329 3.494 7.649 0 7.649"></polygon> 2557 <polygon id="google-mark-c" points=".894 0 13.169 0 13.169 6.443 .894 6.443"></polygon> 2558 </defs> 2559 <g fill="none" fill-rule="evenodd"> 2560 <path fill="#4285F4" 2561 d="M10.5967,12.0469 L10.5967,14.0649 L13.1167,14.0649 C14.6047,12.6759 15.4577,10.6209 15.4577,8.1779 C15.4577,7.6339 15.4137,7.0889 15.3257,6.5559 L7.8887,6.5559 L7.8887,9.6329 L12.1507,9.6329 C11.9767,10.6119 11.4147,11.4899 10.5967,12.0469"> 2562 </path> 2563 <path fill="#34A853" 2564 d="M7.8887,16 C10.0137,16 11.8107,15.289 13.1147,14.067 C13.1147,14.066 13.1157,14.065 13.1167,14.064 L10.5967,12.047 C10.5877,12.053 10.5807,12.061 10.5727,12.067 C9.8607,12.556 8.9507,12.833 7.8887,12.833 C5.8577,12.833 4.1387,11.457 3.4937,9.605 L0.8747,9.605 L0.8747,11.648 C2.2197,14.319 4.9287,16 7.8887,16"> 2565 </path> 2566 <g transform="translate(0 4)"> 2567 <mask id="google-mark-b" fill="#fff"> 2568 <use xlink:href="#google-mark-a"></use> 2569 </mask> 2570 <path fill="#FBBC04" 2571 d="M3.4639,5.5337 C3.1369,4.5477 3.1359,3.4727 3.4609,2.4757 L3.4639,2.4777 C3.4679,2.4657 3.4749,2.4547 3.4789,2.4427 L3.4939,0.3287 L0.8939,0.3287 C0.8799,0.3577 0.8599,0.3827 0.8459,0.4117 C-0.2821,2.6667 -0.2821,5.3337 0.8459,7.5887 L0.8459,7.5997 C0.8549,7.6167 0.8659,7.6317 0.8749,7.6487 L3.4939,5.6057 C3.4849,5.5807 3.4729,5.5587 3.4639,5.5337" 2572 mask="url(#google-mark-b)"></path> 2573 </g> 2574 <mask id="google-mark-d" fill="#fff"> 2575 <use xlink:href="#google-mark-c"></use> 2576 </mask> 2577 <path fill="#EA4335" 2578 d="M0.894,4.3291 L3.478,6.4431 C4.113,4.5611 5.843,3.1671 7.889,3.1671 C9.018,3.1451 10.102,3.5781 10.912,4.3671 L13.169,2.0781 C11.733,0.7231 9.85,-0.0219 7.889,0.0001 C4.941,0.0001 2.245,1.6791 0.894,4.3291" 2579 mask="url(#google-mark-d)"></path> 2580 </g> 2581 </svg> 2582 <svg 2583 class="w-commerce-commercequickcheckoutmicrosofticon" 2584 xmlns="http://www.w3.org/2000/svg" 2585 width="16" 2586 height="16"
2587 viewBox="0 0 16 16" 2588 > 2589 <g fill="none" fill-rule="evenodd"> 2590 <polygon fill="#F05022" points="7 7 1 7 1 1 7 1"></polygon> 2591 <polygon fill="#7DB902" points="15 7 9 7 9 1 15 1"></polygon> 2592 <polygon fill="#00A4EE" points="7 15 1 15 1 9 7 9"></polygon> 2593 <polygon fill="#FFB700" points="15 15 9 15 9 9 15 9"></polygon> 2594 </g> 2595 </svg> 2596 <div>Pay with browser.</div> 2597 </a> 2598 </div> 2599 </div> 2600 </div> 2601 </form> 2602 <div class="w-commerce-commercecartemptystate cart-empty " udy-el="no-items-in-cart"> 2603 <div>Your cart is empty.</div> 2604 </div> 2605 <div style="display:none" data-node-type="commerce-cart-error" class="w-commerce-commercecarterrorstate"> 2606 <div 2607 class="w-cart-error-msg" 2608 data-w-cart-quantity-error="Product is not available in this quantity." 2609 data-w-cart-checkout-error="Checkout is disabled on this site." 2610 data-w-cart-general-error="Something went wrong when adding this item to the cart." 2611 data-w-cart-cart_order_min-error="The order minimum was not met. Add more items to your cart to continue." 2612 > 2613 Product is not available in this quantity. 2614 </div> 2615 </div> 2616 </div> 2617 </div> 2618</div>
2619<script> 2620 (function () { 2621 const cartWrapper = document.querySelector('.cart-wrapper'); 2622 const cartContainer = document.getElementById('cartWrapper'); 2623 2624 if (!cartWrapper || !cartContainer) return; 2625 2626 cartWrapper.addEventListener('click', function (e) { 2627 // Only close if the click landed on the backdrop, not inside the drawer 2628 if (!cartContainer.contains(e.target)) { 2629 const closeBtn = document.querySelector('[data-node-type="commerce-cart-close-link"]'); 2630 if (closeBtn) closeBtn.click(); 2631 } 2632 }); 2633 })(); 2634 </script>
2634 2635 2636 2637
2637<script id="mini-cart-template"> 2638 window.giftNoteVariantId = "63812483121529"; 2639 window.udeslyMiniCartTemplate = function (item) { 2640 var unitPrice = '£' + (item.final_line_price / 100).toFixed(2); 2641 if (item.selling_plan_allocation == undefined) { 2642 item.selling_plan_allocation = ''; 2643 } 2644 2645 var plan_name = item.selling_plan_allocation?.selling_plan?.name || ''; 2646 2647 // Build product image HTML if available 2648 var imageHtml = ''; 2649 if (item.featured_image && item.featured_image.url) { 2650 var imgSrc = item.featured_image.url; 2651 // Shopify CDN resizing: append width param 2652 if (imgSrc.indexOf('?') === -1) { 2653 imgSrc = imgSrc + '?width=250'; 2654 } else { 2655 imgSrc = imgSrc + '&width=250'; 2656 } 2657 imageHtml = `<a href="${item.url}" class="cart-items__media-container" style="--ratio:1;"> 2658 <img 2659 src="${imgSrc}" 2660 width="80" 2661 height="80" 2662 class="cart-items__media-image border-style" 2663 loading="eager" 2664 decoding="async" 2665 alt="${item.product_title}" 2666 > 2667 </a>`; 2668 } 2669 2670 // Build options/properties HTML 2671 var optionsHtml = ''; 2672 if (item.options_with_values) { 2673 item.options_with_values.forEach(function (opt) { 2674 if (opt.name === 'Title' && opt.value === 'Default Title') return; 2675 optionsHtml += `<div class="option-text is--in-cart">${opt.value}</div>`; 2676 }); 2677 } 2678 if (item.properties) { 2679 var props = item.properties; 2680 if (typeof props === 'object' && !Array.isArray(props)) { 2681 Object.keys(props).forEach(function (key) { 2682 if (props[key]) { 2683 optionsHtml += `<div class="option-text is--in-cart" id="productOptions">${key} : ${props[key]}</div>`; 2684 } 2685 }); 2686 } 2687 } 2688 2689 // Quantity controls (shared across both branches) 2690 var qtyHtml = `<div class="q-flex is--sidecart"> 2691 <div class="q-dec is-sidecart" udy-el="quantity-minus"> 2692 <img src="https://cdn.shopify.com/s/files/1/0586/9502/4805/t/7/assets/minus-sign.svg" loading="lazy" alt="" class="q-icon is--cart"> 2693 </div> 2694 <input class="udesly-fake-number-input q-num is--in-cart" type="number" name="updates[${item.id}]" id="updates_${item.id}" data-line="${item.line}" min="1" value="${item.quantity}"> 2695 <div class="q-inc is-sidecart" udy-el="quantity-plus"> 2696 <img src="https://cdn.shopify.com/s/files/1/0586/9502/4805/t/7/assets/plus-sign.svg" loading="lazy" alt="" class="q-icon is--cart"> 2697 </div> 2698 </div>`; 2699 2700 if (String(item.variant_id) === String(window.giftNoteVariantId)) { 2701 var giftMessage = ''; 2702 if (item.properties && typeof item.properties === 'object') { 2703 giftMessage = item.properties['Gift Message'] || ''; 2704 } 2705 return `<li class="list-item-3 is--gift-note" data-item-id="${item.id}"> 2706 <div class="cart-items"> 2707 <div class="cart-product"> 2708 <div class="shop-sections_product-text is--cart-title">${item.product_title}</div> 2709 ${giftMessage ? `<div class="option-text is--in-cart gift-note__message">${giftMessage}</div>` : ''} 2710 </div> 2711 <div class="cart-properties"> 2712 <a href="${item.remove}" class="remove-item" udy-el="remove-item"></a> 2713 <div class="cart-price-wrapper"> 2714 <div class="cart_price in-cart">${unitPrice}</div> 2715 </div> 2716 </div> 2717 </div> 2718 </li>`; 2719 } 2720 2721 if (plan_name == 'Includes one-off water fee') { 2722 var recurring_price = 2723 '£' + 2724 ( 2725 (item.selling_plan_allocation.selling_plan.price_adjustments[1].value * item.quantity) / 2726 100.0 2727 ).toFixed(2); 2728 var regular_price = '£' + (item.line_price / 100.0).toFixed(2); 2729 2730 return `<li class="list-item-3${String(item.variant_id) === String(window.giftNoteVariantId) ? ' is--gift-note' : ''}" data-item-id="${item.id}"> 2731 <div class="cart-items"> 2732 ${imageHtml} 2733 <div class="cart-product"> 2734 <div class="shop-sections_product-text is--cart-title">${item.product_title}</div> 2735 <div class="cart-options">${optionsHtml}</div> 2736 <div>${qtyHtml}</div> 2737 </div> 2738 <div class="cart-properties"> 2739 <a href="${item.remove}" class="remove-item" udy-el="remove-item"></a> 2740 <div class="cart-price-wrapper"> 2741 <div class="cart_price in-cart">${regular_price}</div>
2742 <div class="cart_price is--per-delivery" style="margin:0">${item.selling_plan_allocation.selling_plan.name}</div> 2743 <div class="cart_price is--per-delivery recurring_price"> 2744 Then ${recurring_price} every ${item.selling_plan_allocation.selling_plan.options[0].position} ${item.selling_plan_allocation.selling_plan.options[0].value} 2745 </div> 2746 </div> 2747 </div> 2748 </div> 2749 ${window.buildCartSubscribeWidget ? window.buildCartSubscribeWidget(item) : ''} 2750 </li>`; 2751 } else { 2752 return `<li class="list-item-3${String(item.variant_id) === String(window.giftNoteVariantId) ? ' is--gift-note' : ''}" data-item-id="${item.id}"> 2753 <div class="cart-items"> 2754 ${imageHtml} 2755 <div class="cart-product"> 2756 <div class="shop-sections_product-text is--cart-title">${item.product_title}</div> 2757 <div class="cart-options">${optionsHtml}
2757<div class="is--per-delivery">${item.selling_plan_allocation && item.selling_plan_allocation.selling_plan.name}</div></div> 2758 <div>${qtyHtml}</div> 2759 </div> 2760 <div class="cart-properties"> 2761 <a href="${item.remove}" class="remove-item" udy-el="remove-item"></a> 2762 <div class="cart-price-wrapper"> 2763 <div class="cart_price in-cart">${unitPrice}</div> 2764 </div> 2765 </div> 2766 </div> 2767 ${window.buildCartSubscribeWidget ? window.buildCartSubscribeWidget(item) : ''} 2768 </li>`; 2769 } 2770 }; 2771 </script>
2771 2772
2772<script> 2773 /** 2774 * Free Shipping Bar â live updater 2775 * Called after every cart AJAX update with the fresh cart object. 2776 * Free shipping is earned either by meeting the spend threshold, 2777 * OR automatically if any line item is on a subscription 2778 * (selling plan) â matching the server-rendered logic above. 2779 */ 2780 window.updateFreeShippingBar = function (cart) { 2781 var checkout = document.querySelector('#cart-form [name="checkout"]'); 2782 if (checkout) checkout.disabled = !cart.item_count; 2783 var bar = document.querySelector('[data-free-shipping-bar]'); 2784 if (!bar) return; // bar hidden (empty cart or feature disabled) 2785 2786 var threshold = parseInt(bar.dataset.threshold, 10); 2787 var msgProgress = bar.dataset.messageProgress; // e.g. "You are XX away from FREE SHIPPING!" 2788 var msgEarned = bar.dataset.messageEarned; // e.g. "You've earned FREE SHIPPING!" 2789 2790 var messageEl = bar.querySelector('[data-fsb-message]'); 2791 var trackEl = bar.querySelector('[data-fsb-track]'); 2792 var fillEl = bar.querySelector('[data-fsb-fill]'); 2793 2794 if (!messageEl || !fillEl) return; 2795 2796 var cartTotalCents = cart.total_price; 2797 2798 var hasSubscription = (cart.items || []).some(function (item) { 2799 return !!item.selling_plan_allocation; 2800 }); 2801 2802 var earned = hasSubscription || cartTotalCents >= threshold; 2803 2804 // --- Recalculate --- 2805 var pct = earned ? 100 : Math.min(Math.round((cartTotalCents / threshold) * 100), 100); 2806 var remainingCents = Math.max(threshold - cartTotalCents, 0); 2807 2808 // Format remaining as £X.XX (shop is GBP) 2809 var remaining = '£' + (remainingCents / 100).toFixed(2); 2810 // Strip .00 for cleaner copy: £10.00 â £10 2811 remaining = remaining.replace(/\.00$/, ''); 2812 2813 // --- Update fill --- 2814 fillEl.style.setProperty('--free-shipping-progress', pct + '%'); 2815 fillEl.classList.toggle('free-shipping-bar__fill--complete', earned); 2816 2817 // --- Update track aria --- 2818 if (trackEl) trackEl.setAttribute('aria-valuenow', pct); 2819 2820 // --- Update message --- 2821 if (earned) { 2822 messageEl.textContent = msgEarned; 2823 messageEl.classList.add('free-shipping-bar__message--earned'); 2824 } else { 2825 messageEl.textContent = msgProgress.replace('XX', remaining); 2826 messageEl.classList.remove('free-shipping-bar__message--earned'); 2827 } 2828 2829 // --- Show bar if it was hidden (cart was empty on load) --- 2830 bar.style.display = ''; 2831 }; 2832 2833 /** 2834 * Cart Upsell â live updater 2835 * Called after every cart mutation with the fresh cart object. 2836 * On 0â1 add: unhides the wrapper and updates the custom element's 2837 * data-* attributes so connectedCallback / the already-registered 2838 * class can trigger a fresh recommendations fetch. 2839 */ 2840 window.updateCartUpsell = function (cart) { 2841 var wrapper = document.querySelector('[data-cart-upsell-wrapper]'); 2842 if (!wrapper) return; 2843 2844 var upsellEl = wrapper.querySelector('cart-upsell-recommendations'); 2845 if (!upsellEl) return; 2846 2847 var items = cart.items || []; 2848 2849 if (items.length === 0) { 2850 wrapper.style.display = 'none'; 2851 upsellEl.dataset.productId = ''; 2852 delete upsellEl.dataset.recommendationsPerformed; 2853 return; 2854 } 2855 2856 // Build updated dataset values 2857 var firstProductId = String(items[0].product_id); 2858 var cartProductIds = items.map(function (i) { return i.product_id; }).join(','); 2859 var fetchLimit = Math.min( 2860 parseInt(upsellEl.dataset.limit || '4', 10) + items.length, 2861 10 2862 ); 2863 2864 // Only reset and re-fetch if the lead product has changed 2865 var previousProductId = upsellEl.dataset.productId; 2866 var previousCartProductIds = upsellEl.dataset.cartProductIds; 2867 2868 upsellEl.dataset.cartProductIds = cartProductIds; 2869 upsellEl.dataset.fetchLimit = fetchLimit; 2870
2871 if (firstProductId !== previousProductId || cartProductIds !== previousCartProductIds) { 2872 // Only reopen for new cart contents; preserve empty/error/closed states otherwise. 2873 wrapper.style.display = ''; 2874 wrapper.hidden = false; 2875 // New lead product â allow a fresh fetch 2876 upsellEl.dataset.productId = firstProductId; 2877 delete upsellEl.dataset.recommendationsPerformed; 2878 // Trigger load manually since connectedCallback won't fire again 2879 if (typeof upsellEl._triggerLoad === 'function') { 2880 upsellEl._triggerLoad(true); 2881 } 2882 } 2883 }; 2884 2885 /** 2886 * Hook into the Udesly cart update cycle. 2887 * Udesly calls fetch('/cart/update.js') or '/cart/change.js' then re-renders 2888 * the cart total via [udy-el="cart-total"]. We intercept those fetch calls 2889 * to grab the cart JSON and update the bar in the same tick. 2890 */ 2891 (function () { 2892 var _fetch = window.fetch; 2893 2894 // â Define OUTSIDE the fetch override, so it exists immediately 2895 window.syncGiftNoteUI = function (cart) { 2896 var section = document.getElementById('cart-gift-note-section'); 2897 if (!section) return; 2898 2899 var variantId = section.dataset.variantId; 2900 if (!variantId) return; 2901 2902 var stillInCart = (cart.items || []).some(function (item) { 2903 return String(item.variant_id) === String(variantId); 2904 }); 2905 2906 if (!stillInCart && typeof window.resetGiftNoteUI === 'function') { 2907 window.resetGiftNoteUI(); 2908 } 2909 }; 2910 2911 window.fetch = function (input, init) { 2912 var url = typeof input === 'string' ? input : (input && input.url) || ''; 2913 var isCartMutation = 2914 url.includes('/cart/update') || 2915 url.includes('/cart/change') || 2916 url.includes('/cart/add') || 2917 url.includes('/cart/clear'); 2918 2919 var result = _fetch.apply(this, arguments); 2920 2921 if (isCartMutation) { 2922 result.then(function (response) { 2923 response 2924 .clone() 2925 .json() 2926 .then(function (cart) { 2927 var total = typeof cart.total_price !== 'undefined' ? cart.total_price : null; 2928 2929 if (total !== null) { 2930 window.updateFreeShippingBar(cart); 2931 window.updateCartUpsell(cart); 2932 window.syncGiftNoteUI(cart); 2933 } else { 2934 _fetch('/cart.js', { headers: { 'Content-Type': 'application/json' } }) 2935 .then(function (r) { return r.json(); }) 2936 .then(function (freshCart) { 2937 if (typeof freshCart.total_price !== 'undefined') { 2938 window.updateFreeShippingBar(freshCart); 2939 window.updateCartUpsell(freshCart); 2940 window.syncGiftNoteUI(freshCart); 2941 } 2942 }) 2943 .catch(function () {}); 2944 } 2945 }) 2946 .catch(function () {}); 2947 }); 2948 } 2949 2950 return result; 2951 }; 2952 })(); 2953 </script>
2953 2954 <style> 2955 .udy-property-name { 2956 display: none; 2957 } 2958 </style> 2959 </div> 2960 <a 2961 2962 href="#" 2963 class="lg:hidden nav-link-block mobile-menu w-inline-block is--dark-logo" 2964 @click.prevent="menuOpen = !menuOpen" 2965 > 2966 <img 2967 src="//cartwheelcoffee.com/cdn/shop/t/29/assets/menu-white.svg?v=34693123022433889331790863894" 2968 loading="lazy" 2969 data-w-id="b6432bd8-3dc1-714e-9459-00ca67bfb283" 2970 alt="Menu" 2971 class="nav-burger" 2972 width="32" 2973 height="32" 2974 > 2975 <img 2976 src="//cartwheelcoffee.com/cdn/shop/t/29/assets/nav-close.svg?v=106155978684426472691790863894" 2977 loading="lazy" 2978 alt="" 2979 loading="lazy" 2980 alt="Cart" 2981 width="26" 2982 height="25" 2983 class="nav-close-icon" 2984 > 2985 </a> 2986 </div> 2987 2988 2989 2990 2991 2992 2993 2994 2995<div 2996 class="expanded-menu" 2997 x-show="openSubmenuIndex === 0" 2998 @mouseenter="if(isDesktop) openSubmenuIndex = 0" 2999 @mouseleave="if(isDesktop) openSubmenuIndex = null" 3000 @click.away="if(!isDesktop) openSubmenuIndex = null" 3001 x-transition 3002 style="display: none;" 3003 3004 > 3005 <div class="expanded-menu-inner"> 3006 <div class="expanded-menu-grid"><div class="expanded-block expanded-block__menu"> 3007 <div class="expanded-block__title">Explore</div> 3008 <ul class="expanded-menu__list"> 3009 3010 <li class="expanded-menu__item"> 3011 <a href="/collections/coffee" class="expanded-menu__link"> 3012 All Coffee 3013 </a> 3014 </li> 3015 3016 <li class="expanded-menu__item"> 3017 <a href="/collections/coffee/New" class="expanded-menu__link"> 3018 New Releases 3019 </a> 3020 </li> 3021 3022 <li class="expanded-menu__item"> 3023 <a href="/pages/subscription" class="expanded-menu__link"> 3024 Subscriptions 3025 </a> 3026 </li> 3027 3028 <li class="expanded-menu__item"> 3029 <a href="/collections/gifts" class="expanded-menu__link"> 3030 Gifts 3031 </a> 3032 </li> 3033 3034 <li class="expanded-menu__item"> 3035 <a href="/pages/workshops" class="expanded-menu__link"> 3036 Workshops 3037 </a> 3038 </li> 3039 3040 </ul> 3041 </div><div class="expanded-block expanded-block__menu"> 3042 <div class="expanded-block__title">Coffee For</div> 3043 <ul class="expanded-menu__list"> 3044 3045 <li class="expanded-menu__item"> 3046 <a href="/collections/coffee?filter.p.tag=filter" class="expanded-menu__link"> 3047 Filter 3048 </a> 3049 </li> 3050 3051 <li class="expanded-menu__item"> 3052 <a href="/collections/coffee?filter.p.tag=espresso" class="expanded-menu__link"> 3053 Espresso 3054 </a> 3055 </li> 3056 3057 <li class="expanded-menu__item"> 3058 <a href="/collections/coffee?filter.p.tag=decaf" class="expanded-menu__link"> 3059 Decaf 3060 </a> 3061 </li> 3062 3063 </ul> 3064 </div><div class="expanded-block expanded-block__menu"> 3065 <div class="expanded-block__title">Flavour Profile</div> 3066 <ul class="expanded-menu__list"> 3067 3068 <li class="expanded-menu__item"> 3069 <a href="/collections/coffee?filter.p.m.custom.flavour_profile=Chocolatey+%2B+Nutty" class="expanded-menu__link"> 3070 Chocolatey + Nutty 3071 </a> 3072 </li> 3073 3074 <li class="expanded-menu__item"> 3075 <a href="/collections/coffee?filter.p.m.custom.flavour_profile=Fruity" class="expanded-menu__link"> 3076 Fruity 3077 </a> 3078 </li> 3079 3080 <li class="expanded-menu__item"> 3081 <a href="/collections/coffee?filter.p.m.custom.flavour_profile=Bright+%2B+Juicy" class="expanded-menu__link"> 3082 Bright + Juicy 3083 </a> 3084 </li> 3085 3086 <li class="expanded-menu__item"> 3087 <a href="/collections/coffee?filter.p.m.custom.flavour_profile=Boozy+%2B+Experimental" class="expanded-menu__link"> 3088 Boozy + Experimental 3089 </a> 3090 </li> 3091 3092 </ul> 3093 </div><div class="expanded-block expanded-block__banner"> 3094 3095 <a href="/collections/coffee" class="expanded-block__link"> 3096 3097 <div class="expanded-block__banner-wrapper brew-wrapper brew-cards w-inline-block"><div class="expanded-block__text brew-guides-wrapper">All Coffee</div> 3098 <img src="//cartwheelcoffee.com/cdn/shop/files/2338f8a255bbe5b85923cb525659d5f2018a6323.jpg?v=1752482806&width=618" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/2338f8a255bbe5b85923cb525659d5f2018a6323.jpg?v=1752482806&width=375 375w, //cartwheelcoffee.com/cdn/shop/files/2338f8a255bbe5b85923cb525659d5f2018a6323.jpg?v=1752482806&width=550 550w" height="2732" loading="lazy" sizes="100vw" class="expanded-block-image object-cover brew-image"> 3099 <div class="gradient-overlay"></div> 3100 </div> 3101 3102 </a> 3103 3104 </div><div class="expanded-block expanded-block__banner"> 3105 3106 <a href="/collections/coffee/New" class="expanded-block__link"> 3107 3108 <div class="expanded-block__banner-wrapper brew-wrapper brew-cards w-inline-block"><div class="expanded-block__text brew-guides-wrapper">New Releases</div> 3109 <img src="//cartwheelcoffee.com/cdn/shop/files/7394167a2919709e039701fb5dc6f6bf681ca93e.jpg?v=1752482848&width=618" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/7394167a2919709e039701fb5dc6f6bf681ca93e.jpg?v=1752482848&width=375 375w, //cartwheelcoffee.com/cdn/shop/files/7394167a2919709e039701fb5dc6f6bf681ca93e.jpg?v=1752482848&width=550 550w" height="4096" loading="lazy" sizes="100vw" class="expanded-block-image object-cover brew-image"> 3110 <div class="gradient-overlay"></div> 3111 </div> 3112 3113 </a> 3114 3115 </div><div class="expanded-block expanded-block__banner"> 3116 3117 <a href="/pages/subscription" class="expanded-block__link"> 3118 3119 <div class="expanded-block__banner-wrapper brew-wrapper brew-cards w-inline-block"><div class="expanded-block__text brew-guides-wrapper">Subs</div> 3120 <img src="//cartwheelcoffee.com/cdn/shop/files/68f42535ecc8853841d60ccd6e9b5c7cef709394.jpg?v=1752482882&width=618" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/68f42535ecc8853841d60ccd6e9b5c7cef709394.jpg?v=1752482882&width=375 375w, //cartwheelcoffee.com/cdn/shop/files/68f42535ecc8853841d60ccd6e9b5c7cef709394.jpg?v=1752482882&width=550 550w" height="4096" loading="lazy" sizes="100vw" class="expanded-block-image object-cover brew-image"> 3121 <div class="gradient-overlay"></div> 3122 </div> 3123 3124 </a> 3125 3126 </div></div> 3127 </div> 3128 </div> 3129 3130<div 3131 class="expanded-menu" 3132 x-show="openSubmenuIndex === 1" 3133 @mouseenter="if(isDesktop) openSubmenuIndex = 1" 3134 @mouseleave="if(isDesktop) openSubmenuIndex = null" 3135 @click.away="if(!isDesktop) openSubmenuIndex = null" 3136 x-transition 3137 style="display: none;" 3138 3139 > 3140 <div class="expanded-menu-inner"> 3141 <div class="expanded-menu-grid"><div class="expanded-block expanded-block__menu"> 3142 <div class="expanded-block__title">Explore</div> 3143 <ul class="expanded-menu__list"> 3144 3145 <li class="expanded-menu__item"> 3146 <a href="/collections/equipment" class="expanded-menu__link"> 3147 All Equipment 3148 </a> 3149 </li> 3150 3151 <li class="expanded-menu__item"> 3152 <a href="/collections/gifts" class="expanded-menu__link"> 3153 Gifts 3154 </a> 3155 </li> 3156 3157 <li class="expanded-menu__item"> 3158 <a href="/collections/gifts?filter.p.tag=merch" class="expanded-menu__link"> 3159 Merch 3160 </a> 3161 </li> 3162 3163 <li class="expanded-menu__item"> 3164 <a href="/pages/workshops" class="expanded-menu__link"> 3165 Workshops 3166 </a> 3167 </li> 3168 3169 </ul> 3170 </div><div class="expanded-block expanded-block__menu"> 3171 <div class="expanded-block__title">Brewing Type</div> 3172 <ul class="expanded-menu__list"> 3173 3174 <li class="expanded-menu__item"> 3175 <a href="/collections/equipment?filter.p.tag=filter" class="expanded-menu__link"> 3176 Filter 3177 </a> 3178 </li> 3179 3180 <li class="expanded-menu__item"> 3181 <a href="/collections/equipment?filter.p.tag=espresso" class="expanded-menu__link"> 3182 Espresso 3183 </a> 3184 </li> 3185 3186 <li class="expanded-menu__item"> 3187 <a href="/collections/equipment?filter.p.tag=tea" class="expanded-menu__link"> 3188 Tea 3189 </a> 3190 </li> 3191 3192 </ul> 3193 </div><div class="expanded-block expanded-block__menu"> 3194 <div class="expanded-block__title">Type</div> 3195 <ul class="expanded-menu__list"> 3196 3197 <li class="expanded-menu__item"> 3198 <a href="/collections/equipment?filter.p.m.custom.equipment_type=Filter+Papers" class="expanded-menu__link"> 3199 Filter Papers 3200 </a> 3201 </li> 3202 3203 <li class="expanded-menu__item"> 3204 <a href="/collections/equipment?filter.p.m.custom.equipment_type=Brewers" class="expanded-menu__link"> 3205 Brewers 3206 </a> 3207 </li> 3208 3209 <li class="expanded-menu__item"> 3210 <a href="/collections/equipment?filter.p.m.custom.equipment_type=Grinders" class="expanded-menu__link"> 3211 Grinders 3212 </a> 3213 </li> 3214 3215 <li class="expanded-menu__item"> 3216 <a href="/collections/equipment" class="expanded-menu__link"> 3217 Ceramics 3218 </a> 3219 </li> 3220 3221 </ul> 3222 </div><div class="expanded-block expanded-block__banner"> 3223 3224 <a href="/collections/equipment" class="expanded-block__link"> 3225 3226 <div class="expanded-block__banner-wrapper brew-wrapper brew-cards w-inline-block"><div class="expanded-block__text brew-guides-wrapper">All Equipment</div> 3227 <img src="//cartwheelcoffee.com/cdn/shop/files/equipment.jpg?v=1753010295&width=618" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/equipment.jpg?v=1753010295&width=375 375w, //cartwheelcoffee.com/cdn/shop/files/equipment.jpg?v=1753010295&width=550 550w" height="4096" loading="lazy" sizes="100vw" class="expanded-block-image object-cover brew-image"> 3228 <div class="gradient-overlay"></div> 3229 </div> 3230 3231 </a> 3232 3233 </div><div class="expanded-block expanded-block__banner"> 3234 3235 <a href="/collections/equipment/fellow" class="expanded-block__link"> 3236 3237 <div class="expanded-block__banner-wrapper brew-wrapper brew-cards w-inline-block"><div class="expanded-block__text brew-guides-wrapper">New From Fellow</div> 3238 <img src="//cartwheelcoffee.com/cdn/shop/files/fellow.jpg?v=1753010322&width=618" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/fellow.jpg?v=1753010322&width=375 375w, //cartwheelcoffee.com/cdn/shop/files/fellow.jpg?v=1753010322&width=550 550w" height="1554" loading="lazy" sizes="100vw" class="expanded-block-image object-cover brew-image"> 3239 <div class="gradient-overlay"></div> 3240 </div> 3241 3242 </a> 3243 3244 </div><div class="expanded-block expanded-block__banner"> 3245 3246 <a href="/pages/workshops" class="expanded-block__link"> 3247 3248 <div class="expanded-block__banner-wrapper brew-wrapper brew-cards w-inline-block"><div class="expanded-block__text brew-guides-wrapper">Workshops</div> 3249 <img src="//cartwheelcoffee.com/cdn/shop/files/cupping_1.png?v=1753010295&width=618" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/cupping_1.png?v=1753010295&width=375 375w, //cartwheelcoffee.com/cdn/shop/files/cupping_1.png?v=1753010295&width=550 550w" height="1769" loading="lazy" sizes="100vw" class="expanded-block-image object-cover brew-image"> 3250 <div class="gradient-overlay"></div> 3251 </div> 3252 3253 </a> 3254 3255 </div></div> 3256 </div> 3257 </div> 3258 3259 3260 3261 3262 </div> 3263</div> 3264
3265<script> 3266 var currentSection = document.currentScript.closest('.shopify-section'); 3267 currentSection.setAttribute('class', 'header'); 3268</script>
3268 3269
3270<script> 3271 var navBtn = document.querySelector('.nav-cart-button'); 3272 3273 navBtn.addEventListener('click', (event) => { 3274 const firstOption = document.querySelector('.cart-options .option-text'); 3275 if (!firstOption) return; 3276 let text = firstOption.textContent; 3277 let result = text.includes('Default'); 3278 if (result == true) { 3279 firstOption.textContent = ''; 3280 } 3281 }); 3282</script>
3282 3283 3284
3285<script> 3286 document.addEventListener("DOMContentLoaded", function () { 3287 const navbar = document.querySelector(".navbar"); 3288 let lastScrollY = window.scrollY; 3289 3290 function handleScroll() { 3291 const currentScrollY = window.scrollY; 3292 3293 if (currentScrollY === 0) { 3294 // At the very top -> remove sticky 3295 navbar.classList.remove("sticky"); 3296 } else if (currentScrollY < lastScrollY) { 3297 // Scrolling up -> add sticky 3298 navbar.classList.add("sticky"); 3299 } else { 3300 // Scrolling down -> remove sticky 3301 navbar.classList.remove("sticky"); 3302 } 3303 3304 lastScrollY = currentScrollY; 3305 } 3306 3307 window.addEventListener("scroll", handleScroll); 3308 }); 3309</script>
3309 3310
3311<script> 3312document.addEventListener('DOMContentLoaded', function () { 3313 const cartWrapper = document.querySelector('.nav-cart-wrapper'); 3314 if (!cartWrapper) return; 3315 3316 const setBodyScrollLocked = (locked) => { 3317 document.body.style.overflow = locked ? 'hidden' : ''; 3318 // optional: prevent touch/pan on mobile when locked 3319 document.body.style.touchAction = locked ? 'none' : ''; 3320 }; 3321 3322 // initial state 3323 setBodyScrollLocked(cartWrapper.hasAttribute('data-cart-open')); 3324 3325 // observe attribute changes (data-cart-open) 3326 const observer = new MutationObserver((mutations) => { 3327 for (const m of mutations) { 3328 if (m.type === 'attributes' && m.attributeName === 'data-cart-open') { 3329 setBodyScrollLocked(cartWrapper.hasAttribute('data-cart-open')); 3330 } 3331 } 3332 }); 3333 3334 observer.observe(cartWrapper, { attributes: true, attributeFilter: ['data-cart-open'] }); 3335 3336 // fallback: also toggle shortly after cart open button click (if needed) 3337 const cartOpenBtn = document.getElementById('cartOpen'); 3338 if (cartOpenBtn) { 3339 cartOpenBtn.addEventListener('click', () => { 3340 // attribute might be set asynchronously by other code, poll briefly 3341 setTimeout(() => setBodyScrollLocked(cartWrapper.hasAttribute('data-cart-open')), 50); 3342 }); 3343 } 3344}); 3345</script>
3345 3346 3347<style data-shopify> 3348 .wholesale-navigation .wholesale-reorder { 3349 color: rgb(var(--color-foreground)); 3350 margin-inline-start: 8px; 3351 } 3352 .wholesale-navigation:not(.sticky):not(:hover) .nav-wrapper:not(.menu-open) .wholesale-reorder.is--home { 3353 color: #fff; 3354 } 3355 body.dark-mode--active .wholesale-navigation:not(.sticky):not(:hover) .nav-wrapper:not(.menu-open) .wholesale-reorder { 3356 color: rgb(var(--color-background)); 3357 } 3358 .wholesale-navigation ul.expanded-menu__list li .expanded-menu__link, 3359 .wholesale-navigation ul.expanded-menu__list li .expanded-menu__link--disabled { 3360 font-size: 1.125rem; 3361 text-decoration: none; 3362 transition: opacity 0.3s ease; 3363 } 3364 .wholesale-navigation .expanded-block__text { 3365 line-height: 1.2 !important; 3366 } 3367 @media (min-width: 992px) { 3368 .wholesale-navigation .expanded-block__text { 3369 font-size: clamp(14px, 1.5vw, 28px); 3370 } 3371 } 3372</style> 3373
3374<script> 3375 /** 3376 * Cart drawer ATC offset 3377 * When the drawer is auto-opened after Add to Cart, nudge it down 80px. 3378 * Manual cart icon clicks get the default position. 3379 */ 3380 (function () { 3381 var autoOpened = false; 3382 3383 // Flag set by main-product.liquid when it calls cartBtn.click() after ATC 3384 window.cartDrawerAutoOpen = function () { 3385 autoOpened = true; 3386 }; 3387 3388 var cartWrapper = document.querySelector('.nav-cart-wrapper'); 3389 if (!cartWrapper) return; 3390 3391 // Find the actual drawer panel Udesly renders inside the wrapper 3392 function getDrawerEl() { 3393 return cartWrapper.querySelector('.w-commerce-commercecartcontainerWrapper, [class*="commercecartcontainer"]'); 3394 } 3395 3396 function isNavbarHidden() { 3397 var navbar = document.querySelector('.navbar'); 3398 if (!navbar) return false; 3399 var transform = navbar.style.transform || ''; 3400 return transform.indexOf('translate3d(0px, -100%') !== -1; 3401 } 3402 3403 function applyDrawerOffset(drawer) { 3404 if (!drawer) return; 3405 if (isNavbarHidden()) { 3406 drawer.style.setProperty('transform', 'translateX(0px) translateY(80px)', 'important'); 3407 } else { 3408 drawer.style.setProperty('transform', 'translateX(0px)', 'important'); 3409 } 3410 } 3411 3412 var observer = new MutationObserver(function (mutations) { 3413 mutations.forEach(function (m) { 3414 if (m.type !== 'attributes' || m.attributeName !== 'data-cart-open') return; 3415 3416 if (cartWrapper.hasAttribute('data-cart-open')) { 3417 // Drawer just opened 3418 if (autoOpened) { 3419 applyDrawerOffset(getDrawerEl()); 3420 autoOpened = false; // reset for next interaction 3421 } 3422 } else { 3423 // Drawer closed â always clear the override so manual opens are clean 3424 var drawer = getDrawerEl(); 3425 if (drawer) { 3426 drawer.style.removeProperty('transform'); 3427 } 3428 } 3429 }); 3430 }); 3431 3432 observer.observe(cartWrapper, { attributes: true, attributeFilter: ['data-cart-open'] }); 3433 })(); 3434</script>
3434 3435 3436 3437</div> 3438<!-- END sections: header-group --> 3439 <section id="shopify-section-template--30520050581881__blog" class="shopify-section section hero-section is--blog-template"><section class="container container_center"> 3440 <div class="intro-wrapper new-header is--blog-header"> 3441 <h1>articles</h1> 3442 </div> 3443 <div class="w-dyn-list"> 3444 <div id="blog" role="list" class="blog-list w-dyn-items"> 3445 <div role="listitem" class="blog-margin w-dyn-item"> 3446 <a href="/blogs/articles/making-great-espresso-at-home-a-beginners-guide" class="grid-full_blog w-inline-block"><img alt="Making Great Espresso at Home - A Beginner's Guide" loading="eager" 3447 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/CW_Roastery_Jan_25_espresso_grantritchie_-6_df4256ee-908a-4366-92f6-0bbaa2c5bd31.jpg?v=1740140115" 3448 class="full-width-img is--cover"> 3449 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3450 <h5>21-02-25</h5> 3451 <div class="blog-spacer"></div> 3452 <h2 class="caps-each-word">Making Great Espresso at Home - A Beginner's Guide</h2> 3453 <div class="blog-spacer"></div> 3454 <p> 3455 <p><span>Youâve got yourself an espresso machine and want to recreate the same high-quality espresso as your favourite coffee shop - This is a great first step, we understand this is the most exciting stage! However, great-tasting espresso isnât just about the machine; itâs the result of several key element working together to achieve the quality you are looking for. </span></p> 3456<p><span>In this blog weâll aim to set you up with all the information and skills you need to achieve great tasting espresso at home.</span></p> 3457 3458</p> 3459 <div class="p-text-link">Read more</div> 3460 </div> 3461 </a> 3462 </div><div role="listitem" class="blog-margin w-dyn-item"> 3463 <a href="/blogs/articles/recipe-teds-clarified-coffee-cocktails-2-pumpkin-spice-latte" class="grid-full_blog w-inline-block"><img alt="Recipe - Ted's Clarified Coffee Cocktails - #2 : âPumpkin Spice Latteâ" loading="eager" 3464 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/timothe-durand-8J-nwlRI-XY-unsplash.jpg?v=1698258113" 3465 class="full-width-img is--cover"> 3466 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3467 <h5>25-10-23</h5> 3468 <div class="blog-spacer"></div> 3469 <h2 class="caps-each-word">Recipe - Ted's Clarified Coffee Cocktails - #2 : âPumpkin Spice Latteâ</h2> 3470 <div class="blog-spacer"></div> 3471 <p> 3472 <meta charset="utf-8"> 3473<p data-mce-fragment="1"><span data-mce-fragment="1">If you were at Notts Coffee Festival, chances are you tried one of our coffee cocktails! </span></p> 3474<p data-mce-fragment="1"><span data-mce-fragment="1">Each one uses some kind of clarified milk - This is a process which involves curdling and then straining out the milk solids. The clarified milk adds a smooth and rounded sweetness to the finished cocktail.</span></p> 3475<p data-mce-fragment="1"><span data-mce-fragment="1">This one's a twist on an autumnal classic - The Pumpkin Spice Latte...</span></p> 3476 3477</p> 3478 <div class="p-text-link">Read more</div> 3479 </div> 3480 </a> 3481 </div><div role="listitem" class="blog-margin w-dyn-item"> 3482 <a href="/blogs/articles/the-truth-about-fresh-coffee" class="grid-full_blog w-inline-block"><img alt="The Truth About Fresh Coffee" loading="eager" 3483 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/Cartwheel_Roastery_Nov_21_Grant_Ritchie_-108_52ef81d3-8aaf-4205-93c5-d140ccdc9cfc.jpg?v=1736344053" 3484 class="full-width-img is--cover"> 3485 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3486 <h5>18-10-23</h5> 3487 <div class="blog-spacer"></div> 3488 <h2 class="caps-each-word">The Truth About Fresh Coffee</h2> 3489 <div class="blog-spacer"></div> 3490 <p> 3491 <p><meta charset="utf-8">We often hear that freshly ground coffee is superior to pre-ground coffee, and the common narrative in the specialty coffee scene over the last two decades has been that old coffee is bad, and coffee closest to its roast date is best. Weâve often seen people in our
3491café rifling through bags looking for coffee with the shortest roast date. But how long is too long? This is a topic of much debate. It turns out there is no one right answer, as various factors can influence the ideal period. However, letâs explore coffee freshness and provide insights into ideal resting times, usage windows, and storage methods to help you enjoy your coffee at its best.<br></p> 3492 3493</p> 3494 <div class="p-text-link">Read more</div> 3495 </div> 3496 </a> 3497 </div><div role="listitem" class="blog-margin w-dyn-item"> 3498 <a href="/blogs/articles/the-ultimate-guide-to-coffee-processes" class="grid-full_blog w-inline-block"><img alt="What on Earth is âCarbonic Macerationâ? A Handy Guide to Coffee Processingâ¦." loading="eager" 3499 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/PXL_20220525_143602467.PORTRAIT.jpg?v=1673537221" 3500 class="full-width-img is--cover"> 3501 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3502 <h5>12-01-23</h5> 3503 <div class="blog-spacer"></div> 3504 <h2 class="caps-each-word">What on Earth is âCarbonic Macerationâ? A Handy Guide to Coffee Processingâ¦.</h2> 3505 <div class="blog-spacer"></div> 3506 <p> 3507 <meta charset="utf-8"><span>Youâve probably seen us use the phrases âwashed processâ and ânatural processâ. You might have even come across phrases like âhoney-processâ, âmaceratedâ or âanaerobic fermentationâ...<br></span><span><br></span><span>But what does all this confusing coffee jargon mean? And how can you use these words and labels to help you pick coffee thatâs right for you?</span> 3508 3509</p> 3510 <div class="p-text-link">Read more</div> 3511 </div> 3512 </a> 3513 </div><div role="listitem" class="blog-margin w-dyn-item"> 3514 <a href="/blogs/articles/recipe-teds-clarified-coffee-sours-cocktail-1" class="grid-full_blog w-inline-block"><img alt="Recipe - Ted's Clarified Coffee Cocktails - #1 : Vodka + Odo Shakiso Coffee Sour" loading="eager" 3515 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/thomas-franke-py2fvXhnAnQ-unsplash.jpg?v=1666881253" 3516 class="full-width-img is--cover"> 3517 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3518 <h5>27-10-22</h5> 3519 <div class="blog-spacer"></div> 3520 <h2 class="caps-each-word">Recipe - Ted's Clarified Coffee Cocktails - #1 : Vodka + Odo Shakiso Coffee Sour</h2> 3521 <div class="blog-spacer"></div> 3522 <p> 3523 <p><span style="font-weight: 400;">If you were at Notts Coffee Festival, chances are you tried one of our coffee cocktails! </span></p> 3524<p><span style="font-weight: 400;">Each one uses some kind of clarified milk - This is a process which involves curdling and then straining out the milk solids. The clarified milk adds a smooth and rounded sweetness to the finished cocktail.</span></p> 3525<p><span style="font-weight: 400;">The cocktail mix is poured through used coffee grounds, to infuse the cocktail with its flavour. </span>After that, the sugar syrup is added and voila! You get a deliciously smooth and sweet coffee cocktail, with lovely fresh citrus acidity.</p> 3526<p>This recipe, for <strong>Cocktail #1</strong>, is gluten-free and vegan and can be easily modified.</p> 3527 3528</p> 3529 <div class="p-text-link">Read more</div> 3530 </div> 3531 </a> 3532 </div><div role="listitem" class="blog-margin w-dyn-item"> 3533 <a href="/blogs/articles/coffee-resource-library" class="grid-full_blog w-inline-block"><img alt="A Guide to The Best Coffee Blogs, Podcasts, YouTubers and More..." loading="eager" 3534 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/laura-cleffmann-9NeMqfxFFTE-unsplash.jpg?v=1658939909" 3535 class="full-width-img is--cover"> 3536 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3537 <h5>28-07-22</h5> 3538 <div class="blog-spacer"></div> 3539 <h2 class="caps-each-word">A Guide to The Best Coffee Blogs, Podcasts, YouTubers and More...</h2> 3540 <div class="blog-spacer"></div> 3541 <p> 3542 <p> 3543 Welcome to our brand new library of coffee resources! This list will be updated regularly, with all our favourite coffee-focused websites, must-read coffee blogs, youtube channels, podcasts and books, so that it can become a hub of information for everyone.We want to make specialty coffee more accessible and we believe that information is there to be shared - Even collaborating on this list, each of us found out about something we hadnât heard of before! (Got your own recommendations? Drop us an email here) We hope that whatever area of coffee youâre curious about, thereâll be something on this list that gets you... 3544 </p> 3545 3546</p> 3547 <div class="p-text-link">Read more</div> 3548 </div> 3549 </a> 3550 </div><div role="listitem" class="blog-margin w-dyn-item"> 3551 <a href="/blogs/articles/interviewing-ted-visiting-brazil-2022" class="grid-full_blog w-inline-block"><img alt="Interviewing Ted - Visiting Brazil 2022" loading="eager" 3552 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/interviewing-ted-visiting-brazil-2022-cartwheel-coffee.jpg?v=1658393075" 3553 class="full-width-img is--cover"> 3554 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3555 <h5>14-07-22</h5> 3556 <div class="blog-spacer"></div> 3557 <h2 class="caps-each-word">Interviewing Ted - Visiting Brazil 2022</h2> 3558 <div class="blog-spacer"></div> 3559 <p> 3560 <p> 3561 About a month ago, our head roaster Ted got back from a week-long trip to Brazil organised by Kamba Coffee, one of the importers we work closely with to source coffee. Led by Bruna from Kamba, Ted joined 8 other roasters and coffee professionals from the UK and Europe travelling across the state of São Paulo visiting coffee farms and dry mills. We sat down with Ted to find out more about his trip⦠Helena: Hey Ted! So I wanted to start by asking you what someone can typically expect from Brazilian coffee, in terms of a flavour profile? Ted:... 3562 </p> 3563 3564</p> 3565 <div class="p-text-link">Read more</div> 3566 </div> 3567 </a> 3568 </div><div role="listitem" class="blog-margin w-dyn-item"> 3569 <a href="/blogs/articles/fermentation-geishas-and-blends-uk-coffee-championships-2022" class="grid-full_blog w-inline-block"><img alt="Fermentation, Geishas and Blends - UK Coffee Championships 2022" loading="eager" 3570 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/fermentation-geishas-and-blends-uk-coffee-championships-2022-cartwheel-coffee.png?v=1658392958" 3571 class="full-width-img is--cover"> 3572 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3573 <h5>19-05-22</h5> 3574 <div class="blog-spacer"></div> 3575 <h2 class="caps-each-word">Fermentation, Geishas and Blends - UK Coffee Championships 2022</h2> 3576 <div class="blog-spacer"></div> 3577 <p> 3578 <p> 3579 Last Saturday was a big one for the UK coffee industry! The final rounds for the UK Barista Championships and UK Brewerâs Cup Championships culminated in wins for Claire Wallace of Assembly Coffee and Sierra Yeo of Alpro Barista. Two female powerhouses and all-around amazing people â weâre big fans here at Cartwheel! These competitions are true highlights of the UK Coffee calendar â competitors prepare and perfect their routines for months in advance â and the UK winners of both comps will be going on to represent the UK at the World Championships in Melbourne this September.  Claire... 3580 </p> 3581 3582</p> 3583 <div class="p-text-link">Read more</div> 3584 </div> 3585 </a> 3586 </div><div role="listitem" class="blog-margin w-dyn-item"> 3587 <a href="/blogs/articles/cartwheel-coffee-origins" class="grid-full_blog w-inline-block"><img alt="Cartwheel Coffee Origins" loading="eager" 3588 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/cartwheel-coffee-origins-cartwheel-coffee.jpg?v=1658392958" 3589 class="full-width-img is--cover"> 3590 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3591 <h5>12-05-22</h5> 3592 <div class="blog-spacer"></div> 3593 <h2 class="caps-each-word">Cartwheel Coffee Origins</h2> 3594 <div class="blog-spacer"></div> 3595 <p> 3596 Read about the origins of Cartwheel Coffee, from inspiration to completion. Learn about the story of our owner Alex, how he created an innovative coffee brand and eventually expanded into his mumâs original business premises. 3597 3598</p> 3599 <div class="p-text-link">Read more</div> 3600 </div> 3601 </a> 3602 </div><div role="listitem" class="blog-margin w-dyn-item"> 3603 <a href="/blogs/articles/sustainability-blog-post" class="grid-full_blog w-inline-block"><img alt="Sustainability at Cartwheel" loading="eager" 3604 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/sustainability-at-cartwheel-cartwheel-coffee.jpg?v=1658392958" 3605 class="full-width-img is--cover"> 3606 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3607 <h5>19-04-22</h5> 3608 <div class="blog-spacer"></div> 3609 <h2 class="caps-each-word">Sustainability at Cartwheel</h2> 3610 <div class="blog-spacer"></div> 3611 <p> 3612 Read about Cartwheelâs Sustainability Promise, what weâre doing currently in terms of our sustainability, and what we plan to do. Learn about how weâre reducing plastic waste, using electric vehicles and recycling our food and coffee byproducts! 3613 3614</p> 3615 <div class="p-text-link">Read more</div> 3616 </div> 3617 </a> 3618 </div><div role="listitem" class="blog-margin w-dyn-item"> 3619 <a href="/blogs/articles/grind-size-matters" class="grid-full_blog w-inline-block"><img alt="Grind Size Matters" loading="eager" 3620 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/grind-size-matters-cartwheel-coffee.jpg?v=1658392958" 3621 class="full-width-img is--cover"> 3622 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3623 <h5>24-03-22</h5> 3624 <div class="blog-spacer"></div> 3625 <h2 class="caps-each-word">Grind Size Matters</h2> 3626 <div class="blog-spacer"></div> 3627 <p> 3628 <p> 3629 Have you ever given much thought to your grind setting? Or maybe you order your coffee from us pre-ground for your preferred brew method? Knowing your coffee grounds is the baseline for great coffee. In this blog, weâre going to talk about the difference between burrs and blades, under and over extraction, and coarse or fine grounds. Whether youâre using a Kalita or an espresso machine, by the end of this blog you should know y
3629our grinds, of coarse! Burrs or Blades You might have heard of one of these terms more often than the other, and thatâs because most... 3630 </p> 3631 3632</p> 3633 <div class="p-text-link">Read more</div> 3634 </div> 3635 </a> 3636 </div><div role="listitem" class="blog-margin w-dyn-item"> 3637 <a href="/blogs/articles/traceability-coffee-sourcing" class="grid-full_blog w-inline-block"><img alt="Traceability: Coffee Sourcing" loading="eager" 3638 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/traceability-coffee-sourcing-cartwheel-coffee.jpg?v=1658392958" 3639 class="full-width-img is--cover"> 3640 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3641 <h5>10-03-22</h5> 3642 <div class="blog-spacer"></div> 3643 <h2 class="caps-each-word">Traceability: Coffee Sourcing</h2> 3644 <div class="blog-spacer"></div> 3645 <p> 3646 <p> 3647 Coffee sourcing is where coffee traceability begins for Cartwheel. Weâve built integral relationships with importers, and even sourced directly from origin in our sourcing trips. It is important to us to ensure that we know the quality of the coffee we are buying, and where it has come from. In this blog, I will break down some of the key processes we undertake at Cartwheel when it comes to sourcing our coffee, how this has developed over time, and why this makes us stand apart from commercial coffee.  Sourcing Partnerships At Cartwheel, we rely on partnerships with importers. These... 3648 </p> 3649 3650</p> 3651 <div class="p-text-link">Read more</div> 3652 </div> 3653 </a> 3654 </div><div role="listitem" class="blog-margin w-dyn-item"> 3655 <a href="/blogs/articles/easy-brew-hacks-worth-remembering" class="grid-full_blog w-inline-block"><img alt="Easy Brew Hacks Worth Remembering" loading="eager" 3656 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/easy-brew-hacks-worth-remembering-cartwheel-coffee.jpg?v=1658392958" 3657 class="full-width-img is--cover"> 3658 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3659 <h5>24-02-22</h5> 3660 <div class="blog-spacer"></div> 3661 <h2 class="caps-each-word">Easy Brew Hacks Worth Remembering</h2> 3662 <div class="blog-spacer"></div> 3663 <p> 3664 <p> 3665 âPre-wash your coffee filterâ Whether you like to use a V60 or Kalita brewer, the use of filter papers is undeniably simple. They make for an easy clean up and a consistent brew, with a little bit of practice. But even the best of us forget the simplest tips to refine your brew. Pre-washing your filter paper with hot water is a great practice when using this equipment. Initially, this will help to eliminate any of that papery taste that could leave a trace in your final drink. And the second benefit is that your equipment will be preheated for... 3666 </p> 3667 3668</p> 3669 <div class="p-text-link">Read more</div> 3670 </div> 3671 </a> 3672 </div><div role="listitem" class="blog-margin w-dyn-item"> 3673 <a href="/blogs/articles/traceability-an-introduction" class="grid-full_blog w-inline-block"><img alt="Traceability: An Introduction" loading="eager" 3674 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/traceability-an-introduction-cartwheel-coffee.jpg?v=1658392958" 3675 class="full-width-img is--cover"> 3676 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3677 <h5>17-02-22</h5> 3678 <div class="blog-spacer"></div> 3679 <h2 class="caps-each-word">Traceability: An Introduction</h2> 3680 <div class="blog-spacer"></div> 3681 <p> 3682 <p> 3683 We go on about traceability quite a lot. Itâs one of the main points that we emphasise about our coffee, and we have a small section on the back of all our tasting cards dedicated to it. But what does it mean and why is it so important to us? In coffee, traceability is quite simply the ability to trace where and when the product was produced and by whom. Often it means that other important information is captured and is available such as prices paid to producers, the locations of mills, dates of harvesting and other processes leading up... 3684 </p> 3685 3686</p> 3687 <div class="p-text-link">Read more</div> 3688 </div> 3689 </a> 3690 </div><div role="listitem" class="blog-margin w-dyn-item"> 3691 <a href="/blogs/articles/understanding-coffee-deciphering-tasting-notes" class="grid-full_blog w-inline-block"><img alt="Understanding Coffee: Deciphering Tasting Notes" loading="eager" 3692 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/understanding-coffee-deciphering-tasting-notes-cartwheel-coffee.jpg?v=1658392958" 3693 class="full-width-img is--cover"> 3694 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3695 <h5>10-02-22</h5> 3696 <div class="blog-spacer"></div> 3697 <h2 class="caps-each-word">Understanding Coffee: Deciphering Tasting Notes</h2> 3698 <div class="blog-spacer"></div> 3699 <p> 3700 <p> 3701 When we launched our rebrand back in November 2021, you may have seen our highlight post explaining our tasting cards. These cards come clipped to every bag of coffee you buy and are served alongside every pourover in our
3701café. The intention is to invite you, our customer, into an honest and informative discourse about the coffee that you are drinking. Some of the information that we will provide to you includes the origins of the coffee, the way it was processed, and its traceability. Weâre really passionate about providing you with all the information, from the names of our... 3702 </p> 3703 3704</p> 3705 <div class="p-text-link">Read more</div> 3706 </div> 3707 </a> 3708 </div><div role="listitem" class="blog-margin w-dyn-item"> 3709 <a href="/blogs/articles/coffee-pods-vs-home-brewing" class="grid-full_blog w-inline-block"><img alt="Coffee Pods vs Home Brewing" loading="eager" 3710 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/coffee-pods-vs-home-brewing-cartwheel-coffee.jpg?v=1658392958" 3711 class="full-width-img is--cover"> 3712 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3713 <h5>04-02-22</h5> 3714 <div class="blog-spacer"></div> 3715 <h2 class="caps-each-word">Coffee Pods vs Home Brewing</h2> 3716 <div class="blog-spacer"></div> 3717 <p> 3718 <p> 3719 In this blog, I want to weigh up some of the reasons that we prefer to use fresh, whole-bean coffee in the café and in our home brewing set-ups â looking at the implications of cost, taste, ease and expertise needed to perfect each method. Many companies have attempted to condense the bespoke coffee shop experience into the commonly known coffee pod. These pods, typically made entirely from plastic â or aluminium lined with plastic â are not yet at home recyclable. Most pods need to be sent to specialist recycling centres with some companies offering pickup services to customers.... 3720 </p> 3721 3722</p> 3723 <div class="p-text-link">Read more</div> 3724 </div> 3725 </a> 3726 </div><div role="listitem" class="blog-margin w-dyn-item"> 3727 <a href="/blogs/articles/5-new-years-resolutions-you-don-t-have-to-break" class="grid-full_blog w-inline-block"><img alt="5 New Years Resolutions You Donât Have to Break" loading="eager" 3728 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/5-new-years-resolutions-you-don-t-have-to-break-cartwheel-coffee.jpg?v=1658392958" 3729 class="full-width-img is--cover"> 3730 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3731 <h5>27-01-22</h5> 3732 <div class="blog-spacer"></div> 3733 <h2 class="caps-each-word">5 New Years Resolutions You Donât Have to Break</h2> 3734 <div class="blog-spacer"></div> 3735 <p> 3736 <p> 3737 A recent UK study found that 64% of people abandon their New Yearâs resolutions before the end of January. With âQuitters Dayâ being just the 12th of January, itâs clear to see that our set resolutions are often too difficult or too tedious to uphold. Another reason that resolutions are hard to stick to is how vague we make them: get fit, eat more healthily, sleep better; these are all popular resolutions that have no clear, final goal or route to reach them. However, some resolutions are hard to follow because they can become inconvenient. Using less plastic, eating less... 3738 </p> 3739 3740</p> 3741 <div class="p-text-link">Read more</div> 3742 </div> 3743 </a> 3744 </div><div role="listitem" class="blog-margin w-dyn-item"> 3745 <a href="/blogs/articles/recycling-your-cartwheel-coffee-bags" class="grid-full_blog w-inline-block"><img alt="Recycling Your Cartwheel Coffee Bags" loading="eager" 3746 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/recycling-your-cartwheel-coffee-bags-cartwheel-coffee.jpg?v=1658392958" 3747 class="full-width-img is--cover"> 3748 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3749 <h5>21-01-22</h5> 3750 <div class="blog-spacer"></div> 3751 <h2 class="caps-each-word">Recycling Your Cartwheel Coffee Bags</h2> 3752 <div class="blog-spacer"></div> 3753 <p> 3754 <p> 3755 Recycling isnât a new trend, but you might be surprised to hear that the Household Waste Recycling Act was only approved in 2003! This law required local councils in England to provide every household with a separate collection of at least two types of recyclable materials by 2010. Even so, up to 15% of mixed, dry recycling could be contaminated with non-recyclable plastics. We have worked hard behind the scenes to design and manufacture a coffee bag that is fully recyclable â and we are still in the minority of roasters able to claim this! Whether itâs our tasting cards... 3756 </p> 3757 3758</p> 3759 <div class="p-text-link">Read more</div> 3760 </div> 3761 </a> 3762 </div><div role="listitem" class="blog-margin w-dyn-item">
3763 <a href="/blogs/articles/an-almost-comprehensive-guide-to-coffee-jargon" class="grid-full_blog w-inline-block"><img alt="An (Almost) Comprehensive Guide to Coffee Jargon" loading="eager" 3764 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/an-almost-comprehensive-guide-to-coffee-jargon-cartwheel-coffee.jpg?v=1658392958" 3765 class="full-width-img is--cover"> 3766 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3767 <h5>13-01-22</h5> 3768 <div class="blog-spacer"></div> 3769 <h2 class="caps-each-word">An (Almost) Comprehensive Guide to Coffee Jargon</h2> 3770 <div class="blog-spacer"></div> 3771 <p> 3772 <p> 3773 Specialty coffee is sometimes thought to serve only an elitist community of coffee drinkers, inherently excluding those less knowledgeable about coffee from the conversation. Here at Cartwheel, we believe that everyone should be involved in the conversation and have the opportunity to try and buy specialty coffee. Thatâs why weâre releasing this (almost) comprehensive list of coffee terminology in order to help give you a leg up in your next coffee chat, to prove that specialty coffee really is available for everyone! A AA â A coffee grading term that refers to a specific, larger than normal, bean size. Acidity... 3774 </p> 3775 3776</p> 3777 <div class="p-text-link">Read more</div> 3778 </div> 3779 </a> 3780 </div><div role="listitem" class="blog-margin w-dyn-item"> 3781 <a href="/blogs/articles/save-store-and-reuse-your-excess-coffee" class="grid-full_blog w-inline-block"><img alt="Save, Store and Reuse Your Excess Coffee" loading="eager" 3782 id="w-node-_7b6765c6-d64c-6a17-0701-0cea6aff09ab-05dc4ffe" src="//cartwheelcoffee.com/cdn/shop/articles/save-store-and-reuse-your-excess-coffee-cartwheel-coffee.jpg?v=1658392958" 3783 class="full-width-img is--cover"> 3784 <div id="w-node-_8a8fc45c-26e8-5ed2-427d-30bc0d2c283f-05dc4ffe" class="article-wrapper"> 3785 <h5>06-01-22</h5> 3786 <div class="blog-spacer"></div> 3787 <h2 class="caps-each-word">Save, Store and Reuse Your Excess Coffee</h2> 3788 <div class="blog-spacer"></div> 3789 <p> 3790 <p> 3791 If youâre anything like us, youâll have an impractical amount of coffee left over from the Christmas break. Whether itâs from gifts, personal treats, or that very specific blend that only one person in your house drinks⦠Often thereâs just too much for one person to get through, and most of that good coffee goes bad or ends up in the bin. Well, weâre here to save your New Year, and offer a list of practical uses for your fresh coffee. Whether itâs your whole beans, ground coffee, or spent grinds â weâll help you reduce waste and save you... 3792 </p> 3793 3794</p> 3795 <div class="p-text-link">Read more</div> 3796 </div> 3797 </a> 3798 </div> 3799 </div> 3800 3801 <div class="w-pagination-wrapper _w-pagination-wrapper"> 3802 3803 <a href="/blogs/articles?page=2" class="w-pagination-next load-button"> 3804 <div class="w-inline-block">Next</div><svg class="w-pagination-next-icon" height="12px" width="12px" 3805 xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" transform="translate(0, 1)"> 3806 <path fill="none" stroke="currentColor" fill-rule="evenodd" d="M4 2l4 4-4 4"></path> 3807 </svg> 3808 </a> 3809 </div> 3810 </div> 3811</section> 3812 3813<!--
3813<script src="//cartwheelcoffee.com/cdn/shop/t/29/assets/collection-load-more.aio.min.js?v=180193144851501760451790863894" type="text/javascript"></script>
vendor: 1 bytes, line 3813
3813
3814<script> 3815 (function () { 3816 3817 window.endlessScroll = null; 3818 $("body").on("click", ".store-tabs-menu > a", function () { 3819 if (endlessScroll) endlessScroll.destroy(); 3820 // Start Ajaxinate 3821 3822 // Remove attributes 3823 console.log('Remove attributes') 3824 document.querySelectorAll('[data-node-type="commerce-add-to-cart-form"]').forEach(el => el.parentElement.removeAttribute('udy-el', 'loop-add-to-cart')); 3825 3826 endlessScroll = new Ajaxinate({ 3827 container: $(this).data("ajaxContainer"), 3828 pagination: $(this).data("ajaxPaginate"), 3829 method: "scroll", 3830 loadingText: "", 3831 callback: paginateLoaded, 3832 }); 3833 }); 3834 3835 $("body").find(".store-tabs-menu > a")[0].click(); 3836 3837 function paginateLoaded() { 3838 let $filter = $(".filters-wrapper:visible > a.filters-active"); 3839 $(".filters-wrapper:visible > a")[0].click(); 3840 if ($filter.length) $filter[0].click(); 3841 // Attributes added 3842 console.log('Add attributes') 3843 document.querySelectorAll('[data-node-type="commerce-add-to-cart-form"]').forEach(el => el.parentElement.setAttribute('udy-el', 'loop-add-to-cart')); 3844 document.querySelectorAll('.nav-cart-wrapper').forEach(el => el.removeAttribute('data-node-type')) 3845 document.dispatchEvent(new Event('DOMContentLoaded')); 3846 // Reintialise Webflow interactions 3847 reloadWebflow(); 3848 } 3849 3850 var reloadWebflow = function () { 3851 $("html").attr("data-wf-page", "609ce7e7a10446f2b1dc5057"); 3852 Webflow.destroy(); 3853 Webflow.ready(); 3854 Webflow.require("ix2").init(); 3855 }; 3856 3857 })(); 3858</script>
3858 3859
3860<script> 3861 var reloadWebflow = function reload_js() { 3862 $('html').attr('data-wf-page', '609ce7e7a10446f2b1dc5057'); 3863 Webflow.destroy(); 3864 Webflow.ready(); 3865 Webflow.require('ix2').init(); 3866 document.dispatchEvent(new Event('readystatechange')); 3867 } 3868</script>
3868 --> 3869
3870<script> 3871 var currentSection = document.currentScript.closest('.shopify-section'); 3872 currentSection.setAttribute("class", "section hero-section is--blog-template"); 3873</script>
3873 3874 3875</section>
3875<script data-locksmith> 3876 var load = function () { 3877 3878 if (document.querySelectorAll('.locksmith-manual-trigger').length > 0) { 3879 Locksmith.ping(); 3880 } 3881 3882 3883 Locksmith.util.on('submit', 'locksmith-resource-form', function (event) { 3884 event.preventDefault(); 3885 var data = Locksmith.util.serializeForm(event.target); 3886 var options = { spinner: false, container: 'locksmith-content' }; 3887 // a form rendered inline (section replacement) must keep that context 3888 // on resubmit: same enclosing container (there may be several on the 3889 // page), and no layout classes or cancel affordance in the re-render 3890 var inlineContainer = event.target.closest && event.target.closest('[id^="locksmith-content"]'); 3891 if (inlineContainer) { 3892 options.container = inlineContainer; 3893 } 3894 if (event.target.getAttribute('data-locksmith-inline') === 'true') { 3895 options.include_layout_classes = false; 3896 } 3897 Locksmith.postResource(data, options); 3898 }); 3899 3900 Locksmith.util.on('click', 'locksmith-manual-trigger', function (event) { 3901 event.preventDefault(); 3902 Locksmith.postResource({}, { spinner: true, container: document }); 3903 }); 3904 3905 Locksmith.submitPasscode = function (passcode) { 3906 Locksmith.postResource( 3907 { passcode: passcode }, 3908 { spinner: false, container: 'locksmith-content' } 3909 ); 3910 }; 3911 }; 3912 3913 if (typeof Locksmith !== 'undefined') { 3914 load(); 3915 } else { 3916 window.addEventListener('load', load); 3917 } 3918 </script>
3918 3919 <!-- BEGIN sections: footer-group --> 3920<div id="shopify-section-sections--30520046289273__footer-component" class="shopify-section shopify-section-group-footer-group footer-wrap"><div class="container"> 3921 <div class="intro-wrapper is--footer"> 3922 3923 3924 <h2 3925 class="h1-info-page-editor is--footer" 3926 3927 > 3928 Roasted in 3929 </h2> 3930 3931 3932 3933 <h2 3934 class="is--footer" 3935 3936 > 3937 Nottingham 3938 </h2> 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 </div> 3960 <div class="w-layout-grid grid_footer"> 3961 3962 3963 3964 3965 3966 3967 <ul 3968 class="footer-block-item footer_list w-list-unstyled" 3969 role="list" 3970 class="footer_list w-list-unstyled" 3971 3972 > 3973 <li class="footer-nav-item is--title"> 3974 <h5 class="footer-nav-title">Shop</h5> 3975 </li> 3976 3977 <li class="footer-nav-item" 3978 3979 > 3980 <a href="/collections/coffee" class="footer-nav-link">Coffee</a> 3981 </li> 3982 3983 <li class="footer-nav-item" 3984 3985 > 3986 <a href="/collections/equipment" class="footer-nav-link">Equipment</a> 3987 </li> 3988 3989 <li class="footer-nav-item" 3990 3991 data-spark="b2c-only" 3992 3993 > 3994 <a href="/pages/subscription" class="footer-nav-link">Subscriptions</a> 3995 </li> 3996 3997 <li class="footer-nav-item" 3998 3999 > 4000 <a href="/pages/wholesale" class="footer-nav-link">Wholesale</a> 4001 </li> 4002 4003 <li class="footer-nav-item" 4004 4005 > 4006 <a href="/pages/delivery-and-shipping" class="footer-nav-link">Shipping</a> 4007 </li> 4008 4009 </ul> 4010 4011 4012 4013 <ul 4014 class="footer-block-item footer_list w-list-unstyled" 4015 role="list" 4016 class="footer_list w-list-unstyled" 4017 4018 > 4019 <li class="footer-nav-item is--title"> 4020 <h5 class="footer-nav-title">Contact</h5> 4021 </li> 4022 4023 <li class="footer-nav-item" 4024 4025 > 4026 <a href="mailto:[email protected]" class="footer-nav-link">Email us</a> 4027 </li> 4028 4029 <li class="footer-nav-item" 4030 4031 > 4032 <a href="https://www.instagram.com/cartwheelcoffee" class="footer-nav-link">Follow us</a> 4033 </li> 4034 4035 <li class="footer-nav-item" 4036 4037 data-spark="b2c-only" 4038 4039 > 4040 <a href="/pages/locations" class="footer-nav-link">Locations</a> 4041 </li> 4042 4043 <li class="footer-nav-item" 4044 4045 > 4046 <a href="/pages/faq" class="footer-nav-link">FAQ</a> 4047 </li> 4048 4049 </ul> 4050 4051 4052 4053 <ul 4054 class="footer-block-item footer_list w-list-unstyled" 4055 role="list" 4056 class="footer_list w-list-unstyled" 4057 4058 > 4059 <li class="footer-nav-item is--title"> 4060 <h5 class="footer-nav-title">Resources</h5> 4061 </li> 4062 4063 <li class="footer-nav-item" 4064 4065 > 4066 <a href="/pages/brew-guides" class="footer-nav-link">Brew Guides</a> 4067 </li> 4068 4069 <li class="footer-nav-item" 4070 4071 > 4072 <a href="/blogs/articles" class="footer-nav-link">Articles</a> 4073 </li> 4074 4075 </ul> 4076 4077 4078 4079 <div 4080 id="w-node-b4b1ca0e-3fbb-58d3-af98-df162c244568-929aeb3e" 4081 class="footer-block-item footer-news-wrapper" 4082 4083 > 4084 <div class="news-wrap"> 4085 <ul role="list" class="footer_list w-list-unstyled"> 4086 <li class="footer-nav-item is--title"> 4087 <h5 class="footer-nav-title">Stay updated</h5> 4088 </li> 4089 </ul> 4090 <div class="footer_newsletter w-form "> 4091 <form method="post" action="/contact#contact_form" id="contact_form" accept-charset="UTF-8" class="contact-form"><input type="hidden" name="form_type" value="customer" /><input type="hidden" name="utf8" value="â" /> 4092 <div udesly-add-class="form-footer_news"></div> 4093 <input 4094 type="email" 4095 class="newsletter-field w-input" 4096 maxlength="256" 4097 name="contact[email]" 4098 placeholder="subscribe to our mailing list" 4099 id="newsletter-main" 4100 required="" 4101 4102 ><input type="submit" value="" data-wait="Please wait..." class="newsletter-button w-button"> 4103 <div class="newsletter-signup w-embed"> 4104 <input 4105 type="hidden" 4106 name="contact[customer[tags]]" 4107 value="newsletter" 4108 > 4109 </div> 4110
4110<script> 4111 (function(){ 4112 window.Webflow = window.Webflow || []; 4113 var success = "" == "true"; 4114 4115 var errors = "" == "ErrorsDrop"; 4116 4117 4118 var form = document.currentScript.closest('.w-form'); 4119 4120 if (success) { 4121 form.classList.add('udy-form-posted-successfully'); 4122 } 4123 4124 if (errors) { 4125 form.classList.add('udy-form-failed'); 4126 } 4127 if (success || errors) { 4128 if (form.closest('[data-w-tab]')) { 4129 4130 4131 window.Webflow.push(function() { 4132 var tabId = form.closest('[data-w-tab]').id; 4133 var tabLink = document.querySelector('a[href="#' + tabId +'"]'); 4134 if (tabLink) { 4135 tabLink.click(); 4136 } 4137 }); 4138 4139 } 4140 window.Webflow.push(function() { 4141 var count = form.offsetTop - window.pageYOffset - 30; // xx = any extra distance from top ex. 60 4142 window.scrollBy({top: count, left: 0, behavior: 'smooth'}) 4143 }); 4144 setTimeout(function() { 4145 var count = form.offsetTop - window.pageYOffset - 30; // xx = any extra distance from top ex. 60 4146 window.scrollBy({top: count, left: 0, behavior: 'smooth'}) 4147 }, 300) 4148 } 4149 })(); 4150</script>
4150 4151 <div 4152 class="success-message w-form-done " 4153 > 4154 <div>Thanks for subscribing to our mailing list!</div> 4155 </div> 4156 <div class="display-none w-form-fail "> 4157 <div></div> 4158 </div> 4159 </form> 4160 </div> 4161 </div> 4162 <div class="social-wrap"> 4163 <ul role="list" class="locations_list w-list-unstyled"> 4164 <li class="footer-nav-item is--socials"><a href="https://www.instagram.com/cartwheelcoffee/" class="footer-nav-link socials">insta</a> 4165 <div class="socials-divider-spacing">/</div><a href="https://www.facebook.com/cartwheelcoffee" class="footer-nav-link socials">fb</a> 4166 <div class="socials-divider-spacing">/</div><a href="https://www.tiktok.com/@cartwheelcoffee" class="footer-nav-link socials">tiktok</a></li> 4167 </ul> 4168 <ul role="list" class="locations_list w-list-unstyled"> 4169 <li class="footer-nav-item"> 4170 <a href="https://www.studioyoke.com" target="_blank" class="footer-nav-link socials" 4171 >website by 4172 <span 4173 class="studio-yoke" 4174 >Studio Yoke</span 4175 ></a 4176 > 4177 </li> 4178 </ul> 4179 </div> 4180 </div> 4181 4182 4183 4184 <div 4185 id="w-node-_872107f3-f92b-8346-261e-1c34e0637c8e-929aeb3e" 4186 class="footer-block-item social-wrap-outer_mobile" 4187 4188 > 4189 <ul role="list" class="footer_list w-list-unstyled"> 4190 <li class="footer-nav-item is--socials"><a href="https://www.instagram.com/cartwheelcoffee/" class="footer-nav-link socials">insta</a> 4191 <div class="socials-divider-spacing">/</div><a href="https://www.facebook.com/cartwheelcoffee" class="footer-nav-link socials">fb</a> 4192 <div class="socials-divider-spacing">/</div></li> 4193 </ul><ul role="list" class="footer_list w-list-unstyled"> 4194 <li class="footer-nav-item"> 4195 <a href="https://www.studioyoke.co.uk/" class="footer-nav-link socials" 4196 >website by 4197 <span 4198 class="studio-yoke" 4199 >Studio Yoke</span 4200 ></a 4201 > 4202 </li> 4203 </ul></div> 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 <div id="w-node-_76b1ac00-615b-c4e3-35c1-142f406f27f9-929aeb3e" class="copyright-wrap"> 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 <div class="copyright-text"><a href="/pages/terms-and-conditions" title="Terms and conditions">Terms and Conditions</a></div> 4233 4234 <div class="copyright-text hide-mobile">/</div> 4235 4236 4237 4238 4239 <div class="copyright-text"><a href="/pages/privacy-policy" title="Privacy Policy">Privacy Policy</a></div> 4240 4241 <div class="copyright-text hide-mobile">/</div> 4242 4243 4244 4245 4246 <div class="copyright-text">Cartwheel Coffee © 2026</div> 4247 4248 <div class="copyright-text hide-mobile">/</div> 4249 4250 4251 4252 4253 <div class="copyright-text">All rights reserved</div> 4254 4255 4256 4257 </div> 4258 4259 <img src="//cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_fullsvg.svg?v=1748165769&width=600" alt="Cartwheel Coffee Roasters" srcset="//cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_fullsvg.svg?v=1748165769&width=180 180w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_fullsvg.svg?v=1748165769&width=270 270w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_fullsvg.svg?v=1748165769&width=360 360w" width="180" height="39.301310043668124" loading="eager" id="footer-logo" class="footer-logo" sizes="(max-width: 360px) 50vw, 180px"> 4260 </div> 4261</div> 4262
4263<script> 4264 var currentSection = document.currentScript.closest('.shopify-section'); 4265 currentSection.setAttribute('class', 'footer-wrap'); 4266</script>
4266 4267
4268<script> 4269 var Webflow = Webflow || []; 4270 Webflow.push(function () { 4271 var tabName = getParam('tab'); 4272 if (!tabName) return; 4273 4274 $('.' + tabName).triggerHandler('click'); 4275 4276 function getParam(name) { 4277 name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); 4278 var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'), 4279 results = regex.exec(location.search); 4280 return results == null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); 4281 } 4282 }); 4283</script>
4283 4284 4285 4286</div> 4287<!-- END sections: footer-group --> 4288 </main> 4289 4290
4290<script src="//cartwheelcoffee.com/cdn/shop/t/29/assets/webflow.aio.min.js?v=13766524550765885521790863894" type="text/javascript" defer></script>
4290 4291
4291<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cdn.min.js"></script>
4291 4292 4293 <!-- 4294 [if lte IE 9]>
4294<script src="https://cdnjs.cloudflare.com/ajax/libs/placeholders/3.0.2/placeholders.min.js"></script>
4294<![endif] 4295 --> 4296
4296<script src="//cartwheelcoffee.com/cdn/shop/t/29/assets/udesly-wf-cookie-bar.js?v=118266585114961716471790863894" defer></script>
4296 4297 4298 <style data-shopify> 4299 .show.modal { 4300 -webkit-overflow-scrolling: touch; 4301 } 4302</style> 4303
4304<script> 4305 document.addEventListener('touchstart', function () {}, false); 4306 4307 // $('.menu').click(function () { 4308 // var clicks = $(this).data('clicks'); 4309 // if (clicks) { 4310 // $("body").css("overflow", "auto"); 4311 // } else { 4312 // $("body").css("overflow", "hidden"); 4313 // } 4314 // $(this).data("clicks", !clicks); 4315 // }); 4316 // Click on the hamburger icon whenever you click on the greyed out part 4317</script>
4317 4318
4319<script> 4320 $('.nav-cart-button').click(function () { 4321 var clicks = $(this).data('clicks'); 4322 if (clicks) { 4323 $('body').addClass('hidden-modal'); 4324 $('body').removeClass('show-modal'); 4325 } else { 4326 $('body').addClass('show-modal'); 4327 $('body').removeClass('hidden-modal'); 4328 } 4329 $(this).data('clicks', !clicks); 4330 }); 4331 4332 // Click on the hamburger icon whenever you click on the greyed out part 4333 $('.cart-close').click(function () { 4334 $('.nav-cart-button').click(); 4335 }); 4336 4337 $('.menu').click(function () { 4338 var clicks = $(this).data('clicks'); 4339 if (clicks) { 4340 $('body').addClass('hidden-modal'); 4341 $('body').removeClass('show-modal'); 4342 } else { 4343 $('body').addClass('show-modal'); 4344 $('body').removeClass('hidden-modal'); 4345 } 4346 $(this).data('clicks', !clicks); 4347 }); 4348 4349 $('.menu_close').click(function () { 4350 $('.menu').click(); 4351 }); 4352 4353 // $(".w-commerce-commercecartcontainerwrapper--cartType-rightSidebar").click(function () { 4354 // $("body").css("overflow", "auto"); 4355 // }); 4356 4357 // https://codepen.io/jerrylow/pen/yJeyoG 4358 4359 // $(document).ready(function(){ 4360 // if( navigator.userAgent.match(/iPhone|iPad|iPod/i) ) { 4361 // function preventBehavior(e) { 4362 // e.preventDefault(); 4363 // }; 4364 4365 // $(document).on('show.modal', () => { 4366 // document.addEventListener("touchmove", preventBehavior, {passive: false}); 4367 4368 // }).on('hidden.modal', () => { 4369 // document.removeEventListener("touchmove", preventBehavior, {passive: true}); 4370 // }); 4371 // } 4372 // }); 4373 4374 // First we get the viewport height and we multiple it by 1% to get a value for a vh unit 4375 let vh = window.innerHeight * 0.01; 4376 4377 // Then we set the value in the --vh custom property to the root of the document 4378 document.documentElement.style.setProperty('--vh', `${vh}px`); 4379 4380 // We listen to the resize event 4381 window.addEventListener('resize', () => { 4382 // We execute the same script as before 4383 let vh = window.innerHeight * 0.01; 4384 document.documentElement.style.setProperty('--vh', `${vh}px`); 4385 }); 4386</script>
4386 4387 4388 <style> 4389 4390 .c-cookies-bar {opacity:0;} 4391 4392</style> 4393 <!-- Cookie Consent -->
4394<script async src="https://cdn.jsdelivr.net/npm/@finsweet/cookie-consent@1/fs-cc.js" fs-cc-mode="informational" fs-cc-expires="180"></script>
4394 4395 4396<div fs-cc="banner" class="c-cookies-bar" style="opacity: 0;"> 4397 <div class="c-cookies-wrapper"> 4398 <div class="c-cookie-text">This site uses cookies. <a href="#" class="cookie-link"></a></div> 4399 <div class="flex-links-cookie"> 4400 <a href="/pages/privacy-policy" class="c-cookies-link hide-mobile-cookies">Read more</a> 4401 <div class="c-cookies-spacer"></div> 4402 <a fs-cc="close" href="#" class="c-cookies-link">Accept</a> 4403 <div class="c-cookies-spacer"></div><img src="//cartwheelcoffee.com/cdn/shop/t/29/assets/cookie-close.svg?v=106155978684426472691790863894" loading="lazy" alt="" class="svg_close"> 4404 </div> 4405 </div> 4406</div> 4407
4408<script> 4409 //Close cookie button 4410 const closeCookieBtn = document.querySelector(".svg_close"); 4411 const cookieBar = document.querySelector(".c-cookies-bar"); 4412 function closeBar() { 4413 cookieBar.style.display = "none"; 4414 } 4415 closeCookieBtn.addEventListener("click", closeBar); 4416</script>
vendor: 1 bytes, line 4416
4416
4417<script> 4418 $('.menu').click(function () { 4419 $('.nav-li-link').fadeIn('3000', function () { 4420 // Animation complete 4421 }); 4422 }); 4423 </script>
4423 4424 4425 �
4425<script> 4426window.notificationSuccessTemplate = function(message) { 4427 return ` 4428<div class="udesly-notification udesly-success-notification"> 4429 <p class="udesly-notification-message">${message}</p> 4430</div> 4431 `; 4432} 4433</script>
4433<script> 4434window.notificationErrorTemplate = function(message) { 4435 return ` 4436<div class="udesly-notification udesly-error-notification"> 4437 <p class="udesly-notification-message">${message}</p> 4438</div> 4439 `; 4440} 4441</script>
4441<script> 4442 window.notificationMessages = { 4443 add_to_cart: 'Added to cart!', 4444 remove_from_cart: 'Removed from cart!', 4445 }; 4446</script>
4446 4447 4448
4448<script src="//cartwheelcoffee.com/cdn/shop/t/29/assets/udesly-shopify.min.aio.min.js?v=177517339749802197201790863894"></script>
4448 4449
4449<script src="//cartwheelcoffee.com/cdn/shopifycloud/storefront/assets/themes_support/option_selection-b017cd28.js"></script>
4449 4450 4451 4452 <!-- **BEGIN** Hextom QAB Integration // Main Include - DO NOT MODIFY --> 4453 <!-- **BEGIN** Hextom QAB Integration // Main - DO NOT MODIFY -->
4454<script type="application/javascript"> 4455 window.hextom_qab_meta = { 4456 p1: [ 4457 4458 ], 4459 p2: { 4460 4461 } 4462 }; 4463</script>
4463 4464<!-- **END** Hextom QAB Integration // Main - DO NOT MODIFY --> 4465 <!-- **END** Hextom QAB Integration // Main Include - DO NOT MODIFY --> 4466 4467
4467<script> 4468 window.accessibilityStrings = { 4469 imageAvailable: `Image is now available in gallery view`, 4470 shareSuccess: `Link copied to clipboard`, 4471 pauseSlideshow: `Pause slideshow`, 4472 playSlideshow: `Play slideshow`, 4473 }; 4474 </script>
4474<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
4474 4475</body> 4476</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.