PageSourceSearch

https://cartwheelcoffee.com/blogs/articles

html cartwheelcoffee.com collected 2026-10-05 21:32:00 UTC 237,305 bytes, 4,476 lines download raw bytes

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&amp;height=48&amp;v=1747733750&amp;width=48" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/logo-mark-white.svg?crop=center&amp;height=48&amp;v=1747733750&amp;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&nbsp;<span class="span_editor-time">/&nbsp;</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&amp;width=3840" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&amp;width=375 375w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&amp;width=550 550w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&amp;width=750 750w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&amp;width=1100 1100w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&amp;width=1500 1500w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&amp;width=1780 1780w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&amp;width=2000 2000w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&amp;width=3000 3000w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-coffee-snenton-hq.jpg?v=1657800441&amp;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                  >&nbsp;<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                  >&nbsp;<span class="nav-menu-full_span">/</span>&nbsp;<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&nbsp;</div>
1200              <div class="span_editor-time roasting-time-ful-nav">/&nbsp;<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&amp;width=600" alt="Cartwheel Coffee Roasters" srcset="//cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_small-svg.svg?v=1748615125&amp;width=150 150w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_small-svg.svg?v=1748615125&amp;width=225 225w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_small-svg.svg?v=1748615125&amp;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&#39;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&amp;width=618" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/2338f8a255bbe5b85923cb525659d5f2018a6323.jpg?v=1752482806&amp;width=375 375w, //cartwheelcoffee.com/cdn/shop/files/2338f8a255bbe5b85923cb525659d5f2018a6323.jpg?v=1752482806&amp;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&amp;width=618" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/7394167a2919709e039701fb5dc6f6bf681ca93e.jpg?v=1752482848&amp;width=375 375w, //cartwheelcoffee.com/cdn/shop/files/7394167a2919709e039701fb5dc6f6bf681ca93e.jpg?v=1752482848&amp;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&amp;width=618" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/68f42535ecc8853841d60ccd6e9b5c7cef709394.jpg?v=1752482882&amp;width=375 375w, //cartwheelcoffee.com/cdn/shop/files/68f42535ecc8853841d60ccd6e9b5c7cef709394.jpg?v=1752482882&amp;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&amp;width=618" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/equipment.jpg?v=1753010295&amp;width=375 375w, //cartwheelcoffee.com/cdn/shop/files/equipment.jpg?v=1753010295&amp;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&amp;width=618" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/fellow.jpg?v=1753010322&amp;width=375 375w, //cartwheelcoffee.com/cdn/shop/files/fellow.jpg?v=1753010322&amp;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&amp;width=618" alt="" srcset="//cartwheelcoffee.com/cdn/shop/files/cupping_1.png?v=1753010295&amp;width=375 375w, //cartwheelcoffee.com/cdn/shop/files/cupping_1.png?v=1753010295&amp;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&amp;width=600" alt="Cartwheel Coffee Roasters" srcset="//cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_fullsvg.svg?v=1748165769&amp;width=180 180w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_fullsvg.svg?v=1748165769&amp;width=270 270w, //cartwheelcoffee.com/cdn/shop/files/cartwheel-logo_fullsvg.svg?v=1748165769&amp;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.