1<!doctype html><html class="no-js" lang="en"> 2 <head> 3 4
5<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":"a6111dc4847a5059d4622e3d27b184dd5cbae461b5d6fc459feab12efb47932d","state":{"template":"blog","theme":151830298694,"product":null,"collection":null,"page":null,"blog":"the-print-room-nz","article":null,"app":null},"now":1791103104,"path":"\/blogs\/the-print-room-nz","locale_root_url":"\/","canonical_url":"https:\/\/printroom.co\/blogs\/the-print-room-nz","customer_id":null,"customer_id_signature":"a6111dc4847a5059d4622e3d27b184dd5cbae461b5d6fc459feab12efb47932d","cart":null}</script>
5<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,a,i,t=[76,79,67,75,83,77,73,84,72,49,49],c=function(){a=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===a[0]){if(clearTimeout(i),a.shift(),0<a.length)return void(i=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,a=[],i=s.cache();for(n in i)a.push(n+"="+encodeURIComponent(i[n]));for(n in t)a.push(n+"="+encodeURIComponent(t[n]));return s.state.customer_id&&(a.push("customer_id="+encodeURIComponent(s.state.customer_id)),a.push("customer_id_signature="+encodeURIComponent(s.state.customer_id_signature))),o+=(-1===o.indexOf("?")?"?":"&")+a.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 a(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;
5color:#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,i,s,t){t=t||document;var c="locksmith-"+e+i,n=function(e){var t=e.target,n=e.target.parentElement,o=t&&t.className&&(t.className.baseVal||t.className)||"",a=n&&n.className&&(n.className.baseVal||n.className)||"";("string"==typeof o&&-1!==o.split(/\s+/).indexOf(i)||"string"==typeof a&&-1!==a.split(/\s+/).indexOf(i))&&!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 a,i,s=e.querySelectorAll("script");for(i=0;i<s.length;++i){a=s[i];var c=document.createElement("script");if(a.type&&(c.type=a.type),a.src)c.src=a.src;else{var l=document.createTextNode(a.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 a=s.util.makeUrl(e,o),i="json"===n.type||"text"===n.type;fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Accept:i?"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(i?{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(t){if(!s.isEmbedded){t=t||{};var n=function(){t.reload?s.util.reload():"function"==typeof t.callback&&t.callback()};s.post("/ping",{path:s.path,search:window.location.search,state:s.state},{spinner:!!t.spinner,silent:"undefined"==typeof t.silent||t.silent,type:"text",success:function(e){e&&e.responseText?((e=JSON.parse(e.responseText)).messages&&0<e.messages.length&&s.showMessages(e.messages),e.cart&&s.cache.cart!==e.cart?(s.cache.cart=e.cart,s.cache.saveCart(function(){e.cart&&e.cart.match(/^.+:/)?(t.reload||"function"!=typeof t.callback||t.callback(),s.util.reload()):n()})):n()):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>
5 6
6<script data-locksmith>Locksmith.cache.cart=null</script>
6 7 8
8<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\":\"a6111dc4847a5059d4622e3d27b184dd5cbae461b5d6fc459feab12efb47932d\",\"state\":{\"template\":\"blog\",\"theme\":151830298694,\"product\":null,\"collection\":null,\"page\":null,\"blog\":\"the-print-room-nz\",\"article\":null,\"app\":null},\"now\":1791103104,\"path\":\"\\\/blogs\\\/the-print-room-nz\",\"locale_root_url\":\"\\\/\",\"canonical_url\":\"https:\\\/\\\/printroom.co\\\/blogs\\\/the-print-room-nz\",\"customer_id\":null,\"customer_id_signature\":\"a6111dc4847a5059d4622e3d27b184dd5cbae461b5d6fc459feab12efb47932d\",\"cart\":null}";Locksmith.jsonTagSignature="4d53407c0ab3dc37f2c4e6cc4b7749b08cbe7f105afd360a9d602dcd93961c9b"</script>
8 9<meta name="google-site-verification" content="r89mOlbEOfEjECOwEHOd5jrv5jGOJeGHPXM78LaGLXY" /> 10 11 <meta charset="utf-8"> 12 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 13 <meta name="viewport" content="width=device-width,initial-scale=1"> 14 <meta name="theme-color" content="">
15<script> 16 window.dataLayer = window.dataLayer || []; 17 window.dataLayer.push({ 18 store_access: 'public', 19 store_type: 'main', 20 page_template: "blog" 21 }); 22 window.prTrackLead = window.prTrackLead || function (detail) { 23 try { 24 detail = detail || {}; 25 var ud = detail.user_data || {}; 26 var email = (ud.email || '').toString().trim().toLowerCase(); 27 var phone = (ud.phone_number || '').toString().replace(/[^0-9+]/g, ''); 28 window.dataLayer.push({ 29 event: 'generate_lead', 30 lead_type: detail.lead_type || 'unknown', 31 form_id: detail.form_id || null, 32 page_path: window.location.pathname, 33 /* Enhanced Conversions for Leads â GTM's user-provided-data variable reads 34 user_data.{email,phone_number}; Google hashes (SHA-256) client-side. 35 Same key shape as the quote/book-a-call pushes in global.bundle.js so ONE 36 GTM variable covers every lead type. */ 37 user_data: { 38 email: email || undefined, 39 phone_number: phone || undefined 40 } 41 }); 42 } catch (e) {} 43 }; 44 </script>
44<script> 45 if (!window.__prGtmLoaded) { 46 window.__prGtmLoaded = true;
vendor: 455 bytes, lines 46-56
46 47 (function (w, d, s, l, i) { 48 w[l] = w[l] || []; 49 w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); 50 var f = d.getElementsByTagName(s)[0], 51 j = d.createElement(s), 52 dl = l != 'dataLayer' ? '&l=' + l : ''; 53 j.async = true; 54 j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; 55 f.parentNode.insertBefore(j, f); 56 })(window, document, 'script', 'dataLayer', '
56GTM-W9DFFGB
vendor: 8 bytes, lines 56-57
56'); 57
57} 58 </script>
58 59 60 <link rel="canonical" href="https://printroom.co/blogs/the-print-room-nz"> 61 62 63 64 65 <link rel="preconnect" href="https://cdn.shopify.com" crossorigin> 66 67
67<script> 68(function() { 69 'use strict'; 70 var observer = new MutationObserver(function(mutations) { 71 mutations.forEach(function(mutation) { 72 mutation.addedNodes.forEach(function(node) { 73 if (node.tagName === 'SCRIPT' && node.src && node.src.includes('popt.in')) { 74 node.remove(); 75 } 76 }); 77 }); 78 }); 79 observer.observe(document.documentElement, { childList: true, subtree: true }); 80})(); 81</script>
81<script> 82document.addEventListener('DOMContentLoaded', function() { 83 var scripts = document.querySelectorAll('script[data-block-script]'); 84 if (!scripts.length) return; 85 if (window.Shopify && window.Shopify.designMode) { 86 scripts.forEach(function(s) { 87 var real = document.createElement('script'); 88 real.textContent = s.textContent; 89 s.parentNode.replaceChild(real, s); 90 }); 91 return; 92 } 93 var io = new IntersectionObserver(function(entries) { 94 entries.forEach(function(entry) { 95 if (!entry.isIntersecting) return; 96 io.unobserve(entry.target); 97 var pending = entry.target.querySelector('script[data-block-script]'); 98 if (pending) { 99 var real = document.createElement('script'); 100 real.textContent = pending.textContent; 101 pending.parentNode.replaceChild(real, pending); 102 } 103 }); 104 }, { rootMargin: '300px' }); 105 scripts.forEach(function(s) { 106 var block = s.closest('[data-ai-block]') || s.parentElement; 107 io.observe(block); 108 }); 109}); 110</script>
110<script> 111setTimeout(function() { 112 'use strict'; 113 114 // Google Tag Manager loads early + reliably via the 'gtm-head' snippet 115 // (settings.gtm_container_id). The old "remove existing GTM then re-inject after 116 // 3s" hack saved ~922ms but delayed the Ads Conversion Linker (breaking gclid 117 // attribution) and dropped fast-bounce visitors from analytics. Do NOT re-add it. 118 119 // LAZY LOAD THIRD-PARTY ANALYTICS 120 var loadThirdPartyScripts = function() { 121 if (typeof fbq === 'undefined') { 122 !function(f,b,e,v,n,t,s){ 123 if(f.fbq)return;n=f.fbq=function(){n.callMethod? 124 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 125 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 126 n.queue=[];t=b.createElement(e);t.async=!0; 127 t.src=v;s=b.getElementsByTagName(e)[0]; 128 s.parentNode.insertBefore(t,s) 129 }(window,document,'script','https://connect.facebook.net/en_US/fbevents.js'); 130 } 131 if (typeof clarity === 'undefined' && window.clarityCode) { 132 (function(c,l,a,r,i,t,y){ 133 c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; 134 t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; 135 y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); 136 })(window,document,"clarity","script",window.clarityCode); 137 } 138 }; 139 if ('requestIdleCallback' in window) { 140 requestIdleCallback(loadThirdPartyScripts, { timeout: 5000 }); 141 } else { 142 setTimeout(loadThirdPartyScripts, 5000); 143 } 144 145 // LINK PREFETCH ON HOVER 146 var NO_PREFETCH = ['/cart','/checkout','/account','/admin','/password','/challenge','/apps/','/tools/','/services/']; 147 var prefetched = {}; 148 var hoverTimer = null; 149 150 function shouldPrefetch(href) { 151 try { 152 var url = new URL(href, location.origin); 153 if (url.origin !== location.origin) return false; 154 if (url.pathname === location.pathname) return false; 155 if (prefetched[url.pathname]) return false; 156 if (navigator.connection && navigator.connection.saveData) return false; 157 for (var i = 0; i < NO_PREFETCH.length; i++) { 158 if (url.pathname.indexOf(NO_PREFETCH[i]) === 0) return false; 159 } 160 var ext = url.pathname.split('.').pop(); 161 if (['jpg','jpeg','png','gif','svg','webp','pdf','zip','css','js'].indexOf(ext) !== -1) return false; 162 return true; 163 } catch (e) { 164 return false; 165 } 166 } 167 168 function prefetchUrl(href) { 169 var url = new URL(href, location.origin); 170 if (prefetched[url.pathname]) return; 171 prefetched[url.pathname] = true; 172 var link = document.createElement('link'); 173 link.rel = 'prefetch'; 174 link.href = href; 175 link.as = 'document'; 176 document.head.appendChild(link); 177 } 178 179 document.addEventListener('pointerenter', function(e) { 180 var a = e.target.closest ? e.target.closest('a[href]') : null; 181 if (!a || !shouldPrefetch(a.href)) return; 182 var delay = e.pointerType === 'mouse' ? 65 : 0; 183 hoverTimer = setTimeout(function() { prefetchUrl(a.href); }, delay); 184 }, { capture: true, passive: true }); 185 186 document.addEventListener('pointerleave', function() { 187 if (hoverTimer) { clearTimeout(hoverTimer); hoverTimer = null; } 188 }, { capture: true, passive: true }); 189 190 if ('requestIdleCallback' in window) { 191 requestIdleCallback(function() { 192 var navLinks = document.querySelectorAll('nav a[href], [data-theme-header] a[href]'); 193 var count = 0; 194 navLinks.forEach(function(a) { 195 if (count < 5 && shouldPrefetch(a.href)) { 196 prefetchUrl(a.href); 197 count++; 198 } 199 }); 200 }, { timeout: 3000 }); 201 } 202 203 // BFCACHE SUPPORT 204 window.addEventListener('pageshow', function(event) { 205 if (event.persisted) { 206 fetch('/cart.js').then(function(r) { return r.json(); }).then(function(data) { 207 document.querySelectorAll('[data-cart-count]').forEach(function(el) { 208 el.textContent = data.item_count; 209 }); 210 if (window.Alpine && window.Alpine.store && window.Alpine.store('cartCount')) { 211 window.Alpine.store('cartCount').count = data.item_count; 212 } 213 }).catch(function() {}); 214 } 215 }); 216}, 0); 217</script>
217<script type="speculationrules"> 218{ 219 "prerender": [{ 220 "where": { 221 "and": [ 222 { "href_matches": "/*" }, 223 { "not": { "href_matches": [ 224 "/cart", "/cart/*", 225 "/checkout", "/checkout/*", 226 "/account", "/account/*", 227 "/admin/*", 228 "/password", 229 "/challenge/*", 230 "/apps/*", 231 "/tools/*", 232 "/services/*" 233 ] } }, 234 { "not": { "selector_matches": "[target=_blank]" } } 235 ] 236 }, 237 "eagerness": "moderate" 238 }], 239 "prefetch": [{ 240 "where": { 241 "and": [ 242 { "href_matches": "/*" }, 243 { "not": { "href_matches": [ 244 "/cart", "/cart/*", 245 "/checkout", "/checkout/*", 246 "/account", "/account/*" 247 ] } } 248 ] 249 }, 250 "eagerness": "moderate" 251 }] 252} 253</script>
253 254 255 256<style> 257 .hero-image, [data-hero-image] { aspect-ratio: 16/9; width: 100%; height: auto; background-color: #f0f0f0; } 258 .product-image { aspect-ratio: 1/1; background-color: #fafafa; } 259 header, .header { min-height: 60px; } 260 main { min-height: 100vh; } 261 .skeleton { animation: skeleton-loading 1.5s infinite ease-in-out; background: linear-gradient(90deg,#f0f0f0 25%,#e0e0e0 50%,#f0f0f0 75%); background-size: 200% 100%; } 262 @keyframes skeleton-loading { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } 263 @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } } 264 @media (max-width: 1023px) { .hero-image-mobile, [data-hero-image-mobile] { aspect-ratio: 9/16; } } 265 </style><link 266 rel="icon" 267 type="image/png" 268 href="//printroom.co/cdn/shop/files/pr_branding_logo_favicon_flag-01_11ede80e-5ae5-41fe-8eb2-87dee0e48e14.png?crop=center&height=32&v=1646960588&width=32" 269 ><link rel="preconnect" href="https://fonts.shopifycdn.com" crossorigin> 270 271 272 273 274 <!-- default to true --><!-- Contain template--><!-- setting name: pluginseo_pageTitleTruncateEnableForBlogs--> 275 <!-- setting value: true --><!-- pageTitleTemplate: %% shop.name %% %% blog.title %%%% blog.all_tags || take: '5' || join: ', ' || prepend_not_empty: ' blog: ' || append_not_empty: ' and more' %% --> 276 <!-- pageTitleToParse": The Print Room NZ - Leavers Hoodies & Team Wear --> 277 <!-- pageTitleTruncateApplicable: true --> 278 279 <!-- pluginseo_pageTitleTemplateApplyToAll: true --> 280 <!-- pageTitleTruncateApplicable: true --><!-- Custom page title: Yes --><title>The Print Room Blog blog: apparel, AS Colour, Beanies, beer, branding and more</title> <!-- default to true --><!-- Contain template--><!-- setting name: pluginseo_metaDescriptionTruncateEnableForBlogs--> 281 <!-- setting value: true --><!-- metaDescriptionTemplate: %% blog.articles || map: 'title' || take: '3' || join: ', ' || prepend_not_empty: 'Read about ' || append_not_empty: ' and more on the '%%%% shop.name %% %% blog.title %% blog. --> 282 <!-- metaDescriptionToParse": School Leavers Gear, Custom Hoodies, Team Wear, Corporates, Hospitality, Workwear, Screen Printing for Universities and Halls. We Do It All. Let's Talk! --> 283 <!-- metaDescriptionTruncateApplicable: true --> 284 285 <!-- pluginseo_metaDescriptionTemplateApplyToAll: true --> 286 <!-- metaDescriptionTruncateApplicable: true --><!-- Yes --><meta name="description" content="Read about Fast 15 with Cat Mackenzie Everitt, What makes a good branded tote bag, Custom Merchandise Case Study: Wellington's Parrotdog Brewery and more on the The Print" />
287<script data-desc="seo-breadcrumb-list" type="application/ld+json"> 288{ 289 "@context": "http://schema.org", 290 "@type": "BreadcrumbList", 291 "itemListElement": [{ 292 "@type": "ListItem", 293 "position": 1, 294 "item": { 295 "@id": "https://printroom.co/blogs/the-print-room-nz", 296 "name": "Blog" 297 } 298 }] 299} 300</script>
300<script data-desc="seo-organization" type="application/ld+json"> 301 { 302 "@context": "http://schema.org", 303 "@type": "Organization", 304 "additionalType": "https://schema.org/OnlineStore", 305 "@id": "https://printroom.co#organization", 306 "name": "The Print Room", 307 "url": "https://printroom.co", 308 "description": "Read about Fast 15 with Cat Mackenzie Everitt, What makes a good branded tote bag, Custom Merchandise Case Study: Wellington's Parrotdog Brewery and more on the The Print","logo": { 309 "type": "ImageObject", 310 "url": "https://printroom.co/cdn/shop/t/59/assets/pluginseo_structuredDataLogo_small.png?v=39003" 311 }, 312 "image": "https://printroom.co/cdn/shop/t/59/assets/pluginseo_structuredDataLogo_small.png?v=39003","areaServed": [{ "@type": "Country", "name": "Australia" }, 313 { "@type": "Country", "name": "New Zealand" }], 314 "sameAs": ["https://www.linkedin.com/company/theprintroom"] 315 } 316</script>
316<script data-desc="seo-website" type="application/ld+json"> 317 { 318 "@context": "http://schema.org", 319 "@type": "WebSite", 320 "name": "The Print Room", 321 "url": "https://printroom.co", 322 "inLanguage": "en", 323 "potentialAction": { 324 "@type": "SearchAction", 325 "target": "https://printroom.co/search?q={search_term_string}", 326 "query-input": "required name=search_term_string" 327 } 328 } 329</script>
329<meta name="pluginseo" content="Plug in SEO Plus" data-ptf="s-te_bl" data-mdf="s-te_bl-tr" /> 330 331 332
332<script type="esms-options"> 333 { 334 "noLoadEventRetriggers": true 335 } 336</script>
336 337
338<script> 339 if ( 340 !(HTMLScriptElement.supports && HTMLScriptElement.supports('importmap')) 341 ) { 342 const importMapShimScriptEl = document.createElement('script'); 343 importMapShimScriptEl.src = '//printroom.co/cdn/shop/t/59/assets/es-module-shims.bundle.min.js?v=98603786603752121101787098437' 344 importMapShimScriptEl.async = true; 345 346 document.currentScript.after(importMapShimScriptEl); 347 } 348</script>
vendor: 1 bytes, line 348
348
349<script async crossorigin fetchpriority="high" src="/cdn/shopifycloud/importmap-polyfill/es-modules-shim.2.4.0.js"></script>
vendor: 1 bytes, line 349
349
350<script type="importmap"> 351 { 352 "imports": { 353 "vendor": "//printroom.co/cdn/shop/t/59/assets/vendor.bundle.min.js?v=124729801276099409011787098433", 354 "deferrable-data": "//printroom.co/cdn/shop/t/59/assets/deferrable-data.bundle.js?v=160370895301608380811787098437", 355 "@supabase/supabase-js": "//printroom.co/cdn/shop/t/59/assets/supabase-js.bundle.js?v=151185893978749678631787098436", 356 "product": "//printroom.co/cdn/shop/t/59/assets/island-product.bundle.js?v=53162399053546849101790733316", 357 "quick-buy": "//printroom.co/cdn/shop/t/59/assets/island-quick-buy.bundle.js?v=147469616221971819701787098437", 358 "ai-chatbot": "//printroom.co/cdn/shop/t/59/assets/ai-chatbot.bundle.js?v=114215721854634402901788472409", 359 "leavers-quote-builder": "//printroom.co/cdn/shop/t/59/assets/leavers-quote-builder.bundle.js?v=140741536858912509621787098436", 360 "leavers-product-grid": "//printroom.co/cdn/shop/t/59/assets/leavers-product-grid.bundle.js?v=101839867699394922961787098435" 361 } 362 } 363</script>
363 364
365<script> 366 (function() { 367 var _originalAlert = window.alert; 368 window.alert = function(message) { 369 if (message && message.toLowerCase().includes('personalized text')) { 370 message = 'This field is required to place an order.'; 371 } 372 _originalAlert.call(window, message); 373 }; 374 })(); 375 </script>
375 376 377
377<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
377<meta name="google-site-verification" content="r89mOlbEOfEjECOwEHOd5jrv5jGOJeGHPXM78LaGLXY"> 378<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/7054289/digital_wallets/dialog"> 379<meta id="in-context-paypal-metadata" data-shop-id="7054289" data-venmo-supported="false" data-environment="production" data-locale="en_US" data-paypal-v4="true" data-currency="USD"> 380<link rel="ucp" href="/.well-known/ucp" version="2026-08-25"><link rel="alternate" type="application/atom+xml" title="Feed" href="/blogs/the-print-room-nz.atom" /> 381<link rel="next" href="/blogs/the-print-room-nz?page=2"> 382<link rel="alternate" hreflang="x-default" href="https://theprintroom.nz/blogs/the-print-room-nz"> 383<link rel="alternate" hreflang="en" href="https://theprintroom.nz/blogs/the-print-room-nz"> 384<link rel="alternate" hreflang="en-AU" href="https://printroom.co/en-au/blogs/the-print-room-nz"> 385<link rel="alternate" hreflang="en-CN" href="https://printroom.co/blogs/the-print-room-nz"> 386<link rel="alternate" hreflang="en-FR" href="https://printroom.co/blogs/the-print-room-nz"> 387<link rel="alternate" hreflang="en-GB" href="https://printroom.co/blogs/the-print-room-nz"> 388<link rel="alternate" hreflang="en-US" href="https://printroom.co/blogs/the-print-room-nz">
389<script async="async" src="/checkouts/internal/preloads.js?locale=en-US&default_configuration_id=488013894"></script>
389 390<link rel="preconnect" href="https://shop.app" crossorigin="anonymous">
391<script async="async" src="https://shop.app/checkouts/internal/preloads.js?locale=en-US&default_configuration_id=488013894&shop_id=7054289" crossorigin="anonymous"></script>
vendor: 1 bytes, line 391
391
392<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":7054289,"countryCode":"NZ","currencyCode":"USD","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/7054289","merchantName":"The Print Room","requiredBillingContactFields":["postalAddress","email","phone"],"requiredShippingContactFields":["postalAddress","email","phone"],"shippingType":"shipping","supportedNetworks":["visa","masterCard","amex","jcb"],"total":{"type":"pending","label":"The Print Room","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
vendor: 1 bytes, line 392
392
393<script id="shopify-features" type="application/json">{"accessToken":"0a03320998ce9cf7ffe404a489cfebbd","betas":["rich-media-storefront-analytics"],"domain":"printroom.co","predictiveSearch":true,"shopId":7054289,"locale":"en"}</script>
vendor: 1 bytes, line 393
393
394<script>var Shopify = Shopify || {}; 395Shopify.shop = "the-print-room.myshopify.com"; 396Shopify.locale = "en"; 397Shopify.currency = {"active":"USD","rate":"0.57265452"}; 398Shopify.country = "US"; 399Shopify.theme = {"name":"Print_Room_Co","id":151830298694,"schema_name":"Baseline","schema_version":"3.3.1","theme_store_id":null,"role":"main"}; 400Shopify.theme.handle = "null"; 401Shopify.theme.style = {"id":null,"handle":null}; 402Shopify.cdnHost = "printroom.co/cdn"; 403Shopify.routes = Shopify.routes || {}; 404Shopify.routes.root = "/"; 405Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js"; 406Shopify.SignInWithShop = Shopify.SignInWithShop || {}; 407Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {}; 408Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 408
408
409<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 409
409
410<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 410
410
411<script> 412 window.ShopifyPay = window.ShopifyPay || {}; 413 window.ShopifyPay.apiHost = "shop.app\/pay"; 414 window.ShopifyPay.redirectState = null; 415</script>
vendor: 1 bytes, line 415
415
416<script> 417 window.Shopify = window.Shopify || {}; 418 window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {}; 419 window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 }; 420 window.Shopify.SignInWithShop.eligible = true; 421</script>
vendor: 1 bytes, line 421
421
422<script id="shop-js-analytics" type="application/json">{"pageType":"blog"}</script>
vendor: 1 bytes, line 422
422
423<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 423
423
424<script type="module"> 425 await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"); 426 427 window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true}); 428 429</script>
vendor: 1 bytes, line 429
429
430<script> 431 window.Shopify = window.Shopify || {}; 432 if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {}; 433 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"]}; 434</script>
vendor: 1 bytes, line 434
434
435<script>(function() { 436 var isLoaded = false; 437 function asyncLoad() { 438 if (isLoaded) return; 439 isLoaded = true; 440 var urls = ["\/\/d1liekpayvooaz.cloudfront.net\/apps\/customizery\/customizery.js?shop=the-print-room.myshopify.com","https:\/\/app.carboncheckout.com\/assets\/api\/shopify.min.js?shop=the-print-room.myshopify.com","https:\/\/static.klaviyo.com\/onsite\/js\/klaviyo.js?company_id=WkJ8Uf\u0026shop=the-print-room.myshopify.com","https:\/\/cdn.nfcube.com\/instafeed-dfc514f941e0dbcfd9799eba509c69d2.js?shop=the-print-room.myshopify.com","\/\/d1liekpayvooaz.cloudfront.net\/apps\/uploadery\/uploadery.js?shop=the-print-room.myshopify.com","https:\/\/cdn.grw.reputon.com\/assets\/widget.js?shop=the-print-room.myshopify.com","https:\/\/chimpstatic.com\/mcjs-connected\/js\/users\/3ec9f5a684c36f6bf11dc30fc\/1a983ba3b184a8fb5b6da3882.js?shop=the-print-room.myshopify.com","https:\/\/cdn.hextom.com\/js\/quickannouncementbar.js?shop=the-print-room.myshopify.com","https:\/\/app.popt.in\/pixel.js?id=e7ff5c60e84fb\u0026shop=the-print-room.myshopify.com"]; 441 for (var i = 0; i < urls.length; i++) { 442 var s = document.createElement('script'); 443 s.type = 'text/javascript'; 444 s.async = true; 445 s.src = urls[i]; 446 var x = document.getElementsByTagName('script')[0]; 447 x.parentNode.insertBefore(s, x); 448 } 449 }; 450 if(window.attachEvent) { 451 window.attachEvent('onload', asyncLoad); 452 } else { 453 window.addEventListener('load', asyncLoad, false); 454 } 455})();</script>
vendor: 1 bytes, line 455
455
456<script id="__st">var __st={"a":7054289,"offset":46800,"reqid":"a8f08579-9f70-4d70-8333-bcdc50ec8fa6-1791103104","pageurl":"printroom.co\/blogs\/the-print-room-nz","s":"blogs-6186184","u":"7c7700d41aae","p":"blog","rtyp":"blog","rid":6186184};</script>
vendor: 1 bytes, line 456
456
457<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 457
457
458<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 458
458
459<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//printroom.co/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 459
459
460<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 = "//printroom.co/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>
460<script crossorigin="anonymous" defer="defer" src="//printroom.co/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-616277c7.js?v=20250812"></script>
vendor: 1 bytes, line 460
460
461<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 461
461
462<script> 463 window.Shopify = window.Shopify || {}; 464 window.Shopify.MCP = window.Shopify.MCP || {}; 465 window.Shopify.MCP.enabled = true; 466 window.Shopify.MCP.shop = "the-print-room.myshopify.com"; 467 window.Shopify.MCP.mcpEndpoint = "https:\/\/printroom.co\/api\/mcp"; 468 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?\"\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."}},"required":["query"]}}]; 469</script>
vendor: 1 bytes, line 469
469
470<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("\/\/printroom.co\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})(); 471</script>
vendor: 1 bytes, line 471
471
472<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://printroom.co/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}}; 473</script>
vendor: 1 bytes, line 473
473
474<script data-source-attribution="shopify.dynamic_checkout.buyer_consent"> 475 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); 476</script>
vendor: 1 bytes, line 476
476
477<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})}})); 478</script>
478 479<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://printroom.co/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous"> 480<style id="shopify-accelerated-checkout-cart"> 481 #shopify-buyer-consent { 482 margin-top: 1em; 483 display: inline-block; 484 width: 100%; 485} 486 487#shopify-buyer-consent.hidden { 488 display: none; 489} 490 491#shopify-subscription-policy-button { 492 background: none; 493 border: none; 494 padding: 0; 495 text-decoration: underline; 496 font-size: inherit; 497 cursor: pointer; 498} 499 500#shopify-subscription-policy-button::before { 501 box-shadow: none; 502} 503 504 </style> 505
506<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
506 507 508 509 510 511 <link 512 rel="preload" 513 as="font" 514 href="//printroom.co/cdn/fonts/dm_sans/dmsans_n5.8a0f1984c77eb7186ceb87c4da2173ff65eb012e.woff2" 515 type="font/woff2" 516 crossorigin 517 > 518 519 520 521 <link 522 rel="preload" 523 as="font" 524 href="//printroom.co/cdn/fonts/dm_sans/dmsans_n4.ec80bd4dd7e1a334c969c265873491ae56018d72.woff2" 525 type="font/woff2" 526 crossorigin 527 > 528 529 530 531<style data-shopify> 532 @font-face { 533 font-family: "DM Sans"; 534 font-weight: 400; 535 font-style: normal; 536 font-display: swap; 537 src: url("//printroom.co/cdn/fonts/dm_sans/dmsans_n4.ec80bd4dd7e1a334c969c265873491ae56018d72.woff2") format("woff2"), 538 url("//printroom.co/cdn/fonts/dm_sans/dmsans_n4.87bdd914d8a61247b911147ae68e754d695c58a6.woff") format("woff"); 539} 540 541 @font-face { 542 font-family: "DM Sans"; 543 font-weight: 500; 544 font-style: normal; 545 font-display: swap; 546 src: url("//printroom.co/cdn/fonts/dm_sans/dmsans_n5.8a0f1984c77eb7186ceb87c4da2173ff65eb012e.woff2") format("woff2"), 547 url("//printroom.co/cdn/fonts/dm_sans/dmsans_n5.9ad2e755a89e15b3d6c53259daad5fc9609888e6.woff") format("woff"); 548} 549 550@font-face { 551 font-family: "DM Sans"; 552 font-weight: 700; 553 font-style: normal; 554 font-display: swap; 555 src: url("//printroom.co/cdn/fonts/dm_sans/dmsans_n7.97e21d81502002291ea1de8aefb79170c6946ce5.woff2") format("woff2"), 556 url("//printroom.co/cdn/fonts/dm_sans/dmsans_n7.af5c214f5116410ca1d53a2090665620e78e2e1b.woff") format("woff"); 557} 558@font-face { 559 font-family: "DM Sans"; 560 font-weight: 400; 561 font-style: italic; 562 font-display: swap; 563 src: url("//printroom.co/cdn/fonts/dm_sans/dmsans_i4.b8fe05e69ee95d5a53155c346957d8cbf5081c1a.woff2") format("woff2"), 564 url("//printroom.co/cdn/fonts/dm_sans/dmsans_i4.403fe28ee2ea63e142575c0aa47684d65f8c23a0.woff") format("woff"); 565} 566@font-face { 567 font-family: "DM Sans"; 568 font-weight: 700; 569 font-style: italic; 570 font-display: swap; 571 src: url("//printroom.co/cdn/fonts/dm_sans/dmsans_i7.52b57f7d7342eb7255084623d98ab83fd96e7f9b.woff2") format("woff2"), 572 url("//printroom.co/cdn/fonts/dm_sans/dmsans_i7.d5e14ef18a1d4a8ce78a4187580b4eb1759c2eda.woff") format("woff"); 573} 574@font-face { 575 font-family: "DM Sans"; 576 font-weight: 700; 577 font-style: normal; 578 font-display: swap; 579 src: url("//printroom.co/cdn/fonts/dm_sans/dmsans_n7.97e21d81502002291ea1de8aefb79170c6946ce5.woff2") format("woff2"), 580 url("//printroom.co/cdn/fonts/dm_sans/dmsans_n7.af5c214f5116410ca1d53a2090665620e78e2e1b.woff") format("woff"); 581} 582</style> 583 584<style>:root { 585 586 --font-size-xs: 0.64rem; 587 --font-size-sm: 0.8rem; 588 --font-size-base: 1rem; 589 --font-size-lg: 1.25rem; 590 --font-size-xl: 1.563rem; 591 --font-size-2xl: 1.953rem; 592 --font-size-3xl: 2.441rem; 593 --font-size-4xl: 3.052rem; 594 --font-size-5xl: 3.815rem; 595 --font-size-6xl: 4.768rem; 596 --font-size-7xl: 5.96rem; 597 --font-size-8xl: 7.451rem; 598 --font-size-9xl: 9.313rem; 599 600 --type-scale-n-2: var(--font-size-xs); 601 --type-scale-n-1: var(--font-size-sm); 602 --type-scale-n0: var(--font-size-base); 603 --type-scale-n1: var(--font-size-lg); 604 --type-scale-n2: var(--font-size-xl); 605 --type-scale-n3: var(--font-size-2xl); 606 --type-scale-n4: var(--font-size-3xl); 607 --type-scale-n5: var(--font-size-4xl); 608 --type-scale-n6: var(--font-size-5xl); 609 --type-scale-n7: var(--font-size-6xl); 610 --type-scale-n8: var(--font-size-7xl); 611 --type-scale-n9: var(--font-size-8xl); 612 --type-scale-n10: var(--font-size-9xl); 613 614 --base-font-size: 93.75%; 615 --base-font-size-from-settings: 15; 616 --base-line-height: 1.2; 617 --heading-line-height: 1; 618 619 font-size: var(--base-font-size); 620 line-height: var(--base-line-height); 621 622 --heading-font-stack: "DM Sans", sans-serif; 623 --heading-font-weight: 500; 624 --heading-font-style: normal; 625 626 627 --body-font-stack: "DM Sans", sans-serif; 628 --body-font-weight: 400; 629 --body-font-bold: FontDrop; 630 --body-font-bold-italic: FontDrop; 631 632 --color-gridline: 30 35 38; 633 --gridline-width: 0px; 634 635 --text-border-width: 1px; 636 --checkbox-width: 1px; 637 638 --font-heading: "DM Sans", sans-serif; 639 --font-body: "DM Sans", sans-serif; 640 --font-body-weight: 400; 641 --font-body-style: normal; 642 --font-body-bold-weight: bold; 643 644 --heading-letterspacing: -0.025em; 645 --heading-capitalize: none; 646 --heading-decoration: none; 647 648 --standard-heading-size: var(--type-scale-n3); 649 --feature-heading-size: var(--type-scale-n4); 650 --secondary-heading-size: var(--type-scale-n2); 651 652 --body-copy-transform: none; 653 654 --wrapperWidth: 100vw; 655 --gutter: 0px; 656 --rowHeight: calc((var(--wrapperWidth) - (11 * var(--gutter))) / 12); 657 658 --global-scrolling-items-speed-multiplier: 1; 659 660 --add-to-cart-button-height: 44px; 661 --checkout-button-height: 44px; 662 663 --spacing: 1rem; 664 --spacing-double: 2rem; 665 --spacing-half: 0.5rem; 666 667 /* Equivalent to px-2 */ 668 --section-horizontal-spacing-mobile: 0.5rem; 669 /* Equivalent to px-4 */ 670 --section-horizontal-spacing-desktop: 1rem; 671 672 --section-horizontal-spacing: var(--section-horizontal-spacing-mobile); 673 674 --icon-thickness: 1.5; 675 676 /** 677 * Buttons 678 */ 679 --button-text-transform: none; 680 --button-after-content: '\00a0\2192'; 681 --button-border-radius: 9999px; 682 683 /** 684 * Links 685 */ 686 --links-bottom-border-width: var(--text-border-width); 687 --links-bottom-padding: 0.25rem; 688 --links-text-transform: none; 689 --links-after-content: '\00a0\2192'; 690 --links-before-content: '\2190\00a0'; 691 692 background-color: rgb(var(--color-scheme-background)); 693 color: rgb(var(--color-scheme-text)); 694 } 695 696 @media (min-width: 1024px) { 697 :root { 698 --standard-heading-size: var(--type-scale-n5); 699 --feature-heading-size: var(--type-scale-n6); 700 --secondary-heading-size: var(--type-scale-n3); 701 702 --section-horizontal-spacing: var(--section-horizontal-spacing-desktop); 703 } 704 } 705 706 :root, 707 708 [data-color-scheme="scheme1"] { 709 --color-scheme-text: 43 57 144; 710 --color-scheme-background: 255 255 255; 711 --color-scheme-accent: 248 250 244; 712 --color-scheme-accent-contrast: 43 57 144; 713 --color-scheme-secondary: 30 35 38; 714 } 715 716 [data-color-scheme="scheme2"] { 717 --color-scheme-text: 30 35 38; 718 --color-scheme-background: 241 255 165; 719 --color-scheme-accent: 194 194 194; 720 --color-scheme-accent-contrast: 30 35 38; 721 --color-scheme-secondary: 30 35 38; 722 } 723 724 [data-color-scheme="scheme3"] { 725 --color-scheme-text: 248 250 244; 726 --color-scheme-background: 43 57 144; 727 --color-scheme-accent: 248 250 244; 728 --color-scheme-accent-contrast: 241 255 165; 729 --color-scheme-secondary: 43 57 144; 730 } 731 732 [data-color-scheme="scheme4"] { 733 --color-scheme-text: 248 250 244; 734 --color-scheme-background: 30 35 38; 735 --color-scheme-accent: 248 250 244; 736 --color-scheme-accent-contrast: 30 35 38; 737 --color-scheme-secondary: 248 250 244; 738 } 739 740 [data-color-scheme="scheme5"] { 741 --color-scheme-text: 30 35 38; 742 --color-scheme-background: 255 255 255; 743 --color-scheme-accent: 30 35 38; 744 --color-scheme-accent-contrast: 255 255 255; 745 --color-scheme-secondary: 30 35 38; 746 } 747 748 [data-color-scheme="scheme-62a93d7b-1ea3-42af-a18d-30461b13240a"] { 749 --color-scheme-text: 255 255 255; 750 --color-scheme-background: 255 255 255; 751 --color-scheme-accent: 255 255 255; 752 --color-scheme-accent-contrast: 255 255 255; 753 --color-scheme-secondary: 255 255 255; 754 } 755 756 [data-color-scheme="scheme-7c315ead-1873-415d-a1a8-a7722419ef69"] { 757 --color-scheme-text: 43 57 144; 758 --color-scheme-background: 255 255 255; 759 --color-scheme-accent: 30 35 38; 760 --color-scheme-accent-contrast: 30 35 38; 761 --color-scheme-secondary: 30 35 38; 762 } 763 764 [data-color-scheme="scheme-6641fd8c-0fdd-4ed9-bd94-b490824d6125"] { 765 --color-scheme-text: 30 35 38; 766 --color-scheme-background: 72 127 249; 767 --color-scheme-accent: 248 250 244; 768 --color-scheme-accent-contrast: 30 35 38; 769 --color-scheme-secondary: 30 35 38; 770 } 771 772 773 [data-color-scheme] { 774 --payment-terms-background-color: rgb(var(--color-scheme-background)); 775 776 --button-color-border: var(--color-scheme-text); 777 --button-color-background: var(--color-scheme-accent); 778 --button-color-text: var(--color-scheme-accent-contrast); 779 --button-color-border-hover: var(--color-scheme-text); 780 --button-color-background-hover: var(--color-scheme-text); 781 --button-color-text-hover: var(--color-scheme-background); 782 } 783 784 ::selection { 785 background-color: rgb(var(--color-scheme-accent)); 786 color: rgb(var(--color-scheme-accent-contrast)); 787 } 788
789 @keyframes scrolling-items { 790 0% { 791 transform: translate3d(0, 0, 0); 792 } 793 794 100% { 795 transform: translate3d(-50%, 0, 0); 796 } 797 } 798</style> 799 800<style id="generated-critical-css"> 801image-with-placeholder{display:block}.theme-button,.theme-button--secondary{cursor:pointer;font-size:var(--font-size-base);line-height:var(--base-line-height);overflow-wrap:anywhere;padding:.5rem 2rem;text-transform:var(--button-text-transform);word-break:normal}.theme-button--secondary:after,.theme-button:after{--tw-content:var(--button-after-content);content:var(--tw-content)}.theme-button{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(var(--button-color-background)/var(--tw-bg-opacity,1));border-color:rgb(var(--button-color-border)/var(--tw-border-opacity,1));border-radius:var(--button-border-radius);border-width:var(--text-border-width);color:rgb(var(--button-color-text)/var(--tw-text-opacity,1))}@media (hover:hover) and (pointer:fine){.theme-button:hover{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(var(--button-color-background-hover)/var(--tw-bg-opacity,1));border-color:rgb(var(--button-color-border-hover)/var(--tw-border-opacity,1));color:rgb(var(--button-color-text-hover)/var(--tw-text-opacity,1))}}.theme-button--secondary{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(var(--color-scheme-background)/var(--tw-bg-opacity,1));border-color:rgb(var(--color-scheme-text)/var(--tw-border-opacity,1));border-radius:var(--button-border-radius);border-width:var(--text-border-width);color:rgb(var(--color-scheme-text)/var(--tw-text-opacity,1))}[data-color-scheme] .theme-button--secondary.rte a:hover,[data-color-scheme].theme-button--secondary .rte a:hover,[data-color-scheme].theme-button--secondary.rte a:hover{color:rgb(var(--color-scheme-accent));text-decoration-color:rgb(var(--color-scheme-accent))}[data-color-scheme] .theme-button--secondary.rte blockquote,[data-color-scheme].theme-button--secondary .rte blockquote,[data-color-scheme].theme-button--secondary.rte blockquote{background:rgb(var(--color-scheme-text));color:rgb(var(--color-scheme-background))}@media (hover:hover) and (pointer:fine){.theme-button--secondary:hover{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(var(--color-scheme-accent)/var(--tw-border-opacity,1));color:rgb(var(--color-scheme-accent)/var(--tw-text-opacity,1))}}[data-shopify-xr-hidden]{display:none}.block{display:block}.inline-block{display:inline-block}.hidden{display:none}.shopify-payment-button__button--hidden{display:none!important}.splide:not(.is-active) .\[\.splide\:not\(\.is-active\)_\&\]\:pointer-events-none{pointer-events:none}.splide:not(.is-active) .\[\.splide\:not\(\.is-active\)_\&\]\:invisible{visibility:hidden}.splide:not(.is-active) .\[\.splide\:not\(\.is-active\)_\&\]\:\!flex{display:flex!important}.splide:not(.is-active) .\[\.splide\:not\(\.is-active\)_\&\]\:gap-gridline{gap:var(--gridline-width)}@media not all and (min-width:1024px){.splide:not(.is-active) .max-lg\:\[\.splide\:not\(\.is-active\)_\&\]\:hidden{display:none}} 802</style> 803<style id="manual-critical-css"> 804 html { 805 background-color: rgb(var(--color-primary-background)); 806 color: rgb(var(--color-primary-text)); 807 font-size: var(--base-font-size); 808 line-height: var(--base-line-height); 809 } 810 811 [x-cloak] { 812 display: none; 813 } 814 815 data-island { 816 display: block; 817 } 818 819 html.no-js [x-cloak].no-js-undo-cloak { 820 display: revert; 821 } 822 823 body { 824 display: flex; 825 flex-direction: column; 826 min-height: 100vh; 827 } 828 829 @media (min-width: 768px) { 830 [md\:undo-x-cloak-block] { 831 display: block; 832 } 833 } 834 835 @media (max-width: 767px) { 836 [max-md\:undo-x-cloak-block] { 837 display: block; 838 } 839 } 840</style> 841 842 <style> 843 :root { 844 /* ââ Colors ââ */ 845 --pr-blue: #2B3990; 846 --pr-blue-hover: #232e75; 847 --pr-bright-blue: #487FF9; /* matches product-page volume-pricing table */ 848 --pr-bright-blue-hover: #3D6CD4; 849 --pr-bright-blue-rgb: 72 127 249; 850 --pr-bright-blue-hover-rgb: 61 108 212; 851 --dusky-purple: #4B4D72; 852 --dusky-purple-hover: #3d3f5e; 853 --slider-green: #658a6a; 854 --off-white: #FBFBF6; 855 --pill-bg: #EEE; 856 --pill-bg-hover: #e2e2e2; 857 --cant-find-bg: #EFFE9C; 858 859 /* ââ Typography ââ */ 860 --font-family: 'DM Sans', sans-serif;
861 --title-modal-size: 2.75rem; /* 44px */ 862 --title-modal-tracking: -0.05em; /* -2.2px */ 863 --title-drawer-size: 41px; 864 --title-drawer-tracking: -2px; 865 --body-size: 0.9375rem; /* 15px */ 866 --label-size: 0.8125rem; /* 13px */ 867 --pill-font-size: 0.66rem; /* ~10.65px */ 868 --cta-font-size: 1.5rem; /* 24px */ 869 --submit-font-size: 1.5rem; /* 24px */ 870 --input-font-size: 0.875rem; /* 14px */ 871 872 /* ââ Borders ââ */ 873 --border-modal: 2px solid black; 874 --border-drawer-left: 2px solid black; 875 --border-pill: 0.666px solid black; 876 --border-input: 1px solid black; 877 --border-cta: 2px solid var(--dusky-purple); 878 --border-chip: 0.4px solid black; 879 880 /* ââ Radii ââ */ 881 --radius-modal: 27px; 882 --radius-pill: 9999px; 883 --radius-input: 9999px; 884 --radius-textarea: 10px; 885 --radius-submit: 50px; 886 --radius-cta: 40px; 887 --radius-chip: 24px; 888 --radius-popover: 16px; 889 890 /* ââ Shadows ââ */ 891 --shadow-modal: 0 4px 13px 2px rgba(0, 0, 0, 0.1); 892 --shadow-popover: 0 10px 25px rgba(0, 0, 0, 0.1); 893 --shadow-slider-thumb: 0 2px 6px rgba(0, 0, 0, 0.15); 894 --shadow-focus: 0 0 0 3px rgba(43, 57, 144, 0.1); 895 896 /* ââ Sizing ââ */ 897 --product-image-drawer: 90px; 898 --product-image-modal: 53px; 899 --pill-height: 23px; 900 --submit-height: 70px; 901 --submit-max-width: 351px; 902 --start-quote-height: 79px; 903 --input-min-height: 2.75rem; /* 44px */ 904 --slider-thumb-size: 24px; 905 --slider-track-height: 6px; 906 --cta-width: 153px; 907 --cta-height: 47px; 908 --chip-width: 90px; 909 --chip-height: 21px; 910 911 /* ââ Aliases (backward compat) ââ */ 912 --color-quote-accent: var(--pr-blue); 913 } 914</style> 915 916 917 <link rel="preload" href="//printroom.co/cdn/shop/t/59/assets/base.bundle.css?v=77867960145098054751787098434" as="style" onload="this.onload=null;this.rel='stylesheet'"> 918 <noscript><link rel="stylesheet" href="//printroom.co/cdn/shop/t/59/assets/base.bundle.css?v=77867960145098054751787098434"></noscript> 919 920 <link rel="preload" href="//printroom.co/cdn/shop/t/59/assets/styles.css?v=1691680456440492591789529106" as="style" onload="this.onload=null;this.rel='stylesheet'"> 921 <noscript><link rel="stylesheet" href="//printroom.co/cdn/shop/t/59/assets/styles.css?v=1691680456440492591789529106"></noscript> 922 923<meta property="og:site_name" content="The Print Room"> 924<meta property="og:locale" content="en"><meta property="og:locale:alternate" content="en_NZ"><meta property="og:url" content="https://printroom.co/blogs/the-print-room-nz"><meta property="og:title" content=" 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939The Print Room Blog blog: apparel, AS Colour, Beanies, beer, branding and more 940"> 941<meta property="og:type" content="website"> 942<meta property="og:description" content="Read about Fast 15 with Cat Mackenzie Everitt, What makes a good branded tote bag, Custom Merchandise Case Study: Wellington's Parrotdog Brewery and more on the The Print"> 943<meta property="og:image" content="https://printroom.co/cdn/shop/files/PrintRoomNovember2024-13_507c1311-d6fa-40ae-ae11-a74b59c4faec.jpg?v=1753319129"> 944<meta 945 property="og:image:secure_url" 946 content="https://printroom.co/cdn/shop/files/PrintRoomNovember2024-13_507c1311-d6fa-40ae-ae11-a74b59c4faec.jpg?v=1753319129" 947 > 948 <meta property="og:image:width" content="2048"> 949 <meta property="og:image:height" content="1367"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content=" 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964The Print Room Blog blog: apparel, AS Colour, Beanies, beer, branding and more 965"> 966<meta name="twitter:description" content="Read about Fast 15 with Cat Mackenzie Everitt, What makes a good branded tote bag, Custom Merchandise Case Study: Wellington's Parrotdog Brewery and more on the The Print">
967<script> 968 window.THEMENAME = 'Baseline'; 969 window.THEMEVERSION = '3.0.0'; 970 971 document.documentElement.className = document.documentElement.className.replace('no-js', 'js'); 972 973 function debounce(fn, wait) { 974 let t; 975 return (...args) => { 976 clearTimeout(t); 977 t = setTimeout(() => fn.apply(this, args), wait); 978 }; 979 } 980 981 window.theme = { 982 strings: { 983 loading: "Loading", 984 itemCountOne: "{{ count }} item", 985 itemCountOther: "{{ count }} items", 986 addToCart: "Add to cart", 987 soldOut: "Sold out", 988 unavailable: "Unavailable", 989 regularPrice: "Regular price", 990 salePrice: "Sale price", 991 sale: "Sale", 992 unitPrice: "Unit price", 993 unitPriceSeparator: "per", 994 cartEmpty: "Your cart is currently empty.", 995 cartCookies: "Enable cookies to use the shopping cart", 996 update: "Update", 997 quantity: "Quantity", 998 discountedTotal: "Discounted total", 999 regularTotal: "Regular total", 1000 priceColumn: "See Price column for discount details.", 1001 addedToCart: "Added to Cart!", 1002 cartError: "There was an error while updating your cart. Please try again.", 1003 cartAddError: "All {{ title }} are in your cart.", 1004 shippingCalculatorResultsTitleOne: "There is 1 rate:",
1005 shippingCalculatorResultsTitleMany: "There are {{ count }} rates:", 1006 }, 1007 routes: { 1008 root_url: "\/", 1009 predictive_search_url: "\/search\/suggest", 1010 cart_url: "\/cart", 1011 cart_add_url: "\/cart\/add", 1012 cart_change_url: "\/cart\/change", 1013 cart_update_url: "\/cart\/update", 1014 cart_clear_url: "\/cart\/clear", 1015 }, 1016 moneyFormat: "${{amount}}", 1017 moneyWithCurrencyFormat: "${{amount}} USD", 1018 get defaultMoneyFormat() { 1019 return this.moneyFormat; 1020 }, 1021 cartItemCount: 0, 1022 settings: { 1023 cartType: "page", 1024 openDrawerOnAddToCart: false 1025 }, 1026 info: { 1027 name: 'Baseline', 1028 } 1029 }; 1030</script>
vendor: 1 bytes, line 1030
1030
1031<script src="//printroom.co/cdn/shop/t/59/assets/utils.js?v=84782252304122448471787098437" defer></script>
1031 1032
1032<script src="//printroom.co/cdn/shop/t/59/assets/images.js?v=56710371490645595961787098434" defer></script>
1032 1033
1033<script> 1034 window.themeEventsDebugMode = false; 1035 </script>
1035 1036
1036<script src="//printroom.co/cdn/shop/t/59/assets/theme-events.js?v=133344252210966700221787098437" defer></script>
1036 1037 1038 1039 1040 1041 1042 <!-- "snippets/shogun-head.liquid" was not rendered, the associated app was uninstalled --> 1043
1043<script type="text/javascript"> 1044window.PunchoutSettings = { 1045 "cloud_url": "https://cloud.punchoutexpress.com", 1046 "token": "ba56ba1530c75285dc7e1f854b4ad1a1", 1047 "checkout_selector": "#main-cart-footer div.items-center", 1048 "checkout_text": "Transfer Cart", 1049 "cancel_selector": "#main-cart-footer div.items-center", 1050 "cancel_text": "Cancel", 1051 "hide_selector": "*[name=\"checkout\"],.shopify-payment-button,.additional-checkout-buttons,.additional-checkout-button, #main-cart-footer button.theme-button--secondary, #main-cart-footer button.text-button", 1052 "cart_container_selector": "#CartContainer,#CartDrawer,#ajaxifyModal" 1053 }; 1054</script>
1054 1055 1056 <!-- Punchout Cloud -->
1057<script src="https://cdn.cloud.punchoutexpress.com/cloud/assets-shopify/0.2.0/punchout.min.js?v5_24_0" defer="defer"></script>
1057 1058<style type="text/css">.btn-punchout-cancel {margin-left: 10px;}</style> 1059<!-- /Punchout Cloud --> 1060 1061 1062
1063<script> 1064(function() { 1065 console.log('[TWOA Punchout] Script loaded'); 1066 1067 // Check if we're on the Te Wananga page and Locksmith is present 1068 const isTWOAPage = window.location.pathname.includes('te-wananga-o-aotearoa'); 1069 console.log('[TWOA Punchout] Is TWOA page:', isTWOAPage); 1070 console.log('[TWOA Punchout] Current path:', window.location.pathname); 1071 1072 if (isTWOAPage) { 1073 // Check if punchout session is already active 1074 const urlParams = new URLSearchParams(window.location.search); 1075 const hasPunchoutSession = urlParams.has('punchout_sess_id'); 1076 console.log('[TWOA Punchout] Has punchout session:', hasPunchoutSession); 1077 1078 if (!hasPunchoutSession) { 1079 console.log('[TWOA Punchout] No punchout session detected, will auto-activate'); 1080 1081 // Wait for page to fully load, then activate punchout 1082 window.addEventListener('load', function() { 1083 // Check if there's a Locksmith password form visible 1084 const hasPasswordForm = document.querySelector('form[data-locksmith-form], input[type="password"][name*="lock"]'); 1085 1086 console.log('[TWOA Punchout] Page loaded - Has password form:', !!hasPasswordForm); 1087 1088 if (!hasPasswordForm) { 1089 // No password form = user has access, activate punchout immediately 1090 console.log('[TWOA Punchout] â Access granted - activating punchout session'); 1091 const punchoutId = Date.now().toString() + Math.random().toString(36).substring(2, 15); 1092 const newUrl = new URL(window.location.href); 1093 newUrl.searchParams.set('punchout_sess_id', punchoutId); 1094 1095 // Store in sessionStorage to persist across page navigation 1096 sessionStorage.setItem('twoa_punchout_active', 'true'); 1097 sessionStorage.setItem('twoa_punchout_id', punchoutId); 1098 console.log('[TWOA Punchout] Session ID:', punchoutId); 1099 1100 // Redirect with punchout parameter 1101 console.log('[TWOA Punchout] Redirecting to:', newUrl.toString()); 1102 window.location.href = newUrl.toString(); 1103 } else { 1104 console.log('[TWOA Punchout] Password form detected, waiting for login...'); 1105 1106 // Watch for form submission / successful login 1107 const checkForAccess = setInterval(function() { 1108 const formStillVisible = document.querySelector('form[data-locksmith-form], input[type="password"][name*="lock"]'); 1109 1110 if (!formStillVisible) { 1111 console.log('[TWOA Punchout] â Password form disappeared - activating punchout'); 1112 clearInterval(checkForAccess); 1113 1114 const punchoutId = Date.now().toString() + Math.random().toString(36).substring(2, 15); 1115 sessionStorage.setItem('twoa_punchout_active', 'true'); 1116 sessionStorage.setItem('twoa_punchout_id', punchoutId); 1117 1118 const newUrl = new URL(window.location.href); 1119 newUrl.searchParams.set('punchout_sess_id', punchoutId); 1120 window.location.href = newUrl.toString(); 1121 } 1122 }, 500); 1123 1124 // Stop after 30 seconds 1125 setTimeout(() => clearInterval(checkForAccess), 30000); 1126 } 1127 }); 1128 } else { 1129 // If punchout is already active, store it in session 1130 console.log('[TWOA Punchout] Punchout already active, storing in session'); 1131 sessionStorage.setItem('twoa_punchout_active', 'true'); 1132 sessionStorage.setItem('twoa_punchout_id', urlParams.get('punchout_sess_id')); 1133 } 1134 } 1135 1136 // Apply punchout session to all pages if Te Wananga session is active 1137 const storedPunchoutActive = sessionStorage.getItem('twoa_punchout_active'); 1138 const storedPunchoutId = sessionStorage.getItem('twoa_punchout_id'); 1139 console.log('[TWOA Punchout] Session storage - Active:', storedPunchoutActive, 'ID:', storedPunchoutId); 1140 1141 if (storedPunchoutActive === 'true' && storedPunchoutId) { 1142 const urlParams = new URLSearchParams(window.location.search); 1143 if (!urlParams.has('punchout_sess_id')) { 1144 console.log('[TWOA Punchout] Applying stored punchout session to current page'); 1145 const newUrl = new URL(window.location.href); 1146 newUrl.searchParams.set('punchout_sess_id', storedPunchoutId); 1147 window.history.replaceState({}, '', newUrl.toString()); 1148 console.log('[TWOA Punchout] URL updated:', newUrl.toString()); 1149 1150 // Reinitialize punchout if the script is loaded 1151 if (window.PunchoutCloud && window.PunchoutCloud.init) { 1152 console.log('[TWOA Punchout] Reinitializing PunchoutCloud'); 1153 window.PunchoutCloud.init(); 1154 } 1155 } 1156 } 1157})(); 1158</script>
1158 1159 1160<!-- BEGIN app block: shopify://apps/one-tree-planted/blocks/index/1cbac389-d687-4afb-9e8a-26b6535fa1c2 -->
1160<script src="https://cdn.shopify.com/extensions/01a0f89b-d3f4-7fbc-a0d8-5474ae165888/reforestation-app-16/assets/script.js" defer></script>
1160 1161<!-- END app block -->
1161<script src="https://cdn.shopify.com/extensions/019d45d2-6a70-7eed-8da1-d1e8fd0fae86/fulfillment-fee-app-100/assets/fulfillment-fee-manager.js" type="text/javascript" defer="defer"></script>
1161 1162<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
1163<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: 7054289,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 1163
1163
1164<script> 1165 window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || []; 1166</script>
vendor: 1 bytes, line 1166
1166
1167<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}
1167).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: 7054289,storefrontBaseUrl: "https://printroom.co",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://printroom.co/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["4c64608a","16072cab","8450a54b","7ee89bf1"],webPixelsConfigList: [{"id":"2246574150","configuration":"{\"accountID\":\"SWPcHh\",\"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":[]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"2207776838","configuration":"{\"tagID\":\"2612346888626\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"7ae565e198624b39e0856d352b9a6b4c","type":"APP","apiClientId":3009811,"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"}
1167,{"id":"1975877702","configuration":"{\"mailchimp_store_id\":\"store_sgk5l8njdgd17w61safe\", \"mailchimp_user_id\":\"33995925\",\"mailchimp_list_id\":\"ef9b0a5c04\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"e357a49eadeb6216a959d63fa3fb8f55","type":"APP","apiClientId":2585307,"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":"462651462","configuration":"{\"config\":\"{\\\"google_tag_ids\\\":[\\\"G-7N7TTE08E9\\\",\\\"GT-KD7KB7H4\\\"],\\\"target_country\\\":\\\"ZZ\\\",\\\"gtag_events\\\":[{\\\"type\\\":\\\"search\\\",\\\"action_label\\\":\\\"G-7N7TTE08E9\\\"},{\\\"type\\\":\\\"begin_checkout\\\",\\\"action_label\\\":\\\"G-7N7TTE08E9\\\"},{\\\"type\\\":\\\"remove_from_cart\\\",\\\"action_label\\\":\\\"G-7N7TTE08E9\\\"},{\\\"type\\\":\\\"view_item\\\",\\\"action_label\\\":[\\\"G-7N7TTE08E9\\\",\\\"MC-1HQ5JHVSZ0\\\"]},{\\\"type\\\":\\\"purchase\\\",\\\"action_label\\\":[\\\"G-7N7TTE08E9\\\",\\\"MC-1HQ5JHVSZ0\\\"]},{\\\"type\\\":\\\"add_shipping_info\\\",\\\"action_label\\\":\\\"G-7N7TTE08E9\\\"},{\\\"type\\\":\\\"page_view\\\",\\\"action_label\\\":[\\\"G-7N7TTE08E9\\\",\\\"MC-1HQ5JHVSZ0\\\"]},{\\\"type\\\":\\\"view_item_list\\\",\\\"action_label\\\":\\\"G-7N7TTE08E9\\\"},{\\\"type\\\":\\\"add_payment_info\\\",\\\"action_label\\\":\\\"G-7N7TTE08E9\\\"},{\\\"type\\\":\\\"add_to_cart\\\",\\\"action_label\\\":\\\"G-7N7TTE08E9\\\"},{\\\"type\\\":\\\"view_cart\\\",\\\"action_label\\\":\\\"G-7N7TTE08E9\\\"}],\\\"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":"171573318","configuration":"{\"pixel_id\":\"1516354578649796\",\"pixel_type\":\"facebook_pixel\",\"metaapp_system_user_token\":\"-\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"96420dbe9ea96c426a1b7f364f977719","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":"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":"The Print Room","paymentSettings":{"currencyCode":"NZD"},"myshopifyDomain":"the-print-room.myshopify.com","countryCode":"NZ","storefrontUrl":"https:\/\/printroom.co"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[],"purchasingCompany":null},},"https://printroom.co/cdn","5982071ew7ea472e3p69b68784m2150dfea",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"false","themeId":"151830298694","themePublished":"true","eventMetadataId":"e11b474d-b4e6-49fc-883b-264c0457a2e0","pageType":"blog","resourceId":"6186184","shopId":"7054289","storefrontBaseUrl":"https:\/\/printroom.co","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>
1167<script> 1168 window.ShopifyAnalytics = window.ShopifyAnalytics || {}; 1169 window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; 1170 window.ShopifyAnalytics.meta.currency = 'USD'; 1171 var meta = {"page":{"pageType":"blog","resourceType":"blog","resourceId":6186184,"requestId":"a8f08579-9f70-4d70-8333-bcdc50ec8fa6-1791103104"}}; 1172 for (var attr in meta) { 1173 window.ShopifyAnalytics.meta[attr] = meta[attr]; 1174 } 1175</script>
vendor: 1 bytes, line 1175
1175
1176<script class="analytics"> 1177 (function () { 1178 var customDocumentWrite = function(content) { 1179 var jquery = null; 1180 1181 if (window.jQuery) { 1182 jquery = window.jQuery; 1183 } else if (window.Checkout && window.Checkout.$) { 1184 jquery = window.Checkout.$; 1185 } 1186 1187 if (jquery) { 1188 jquery('body').append(content); 1189 } 1190 }; 1191 1192 var hasLoggedConversion = function(token) { 1193 if (token) { 1194 return document.cookie.indexOf('loggedConversion=' + token) !== -1; 1195 } 1196 return false; 1197 } 1198 1199 var setCookieIfConversion = function(token) { 1200 if (token) { 1201 var twoMonthsFromNow = new Date(Date.now()); 1202 twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2); 1203 1204 document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow; 1205 } 1206 } 1207 1208 var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || []; 1209 window.ShopifyAnalytics.lib.trekkie = window.trekkie; 1210 if (trekkie.integrations) { 1211 return; 1212 } 1213 trekkie.methods = [ 1214 'identify', 1215 'page', 1216 'ready', 1217 'track', 1218 'trackForm', 1219 'trackLink' 1220 ]; 1221 trekkie.factory = function(method) { 1222 return function() { 1223 var args = Array.prototype.slice.call(arguments); 1224 args.unshift(method); 1225 trekkie.push(args); 1226 if (method == 'track' || method == 'page') { 1227 var pageUrl; 1228 try { 1229 pageUrl = window.location.href; 1230 } catch (e) {} 1231 var pageReferrer; 1232 try { 1233 pageReferrer = document.referrer; 1234 } catch (e) {} 1235 try { 1236 if (window.__TREKKIE_SHIM_QUEUE == null) { 1237 window.__TREKKIE_SHIM_QUEUE = []; 1238 } 1239 window.__TREKKIE_SHIM_QUEUE.push({ 1240 from: 'trekkie-stub', 1241 method: method, 1242 args: args.slice(1), 1243 pageContext: { 1244 url: pageUrl, 1245 referrer: pageReferrer 1246 } 1247 }); 1248 } catch (e) { 1249 // no-op 1250 } 1251 } 1252 return trekkie; 1253 }; 1254 }; 1255 for (var i = 0; i < trekkie.methods.length; i++) { 1256 var key = trekkie.methods[i]; 1257 trekkie[key] = trekkie.factory(key); 1258 } 1259 trekkie.load = function(config) { 1260 trekkie.config = config || {}; 1261 trekkie.config.initialDocumentCookie = document.cookie; 1262 var first = document.getElementsByTagName('script')[0]; 1263var script = document.createElement('script'); 1264script.type = 'text/javascript'; 1265script.onerror = function(e) { 1266 var scriptFallback = document.createElement('script'); 1267 scriptFallback.type = 'text/javascript'; 1268 scriptFallback.onerror = function(error) { 1269 var Monorail = { 1270 produce: function produce(monorailDomain, schemaId, payload) { 1271 var currentMs = new Date().getTime(); 1272 var event = { 1273 schema_id: schemaId, 1274 payload: payload, 1275 metadata: { 1276 event_created_at_ms: currentMs, 1277 event_sent_at_ms: currentMs 1278 } 1279 }; 1280 return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event)); 1281 }, 1282 sendRequest: function sendRequest(endpointUrl, payload) { 1283 // Try the sendBeacon API 1284 if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) { 1285 var blobData = new window.Blob([payload], { 1286 type: 'text/plain' 1287 }); 1288 1289 if (window.navigator.sendBeacon(endpointUrl, blobData)) { 1290 return true; 1291 } // sendBeacon was not successful 1292 1293 } // XHR beacon 1294 1295 var xhr = new XMLHttpRequest(); 1296 1297 try { 1298 xhr.open('POST', endpointUrl); 1299 xhr.setRequestHeader('Content-Type', 'text/plain'); 1300 xhr.send(payload); 1301 } catch (e) { 1302 console.log(e); 1303 } 1304 1305 return false; 1306 }, 1307 isIos12: function isIos12() { 1308 return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1; 1309 } 1310 }; 1311 Monorail.produce('monorail-edge.shopifysvc.com', 1312 'trekkie_storefront_load_errors/1.1', 1313 {shop_id: 7054289, 1314 theme_id: 151830298694, 1315 app_name: "storefront", 1316 context_url: window.location.href, 1317 source_url: "//printroom.co/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js"}); 1318 1319 }; 1320 scriptFallback.async = true; 1321 scriptFallback.src = '//printroom.co/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js'; 1322 first.parentNode.insertBefore(scriptFallback, first); 1323}; 1324script.async = true; 1325script.src = '//printroom.co/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js'; 1326first.parentNode.insertBefore(script, first); 1327 1328 }; 1329 trekkie.load( 1330 {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":7054289,"isMerchantRequest":null,"themeId":151830298694,"themeCityHash":"18288446332362764096","contentLanguage":"en","currency":"USD","eventMetadataId":"e11b474d-b4e
13306-49fc-883b-264c0457a2e0"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b","7ee89bf1","4c64608a"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":false,"source":"trekkie-storefront-renderer","apiClientId":580111}} 1331 ); 1332 1333 var loaded = false; 1334 trekkie.ready(function() { 1335 if (loaded) return; 1336 loaded = true; 1337 1338 window.ShopifyAnalytics.lib = window.trekkie; 1339 1340 var originalDocumentWrite = document.write; 1341 document.write = customDocumentWrite; 1342 try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {}; 1343 document.write = originalDocumentWrite; 1344 1345 var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/) 1346 var token = match? match[1]: undefined; 1347 if (!hasLoggedConversion(token)) { 1348 setCookieIfConversion(token); 1349 1350 } 1351 }); 1352 1353 window.ShopifyAnalytics.lib.page(null,{"pageType":"blog","resourceType":"blog","resourceId":6186184,"requestId":"a8f08579-9f70-4d70-8333-bcdc50ec8fa6-1791103104","shopifyEmitted":true}); 1354 1355 var eventsListenerScript = document.createElement('script'); 1356 eventsListenerScript.async = true; 1357 eventsListenerScript.src = "//printroom.co/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js"; 1358 document.getElementsByTagName('head')[0].appendChild(eventsListenerScript); 1359})();</script>
1359 1360
1360<script> 1361 if (!window.ga || (window.ga && typeof window.ga !== 'function')) { 1362 window.ga = function ga() { 1363 (window.ga.q = window.ga.q || []).push(arguments); 1364 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 1365 window.Shopify.analytics.publish("ga_stub_called", {}, {sendTo: "google_osp_migration"}); 1366 } 1367 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."); 1368 }; 1369 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 1370 window.Shopify.analytics.publish("ga_stub_initialized", {}, {sendTo: "google_osp_migration"}); 1371 } 1372 } 1373</script>
vendor: 1 bytes, line 1373
1373
1374<script 1375 defer 1376 src="https://printroom.co/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.4.min.js" 1377 data-application="storefront-renderer" 1378 data-shop-id="7054289" 1379 data-render-region="gcp-us-central1" 1380 data-page-type="blog" 1381 data-theme-instance-id="151830298694" 1382 data-theme-name="Baseline" 1383 data-theme-version="3.3.1" 1384 data-monorail-region="shop_domain" 1385 data-resource-timing-sampling-rate="10" 1386 data-shs="true" 1387 data-shs-beacon="true" 1388 data-shs-export-with-fetch="true" 1389 data-shs-logs-sample-rate="1" 1390 data-shs-beacon-endpoint="https://printroom.co/api/collect" 1391></script>
1391 1392<meta name="shopify-y" content="b2c8f042-7e89-4050-96ec-9ac9a33f699b" data-expiration="1822660704000"><meta name="shopify-s" content="c141c267-cb00-4498-9f73-a06db22cf78d" data-expiration="1791104904000"><meta name="new-cookie-storage-activated" content="t"> 1393</head> 1394 1395 <body> 1396<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W9DFFGB" 1397 height="0" width="0" style="display:none;visibility:hidden" title="gtm"></iframe></noscript> 1398 1399 <a class="skip-link" href="#MainContent">Skip to content</a> 1400 1401 <!-- BEGIN sections: header-group --> 1402<div id="shopify-section-sections--21296457187398__geo_market_banner" class="shopify-section shopify-section-group-header-group contents"> 1403 <style data-shopify> 1404 #shopify-section-sections--21296457187398__geo_market_banner [data-geo-market-banner] { 1405 position: sticky; 1406 top: 0; 1407 left: 0; 1408 right: 0; 1409 z-index: 40; 1410 display: block; 1411 width: 100%; 1412 padding: 0; 1413 border-bottom: 1px solid rgba(248, 250, 244, 0.18); 1414 background: #2b3990; 1415 color: #f8faf4; 1416 box-shadow: 0 14px 30px rgba(19, 27, 68, 0.18); 1417 pointer-events: auto; 1418 } 1419 1420 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__inner { 1421 display: grid; 1422 grid-template-columns: minmax(0, 1fr) auto; 1423 align-items: center; 1424 gap: 1rem 1.5rem; 1425 padding: 0.95rem var(--section-horizontal-spacing); 1426 } 1427 1428 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__message { 1429 margin: 0; 1430 max-width: 48rem; 1431 color: inherit; 1432 font-family: var(--font-body); 1433 font-size: var(--font-size-base); 1434 font-style: var(--font-body-style); 1435 font-weight: 500; 1436 letter-spacing: -0.01em; 1437 line-height: 1.45; 1438 } 1439 1440 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__actions { 1441 display: flex; 1442 flex-wrap: wrap; 1443 align-items: center; 1444 justify-content: flex-end; 1445 gap: 0.75rem; 1446 justify-self: end; 1447 } 1448 1449 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__button, 1450 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__dismiss { 1451 display: inline-flex; 1452 min-height: 2.875rem; 1453 align-items: center; 1454 justify-content: center; 1455 gap: 0.45rem; 1456 border-style: solid; 1457 border-width: var(--text-border-width); 1458 border-radius: var(--button-border-radius); 1459 font-family: var(--font-body); 1460 font-size: var(--font-size-base); 1461 font-style: var(--font-body-style); 1462 font-weight: 600; 1463 line-height: 1; 1464 text-decoration: none; 1465 text-transform: var(--button-text-transform); 1466 white-space: nowrap; 1467 transition: 1468 transform 0.18s ease, 1469 box-shadow 0.18s ease, 1470 background-color 0.18s ease, 1471 border-color 0.18s ease, 1472 color 0.18s ease, 1473 opacity 0.18s ease; 1474 } 1475 1476 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__button { 1477 padding: 0.8rem 1.35rem; 1478 border: 1px solid rgba(255, 255, 255, 0.12); 1479 background: #fbfbf6; 1480 box-shadow: 0 12px 24px rgba(14, 21, 52, 0.14); 1481 color: #2b3990; 1482 } 1483 1484 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__dismiss { 1485 padding: 0.8rem 1rem; 1486 border-color: rgba(248, 250, 244, 0.32); 1487 background: rgba(248, 250, 244, 0.08); 1488 box-shadow: none; 1489 color: inherit; 1490 opacity: 0.96; 1491 } 1492 1493 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__dismiss-icon { 1494 font-size: 0.95rem; 1495 line-height: 1; 1496 } 1497 1498 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__button:focus-visible, 1499 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__dismiss:focus-visible { 1500 outline: 2px solid #f8faf4; 1501 outline-offset: 2px; 1502 } 1503 1504 @media (hover: hover) and (pointer: fine) { 1505 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__button:hover, 1506 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__dismiss:hover { 1507 transform: translateY(-1px); 1508 } 1509 1510 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__button:hover { 1511 background: #ffffff; 1512 box-shadow: 0 16px 30px rgba(14, 21, 52, 0.18); 1513 } 1514 1515 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__dismiss:hover { 1516 border-color: rgba(248, 250, 244, 0.56); 1517 background: rgba(248, 250, 244, 0.16); 1518 opacity: 1; 1519 } 1520 } 1521 1522 @media (max-width: 767px) { 1523 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__inner { 1524 grid-template-columns: 1fr; 1525 align-items: stretch; 1526 gap: 0.9rem; 1527 } 1528 1529 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__message { 1530 max-width: none; 1531 } 1532 1533 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__actions { 1534 width: 100%; 1535 display: grid; 1536 grid-template-columns: 1fr; 1537 justify-content: stretch; 1538 justify-self: stretch; 1539 } 1540 1541 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__button { 1542 width: 100%; 1543 } 1544 1545 #shopify-section-sections--21296457187398__geo_market_banner .geo-market-banner__dismiss { 1546 justify-self: start; 1547 } 1548 } 1549 </style> 1550 1551 <data-island 1552 data-color-scheme="scheme3" 1553 x-data="GeoMarketBanner({ 1554 enabled: true, 1555 nzTargetUrl: "https:\/\/theprintroom.nz", 1556 intlTargetUrl: "https:\/\/printroom.co", 1557 auTargetUrl: "https:\/\/www.printroom.co\/en-au", 1558 messages: { 1559 fromInternational: "You're on our international site.", 1560 fromNz: "You're on our New Zealand site.", 1561 fromAu: "You're on our Australia site.", 1562 switchToNz: "Switch to New Zealand", 1563 switchToAu: "Switch to Australia", 1564 switchToInternational: "Switch to international",
1565 dismiss: "Dismiss" 1566 } 1567 })" 1568 role="region" 1569 aria-label="Regional site selector" 1570 x-show="shown" 1571 x-transition:enter="transition duration-300 motion-reduce:duration-0 outline-0" 1572 x-transition:enter-start="-translate-y-full" 1573 x-transition:enter-end="translate-y-0" 1574 x-transition:leave="transition duration-200 motion-reduce:duration-0 outline-0" 1575 x-transition:leave-start="translate-y-0" 1576 x-transition:leave-end="-translate-y-full" 1577 @keydown.escape.window="dismiss" 1578 id="sections--21296457187398__geo_market_banner" 1579 data-geo-market-banner 1580 style="display: none;" 1581 on="idle" 1582 src="//printroom.co/cdn/shop/t/59/assets/island-geo-market-banner.bundle.js?v=76971093760605141431787098434" 1583 > 1584 <div class="geo-market-banner__inner"> 1585 <p class="geo-market-banner__message"> 1586 <span x-text="message"></span> 1587 </p> 1588 <div class="geo-market-banner__actions"> 1589 <a 1590 class="geo-market-banner__button" 1591 :href="targetUrl" 1592 x-text="ctaLabel" 1593 @click="acceptSwitch($event)" 1594 ></a> 1595 <button 1596 class="geo-market-banner__dismiss" 1597 type="button" 1598 @click="dismiss" 1599 :aria-label="dismissLabel" 1600 > 1601 <span x-text="dismissLabel"></span> 1602 <span class="geo-market-banner__dismiss-icon" aria-hidden="true">Ã</span> 1603 </button> 1604 </div> 1605 </div> 1606 </data-island> 1607 1608 1609 1610</div><div id="shopify-section-sections--21296457187398__header" class="shopify-section shopify-section-group-header-group section-header relative z-20"> 1611 1612 1613<style data-shopify> 1614 1615 #shopify-section-sections--21296457187398__header { 1616 position: sticky; 1617 top: 0; 1618 z-index: 30; 1619 } 1620 1621 :root { 1622 --sticky-header-height: 66px; 1623 } 1624 1625 1626 #shopify-section-sections--21296457187398__header { 1627 --logo-max-width: 80px; 1628 } 1629 @media (min-width: 1024px) { 1630 #shopify-section-sections--21296457187398__header { 1631 --logo-max-width: 90px; 1632 } 1633 } 1634</style> 1635 1636<data-island 1637 x-data="Header" 1638 class="block" 1639 :class="{ 'is-stuck' : isStuck }" 1640 1641 data-sticky="true" 1642 1643 1644 data-color-scheme="scheme1" 1645 data-overlay-header-with-sticky="false" 1646 data-overlay-text-color-scheme="scheme1" 1647 id="sections--21296457187398__header" 1648 role="banner" 1649 data-theme-header 1650> 1651 1652 <sticky-header-height-helper hidden></sticky-header-height-helper> 1653 1654 <header 1655 x-ref="header" 1656 class="relative z-10 text-scheme-text header-glass" 1657 data-color-scheme="scheme1" 1658 > 1659 <nav 1660 class="relative hidden lg:block" 1661 aria-label="Primary" 1662 > 1663 <div class="flex items-stretch px-section-horizontal-spacing justify-between flex-wrap "> 1664 <div class="flex items-stretch"> 1665 1666 <div class="flex"> 1667 <a 1668 href="/" 1669 class="break-word my-auto inline-block py-4" 1670 > 1671 1672 1673 <div class="max-w-[var(--logo-max-width)]"> 1674 1675<img 1676 src="//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=90" 1677 srcset="//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=80 80w,//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=160 160w,//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=240 240w,//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=90 90w,//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=180 180w,//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=270 270w 1678 " 1679 width="543" 1680 height="397" 1681 loading="eager" 1682 1683 sizes="(min-width: 1024px) 90px, 80px" 1684 1685 alt="The Print Room" 1686 1687 > 1688 1689 1690 1691 </div> 1692 1693 1694 </a> 1695 </div> 1696 1697 1698 </div> 1699 1700 1701 1702 1703 1704 <a 1705 1706 class="flex py-4 relative self-stretch inline-flex flex-col" 1707 href="/collections/product-library" 1708 >
1709 <span class="m-auto inline-block">Products</span></a> 1710 1711 1712<data-island 1713 x-data="{ 1714 expanded: false, 1715 hoverTimeout: null, 1716 openDropdown() { 1717 clearTimeout(this.hoverTimeout); 1718 this.expanded = true; 1719 this.$nextTick(() => { 1720 const header = this.$el.closest('header'); 1721 const dd = this.$el.querySelector('.dropdown-glass'); 1722 if (header && dd) { 1723 header.style.setProperty('--dropdown-h', dd.offsetHeight + 'px'); 1724 } 1725 }); 1726 }, 1727 closeDropdown() { 1728 this.hoverTimeout = setTimeout(() => { 1729 this.expanded = false; 1730 }, 150); 1731 } 1732 }" 1733 @mouseenter="openDropdown()" 1734 @mouseleave="closeDropdown()" 1735 @focusin="openDropdown()" 1736 @focusout="if ($event.relatedTarget && !$el.contains($event.relatedTarget)) closeDropdown()" 1737 class="no-js-focus-wrapper flex self-stretch header-dropdown" 1738 1739 > 1740 <button 1741 class="inline-flex py-4 items-center header-menu-item" 1742 @click="expanded = !expanded" 1743 :aria-expanded="expanded ? true : 'false'" 1744 aria-controls="menu0" 1745 > 1746 <span class="inline-block pr-1">Services</span><span 1747 class="mr-1 inline-block h-3 w-3 origin-center align-middle" 1748 x-show="!expanded" 1749 ><svg 1750 class="theme-icon" 1751 xmlns="http://www.w3.org/2000/svg" 1752 fill="none" 1753 viewBox="0 0 24 24" 1754> 1755 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 1756</svg> 1757</span> 1758 <span 1759 class="mr-1 inline-block h-3 w-3 origin-center align-middle" 1760 x-show="expanded" 1761 style="display: none;" 1762 ><svg 1763 class="theme-icon" 1764 xmlns="http://www.w3.org/2000/svg" 1765 fill="none" 1766 viewBox="0 0 24 24" 1767> 1768 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 1769</svg> 1770</span></button> 1771 <div 1772 id="menu0" 1773 class="no-js-focus-container absolute top-full z-20 dropdown-glass text-scheme-text bottom-auto left-0 w-full" 1774 x-cloak 1775 x-show="expanded" 1776 x-transition:enter="transition ease-out duration-300 motion-reduce:duration-0" 1777 x-transition:enter-start="opacity-0 -translate-y-2 scale-[0.98]" 1778 x-transition:enter-end="opacity-100 translate-y-0 scale-100" 1779 x-transition:leave="transition ease-in duration-200 motion-reduce:duration-0" 1780 x-transition:leave-start="opacity-100 translate-y-0 scale-100" 1781 x-transition:leave-end="opacity-0 -translate-y-1 scale-[0.99]" 1782 style="transform-origin: top center;" 1783 data-color-scheme="" 1784 ><div class=" text-left"><div class="grid gap-gutter bg-gridline-color grid-cols-4"> 1785 1786 <div class="bg-scheme-background px-section-horizontal-spacing py-section-vertical-spacing text-scheme-text"> 1787 <a 1788 1789 class="font-heading inline-block py-1" 1790 href="/pages/services" 1791 > 1792 Services 1793 </a> 1794 </div> 1795 1796 1797 1798 1799<div class="bg-scheme-background px-section-horizontal-spacing py-section-vertical-spacing text-scheme-text"> 1800 <h2 class="font-heading mb-2"> 1801 1802 <a 1803 1804 class="inline-block py-1" 1805 href="/pages/product-capabilities" 1806 1807 > 1808 Production capabilities 1809 </a> 1810 1811 </h2> 1812 <ul><li class=""> 1813 <a 1814 1815 class="inline-block py-1" 1816 href="/pages/custom-manufactured" 1817 >Custom-manufactured</a> 1818 </li><li class=""> 1819 <a 1820 1821 class="inline-block py-1" 1822 href="/pages/screen-printing" 1823 >Screen printing</a> 1824 </li><li class=""> 1825 <a 1826 1827 class="inline-block py-1" 1828 href="/pages/embroidery" 1829 >Embroidery</a> 1830 </li><li class=""> 1831 <a 1832 1833 class="inline-block py-1" 1834 href="/pages/heat-transfers" 1835 >Heat transfers</a> 1836 </li><li class=""> 1837 <a 1838 1839 class="inline-block py-1" 1840 href="/pages/finishing" 1841 >Finishing</a> 1842 </li></ul> 1843 </div><div class="bg-scheme-background px-section-horizontal-spacing py-section-vertical-spacing text-scheme-text"> 1844 <h2 class="font-heading mb-2"> 1845 1846 <a 1847 1848 class="inline-block py-1" 1849 href="/pages/partner-services" 1850 1851 > 1852 Partner services 1853 </a> 1854 1855 </h2> 1856 <ul><li class=""> 1857 <a 1858 1859 class="inline-block py-1" 1860 href="/pages/client-portal" 1861 >Client portal</a> 1862 </li><li class=""> 1863 <a 1864 1865 class="inline-block py-1" 1866 href="/pages/fundraising-pre-orders" 1867 >Fundraise & pre-order</a> 1868 </li><li class=""> 1869 <a 1870 1871 class="inline-block py-1" 1872 href="/pages/repurpose-initiative" 1873 >Repurpose initiative</a> 1874 </li></ul> 1875 </div><div class="bg-scheme-background px-section-horizontal-spacing py-section-vertical-spacing text-scheme-text"> 1876 <h2 class="font-heading mb-2"> 1877 1878 <a 1879 1880 class="inline-block py-1" 1881 href="/pages/popular-services" 1882 1883 > 1884 Popular services 1885 </a> 1886 1887 </h2> 1888 <ul><li class=""> 1889 <a 1890 1891 class="inline-block py-1" 1892 href="/pages/school-leavers-gear" 1893 >School leavers gear</a> 1894 </li><li class=""> 1895 <a 1896 1897 class="inline-block py-1" 1898 href="/pages/tshirt-printing" 1899 >Custom t-shirt printing</a> 1900 </li></ul> 1901 </div> 1902</div></div></div> 1903 </data-island> 1904 1905 1906 1907 1908 <a 1909 1910 class="flex py-4 relative self-stretch inline-flex flex-col" 1911 href="/pages/responsibility" 1912 >
1913 <span class="m-auto inline-block">Responsibility</span></a> 1914 1915 1916<data-island 1917 x-data="{ 1918 expanded: false, 1919 hoverTimeout: null, 1920 openDropdown() { 1921 clearTimeout(this.hoverTimeout); 1922 this.expanded = true; 1923 this.$nextTick(() => { 1924 const header = this.$el.closest('header'); 1925 const dd = this.$el.querySelector('.dropdown-glass'); 1926 if (header && dd) { 1927 header.style.setProperty('--dropdown-h', dd.offsetHeight + 'px'); 1928 } 1929 }); 1930 }, 1931 closeDropdown() { 1932 this.hoverTimeout = setTimeout(() => { 1933 this.expanded = false; 1934 }, 150); 1935 } 1936 }" 1937 @mouseenter="openDropdown()" 1938 @mouseleave="closeDropdown()" 1939 @focusin="openDropdown()" 1940 @focusout="if ($event.relatedTarget && !$el.contains($event.relatedTarget)) closeDropdown()" 1941 class="no-js-focus-wrapper flex self-stretch header-dropdown" 1942 style="position: relative;" 1943 > 1944 <button 1945 class="inline-flex py-4 items-center header-menu-item" 1946 @click="expanded = !expanded" 1947 :aria-expanded="expanded ? true : 'false'" 1948 aria-controls="menu1" 1949 > 1950 <span class="inline-block pr-1">Our story</span><span 1951 class="mr-1 inline-block h-3 w-3 origin-center align-middle" 1952 x-show="!expanded" 1953 ><svg 1954 class="theme-icon" 1955 xmlns="http://www.w3.org/2000/svg" 1956 fill="none" 1957 viewBox="0 0 24 24" 1958> 1959 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 1960</svg> 1961</span> 1962 <span 1963 class="mr-1 inline-block h-3 w-3 origin-center align-middle" 1964 x-show="expanded" 1965 style="display: none;" 1966 ><svg 1967 class="theme-icon" 1968 xmlns="http://www.w3.org/2000/svg" 1969 fill="none" 1970 viewBox="0 0 24 24" 1971> 1972 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 1973</svg> 1974</span></button> 1975 <div 1976 id="menu1" 1977 class="no-js-focus-container absolute top-full z-20 dropdown-glass text-scheme-text gs-dropdown-content nav-dropdown-content" 1978 x-cloak 1979 x-show="expanded" 1980 x-transition:enter="transition ease-out duration-300 motion-reduce:duration-0" 1981 x-transition:enter-start="opacity-0 -translate-y-2 scale-[0.98]" 1982 x-transition:enter-end="opacity-100 translate-y-0 scale-100" 1983 x-transition:leave="transition ease-in duration-200 motion-reduce:duration-0" 1984 x-transition:leave-start="opacity-100 translate-y-0 scale-100" 1985 x-transition:leave-end="opacity-0 -translate-y-1 scale-[0.99]" 1986 style="transform-origin: top left;" 1987 data-color-scheme="" 1988 ><a 1989 href="/pages/in-good-company-with" 1990 1991 >In good company withâ¦</a><a 1992 href="/pages/about-print-room" 1993 1994 >Our origins</a></div> 1995 </data-island> 1996 1997<data-island 1998 x-data="{ 1999 expanded: false, 2000 hoverTimeout: null, 2001 openDropdown() { 2002 clearTimeout(this.hoverTimeout); 2003 this.expanded = true; 2004 this.$nextTick(() => { 2005 const header = this.$el.closest('header'); 2006 const dd = this.$el.querySelector('.dropdown-glass'); 2007 if (header && dd) { 2008 header.style.setProperty('--dropdown-h', dd.offsetHeight + 'px'); 2009 } 2010 }); 2011 }, 2012 closeDropdown() { 2013 this.hoverTimeout = setTimeout(() => { 2014 this.expanded = false; 2015 }, 150); 2016 } 2017 }" 2018 @mouseenter="openDropdown()" 2019 @mouseleave="closeDropdown()" 2020 @focusin="openDropdown()" 2021 @focusout="if ($event.relatedTarget && !$el.contains($event.relatedTarget)) closeDropdown()" 2022 class="no-js-focus-wrapper flex items-center self-stretch header-dropdown" 2023 style="position: relative;" 2024 > 2025 <button 2026 class="gs-pill" 2027 :class="{ 'is-active': expanded }" 2028 @click="expanded = !expanded" 2029 :aria-expanded="expanded ? 'true' : 'false'" 2030 >
2031 <span>Get started +</span> 2032 </button> 2033 <div 2034 class="no-js-focus-container absolute top-full z-20 dropdown-glass text-scheme-text gs-dropdown-content" 2035 x-cloak 2036 x-show="expanded" 2037 x-transition:enter="transition ease-out duration-300 motion-reduce:duration-0" 2038 x-transition:enter-start="opacity-0 -translate-y-2" 2039 x-transition:enter-end="opacity-100 translate-y-0" 2040 x-transition:leave="transition ease-in duration-200 motion-reduce:duration-0" 2041 x-transition:leave-start="opacity-100 translate-y-0" 2042 x-transition:leave-end="opacity-0 -translate-y-1" 2043 style="transform-origin: top left;" 2044 data-color-scheme="" 2045 ><a href="/collections/product-library">Start a project</a><a href="/pages/book-a-call">Book a call</a></div> 2046 </data-island> 2047 2048 2049<div class="flex items-stretch justify-end gap-x-4 text-right "><div class="ml-4 my-auto shrink-0"><form method="post" action="/localization" id="header-localization-form" accept-charset="UTF-8" class="shopify-localization-form" enctype="multipart/form-data"><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="â" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/blogs/the-print-room-nz" /><div class="flex gap-4 justify-end max-lg:hidden"><div class="inline-block shrink-0 select-none"> 2050 <h2 class="sr-only" id="country-heading-header"> 2051 Country/region 2052 </h2> 2053 <data-island 2054 class="relative" 2055 x-data="{ expanded: false }" 2056 @keydown.escape.prevent.stop="expanded = false" 2057 @click.outside="expanded = false" 2058 > 2059 <button 2060 type="button" 2061 class="text-base py-4" 2062 :aria-expanded="expanded" 2063 aria-controls="country-list-header" 2064 aria-describedby="country-heading-header" 2065 @click.prevent="expanded = ! expanded" 2066 > 2067 United States (USD 2068 $) 2069 <span 2070 class="rotate ml-1 inline-block w-3 origin-center transform fill-current transition" 2071 :class="{ 'rotate-180': expanded }" 2072 > 2073 <svg 2074 class="theme-icon" 2075 xmlns="http://www.w3.org/2000/svg" 2076 fill="none" 2077 viewBox="0 0 24 24" 2078> 2079 <path stroke="currentColor" d="M1.5 7 12 17.5 22.5 7" vector-effect="non-scaling-stroke"/> 2080</svg> 2081 2082 </span> 2083 </button> 2084 <div 2085 class="absolute top-full left-0 right-auto" 2086 x-show="expanded" 2087 style="display: none;" 2088 > 2089 <ul 2090 id="country-list-header" 2091 class="relative z-10 flex max-h-[30vh] w-max max-w-[theme(spacing.64)] snap-y snap-mandatory flex-col gap-[--text-border-width] overflow-y-auto border-text border-gridline-color bg-gridline-color text-base" 2092 x-transition:enter="transition ease duration-300" 2093 x-transition:enter-start="opacity-0" 2094 x-transition:enter-end="opacity-100" 2095 x-transition:leave="transition ease duration-300" 2096 x-transition:leave-start="opacity-100" 2097 x-transition:leave-end="opacity-0" 2098 :aria-hidden="! expanded" 2099 > 2100 2101 <li class="flex items-center bg-scheme-background px-4 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 2102 <button 2103 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 2104 type="button" 2105 2106 @click.prevent="$refs.input.value = 'AU'; $root.closest('form').submit();" 2107 > 2108 <span class="border-transparent border-b-text">Australia (AUD 2109 $)</span 2110 > 2111 </button> 2112 </li> 2113 <li class="flex items-center bg-scheme-background px-4 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 2114 <button 2115 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 2116 type="button" 2117 2118 @click.prevent="$refs.input.value = 'CN'; $root.closest('form').submit();" 2119 >
2120 <span class="border-transparent border-b-text">China (CNY 2121 Â¥)</span 2122 > 2123 </button> 2124 </li> 2125 <li class="flex items-center bg-scheme-background px-4 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 2126 <button 2127 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 2128 type="button" 2129 2130 @click.prevent="$refs.input.value = 'FR'; $root.closest('form').submit();" 2131 > 2132 <span class="border-transparent border-b-text">France (EUR 2133 â¬)</span 2134 > 2135 </button> 2136 </li> 2137 <li class="flex items-center bg-scheme-background px-4 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 2138 <button 2139 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 2140 type="button" 2141 2142 @click.prevent="$refs.input.value = 'NZ'; $root.closest('form').submit();" 2143 > 2144 <span class="border-transparent border-b-text">New Zealand (NZD 2145 $)</span 2146 > 2147 </button> 2148 </li> 2149 <li class="flex items-center bg-scheme-background px-4 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 2150 <button 2151 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 2152 type="button" 2153 2154 @click.prevent="$refs.input.value = 'GB'; $root.closest('form').submit();" 2155 > 2156 <span class="border-transparent border-b-text">United Kingdom (GBP 2157 £)</span 2158 > 2159 </button> 2160 </li> 2161 <li class="flex items-center bg-scheme-background px-4 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 2162 <button 2163 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 2164 type="button" 2165 2166 aria-current="true" 2167 2168 @click.prevent="$refs.input.value = 'US'; $root.closest('form').submit();" 2169 > 2170 <span class="border-scheme-text border-b-text">United States (USD 2171 $)</span 2172 > 2173 </button> 2174 </li></ul> 2175 </div> 2176 2177 <input 2178 x-ref="input" 2179 type="hidden" 2180 name="country_code" 2181 id="CountrySelector" 2182 value="US" 2183 > 2184 </data-island> 2185 </div></div></form></div> 2186 <div class="flex items-stretch whitespace-nowrap"> 2187 <data-island 2188 x-data="{ searchOpen: false }" 2189 class="contents" 2190> 2191 <a 2192 x-ref="searchToggle" 2193 @click.prevent="searchOpen = true" 2194 @keydown.space.prevent="searchOpen = true" 2195 class="inline-flex py-4 h-full" 2196 href="/search" 2197 :role="`button`" 2198 ><span class="sr-only">Search</span> 2199 <span class="my-auto inline-block h-6 w-6 align-middle"><svg 2200 class="theme-icon" 2201 xmlns="http://www.w3.org/2000/svg" 2202 fill="none" 2203 viewBox="0 0 24 24" 2204> 2205 <path stroke="currentColor" d="M2 11a9 9 0 1 0 18 0 9 9 0 0 0-18 0Zm15.364 6.364L22 22" vector-effect="non-scaling-stroke"/> 2206</svg> 2207</span></a> 2208 2209 <data-island 2210 class="absolute z-20 border-y-gridline border-gridline-color bg-scheme-background px-section-horizontal-spacing py-2 text-scheme-text w-full top-full bottom-auto left-0" 2211 x-cloak 2212 x-show="searchOpen" 2213 x-transition:enter="ease duration-200" 2214 x-transition:enter-start="opacity-0" 2215 x-transition:enter-end="opacity-100" 2216 x-transition:leave="ease duration-200" 2217 x-transition:leave-start="opacity-100" 2218 x-transition:leave-end="opacity-0" 2219 2220 x-data="PredictiveSearch('product,collection,article,page,query')" 2221 x-trap.inert.noscroll="resultsOpen" 2222 @keyup="onKeyup" 2223 @keydown="onKeydown" 2224 @click.outside.prevent="close()" 2225 @keyup.escape.prevent.stop="close(true, $refs.searchToggle)" 2226 @focusin.window="( searchOpen && ! $root.contains($event.target) ) && close()" 2227 style="--results-height: calc(100vh - var(--header-group-height) - var(--search-bar-height) + var(--gridline-width));" 2228 src="//printroom.co/cdn/shop/t/59/assets/island-predictive-search.bundle.js?v=181601895277339900721787098435" 2229 2230 x-ref="searchComponent" 2231 data-color-scheme="scheme1" 2232 on="idle" 2233 > 2234 <div 2235 class="w-full whitespace-normal" 2236 > 2237 <form 2238 action="/search" 2239 method="get" 2240 class="predictive-search-form input-group search" 2241 role="search" 2242 > 2243 <input type="hidden" name="options[prefix]" value="last"><label 2244 for="search-logo_left_menu_spread-desktop" 2245 class="hidden" 2246 >Submit</label> 2247 2248 <div 2249 class="flex items-center justify-between" 2250 > 2251 <button 2252 class="mr-4 py-2" 2253 aria-label="Submit" 2254 type="submit" 2255 >
2256 <span class="inline-block h-6 w-6 align-middle"><svg 2257 class="theme-icon" 2258 xmlns="http://www.w3.org/2000/svg" 2259 fill="none" 2260 viewBox="0 0 24 24" 2261> 2262 <path stroke="currentColor" d="M2 11a9 9 0 1 0 18 0 9 9 0 0 0-18 0Zm15.364 6.364L22 22" vector-effect="non-scaling-stroke"/> 2263</svg> 2264</span> 2265 <span class="sr-only">Submit</span> 2266 </button> 2267 <input 2268 id="search-logo_left_menu_spread-desktop" 2269 type="search" 2270 name="q" 2271 value="" 2272 placeholder="Search" 2273 class="font-body block w-full bg-transparent placeholder-current" 2274 aria-label="Search" 2275 data-search-input 2276 2277 :aria-expanded="resultsOpen" 2278 :aria-activedescendant="resultsOpen ? 'predictive-search-results' : false" 2279 aria-owns="predictive-search-results" 2280 aria-controls="predictive-search-results" 2281 aria-autocomplete="list" 2282 autocorrect="off" 2283 autocomplete="off" 2284 autocapitalize="off" 2285 spellcheck="false" 2286 x-ref="input" 2287 x-model.debounce.300="rawQuery" 2288 @focus="onFocus" 2289 2290 > 2291 <button 2292 class="ml-4 py-2" 2293 2294 @click="close()" 2295 2296 type="button" 2297 > 2298 <span class="sr-only">Close</span> 2299 <span class="inline-block h-6 w-6 align-middle"><svg 2300 class="theme-icon" 2301 xmlns="http://www.w3.org/2000/svg" 2302 fill="none" 2303 viewBox="0 0 24 24" 2304> 2305 <path stroke="currentColor" d="m1.5 1.5 21 21m0-21-21 21" vector-effect="non-scaling-stroke"/> 2306</svg> 2307</span> 2308 </button> 2309 </div><div 2310 tabindex="-1" 2311 x-cloak 2312 class="predictive-search-results absolute left-0 right-0 top-[calc(100%_+_var(--gridline-width))] z-50 h-screen text-scheme-text transition-colors duration-300 ease-out" 2313 > 2314 <template x-if="loading"> 2315 <div class="border-b-gridline border-gridline-color bg-scheme-background"> 2316 <div 2317 class="mx-auto py-6 text-center" 2318 > 2319 <div>Loading…</div> 2320 </div> 2321 </div> 2322 </template> 2323 <template x-if="resultsOpen"> 2324 <div 2325 x-show="!loading && resultsHTML && resultsOpen" 2326 class="px-section max-h-[--results-height] scroll-py-5 overflow-hidden overflow-y-auto border-b-gridline border-gridline-color bg-scheme-background" 2327 x-html-if-set="resultsHTML" 2328 ></div> 2329 </template> 2330 </div> 2331 <span 2332 class="predictive-search-status sr-only" 2333 role="status" 2334 aria-hidden="true" 2335 ></span></form> 2336 </div> 2337 </data-island> 2338</data-island> 2339 2340 </div> 2341 2342 2343 <div class="flex items-stretch whitespace-nowrap gap-4"><style> 2344 @keyframes quote-badge-pulse { 2345 0% { transform: scale(1); } 2346 50% { transform: scale(1.22); } 2347 100% { transform: scale(1); } 2348 } 2349 2350 @keyframes quote-icon-pulse { 2351 0% { transform: scale(1); } 2352 50% { transform: scale(1.12); } 2353 100% { transform: scale(1); } 2354 } 2355 2356 .quote-badge-animate { 2357 animation: quote-badge-pulse 0.4s ease-in-out; 2358 } 2359 .quote-icon-animate { 2360 animation: quote-icon-pulse 0.4s ease-in-out; 2361 } 2362 .quote-badge { 2363 min-width: 1.3rem; 2364 padding-inline: 0.22rem; 2365 box-shadow: 0 10px 24px rgba(43, 57, 144, 0.22); 2366 } 2367 .quote-tooltip { 2368 position: absolute; 2369 top: calc(100% + 8px); 2370 right: -10px; 2371 width: 152px; 2372 padding: 15px 16px; 2373 border-radius: 20px; 2374 font-size: 14px; 2375 font-style: italic; 2376 line-height: 17px; 2377 color: #000; 2378 background: #FBFBF6; 2379 border: 1px solid #000; 2380 box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.15); 2381 z-index: 1000; 2382 cursor: pointer; 2383 white-space: normal; 2384 text-align: left; 2385 } 2386 .quote-tooltip::before { 2387 content: ''; 2388 position: absolute; 2389 top: -7px; 2390 right: 24px; 2391 width: 14px; 2392 height: 14px; 2393 background: #FBFBF6; 2394 border-top: 1px solid #000; 2395 border-left: 1px solid #000; 2396 transform: rotate(45deg); 2397 } 2398 @media (max-width: 640px) { 2399 .quote-tooltip { 2400 right: -10px; 2401 } 2402 } 2403</style> 2404 2405<div 2406 class="relative" 2407 x-data="{ 2408 showTooltip: false,
2409 tooltipDismissed: false, 2410 animating: false, 2411 tooltipTimer: null, 2412 dismissTooltip() { 2413 this.showTooltip = false; 2414 this.tooltipDismissed = true; 2415 if (this.tooltipTimer) clearTimeout(this.tooltipTimer); 2416 if (this.tooltipDelayTimer) clearTimeout(this.tooltipDelayTimer); 2417 }, 2418 tooltipDelayTimer: null, 2419 triggerTooltip() { 2420 try { 2421 if (this.tooltipDismissed || sessionStorage.getItem('psstShown')) return; 2422 } catch (error) { 2423 if (this.tooltipDismissed) return; 2424 } 2425 if (this.tooltipDelayTimer) clearTimeout(this.tooltipDelayTimer); 2426 this.tooltipDelayTimer = setTimeout(() => { 2427 if (this.tooltipDismissed) return; 2428 try { sessionStorage.setItem('psstShown', '1'); } catch(e) {} 2429 this.showTooltip = true; 2430 if (this.tooltipTimer) clearTimeout(this.tooltipTimer); 2431 this.tooltipTimer = setTimeout(() => { this.showTooltip = false; }, 15000); 2432 }, 5000); 2433 }, 2434 pulseIcon() { 2435 this.animating = true; 2436 setTimeout(() => { this.animating = false; }, 450); 2437 } 2438 }" 2439 @quote-item-added.document="pulseIcon(); triggerTooltip()" 2440> 2441 <a 2442 href="/pages/general-quote" 2443 class="inline-flex min-h-10 items-center py-4 h-full" 2444 :role="`button`" 2445 :aria-expanded="$store.modals.rightDrawer.contents === 'favorites'" 2446 @click.prevent="$store.modals.open('favorites'); dismissTooltip(); window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: 'quote_drawer_opened', quote_count: $store.favorites.count, page_path: window.location.pathname })" 2447 @keydown.space.prevent="$store.modals.open('favorites'); dismissTooltip()" 2448 aria-label="Open your quote" 2449 ><div class="pointer-events-none relative my-auto align-middle" :class="{ 'quote-icon-animate': animating }"><span class="inline-block h-6 w-6 align-top [&_*]:pointer-events-none"><span class="h-full w-full"> 2450 <svg 2451 aria-hidden="true" 2452 focusable="false" 2453 role="presentation" 2454 class="icon icon-quote-list-outline" 2455 viewBox="0 0 24 24" 2456 fill="none" 2457 ><rect x="3" y="1" width="18" height="22" rx="2.5" ry="2.5" stroke="currentColor" stroke-width="1.5"></rect><circle cx="7.5" cy="7.5" r="1" fill="currentColor"></circle> 2458 <line x1="10" y1="7.5" x2="17.5" y2="7.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></line> 2459 <circle cx="7.5" cy="11" r="1" fill="currentColor"></circle> 2460 <line x1="10" y1="11" x2="17.5" y2="11" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></line> 2461 <circle cx="7.5" cy="14.5" r="1" fill="currentColor"></circle> 2462 <line x1="10" y1="14.5" x2="17.5" y2="14.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></line> 2463 <circle cx="7.5" cy="18" r="1" fill="currentColor"></circle> 2464 <line x1="10" y1="18" x2="17.5" y2="18" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></line> 2465 </svg> 2466</span> 2467</span><span 2468 x-show="$store.favorites.count > 0" 2469 x-cloak 2470 class="quote-badge absolute flex items-center justify-center rounded-full text-[10px] font-bold" 2471 style="background-color: #4B4D72; color: #fff; width: 18px; height: 18px; top: -7px; right: -8px;" 2472 :class="{ 'quote-badge-animate': animating }" 2473 x-text="$store.favorites.count" 2474 ></span> 2475 <span class="sr-only" x-text="'Your Quote: ' + $store.favorites.countWithText()"> 2476 Your Quote: 0 items 2477 </span> 2478 </div></a><div 2479 x-show="showTooltip" 2480 x-transition:enter="transition ease-out duration-200" 2481 x-transition:enter-start="opacity-0 translate-y-1" 2482 x-transition:enter-end="opacity-100 translate-y-0" 2483 x-transition:leave="transition ease-in duration-150" 2484 x-transition:leave-start="opacity-100" 2485 x-transition:leave-end="opacity-0" 2486 x-cloak 2487 class="quote-tooltip" 2488 @click="dismissTooltip()" 2489 > 2490 Hi, your favourite products are here. 2491 </div> 2492</div> 2493 2494 <a 2495 href="/cart" 2496 class="inline-flex py-4 h-full" 2497 2498 ><div class="pointer-events-none relative my-auto align-middle"> 2499 <span 2500 x-show="$store.cartCount.count > 0" 2501 class="absolute right-0 top-1 h-2 w-2 rounded-full" 2502 style="background-color: #f1ffa5;" 2503 ></span>
2504 <span class="inline-block h-6 w-6 fill-current align-top [&_*]:pointer-events-none"><svg 2505 class="theme-icon" 2506 xmlns="http://www.w3.org/2000/svg" 2507 fill="none" 2508 viewBox="0 0 24 24" 2509> 2510 <path stroke="currentColor" d="M2 7h20v15H2V7Zm15 0v-.2A4.8 4.8 0 0 0 12.2 2h-.4A4.8 4.8 0 0 0 7 6.8V7" vector-effect="non-scaling-stroke"/> 2511</svg> 2512</span> 2513 <span class="sr-only" x-text="$store.cartCount.countWithText()"> 2514 25150 items 2516 </span> 2517 </div></a> 2518 </div> 2519 </div> 2520 </div> 2521 2522 2523 </nav> 2524 2525 2526 <nav 2527 aria-label="Header" 2528 class="lg:hidden" 2529 > 2530 <div class="flex items-center justify-between px-section-horizontal-spacing lg:relative"> 2531 <div class="flex gap-2 items-center"> 2532 2533 <div> 2534 <a 2535 href="/" 2536 class="break-word my-auto inline-block py-4" 2537 > 2538 2539 2540 <div class="max-w-[var(--logo-max-width)]"> 2541 2542<img 2543 src="//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=90" 2544 srcset="//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=80 80w,//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=160 160w,//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=240 240w,//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=90 90w,//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=180 180w,//printroom.co/cdn/shop/files/printroom_primary_logo.svg?v=1704916358&width=270 270w 2545 " 2546 width="543" 2547 height="397" 2548 loading="eager" 2549 2550 sizes="(min-width: 1024px) 90px, 80px" 2551 2552 alt="The Print Room" 2553 2554 > 2555 2556 2557 2558 </div> 2559 2560 2561 </a> 2562 </div> 2563 2564 2565 </div> 2566 2567 2568 2569 <div class="flex justify-end gap-2 text-right"> 2570 2571 <button 2572 class="inline-block no-js:hidden py-4" 2573 :aria-expanded="$store.modals.leftDrawer.contents === 'sidebar'" 2574 @click="$store.modals.open('sidebar')" 2575 ><span class="sr-only pointer-events-none">Menu</span> 2576 <span class="pointer-events-none inline-block h-6 w-6 align-middle"><svg 2577 class="theme-icon" 2578 xmlns="http://www.w3.org/2000/svg" 2579 fill="none" 2580 viewBox="0 0 24 24" 2581> 2582 <path stroke="currentColor" d="M1 7.364h22M1 15.636h22" vector-effect="non-scaling-stroke"/> 2583</svg> 2584</span></button> 2585 2586 2587 2588 2589 2590 <div class="whitespace-nowrap lg:ml-4"> 2591 <data-island 2592 x-data="{ searchOpen: false }" 2593 class="contents" 2594> 2595 <a 2596 x-ref="searchToggle" 2597 @click.prevent="searchOpen = true" 2598 @keydown.space.prevent="searchOpen = true" 2599 class="inline-flex py-4 h-full" 2600 href="/search" 2601 :role="`button`" 2602 ><span class="sr-only">Search</span> 2603 <span class="my-auto inline-block h-6 w-6 align-middle"><svg 2604 class="theme-icon" 2605 xmlns="http://www.w3.org/2000/svg" 2606 fill="none" 2607 viewBox="0 0 24 24" 2608> 2609 <path stroke="currentColor" d="M2 11a9 9 0 1 0 18 0 9 9 0 0 0-18 0Zm15.364 6.364L22 22" vector-effect="non-scaling-stroke"/> 2610</svg> 2611</span></a> 2612 2613 <data-island 2614 class="absolute z-20 border-y-gridline border-gridline-color bg-scheme-background px-section-horizontal-spacing py-2 text-scheme-text w-full top-full bottom-auto left-0" 2615 x-cloak 2616 x-show="searchOpen" 2617 x-transition:enter="ease duration-200" 2618 x-transition:enter-start="opacity-0" 2619 x-transition:enter-end="opacity-100" 2620 x-transition:leave="ease duration-200" 2621 x-transition:leave-start="opacity-100" 2622 x-transition:leave-end="opacity-0" 2623 2624 x-data="PredictiveSearch('product,collection,article,page,query')" 2625 x-trap.inert.noscroll="resultsOpen" 2626 @keyup="onKeyup" 2627 @keydown="onKeydown" 2628 @click.outside.prevent="close()" 2629 @keyup.escape.prevent.stop="close(true, $refs.searchToggle)" 2630 @focusin.window="( searchOpen && ! $root.contains($event.target) ) && close()" 2631 style="--results-height: calc(100vh - var(--header-group-height) - var(--search-bar-height) + var(--gridline-width));" 2632 src="//printroom.co/cdn/shop/t/59/assets/island-predictive-search.bundle.js?v=181601895277339900721787098435" 2633 2634 x-ref="searchComponent" 2635 data-color-scheme="scheme1" 2636 on="idle" 2637 > 2638 <div 2639 class="w-full whitespace-normal" 2640 > 2641 <form 2642 action="/search" 2643 method="get" 2644 class="predictive-search-form input-group search" 2645 role="search" 2646 > 2647 <input type="hidden" name="options[prefix]" value="last"><label 2648 for="search-logo_left_menu_spread-mobile" 2649 class="hidden" 2650 >Submit</label> 2651 2652 <div 2653 class="flex items-center justify-between" 2654 > 2655 <button 2656 class="mr-4 py-2" 2657 aria-label="Submit" 2658 type="submit" 2659 >
2660 <span class="inline-block h-6 w-6 align-middle"><svg 2661 class="theme-icon" 2662 xmlns="http://www.w3.org/2000/svg" 2663 fill="none" 2664 viewBox="0 0 24 24" 2665> 2666 <path stroke="currentColor" d="M2 11a9 9 0 1 0 18 0 9 9 0 0 0-18 0Zm15.364 6.364L22 22" vector-effect="non-scaling-stroke"/> 2667</svg> 2668</span> 2669 <span class="sr-only">Submit</span> 2670 </button> 2671 <input 2672 id="search-logo_left_menu_spread-mobile" 2673 type="search" 2674 name="q" 2675 value="" 2676 placeholder="Search" 2677 class="font-body block w-full bg-transparent placeholder-current" 2678 aria-label="Search" 2679 data-search-input 2680 2681 :aria-expanded="resultsOpen" 2682 :aria-activedescendant="resultsOpen ? 'predictive-search-results' : false" 2683 aria-owns="predictive-search-results" 2684 aria-controls="predictive-search-results" 2685 aria-autocomplete="list" 2686 autocorrect="off" 2687 autocomplete="off" 2688 autocapitalize="off" 2689 spellcheck="false" 2690 x-ref="input" 2691 x-model.debounce.300="rawQuery" 2692 @focus="onFocus" 2693 2694 > 2695 <button 2696 class="ml-4 py-2" 2697 2698 @click="close()" 2699 2700 type="button" 2701 > 2702 <span class="sr-only">Close</span> 2703 <span class="inline-block h-6 w-6 align-middle"><svg 2704 class="theme-icon" 2705 xmlns="http://www.w3.org/2000/svg" 2706 fill="none" 2707 viewBox="0 0 24 24" 2708> 2709 <path stroke="currentColor" d="m1.5 1.5 21 21m0-21-21 21" vector-effect="non-scaling-stroke"/> 2710</svg> 2711</span> 2712 </button> 2713 </div><div 2714 tabindex="-1" 2715 x-cloak 2716 class="predictive-search-results absolute left-0 right-0 top-[calc(100%_+_var(--gridline-width))] z-50 h-screen text-scheme-text transition-colors duration-300 ease-out" 2717 > 2718 <template x-if="loading"> 2719 <div class="border-b-gridline border-gridline-color bg-scheme-background"> 2720 <div 2721 class="mx-auto py-6 text-center" 2722 > 2723 <div>Loading…</div> 2724 </div> 2725 </div> 2726 </template> 2727 <template x-if="resultsOpen"> 2728 <div 2729 x-show="!loading && resultsHTML && resultsOpen" 2730 class="px-section max-h-[--results-height] scroll-py-5 overflow-hidden overflow-y-auto border-b-gridline border-gridline-color bg-scheme-background" 2731 x-html-if-set="resultsHTML" 2732 ></div> 2733 </template> 2734 </div> 2735 <span 2736 class="predictive-search-status sr-only" 2737 role="status" 2738 aria-hidden="true" 2739 ></span></form> 2740 </div> 2741 </data-island> 2742</data-island> 2743 2744 </div> 2745 2746<div class="inline-block shrink-0 select-none whitespace-nowrap lg:ml-4"> 2747 <data-island 2748 class="relative" 2749 x-data="{ expanded: false }" 2750 @keydown.escape.prevent.stop="expanded = false" 2751 @click.outside="expanded = false" 2752 > 2753 <button 2754 type="button" 2755 class="inline-flex py-4 h-full" 2756 :aria-expanded="expanded" 2757 aria-controls="currency-list-header" 2758 @click.prevent="expanded = ! expanded" 2759 aria-label="Currency selector" 2760 > 2761 <span class="my-auto inline-flex items-center gap-1"> 2762 <span class="inline-block h-6 w-6 align-middle"> 2763 <svg class="theme-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"> 2764 <circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5" vector-effect="non-scaling-stroke" fill="none"/> 2765 <path stroke="currentColor" stroke-width="1.5" d="M12 6v12M8 10h8M8 14h8" vector-effect="non-scaling-stroke"/> 2766</svg> 2767 </span> 2768 <span class="text-xs font-medium">USD</span> 2769 </span>
2770 <span 2771 class="rotate ml-1 inline-block w-3 origin-center transform fill-current transition my-auto" 2772 :class="{ 'rotate-180': expanded }" 2773 > 2774 <svg 2775 class="theme-icon" 2776 xmlns="http://www.w3.org/2000/svg" 2777 fill="none" 2778 viewBox="0 0 24 24" 2779> 2780 <path stroke="currentColor" d="M1.5 7 12 17.5 22.5 7" vector-effect="non-scaling-stroke"/> 2781</svg> 2782 2783 </span> 2784 </button> 2785 <div 2786 class="absolute top-full right-0" 2787 x-show="expanded" 2788 style="display: none;" 2789 > 2790 <form method="post" action="/localization" accept-charset="UTF-8" enctype="multipart/form-data"> 2791 <input type="hidden" name="form_type" value="localization"> 2792 <input type="hidden" name="utf8" value="â"> 2793 <input type="hidden" name="_method" value="put"> 2794 <input type="hidden" name="return_to" value="/blogs/the-print-room-nz"> 2795 <ul 2796 id="currency-list-header" 2797 class="relative z-50 flex max-h-[30vh] w-max max-w-[theme(spacing.64)] snap-y snap-mandatory flex-col gap-[--text-border-width] overflow-y-auto border-text border-gridline-color bg-gridline-color text-base" 2798 x-transition:enter="transition ease duration-300" 2799 x-transition:enter-start="opacity-0" 2800 x-transition:enter-end="opacity-100" 2801 x-transition:leave="transition ease duration-300" 2802 x-transition:leave-start="opacity-100" 2803 x-transition:leave-end="opacity-0" 2804 :aria-hidden="! expanded" 2805 > 2806 2807 <li class="flex items-center bg-scheme-background px-4 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 2808 <button 2809 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 2810 type="submit" 2811 name="country_code" 2812 value="AU" 2813 2814 > 2815 <span class="border-transparent border-b-text">AUD $<span class="ml-2 text-xs opacity-70">Australia</span></span 2816 > 2817 </button> 2818 </li> 2819 <li class="flex items-center bg-scheme-background px-4 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 2820 <button 2821 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 2822 type="submit" 2823 name="country_code" 2824 value="CN" 2825 2826 > 2827 <span class="border-transparent border-b-text">CNY Â¥<span class="ml-2 text-xs opacity-70">China</span></span 2828 > 2829 </button> 2830 </li> 2831 <li class="flex items-center bg-scheme-background px-4 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 2832 <button 2833 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 2834 type="submit" 2835 name="country_code" 2836 value="FR" 2837 2838 > 2839 <span class="border-transparent border-b-text">EUR â¬<span class="ml-2 text-xs opacity-70">France</span></span 2840 > 2841 </button> 2842 </li> 2843 <li class="flex items-center bg-scheme-background px-4 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 2844 <button 2845 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 2846 type="submit" 2847 name="country_code" 2848 value="NZ" 2849 2850 >
2851 <span class="border-transparent border-b-text">NZD $<span class="ml-2 text-xs opacity-70">New Zealand</span></span 2852 > 2853 </button> 2854 </li> 2855 <li class="flex items-center bg-scheme-background px-4 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 2856 <button 2857 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 2858 type="submit" 2859 name="country_code" 2860 value="GB" 2861 2862 > 2863 <span class="border-transparent border-b-text">GBP £<span class="ml-2 text-xs opacity-70">United Kingdom</span></span 2864 > 2865 </button> 2866 </li> 2867 <li class="flex items-center bg-scheme-background px-4 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 2868 <button 2869 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 2870 type="submit" 2871 name="country_code" 2872 value="US" 2873 2874 aria-current="true" 2875 2876 > 2877 <span class="border-scheme-text border-b-text">USD $<span class="ml-2 text-xs opacity-70">United States</span></span 2878 > 2879 </button> 2880 </li></ul> 2881 </form> 2882 </div> 2883 </data-island> 2884 </div><div class="flex items-center whitespace-nowrap gap-2 lg:ml-4"><style> 2885 @keyframes quote-badge-pulse { 2886 0% { transform: scale(1); } 2887 50% { transform: scale(1.22); } 2888 100% { transform: scale(1); } 2889 } 2890 2891 @keyframes quote-icon-pulse { 2892 0% { transform: scale(1); } 2893 50% { transform: scale(1.12); } 2894 100% { transform: scale(1); } 2895 } 2896 2897 .quote-badge-animate { 2898 animation: quote-badge-pulse 0.4s ease-in-out; 2899 } 2900 .quote-icon-animate { 2901 animation: quote-icon-pulse 0.4s ease-in-out; 2902 } 2903 .quote-badge { 2904 min-width: 1.3rem; 2905 padding-inline: 0.22rem; 2906 box-shadow: 0 10px 24px rgba(43, 57, 144, 0.22); 2907 } 2908 .quote-tooltip { 2909 position: absolute; 2910 top: calc(100% + 8px); 2911 right: -10px; 2912 width: 152px; 2913 padding: 15px 16px; 2914 border-radius: 20px; 2915 font-size: 14px; 2916 font-style: italic; 2917 line-height: 17px; 2918 color: #000; 2919 background: #FBFBF6; 2920 border: 1px solid #000; 2921 box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.15); 2922 z-index: 1000; 2923 cursor: pointer; 2924 white-space: normal; 2925 text-align: left; 2926 } 2927 .quote-tooltip::before { 2928 content: ''; 2929 position: absolute; 2930 top: -7px; 2931 right: 24px; 2932 width: 14px; 2933 height: 14px; 2934 background: #FBFBF6; 2935 border-top: 1px solid #000; 2936 border-left: 1px solid #000; 2937 transform: rotate(45deg); 2938 } 2939 @media (max-width: 640px) { 2940 .quote-tooltip { 2941 right: -10px; 2942 } 2943 } 2944</style> 2945 2946<div 2947 class="relative" 2948 x-data="{ 2949 showTooltip: false, 2950 tooltipDismissed: false, 2951 animating: false, 2952 tooltipTimer: null, 2953 dismissTooltip() { 2954 this.showTooltip = false; 2955 this.tooltipDismissed = true; 2956 if (this.tooltipTimer) clearTimeout(this.tooltipTimer); 2957 if (this.tooltipDelayTimer) clearTimeout(this.tooltipDelayTimer); 2958 }, 2959 tooltipDelayTimer: null, 2960 triggerTooltip() { 2961 try { 2962 if (this.tooltipDismissed || sessionStorage.getItem('psstShown')) return; 2963 } catch (error) { 2964 if (this.tooltipDismissed) return; 2965 } 2966 if (this.tooltipDelayTimer) clearTimeout(this.tooltipDelayTimer); 2967 this.tooltipDelayTimer = setTimeout(() => { 2968 if (this.tooltipDismissed) return; 2969 try { sessionStorage.setItem('psstShown', '1'); } catch(e) {} 2970 this.showTooltip = true; 2971 if (this.tooltipTimer) clearTimeout(this.tooltipTimer); 2972 this.tooltipTimer = setTimeout(() => { this.showTooltip = false; }, 15000); 2973 }, 5000); 2974 }, 2975 pulseIcon() { 2976 this.animating = true; 2977 setTimeout(() => { this.animating = false; }, 450); 2978 } 2979 }" 2980 @quote-item-added.document="pulseIcon(); triggerTooltip()" 2981> 2982 <a 2983 href="/pages/general-quote" 2984 class="inline-flex min-h-10 items-center py-4 h-full" 2985 :role="`button`" 2986 :aria-expanded="$store.modals.rightDrawer.contents === 'favorites'" 2987 @click.prevent="$store.modals.open('favorites'); dismissTooltip(); window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: 'quote_drawer_opened', quote_count: $store.favorites.count, page_path: window.location.pathname })" 2988 @keydown.space.prevent="$store.modals.open('favorites'); dismissTooltip()" 2989 aria-label="Open your quote" 2990 ><div class="pointer-events-none relative my-auto align-middle" :class="{ 'quote-icon-animate': animating }"><span class="inline-block h-6 w-6 align-top [&_*]:pointer-events-none"><span class="h-full w-full"> 2991 <svg 2992 aria-hidden="true" 2993 focusable="false" 2994 role="presentation" 2995 class="icon icon-quote-list-outline"
2996 viewBox="0 0 24 24" 2997 fill="none" 2998 ><rect x="3" y="1" width="18" height="22" rx="2.5" ry="2.5" stroke="currentColor" stroke-width="1.5"></rect><circle cx="7.5" cy="7.5" r="1" fill="currentColor"></circle> 2999 <line x1="10" y1="7.5" x2="17.5" y2="7.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></line> 3000 <circle cx="7.5" cy="11" r="1" fill="currentColor"></circle> 3001 <line x1="10" y1="11" x2="17.5" y2="11" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></line> 3002 <circle cx="7.5" cy="14.5" r="1" fill="currentColor"></circle> 3003 <line x1="10" y1="14.5" x2="17.5" y2="14.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></line> 3004 <circle cx="7.5" cy="18" r="1" fill="currentColor"></circle> 3005 <line x1="10" y1="18" x2="17.5" y2="18" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></line> 3006 </svg> 3007</span> 3008</span><span 3009 x-show="$store.favorites.count > 0" 3010 x-cloak 3011 class="quote-badge absolute flex items-center justify-center rounded-full text-[10px] font-bold" 3012 style="background-color: #4B4D72; color: #fff; width: 18px; height: 18px; top: -7px; right: -8px;" 3013 :class="{ 'quote-badge-animate': animating }" 3014 x-text="$store.favorites.count" 3015 ></span> 3016 <span class="sr-only" x-text="'Your Quote: ' + $store.favorites.countWithText()"> 3017 Your Quote: 0 items 3018 </span> 3019 </div></a><div 3020 x-show="showTooltip" 3021 x-transition:enter="transition ease-out duration-200" 3022 x-transition:enter-start="opacity-0 translate-y-1" 3023 x-transition:enter-end="opacity-100 translate-y-0" 3024 x-transition:leave="transition ease-in duration-150" 3025 x-transition:leave-start="opacity-100" 3026 x-transition:leave-end="opacity-0" 3027 x-cloak 3028 class="quote-tooltip" 3029 @click="dismissTooltip()" 3030 > 3031 Hi, your favourite products are here. 3032 </div> 3033</div> 3034 3035 <a 3036 href="/cart" 3037 class="inline-flex py-4 h-full" 3038 3039 ><div class="pointer-events-none relative my-auto align-middle"> 3040 <span 3041 x-show="$store.cartCount.count > 0" 3042 class="absolute right-0 top-1 h-2 w-2 rounded-full" 3043 style="background-color: #f1ffa5;" 3044 ></span> 3045 <span class="inline-block h-6 w-6 fill-current align-top [&_*]:pointer-events-none"><svg 3046 class="theme-icon" 3047 xmlns="http://www.w3.org/2000/svg" 3048 fill="none" 3049 viewBox="0 0 24 24" 3050> 3051 <path stroke="currentColor" d="M2 7h20v15H2V7Zm15 0v-.2A4.8 4.8 0 0 0 12.2 2h-.4A4.8 4.8 0 0 0 7 6.8V7" vector-effect="non-scaling-stroke"/> 3052</svg> 3053</span> 3054 <span class="sr-only" x-text="$store.cartCount.countWithText()"> 3055 30560 items 3057 </span> 3058 </div></a> 3059 </div> 3060 </div> 3061 </div> 3062 </nav> 3063 </header> 3064</data-island><noscript> 3065 <style data-shopify> 3066 .no-js-focus-wrapper:focus-within .no-js-focus-container { 3067 display: block !important; 3068 } 3069 3070 </style> 3071</noscript> 3072 3073<style> 3074 /* ââ Get Started pill + dropdown ââ */ 3075 .gs-pill { 3076 display: inline-flex; 3077 align-items: center; 3078 padding: 0 20px; 3079 height: 39px; 3080 border: 1px solid #2a3a8e; 3081 border-radius: 40px; 3082 background: transparent; 3083 color: #2a3a8e; 3084 font-size: 17.3px; 3085 font-family: 'DM Sans', sans-serif; 3086 font-weight: 400; 3087 line-height: 24px; 3088 cursor: pointer; 3089 white-space: nowrap; 3090 transition: background-color 0.25s ease, color 0.25s ease; 3091 } 3092 3093 .gs-pill:hover, 3094 .gs-pill.is-active { 3095 background-color: #2b3990; 3096 color: #f9fafb; 3097 } 3098 3099 .gs-dropdown-content { 3100 display: flex; 3101 flex-direction: column; 3102 gap: 6px; 3103 padding: 10px 20px 14px; 3104 left: 0; 3105 } 3106 3107 .gs-dropdown-content a { 3108 color: #2a3a8e; 3109 font-size: 17.3px; 3110 font-family: 'DM Sans', sans-serif; 3111 font-weight: 400; 3112 text-decoration: none; 3113 white-space: nowrap; 3114 line-height: 32px; 3115 } 3116 3117 .gs-dropdown-content a:hover { 3118 opacity: 0.7; 3119 } 3120 3121 /* Nav dropdowns (e.g. "Our story") nudged left to sit under the menu label */ 3122 .nav-dropdown-content { 3123 left: -12px; 3124 } 3125 3126 .quote-pill-button { 3127 display: inline-block; 3128 padding: 1rem 2rem; 3129 border-radius: 9999px; 3130 cursor: pointer; 3131 border: 0; 3132 background-color: #f1ffa5; 3133 transition: all 0.5s ease; 3134 color: #1F2937; 3135 text-decoration: none; 3136 font-weight: 600; 3137 font-size: 1.1em; 3138 } 3139 3140 .quote-pill-button:hover { 3141 transform: scale(1.2); 3142 } 3143 3144 .quote-pill-button:active { 3145 transform: scale(1.07); 3146 transition: 100ms; 3147 } 3148
3149 .start-design-button { 3150 display: inline-block; 3151 padding: 1rem 2rem; 3152 border-radius: 9999px; 3153 cursor: pointer; 3154 border: 0; 3155 background-color: #2b3990; 3156 transition: all 0.5s ease; 3157 color: #ffffff; 3158 text-decoration: none; 3159 font-weight: 600; 3160 font-size: 1.1em; 3161 } 3162 3163 .start-design-button:hover { 3164 transform: scale(1.2); 3165 } 3166 3167 .start-design-button:active { 3168 transform: scale(1.07); 3169 transition: 100ms; 3170 } 3171 3172 @keyframes float { 3173 0%, 100% { 3174 transform: translateY(0px); 3175 } 3176 50% { 3177 transform: translateY(-6px); 3178 } 3179 } 3180 3181 .beta-badge { 3182 position: absolute; 3183 top: -8px; 3184 right: -8px; 3185 background-color: #f1ffa5; 3186 color: #1e2326; 3187 font-size: 0.65em; 3188 font-weight: 700; 3189 padding: 0.25rem 0.5rem; 3190 border-radius: 9999px; 3191 text-transform: uppercase; 3192 letter-spacing: 0.5px; 3193 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); 3194 z-index: 10; 3195 animation: float 2s ease-in-out infinite; 3196 } 3197</style> 3198 3199 3200 3201
3201<script> 3202 if (!customElements.get('sticky-header-height-helper')) { 3203 class StickyHeaderHeightHelper extends HTMLElement { 3204 constructor() { 3205 super(); 3206 } 3207 3208 connectedCallback() { 3209 const headerEl = this.closest('[data-theme-header]'); 3210 3211 if (headerEl && headerEl.getAttribute('data-sticky')) { 3212 document.documentElement.style.setProperty( 3213 '--sticky-header-height', 3214 `${headerEl.getBoundingClientRect().height}px` 3215 ); 3216 } else { 3217 3218 document.documentElement.style.setProperty( 3219 '--sticky-header-height', 3220 '0px' 3221 ); 3222 } 3223 } 3224 } 3225 3226 customElements.define( 3227 'sticky-header-height-helper', 3228 StickyHeaderHeightHelper 3229 ); 3230 } 3231 </script>
3231 3232 3233 3234<style> #shopify-section-sections--21296457187398__header .bg-scheme-background {border-bottom: 1px solid #2b3990;} </style></div> 3235<!-- END sections: header-group --> 3236<div id="shopify-section-menu-drawer" class="shopify-section"> 3237 3238<data-island 3239 3240 x-data 3241 3242 x-init="initTeleport($root); $store.modals.register('sidebar', 'leftDrawer');" 3243 on="idle" 3244> 3245 <template data-should-teleport="#left-drawer-slot"> 3246 <template 3247 id="sidebar" 3248 x-if="$store.modals.leftDrawer.contents === 'sidebar'" 3249 > 3250 3251 <div 3252 3253 data-modal-label="Menu" 3254 > 3255 <div class="sticky top-0 z-1 flex items-center justify-between border-b-gridline border-gridline-color px-section-horizontal-spacing py-4"> 3256 <div aria-hidden="true"> </div> 3257 <button 3258 @click.prevent="$store.modals.close('sidebar')" 3259 class="absolute right-0 top-0 block h-full" 3260 type="button" 3261 > 3262 <span class="sr-only">Close</span> 3263 <div class="my-auto mr-section-horizontal-spacing h-6 w-6"><svg 3264 class="theme-icon" 3265 xmlns="http://www.w3.org/2000/svg" 3266 fill="none" 3267 viewBox="0 0 24 24" 3268> 3269 <path stroke="currentColor" d="m1.5 1.5 21 21m0-21-21 21" vector-effect="non-scaling-stroke"/> 3270</svg> 3271</div> 3272 </button> 3273 </div> 3274 <nav 3275 3276 aria-label="Primary" 3277 > 3278 <ul><li 3279 class="no-js-focus-wrapper break-word px-section-horizontal-spacing border-t-gridline border-gridline-color first-of-type:border-t-0" 3280 ><a class="inline-block py-4 w-full text-heading-standard" href="/collections/product-library"> 3281 Products 3282 </a></li><li 3283 class="no-js-focus-wrapper break-word px-section-horizontal-spacing border-t-gridline border-gridline-color first-of-type:border-t-0" 3284 ><data-island class="contents" x-data="{ expanded: false }"><button 3285 class="relative block w-full text-left inline-block py-4 w-full text-heading-standard ease pr-10 transition font-body" 3286 x-bind:aria-expanded="expanded ? true : 'false'" 3287 @click="expanded = ! expanded" 3288 aria-controls="accordion0" 3289 > 3290 Services 3291 <span class="absolute right-0 top-1/2 flex h-6 w-6 -translate-y-1/2 transform items-center"><span 3292 class="inline-block w-full origin-center" 3293 x-show="!expanded" 3294 ><svg 3295 class="theme-icon" 3296 xmlns="http://www.w3.org/2000/svg" 3297 fill="none" 3298 viewBox="0 0 24 24" 3299> 3300 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 3301</svg> 3302</span> 3303 <span 3304 class="inline-block w-full origin-center" 3305 x-show="expanded" 3306 style="display: none;" 3307 ><svg 3308 class="theme-icon" 3309 xmlns="http://www.w3.org/2000/svg" 3310 fill="none" 3311 viewBox="0 0 24 24" 3312> 3313 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 3314</svg> 3315</span></span> 3316 </button> 3317 <ul 3318 id="accordion0" 3319 class="no-js-focus-container pb-2 pl-4" 3320 x-show="expanded" 3321 x-cloak 3322 ><li class="no-js-focus-wrapper"><data-island class="contents" x-data="{ expanded: false }" > 3323 <button 3324 class="relative w-full text-left inline-block py-1 pr-10" 3325 x-bind:aria-expanded="expanded ? true : 'false'" 3326 @click="expanded = ! expanded" 3327 aria-controls="accordion1" 3328 > 3329 Production capabilities 3330 <span class="absolute right-0 top-1/2 flex h-6 w-6 -translate-y-1/2 transform items-center"><span 3331 class="inline-block w-full origin-center" 3332 x-show="!expanded" 3333 ><svg 3334 class="theme-icon" 3335 xmlns="http://www.w3.org/2000/svg" 3336 fill="none" 3337 viewBox="0 0 24 24" 3338> 3339 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 3340</svg> 3341</span>
3342 <span 3343 class="inline-block w-full origin-center" 3344 x-show="expanded" 3345 style="display: none;" 3346 ><svg 3347 class="theme-icon" 3348 xmlns="http://www.w3.org/2000/svg" 3349 fill="none" 3350 viewBox="0 0 24 24" 3351> 3352 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 3353</svg> 3354</span></span> 3355 </button> 3356 <ul 3357 id="accordion1" 3358 class="no-js-focus-container px-2 pb-2 pt-1" 3359 x-show="expanded" 3360 x-cloak 3361 ><li> 3362 <a 3363 class="inline-block py-1 " 3364 href="/pages/custom-manufactured" 3365 > 3366 Custom-manufactured 3367 </a> 3368 </li><li> 3369 <a 3370 class="inline-block py-1 " 3371 href="/pages/screen-printing" 3372 > 3373 Screen printing 3374 </a> 3375 </li><li> 3376 <a 3377 class="inline-block py-1 " 3378 href="/pages/embroidery" 3379 > 3380 Embroidery 3381 </a> 3382 </li><li> 3383 <a 3384 class="inline-block py-1 " 3385 href="/pages/heat-transfers" 3386 > 3387 Heat transfers 3388 </a> 3389 </li><li> 3390 <a 3391 class="inline-block py-1 " 3392 href="/pages/finishing" 3393 > 3394 Finishing 3395 </a> 3396 </li></ul> 3397 </data-island></li><li class="no-js-focus-wrapper"><data-island class="contents" x-data="{ expanded: false }" > 3398 <button 3399 class="relative w-full text-left inline-block py-1 pr-10" 3400 x-bind:aria-expanded="expanded ? true : 'false'" 3401 @click="expanded = ! expanded" 3402 aria-controls="accordion2" 3403 > 3404 Partner services 3405 <span class="absolute right-0 top-1/2 flex h-6 w-6 -translate-y-1/2 transform items-center"><span 3406 class="inline-block w-full origin-center" 3407 x-show="!expanded" 3408 ><svg 3409 class="theme-icon" 3410 xmlns="http://www.w3.org/2000/svg" 3411 fill="none" 3412 viewBox="0 0 24 24" 3413> 3414 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 3415</svg> 3416</span> 3417 <span 3418 class="inline-block w-full origin-center" 3419 x-show="expanded" 3420 style="display: none;" 3421 ><svg 3422 class="theme-icon" 3423 xmlns="http://www.w3.org/2000/svg" 3424 fill="none" 3425 viewBox="0 0 24 24" 3426> 3427 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 3428</svg> 3429</span></span> 3430 </button> 3431 <ul 3432 id="accordion2" 3433 class="no-js-focus-container px-2 pb-2 pt-1" 3434 x-show="expanded" 3435 x-cloak 3436 ><li> 3437 <a 3438 class="inline-block py-1 " 3439 href="/pages/client-portal" 3440 > 3441 Client portal 3442 </a> 3443 </li><li> 3444 <a 3445 class="inline-block py-1 " 3446 href="/pages/fundraising-pre-orders" 3447 > 3448 Fundraise & pre-order 3449 </a> 3450 </li><li> 3451 <a 3452 class="inline-block py-1 " 3453 href="/pages/repurpose-initiative" 3454 > 3455 Repurpose initiative 3456 </a> 3457 </li></ul> 3458 </data-island></li><li class="no-js-focus-wrapper"><data-island class="contents" x-data="{ expanded: false }" > 3459 <button 3460 class="relative w-full text-left inline-block py-1 pr-10" 3461 x-bind:aria-expanded="expanded ? true : 'false'" 3462 @click="expanded = ! expanded" 3463 aria-controls="accordion3" 3464 > 3465 Popular services
3466 <span class="absolute right-0 top-1/2 flex h-6 w-6 -translate-y-1/2 transform items-center"><span 3467 class="inline-block w-full origin-center" 3468 x-show="!expanded" 3469 ><svg 3470 class="theme-icon" 3471 xmlns="http://www.w3.org/2000/svg" 3472 fill="none" 3473 viewBox="0 0 24 24" 3474> 3475 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 3476</svg> 3477</span> 3478 <span 3479 class="inline-block w-full origin-center" 3480 x-show="expanded" 3481 style="display: none;" 3482 ><svg 3483 class="theme-icon" 3484 xmlns="http://www.w3.org/2000/svg" 3485 fill="none" 3486 viewBox="0 0 24 24" 3487> 3488 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 3489</svg> 3490</span></span> 3491 </button> 3492 <ul 3493 id="accordion3" 3494 class="no-js-focus-container px-2 pb-2 pt-1" 3495 x-show="expanded" 3496 x-cloak 3497 ><li> 3498 <a 3499 class="inline-block py-1 " 3500 href="/pages/school-leavers-gear" 3501 > 3502 School leavers gear 3503 </a> 3504 </li><li> 3505 <a 3506 class="inline-block py-1 " 3507 href="/pages/tshirt-printing" 3508 > 3509 Custom t-shirt printing 3510 </a> 3511 </li></ul> 3512 </data-island></li></ul> 3513 </data-island></li><li 3514 class="no-js-focus-wrapper break-word px-section-horizontal-spacing border-t-gridline border-gridline-color first-of-type:border-t-0" 3515 ><a class="inline-block py-4 w-full text-heading-standard" href="/pages/responsibility"> 3516 Responsibility 3517 </a></li><li 3518 class="no-js-focus-wrapper break-word px-section-horizontal-spacing border-t-gridline border-gridline-color first-of-type:border-t-0" 3519 ><data-island class="contents" x-data="{ expanded: false }"><button 3520 class="relative block w-full text-left inline-block py-4 w-full text-heading-standard ease pr-10 transition font-body" 3521 x-bind:aria-expanded="expanded ? true : 'false'" 3522 @click="expanded = ! expanded" 3523 aria-controls="accordion4" 3524 > 3525 Our story 3526 <span class="absolute right-0 top-1/2 flex h-6 w-6 -translate-y-1/2 transform items-center"><span 3527 class="inline-block w-full origin-center" 3528 x-show="!expanded" 3529 ><svg 3530 class="theme-icon" 3531 xmlns="http://www.w3.org/2000/svg" 3532 fill="none" 3533 viewBox="0 0 24 24" 3534> 3535 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 3536</svg> 3537</span> 3538 <span 3539 class="inline-block w-full origin-center" 3540 x-show="expanded" 3541 style="display: none;" 3542 ><svg 3543 class="theme-icon" 3544 xmlns="http://www.w3.org/2000/svg" 3545 fill="none" 3546 viewBox="0 0 24 24" 3547> 3548 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 3549</svg> 3550</span></span> 3551 </button> 3552 <ul 3553 id="accordion4" 3554 class="no-js-focus-container pb-2 pl-4" 3555 x-show="expanded" 3556 x-cloak 3557 ><li class="no-js-focus-wrapper"><a 3558 class="inline-block py-1 " 3559 href="/pages/in-good-company-with" 3560 > 3561 In good company with⦠3562 </a></li><li class="no-js-focus-wrapper"><a 3563 class="inline-block py-1 " 3564 href="/pages/about-print-room" 3565 > 3566 Our origins 3567 </a></li></ul> 3568 </data-island></li><li 3569 class="no-js-focus-wrapper break-word px-section-horizontal-spacing border-t-gridline border-gr
3569idline-color first-of-type:border-t-0" 3570 ><data-island class="contents" x-data="{ expanded: false }"><button 3571 class="relative block w-full text-left inline-block py-4 w-full text-heading-standard ease pr-10 transition font-body" 3572 x-bind:aria-expanded="expanded ? true : 'false'" 3573 @click="expanded = ! expanded" 3574 aria-controls="accordion5" 3575 > 3576 Get started 3577 <span class="absolute right-0 top-1/2 flex h-6 w-6 -translate-y-1/2 transform items-center"><span 3578 class="inline-block w-full origin-center" 3579 x-show="!expanded" 3580 ><svg 3581 class="theme-icon" 3582 xmlns="http://www.w3.org/2000/svg" 3583 fill="none" 3584 viewBox="0 0 24 24" 3585> 3586 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 3587</svg> 3588</span> 3589 <span 3590 class="inline-block w-full origin-center" 3591 x-show="expanded" 3592 style="display: none;" 3593 ><svg 3594 class="theme-icon" 3595 xmlns="http://www.w3.org/2000/svg" 3596 fill="none" 3597 viewBox="0 0 24 24" 3598> 3599 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 3600</svg> 3601</span></span> 3602 </button> 3603 <ul 3604 id="accordion5" 3605 class="no-js-focus-container pb-2 pl-4" 3606 x-show="expanded" 3607 x-cloak 3608 ><li class="no-js-focus-wrapper"><a 3609 class="inline-block py-1 " 3610 href="/collections/product-library" 3611 > 3612 Start a project 3613 </a></li><li class="no-js-focus-wrapper"><a 3614 class="inline-block py-1 " 3615 href="/pages/book-a-call" 3616 > 3617 Book a call 3618 </a></li></ul> 3619 </data-island></li></ul> 3620 </nav> 3621 <div class="border-t-gridline border-gridline-color"> 3622 <nav class="my-6" aria-label="Secondary"> 3623 <ul></ul> 3624 </nav> 3625 3626 3627 <div class="my-6 px-section-horizontal-spacing"> 3628 <form method="post" action="/localization" id="sidebar-localization-form" accept-charset="UTF-8" class="shopify-localization-form" enctype="multipart/form-data"><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="â" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/blogs/the-print-room-nz" /><div class="flex gap-4 flex-col gap-y-0"><div class="inline-block shrink-0 select-none"> 3629 <h2 class="sr-only" id="country-heading-sidebar"> 3630 Country/region 3631 </h2> 3632 <data-island 3633 class="relative" 3634 x-data="{ expanded: false }" 3635 @keydown.escape.prevent.stop="expanded = false" 3636 @click.outside="expanded = false" 3637 > 3638 <button 3639 type="button" 3640 class="text-base py-2" 3641 :aria-expanded="expanded" 3642 aria-controls="country-list-sidebar" 3643 aria-describedby="country-heading-sidebar" 3644 @click.prevent="expanded = ! expanded" 3645 > 3646 United States (USD 3647 $) 3648 <span 3649 class="rotate ml-1 inline-block w-3 origin-center transform fill-current transition" 3650 :class="{ 'rotate-180': expanded }" 3651 > 3652 <svg 3653 class="theme-icon" 3654 xmlns="http://www.w3.org/2000/svg" 3655 fill="none" 3656 viewBox="0 0 24 24" 3657> 3658 <path stroke="currentColor" d="M1.5 7 12 17.5 22.5 7" vector-effect="non-scaling-stroke"/> 3659</svg> 3660 3661 </span> 3662 </button> 3663 <div 3664 class="absolute bottom-[calc(100%_+_0.5rem)] right-auto left-0" 3665 x-show="expanded" 3666 style="display: none;" 3667 > 3668 <ul 3669 id="country-list-sidebar" 3670 class="relative z-10 flex max-h-[30vh] w-max max-w-[theme(spacing.52)] snap-y snap-mandatory flex-col gap-[--text-border-width] overflow-y-auto border-text border-gr
3670idline-color bg-gridline-color text-base" 3671 x-transition:enter="transition ease duration-300" 3672 x-transition:enter-start="opacity-0" 3673 x-transition:enter-end="opacity-100" 3674 x-transition:leave="transition ease duration-300" 3675 x-transition:leave-start="opacity-100" 3676 x-transition:leave-end="opacity-0" 3677 :aria-hidden="! expanded" 3678 > 3679 3680 <li class="flex items-center bg-scheme-background px-2 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 3681 <button 3682 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 3683 type="button" 3684 3685 @click.prevent="$refs.input.value = 'AU'; $root.closest('form').submit();" 3686 > 3687 <span class="border-transparent border-b-text">Australia (AUD 3688 $)</span 3689 > 3690 </button> 3691 </li> 3692 <li class="flex items-center bg-scheme-background px-2 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 3693 <button 3694 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 3695 type="button" 3696 3697 @click.prevent="$refs.input.value = 'CN'; $root.closest('form').submit();" 3698 > 3699 <span class="border-transparent border-b-text">China (CNY 3700 Â¥)</span 3701 > 3702 </button> 3703 </li> 3704 <li class="flex items-center bg-scheme-background px-2 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 3705 <button 3706 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 3707 type="button" 3708 3709 @click.prevent="$refs.input.value = 'FR'; $root.closest('form').submit();" 3710 > 3711 <span class="border-transparent border-b-text">France (EUR 3712 â¬)</span 3713 > 3714 </button> 3715 </li> 3716 <li class="flex items-center bg-scheme-background px-2 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 3717 <button 3718 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 3719 type="button" 3720 3721 @click.prevent="$refs.input.value = 'NZ'; $root.closest('form').submit();" 3722 > 3723 <span class="border-transparent border-b-text">New Zealand (NZD 3724 $)</span 3725 > 3726 </button> 3727 </li> 3728 <li class="flex items-center bg-scheme-background px-2 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 3729 <button 3730 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 3731 type="button" 3732 3733 @click.prevent="$refs.input.value = 'GB'; $root.closest('form').submit();" 3734 > 3735 <span class="border-transparent border-b-text">United Kingdom (GBP 3736 £)</span 3737 > 3738 </button> 3739 </li> 3740 <li class="flex items-center bg-scheme-background px-2 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 3741 <button 3742 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 3743 type="button" 3744 3745 aria-current="true" 3746 3747 @click.prevent="$refs.input.value = 'US'; $root.closest('form').submit();" 3748 > 3749 <span class="border-scheme-text border-b-text">United States (USD 3750 $)</span 3751 > 3752 </button> 3753 </li></ul> 3754 </div> 3755 3756 <input 3757 x-ref="input" 3758 type="hidden" 3759 name="country_code" 3760 id="CountrySelector" 3761 value="US" 3762 > 3763 </data-island> 3764 </div></div></form> 3765 </div> 3766 3767 3768 3769<form 3770 class="my-6 px-section-horizontal-spacing" 3771 action="/search" 3772 method="get" 3773 role="search" 3774 > 3775 <div class="flex w-full max-w-xs items-end"> 3776 <label for="menu-drawer-search" class="sr-only">Search</label> 3777 <input 3778 class="min-w-0 flex-auto border-b-text border-current bg-transparent py-1.5 placeholder-current" 3779 id="menu-drawer-search" 3780 type="text" 3781 name="q" 3782 placeholder="Search" 3783 > 3784 <button 3785 class="px-1" 3786 type="submit" 3787 >
3788 <span class="inline-block h-6 w-6"><svg 3789 class="theme-icon" 3790 xmlns="http://www.w3.org/2000/svg" 3791 fill="none" 3792 viewBox="0 0 24 24" 3793> 3794 <path stroke="currentColor" d="M2 11a9 9 0 1 0 18 0 9 9 0 0 0-18 0Zm15.364 6.364L22 22" vector-effect="non-scaling-stroke"/> 3795</svg> 3796</span> 3797 <span class="sr-only">Submit</span> 3798 </button> 3799 </div> 3800 </form> 3801 </div> 3802 </div> 3803 3804 </template> 3805 </template> 3806</data-island> 3807 3808<noscript> 3809 <section class="section-sidebar"> 3810 <div class="px-section-horizontal-spacing py-2 text-right"> 3811 <button 3812 class="inline-flex items-center justify-center py-2 " 3813 data-menu-drawer-toggle 3814 > 3815 <span class="mr-2 inline-block h-6 w-6 align-middle"><svg 3816 class="theme-icon" 3817 xmlns="http://www.w3.org/2000/svg" 3818 fill="none" 3819 viewBox="0 0 24 24" 3820> 3821 <path stroke="currentColor" d="M1 4.545h22M1 12h22M1 19.455h22" vector-effect="non-scaling-stroke"/> 3822</svg> 3823</span> 3824 <span>Menu</span> 3825 </button> 3826 </div> 3827 <div class="sidebar-container z-80 border-r-grid border-grid-color fixed bottom-0 left-0 top-0 w-11/12 max-w-xl transform overflow-y-auto bg-scheme-background text-scheme-text transition-transform"> 3828 3829 <div 3830 3831 data-modal-label="Menu" 3832 > 3833 <div class="sticky top-0 z-1 flex items-center justify-between border-b-gridline border-gridline-color px-section-horizontal-spacing py-4"> 3834 <div aria-hidden="true"> </div> 3835 <button 3836 @click.prevent="$store.modals.close('sidebar')" 3837 class="absolute right-0 top-0 block h-full" 3838 type="button" 3839 > 3840 <span class="sr-only">Close</span> 3841 <div class="my-auto mr-section-horizontal-spacing h-6 w-6"><svg 3842 class="theme-icon" 3843 xmlns="http://www.w3.org/2000/svg" 3844 fill="none" 3845 viewBox="0 0 24 24" 3846> 3847 <path stroke="currentColor" d="m1.5 1.5 21 21m0-21-21 21" vector-effect="non-scaling-stroke"/> 3848</svg> 3849</div> 3850 </button> 3851 </div> 3852 <nav 3853 3854 aria-label="Primary" 3855 > 3856 <ul><li 3857 class="no-js-focus-wrapper break-word px-section-horizontal-spacing border-t-gridline border-gridline-color first-of-type:border-t-0" 3858 ><a class="inline-block py-4 w-full text-heading-standard" href="/collections/product-library"> 3859 Products 3860 </a></li><li 3861 class="no-js-focus-wrapper break-word px-section-horizontal-spacing border-t-gridline border-gridline-color first-of-type:border-t-0" 3862 ><data-island class="contents" x-data="{ expanded: false }"><button 3863 class="relative block w-full text-left inline-block py-4 w-full text-heading-standard ease pr-10 transition font-body" 3864 x-bind:aria-expanded="expanded ? true : 'false'" 3865 @click="expanded = ! expanded" 3866 aria-controls="accordion0" 3867 > 3868 Services 3869 <span class="absolute right-0 top-1/2 flex h-6 w-6 -translate-y-1/2 transform items-center"><span 3870 class="inline-block w-full origin-center" 3871 x-show="!expanded" 3872 ><svg 3873 class="theme-icon" 3874 xmlns="http://www.w3.org/2000/svg" 3875 fill="none" 3876 viewBox="0 0 24 24" 3877> 3878 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 3879</svg> 3880</span> 3881 <span 3882 class="inline-block w-full origin-center" 3883 x-show="expanded" 3884 style="display: none;" 3885 ><svg 3886 class="theme-icon" 3887 xmlns="http://www.w3.org/2000/svg" 3888 fill="none" 3889 viewBox="0 0 24 24" 3890> 3891 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 3892</svg> 3893</span></span> 3894 </button> 3895 <ul 3896 id="accordion0" 3897 class="no-js-focus-container pb-2 pl-4" 3898 x-show="expanded" 3899 x-cloak 3900 ><li class="no-js-focus-wrapper"><data-island class="contents" x-data="{ expanded: false }" > 3901 <button 3902 class="relative w-full text-left inline-block py-1 pr-10" 3903 x-bind:aria-expanded="expanded ? true : 'false'" 3904 @click="expanded = ! expanded" 3905 aria-controls="accordion1" 3906 > 3907 Production capabilities
3908 <span class="absolute right-0 top-1/2 flex h-6 w-6 -translate-y-1/2 transform items-center"><span 3909 class="inline-block w-full origin-center" 3910 x-show="!expanded" 3911 ><svg 3912 class="theme-icon" 3913 xmlns="http://www.w3.org/2000/svg" 3914 fill="none" 3915 viewBox="0 0 24 24" 3916> 3917 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 3918</svg> 3919</span> 3920 <span 3921 class="inline-block w-full origin-center" 3922 x-show="expanded" 3923 style="display: none;" 3924 ><svg 3925 class="theme-icon" 3926 xmlns="http://www.w3.org/2000/svg" 3927 fill="none" 3928 viewBox="0 0 24 24" 3929> 3930 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 3931</svg> 3932</span></span> 3933 </button> 3934 <ul 3935 id="accordion1" 3936 class="no-js-focus-container px-2 pb-2 pt-1" 3937 x-show="expanded" 3938 x-cloak 3939 ><li> 3940 <a 3941 class="inline-block py-1 " 3942 href="/pages/custom-manufactured" 3943 > 3944 Custom-manufactured 3945 </a> 3946 </li><li> 3947 <a 3948 class="inline-block py-1 " 3949 href="/pages/screen-printing" 3950 > 3951 Screen printing 3952 </a> 3953 </li><li> 3954 <a 3955 class="inline-block py-1 " 3956 href="/pages/embroidery" 3957 > 3958 Embroidery 3959 </a> 3960 </li><li> 3961 <a 3962 class="inline-block py-1 " 3963 href="/pages/heat-transfers" 3964 > 3965 Heat transfers 3966 </a> 3967 </li><li> 3968 <a 3969 class="inline-block py-1 " 3970 href="/pages/finishing" 3971 > 3972 Finishing 3973 </a> 3974 </li></ul> 3975 </data-island></li><li class="no-js-focus-wrapper"><data-island class="contents" x-data="{ expanded: false }" > 3976 <button 3977 class="relative w-full text-left inline-block py-1 pr-10" 3978 x-bind:aria-expanded="expanded ? true : 'false'" 3979 @click="expanded = ! expanded" 3980 aria-controls="accordion2" 3981 > 3982 Partner services 3983 <span class="absolute right-0 top-1/2 flex h-6 w-6 -translate-y-1/2 transform items-center"><span 3984 class="inline-block w-full origin-center" 3985 x-show="!expanded" 3986 ><svg 3987 class="theme-icon" 3988 xmlns="http://www.w3.org/2000/svg" 3989 fill="none" 3990 viewBox="0 0 24 24" 3991> 3992 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 3993</svg> 3994</span> 3995 <span 3996 class="inline-block w-full origin-center" 3997 x-show="expanded" 3998 style="display: none;" 3999 ><svg 4000 class="theme-icon" 4001 xmlns="http://www.w3.org/2000/svg" 4002 fill="none" 4003 viewBox="0 0 24 24" 4004> 4005 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 4006</svg> 4007</span></span> 4008 </button> 4009 <ul 4010 id="accordion2" 4011 class="no-js-focus-container px-2 pb-2 pt-1" 4012 x-show="expanded" 4013 x-cloak 4014 ><li> 4015 <a 4016 class="inline-block py-1 " 4017 href="/pages/client-portal" 4018 > 4019 Client portal 4020 </a> 4021 </li><li> 4022 <a 4023 class="inline-block py-1 " 4024 href="/pages/fundraising-pre-orders" 4025 > 4026 Fundraise & pre-order 4027 </a> 4028 </li><li> 4029 <a 4030 class="inline-block py-1 " 4031 href="/pages/repurpose-initiative" 4032 > 4033 Repurpose initiative 4034 </a> 4035 </li></ul> 4036 </data-island></li><li class="no-js-focus-wrapper"><data-island class="contents" x-data="{ expanded: false }" > 4037 <button 4038 class="relative w-full text-left inline-block py-1 pr-10" 4039 x-bind:aria-expanded="expanded ? true : 'false'" 4040 @click="expanded = ! expanded" 4041 aria-controls="accordion3" 4042 > 4043 Popular services
4044 <span class="absolute right-0 top-1/2 flex h-6 w-6 -translate-y-1/2 transform items-center"><span 4045 class="inline-block w-full origin-center" 4046 x-show="!expanded" 4047 ><svg 4048 class="theme-icon" 4049 xmlns="http://www.w3.org/2000/svg" 4050 fill="none" 4051 viewBox="0 0 24 24" 4052> 4053 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 4054</svg> 4055</span> 4056 <span 4057 class="inline-block w-full origin-center" 4058 x-show="expanded" 4059 style="display: none;" 4060 ><svg 4061 class="theme-icon" 4062 xmlns="http://www.w3.org/2000/svg" 4063 fill="none" 4064 viewBox="0 0 24 24" 4065> 4066 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 4067</svg> 4068</span></span> 4069 </button> 4070 <ul 4071 id="accordion3" 4072 class="no-js-focus-container px-2 pb-2 pt-1" 4073 x-show="expanded" 4074 x-cloak 4075 ><li> 4076 <a 4077 class="inline-block py-1 " 4078 href="/pages/school-leavers-gear" 4079 > 4080 School leavers gear 4081 </a> 4082 </li><li> 4083 <a 4084 class="inline-block py-1 " 4085 href="/pages/tshirt-printing" 4086 > 4087 Custom t-shirt printing 4088 </a> 4089 </li></ul> 4090 </data-island></li></ul> 4091 </data-island></li><li 4092 class="no-js-focus-wrapper break-word px-section-horizontal-spacing border-t-gridline border-gridline-color first-of-type:border-t-0" 4093 ><a class="inline-block py-4 w-full text-heading-standard" href="/pages/responsibility"> 4094 Responsibility 4095 </a></li><li 4096 class="no-js-focus-wrapper break-word px-section-horizontal-spacing border-t-gridline border-gridline-color first-of-type:border-t-0" 4097 ><data-island class="contents" x-data="{ expanded: false }"><button 4098 class="relative block w-full text-left inline-block py-4 w-full text-heading-standard ease pr-10 transition font-body" 4099 x-bind:aria-expanded="expanded ? true : 'false'" 4100 @click="expanded = ! expanded" 4101 aria-controls="accordion4" 4102 > 4103 Our story 4104 <span class="absolute right-0 top-1/2 flex h-6 w-6 -translate-y-1/2 transform items-center"><span 4105 class="inline-block w-full origin-center" 4106 x-show="!expanded" 4107 ><svg 4108 class="theme-icon" 4109 xmlns="http://www.w3.org/2000/svg" 4110 fill="none" 4111 viewBox="0 0 24 24" 4112> 4113 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 4114</svg> 4115</span> 4116 <span 4117 class="inline-block w-full origin-center" 4118 x-show="expanded" 4119 style="display: none;" 4120 ><svg 4121 class="theme-icon" 4122 xmlns="http://www.w3.org/2000/svg" 4123 fill="none" 4124 viewBox="0 0 24 24" 4125> 4126 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 4127</svg> 4128</span></span> 4129 </button> 4130 <ul 4131 id="accordion4" 4132 class="no-js-focus-container pb-2 pl-4" 4133 x-show="expanded" 4134 x-cloak 4135 ><li class="no-js-focus-wrapper"><a 4136 class="inline-block py-1 " 4137 href="/pages/in-good-company-with" 4138 > 4139 In good company with⦠4140 </a></li><li class="no-js-focus-wrapper"><a 4141 class="inline-block py-1 " 4142 href="/pages/about-print-room" 4143 > 4144 Our origins 4145 </a></li></ul> 4146 </data-island></li><li 4147 class="no-js-focus-wrapper break-word px-section-horizontal-spacing border-t-gridline border-gr
4147idline-color first-of-type:border-t-0" 4148 ><data-island class="contents" x-data="{ expanded: false }"><button 4149 class="relative block w-full text-left inline-block py-4 w-full text-heading-standard ease pr-10 transition font-body" 4150 x-bind:aria-expanded="expanded ? true : 'false'" 4151 @click="expanded = ! expanded" 4152 aria-controls="accordion5" 4153 > 4154 Get started 4155 <span class="absolute right-0 top-1/2 flex h-6 w-6 -translate-y-1/2 transform items-center"><span 4156 class="inline-block w-full origin-center" 4157 x-show="!expanded" 4158 ><svg 4159 class="theme-icon" 4160 xmlns="http://www.w3.org/2000/svg" 4161 fill="none" 4162 viewBox="0 0 24 24" 4163> 4164 <path stroke="currentColor" d="M12 1v22M1 12h22" vector-effect="non-scaling-stroke"/> 4165</svg> 4166</span> 4167 <span 4168 class="inline-block w-full origin-center" 4169 x-show="expanded" 4170 style="display: none;" 4171 ><svg 4172 class="theme-icon" 4173 xmlns="http://www.w3.org/2000/svg" 4174 fill="none" 4175 viewBox="0 0 24 24" 4176> 4177 <path stroke="currentColor" d="M1 12h22" vector-effect="non-scaling-stroke"/> 4178</svg> 4179</span></span> 4180 </button> 4181 <ul 4182 id="accordion5" 4183 class="no-js-focus-container pb-2 pl-4" 4184 x-show="expanded" 4185 x-cloak 4186 ><li class="no-js-focus-wrapper"><a 4187 class="inline-block py-1 " 4188 href="/collections/product-library" 4189 > 4190 Start a project 4191 </a></li><li class="no-js-focus-wrapper"><a 4192 class="inline-block py-1 " 4193 href="/pages/book-a-call" 4194 > 4195 Book a call 4196 </a></li></ul> 4197 </data-island></li></ul> 4198 </nav> 4199 <div class="border-t-gridline border-gridline-color"> 4200 <nav class="my-6" aria-label="Secondary"> 4201 <ul></ul> 4202 </nav> 4203 4204 4205 <div class="my-6 px-section-horizontal-spacing"> 4206 <form method="post" action="/localization" id="sidebar-localization-form" accept-charset="UTF-8" class="shopify-localization-form" enctype="multipart/form-data"><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="â" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/blogs/the-print-room-nz" /><div class="flex gap-4 flex-col gap-y-0"><div class="inline-block shrink-0 select-none"> 4207 <h2 class="sr-only" id="country-heading-sidebar"> 4208 Country/region 4209 </h2> 4210 <data-island 4211 class="relative" 4212 x-data="{ expanded: false }" 4213 @keydown.escape.prevent.stop="expanded = false" 4214 @click.outside="expanded = false" 4215 > 4216 <button 4217 type="button" 4218 class="text-base py-2" 4219 :aria-expanded="expanded" 4220 aria-controls="country-list-sidebar" 4221 aria-describedby="country-heading-sidebar" 4222 @click.prevent="expanded = ! expanded" 4223 > 4224 United States (USD 4225 $) 4226 <span 4227 class="rotate ml-1 inline-block w-3 origin-center transform fill-current transition" 4228 :class="{ 'rotate-180': expanded }" 4229 > 4230 <svg 4231 class="theme-icon" 4232 xmlns="http://www.w3.org/2000/svg" 4233 fill="none" 4234 viewBox="0 0 24 24" 4235> 4236 <path stroke="currentColor" d="M1.5 7 12 17.5 22.5 7" vector-effect="non-scaling-stroke"/> 4237</svg> 4238 4239 </span> 4240 </button> 4241 <div 4242 class="absolute bottom-[calc(100%_+_0.5rem)] right-auto left-0" 4243 x-show="expanded" 4244 style="display: none;" 4245 > 4246 <ul 4247 id="country-list-sidebar" 4248 class="relative z-10 flex max-h-[30vh] w-max max-w-[theme(spacing.52)] snap-y snap-mandatory flex-col gap-[--text-border-width] overflow-y-auto border-text border-gr
4248idline-color bg-gridline-color text-base" 4249 x-transition:enter="transition ease duration-300" 4250 x-transition:enter-start="opacity-0" 4251 x-transition:enter-end="opacity-100" 4252 x-transition:leave="transition ease duration-300" 4253 x-transition:leave-start="opacity-100" 4254 x-transition:leave-end="opacity-0" 4255 :aria-hidden="! expanded" 4256 > 4257 4258 <li class="flex items-center bg-scheme-background px-2 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 4259 <button 4260 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 4261 type="button" 4262 4263 @click.prevent="$refs.input.value = 'AU'; $root.closest('form').submit();" 4264 > 4265 <span class="border-transparent border-b-text">Australia (AUD 4266 $)</span 4267 > 4268 </button> 4269 </li> 4270 <li class="flex items-center bg-scheme-background px-2 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 4271 <button 4272 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 4273 type="button" 4274 4275 @click.prevent="$refs.input.value = 'CN'; $root.closest('form').submit();" 4276 > 4277 <span class="border-transparent border-b-text">China (CNY 4278 Â¥)</span 4279 > 4280 </button> 4281 </li> 4282 <li class="flex items-center bg-scheme-background px-2 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 4283 <button 4284 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 4285 type="button" 4286 4287 @click.prevent="$refs.input.value = 'FR'; $root.closest('form').submit();" 4288 > 4289 <span class="border-transparent border-b-text">France (EUR 4290 â¬)</span 4291 > 4292 </button> 4293 </li> 4294 <li class="flex items-center bg-scheme-background px-2 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 4295 <button 4296 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 4297 type="button" 4298 4299 @click.prevent="$refs.input.value = 'NZ'; $root.closest('form').submit();" 4300 > 4301 <span class="border-transparent border-b-text">New Zealand (NZD 4302 $)</span 4303 > 4304 </button> 4305 </li> 4306 <li class="flex items-center bg-scheme-background px-2 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 4307 <button 4308 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 4309 type="button" 4310 4311 @click.prevent="$refs.input.value = 'GB'; $root.closest('form').submit();" 4312 > 4313 <span class="border-transparent border-b-text">United Kingdom (GBP 4314 £)</span 4315 > 4316 </button> 4317 </li> 4318 <li class="flex items-center bg-scheme-background px-2 py-2 coarse-pointer:min-h-[44px] coarse-pointer:min-w-[44px]"> 4319 <button 4320 class="break-word text-left [text-wrap:balance] hover:text-scheme-accent" 4321 type="button" 4322 4323 aria-current="true" 4324 4325 @click.prevent="$refs.input.value = 'US'; $root.closest('form').submit();" 4326 > 4327 <span class="border-scheme-text border-b-text">United States (USD 4328 $)</span 4329 > 4330 </button> 4331 </li></ul> 4332 </div> 4333 4334 <input 4335 x-ref="input" 4336 type="hidden" 4337 name="country_code" 4338 id="CountrySelector" 4339 value="US" 4340 > 4341 </data-island> 4342 </div></div></form> 4343 </div> 4344 4345 4346 4347<form 4348 class="my-6 px-section-horizontal-spacing" 4349 action="/search" 4350 method="get" 4351 role="search" 4352 > 4353 <div class="flex w-full max-w-xs items-end"> 4354 <label for="menu-drawer-search" class="sr-only">Search</label> 4355 <input 4356 class="min-w-0 flex-auto border-b-text border-current bg-transparent py-1.5 placeholder-current" 4357 id="menu-drawer-search" 4358 type="text" 4359 name="q" 4360 placeholder="Search" 4361 > 4362 <button 4363 class="px-1" 4364 type="submit" 4365 >
4366 <span class="inline-block h-6 w-6"><svg 4367 class="theme-icon" 4368 xmlns="http://www.w3.org/2000/svg" 4369 fill="none" 4370 viewBox="0 0 24 24" 4371> 4372 <path stroke="currentColor" d="M2 11a9 9 0 1 0 18 0 9 9 0 0 0-18 0Zm15.364 6.364L22 22" vector-effect="non-scaling-stroke"/> 4373</svg> 4374</span> 4375 <span class="sr-only">Submit</span> 4376 </button> 4377 </div> 4378 </form> 4379 </div> 4380 </div> 4381 4382 </div> 4383 </section> 4384 4385 <style> 4386 .section-sidebar { 4387 display: block !important; 4388 } 4389 4390 @media (min-width: 1024px) { 4391 .section-sidebar { 4392 display: none !important; 4393 } 4394 } 4395 4396 .sidebar-container { 4397 position: static; 4398 width: 100%; 4399 max-width: 100%; 4400 border-right: 0; 4401 display: none; 4402 } 4403 4404 .section-sidebar:focus-within .sidebar-container { 4405 display: block !important; 4406 } 4407 </style> 4408</noscript> 4409 4410 4411</div>
4411<script> 4412 const calculateHeaderHeights = () => { 4413 const headerGroupHeights = []; 4414 4415 document 4416 .querySelectorAll('.shopify-section-group-header-group') 4417 .forEach((headerGroupSectionEl) => { 4418 headerGroupHeights.push( 4419 headerGroupSectionEl.getBoundingClientRect().height 4420 ); 4421 }); 4422 4423 document.documentElement.style.setProperty( 4424 '--header-group-height', 4425 `${headerGroupHeights.reduce((subtotal, a) => subtotal + a, 0)}px` 4426 ); 4427 }; 4428 4429 calculateHeaderHeights(); 4430 4431 if (document.readyState === 'loading') { 4432 document.addEventListener('DOMContentLoaded', calculateHeaderHeights); 4433 } 4434 window.addEventListener('load', calculateHeaderHeights); 4435 4436 const debouncedCalculateHeaderHeights = debounce(calculateHeaderHeights, 300); 4437 4438 window.addEventListener('resize', debouncedCalculateHeaderHeights); 4439</script>
4439 4440 4441 4442 4443<style> 4444 #MainContent 4445 > .shopify-section.banner-section:first-child 4446 [data-media-container].h-screen { 4447 height: calc(100vh - var(--header-group-height)); 4448 } 4449 4450 @media (min-width: 990px) { 4451 #MainContent 4452 > .shopify-section.banner-section:first-child 4453 [data-media-container].lg\:h-auto { 4454 height: auto; 4455 } 4456 4457 #MainContent 4458 > .shopify-section.banner-section:first-child 4459 [data-media-container].lg\:h-screen { 4460 height: calc(100vh - var(--header-group-height)); 4461 } 4462 } 4463</style> 4464 4465 4466 4467 <main id="MainContent"> 4468 <div id="shopify-section-template--21296459939910__rich_text_PFWrHz" class="shopify-section"><section 4469 class="overflow-hidden border-b-gridline border-gridline-color bg-scheme-background text-scheme-text snap-section" 4470 data-color-scheme="scheme5" 4471 x-data="{ visible: false }" 4472 x-intersect:enter.threshold.25="visible = true" 4473 x-intersect:leave="visible = false" 4474 data-animate="fade" 4475 :class="{ 'is-visible': visible }" 4476> 4477 <div class="px-section-horizontal-spacing py-section-vertical-spacing"> 4478 <div class="flex text-left justify-start"> 4479 <div class="w-full lg:w-full"><h2 class="font-heading text-heading-standard"> 4480 A closer look at our favourite brands 4481 </h2><div class="rte mt-4 break-word"> 4482 4483 </div></div> 4484 </div> 4485 </div> 4486</section> 4487 4488 4489<style> #shopify-section-template--21296459939910__rich_text_PFWrHz .text-scheme-text {padding-left: 30px; padding-right: 30px;} </style></div><div id="shopify-section-template--21296459939910__custom_links_with_image_9yEMyr" class="shopify-section"><data-island 4490 class="grid grid-flow-row-dense grid-cols-1 gap-gutter overflow-hidden border-b-gridline border-gridline-color bg-gridline-color lg:grid-cols-12" 4491 role="banner" 4492 x-data="{ currentLink: '' }" 4493 data-color-scheme="scheme5" 4494> 4495 <div class="bg-scheme-background lg:col-start-7 lg:col-end-13 p-2 lg:p-4 h-full w-full "> 4496 <div class="relative min-h-full"><div class="hidden lg:block"> 4497 <image-with-placeholder> 4498 <img src="//printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=3000" alt="AS-colour-custom-printing" srcset="//printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=200 200w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=350 350w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=450 450w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=750 750w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=850 850w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=960 960w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1280 1280w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1440 1440w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1536 1536w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1706 1706w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1782 1782w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1920 1920w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=2560 2560w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=2880 2880w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=3000 3000w" width="3000" height="1686" loading="eager" class="peer/image block absolute inset-0 w-full h-full object-cover" sizes="(min-width: 1024px) 50vw, 100vw"> 4499 4500 <div 4501 class="absolute inset-0 h-full w-full bg-scheme-text opacity-[0.05] peer-[.is-complete]/image:opacity-0 no-js:hidden" 4502 ></div> 4503 4504</image-with-placeholder> 4505 4506 </div> 4507 <div class="block lg:hidden"> 4508 <image-with-placeholder class="relative"><img src="//printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=3000" alt="AS-colour-custom-printing" srcset="//printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=200 200w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=350 350w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=450 450w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=750 750w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=850 850w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=960 960w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1280 1280w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1440 1440w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1536 1536w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1706 1706w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1782 1782w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1920 1920w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=2560 2560w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=2880 2880w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=3000 3000w" width="3000" height="1686" loading="eager" class="peer/image" sizes="(min-width: 1024px) 50vw, 100vw"> 4509 4510 <div 4511 class="absolute inset-0 h-full w-full bg-scheme-text opacity-[0.05] peer-[.is-complete]/image:opacity-0 no-js:hidden" 4512 ></div> 4513 4514</image-with-placeholder> 4515 4516 </div><div><div
4517 class="no-js:hidden" 4518 x-show="isLgBreakpoint() && currentLink === 'link_rnjcua'" 4519 x-transition:enter="transition-opacity duration-200" 4520 x-transition:enter-start="opacity-0" 4521 x-transition:enter-end="opacity-100" 4522 x-transition:leave="transition-opacity duration-200" 4523 x-transition:leave-start="opacity-100" 4524 x-transition:leave-end="opacity-0" 4525 style="display: none;" 4526 :aria-hidden="isLgBreakpoint() && currentLink === 'link_rnjcua'" 4527> 4528 4529 <image-with-placeholder> 4530 <img src="//printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=3000" alt="stanley-stella nz" srcset="//printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=200 200w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=350 350w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=450 450w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=750 750w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=850 850w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=960 960w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=1280 1280w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=1440 1440w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=1536 1536w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=1706 1706w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=1782 1782w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=1920 1920w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=2560 2560w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=2880 2880w, //printroom.co/cdn/shop/files/stanley-stella_cover_2.jpg?v=1758161166&width=3000 3000w" width="3000" height="1688" loading="lazy" class="peer/image block absolute inset-0 w-full h-full object-cover" sizes="(min-width: 1024px) 50vw, 100vw"> 4531 4532</image-with-placeholder> 4533 4534 4535</div> 4536<div 4537 class="no-js:hidden" 4538 x-show="isLgBreakpoint() && currentLink === 'link_hkiftb'" 4539 x-transition:enter="transition-opacity duration-200" 4540 x-transition:enter-start="opacity-0" 4541 x-transition:enter-end="opacity-100" 4542 x-transition:leave="transition-opacity duration-200" 4543 x-transition:leave-start="opacity-100" 4544 x-transition:leave-end="opacity-0" 4545 style="display: none;" 4546 :aria-hidden="isLgBreakpoint() && currentLink === 'link_hkiftb'" 4547> 4548 4549 <image-with-placeholder> 4550 <img src="//printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=3000" alt="AS-colour-custom-printing" srcset="//printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=200 200w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=350 350w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=450 450w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=750 750w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=850 850w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=960 960w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1280 1280w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1440 1440w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1536 1536w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1706 1706w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1782 1782w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=1920 1920w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=2560 2560w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=2880 2880w, //printroom.co/cdn/shop/files/BOX_HOOD_wide.jpg?v=1753759570&width=3000 3000w" width="3000" height="1686" loading="lazy" class="peer/image block absolute inset-0 w-full h-full object-cover" sizes="(min-width: 1024px) 50vw, 100vw"> 4551 4552</image-with-placeholder> 4553 4554 4555</div> 4556</div> 4557 </div> 4558 </div> 4559 4560 <div class="lg:col-span-6 relative flex bg-scheme-background px-section-horizontal-spacing py-section-vertical-spacing text-scheme-text items-center"> 4561 <div 4562 class="text-scale-n2 lg:text-scale-n6 text-left w-full" 4563 > 4564 <ul class="font-heading break-word inline-block max-w-full"><li > 4565 <div class=" relative inline-block max-w-full"> 4566 <a 4567 href="/pages/stanley-stella" 4568 class="font-heading break-word hover:text-scheme-accent" 4569 x-on:mouseenter="currentLink = 'link_rnjcua'" 4570 x-on:mouseleave=" 4571 setTimeout( 4572 () => { 4573 if (currentLink == 'link_rnjcua') { 4574 currentLink = '' 4575 } 4576 }, 200) 4577 " 4578 x-on:focus="currentLink = 'link_rnjcua'" 4579 x-on:blur=" 4580 setTimeout( 4581 () => { 4582 if (currentLink == 'link_rnjcua') { 4583 currentLink = '' 4584 } 4585 }, 200) 4586 " 4587 >
4588 <span class="hover:underline">Stanley/Stella</span> 4589 </a> 4590 </div> 4591 </li><li > 4592 <div class=" relative inline-block max-w-full"> 4593 <a 4594 href="/pages/as-colour" 4595 class="font-heading break-word hover:text-scheme-accent" 4596 x-on:mouseenter="currentLink = 'link_hkiftb'" 4597 x-on:mouseleave=" 4598 setTimeout( 4599 () => { 4600 if (currentLink == 'link_hkiftb') { 4601 currentLink = '' 4602 } 4603 }, 200) 4604 " 4605 x-on:focus="currentLink = 'link_hkiftb'" 4606 x-on:blur=" 4607 setTimeout( 4608 () => { 4609 if (currentLink == 'link_hkiftb') { 4610 currentLink = '' 4611 } 4612 }, 200) 4613 " 4614 > 4615 <span class="hover:underline">AS Colour</span> 4616 </a> 4617 </div> 4618 </li></ul> 4619 </div> 4620 </div> 4621</data-island> 4622 4623 4624<style> #shopify-section-template--21296459939910__custom_links_with_image_9yEMyr .text-scheme-text {padding-left: 50px; padding-right: 50px;} #shopify-section-template--21296459939910__custom_links_with_image_9yEMyr .gap-gutter {border-bottom: 1px solid black;} </style></div><div id="shopify-section-template--21296459939910__rich_text_kayamR" class="shopify-section"><section 4625 class="overflow-hidden border-b-gridline border-gridline-color bg-scheme-background text-scheme-text snap-section" 4626 data-color-scheme="scheme5" 4627 x-data="{ visible: false }" 4628 x-intersect:enter.threshold.25="visible = true" 4629 x-intersect:leave="visible = false" 4630 data-animate="fade" 4631 :class="{ 'is-visible': visible }" 4632> 4633 <div class="px-section-horizontal-spacing py-section-vertical-spacing"> 4634 <div class="flex text-left justify-start"> 4635 <div class="w-full lg:w-full"><h2 class="font-heading text-heading-standard"> 4636 A closer look at our favourite products 4637 </h2><div class="rte mt-4 break-word"> 4638 4639 </div></div> 4640 </div> 4641 </div> 4642</section> 4643 4644 4645<style> #shopify-section-template--21296459939910__rich_text_kayamR .text-scheme-text {padding-left: 30px; padding-right: 30px;} </style></div><div id="shopify-section-template--21296459939910__custom_links_with_image_UnEXb9" class="shopify-section"><data-island 4646 class="grid grid-flow-row-dense grid-cols-1 gap-gutter overflow-hidden border-b-gridline border-gridline-color bg-gridline-color lg:grid-cols-12" 4647 role="banner" 4648 x-data="{ currentLink: '' }" 4649 data-color-scheme="scheme5" 4650> 4651 <div class="bg-scheme-background lg:col-start-7 lg:col-end-13 p-2 lg:p-4 h-full w-full "> 4652 <div class="relative min-h-full"><div class="hidden lg:block"> 4653 <image-with-placeholder> 4654 <img src="//printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=3000" alt="" srcset="//printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=200 200w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=350 350w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=450 450w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=750 750w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=850 850w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=960 960w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=1280 1280w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=1440 1440w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=1536 1536w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=1706 1706w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=1782 1782w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=1920 1920w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=2560 2560w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=2880 2880w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=3000 3000w" width="3000" height="2399" loading="lazy" class="peer/image block absolute inset-0 w-full h-full object-cover" sizes="(min-width: 1024px) 50vw, 100vw"> 4655 4656 <div 4657 class="absolute inset-0 h-full w-full bg-scheme-text opacity-[0.05] peer-[.is-complete]/image:opacity-0 no-js:hidden" 4658 ></div> 4659 4660</image-with-placeholder> 4661 4662 </div> 4663 <div class="block lg:hidden"> 4664 <image-with-placeholder class="relative"><img src="//printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=3000" alt="" srcset="//printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=200 200w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=350 350w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=450 450w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=750 750w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=850 850w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=960 960w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=1280 1280w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=1440 1440w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=1536 1536w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=1706 1706w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=1782 1782w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=1920 1920w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=2560 2560w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=2880 2880w, //printroom.co/cdn/shop/files/PrintRoomMay2024Image-6.jpg?v=1742440428&width=3000 3000w" width="3000" height="2399" loading="lazy" class="peer/image" sizes="(min-width: 1024px) 50vw, 100vw"> 4665 4666 <div 4667 class="absolute inset-0 h-full w-full bg-scheme-text opacity-[0.05] peer-[.is-complete]/image:opacity-0 no-js:hidden" 4668 ></div> 4669 4670</image-with-placeholder> 4671 4672 </div><div><div
4673 class="no-js:hidden" 4674 x-show="isLgBreakpoint() && currentLink === 'link_hydgl7'" 4675 x-transition:enter="transition-opacity duration-200" 4676 x-transition:enter-start="opacity-0" 4677 x-transition:enter-end="opacity-100" 4678 x-transition:leave="transition-opacity duration-200" 4679 x-transition:leave-start="opacity-100" 4680 x-transition:leave-end="opacity-0" 4681 style="display: none;" 4682 :aria-hidden="isLgBreakpoint() && currentLink === 'link_hydgl7'" 4683> 4684 4685 <image-with-placeholder> 4686 <img src="//printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=3000" alt="Custom Caps NZ as colour" srcset="//printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=200 200w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=350 350w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=450 450w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=750 750w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=850 850w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=960 960w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=1280 1280w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=1440 1440w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=1536 1536w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=1706 1706w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=1782 1782w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=1920 1920w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=2560 2560w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=2880 2880w, //printroom.co/cdn/shop/files/SURF_CAPS_2.jpg?v=1753826288&width=3000 3000w" width="3000" height="3750" loading="lazy" class="peer/image block absolute inset-0 w-full h-full object-cover" sizes="(min-width: 1024px) 50vw, 100vw"> 4687 4688</image-with-placeholder> 4689 4690 4691</div> 4692</div> 4693 </div> 4694 </div> 4695 4696 <div class="lg:col-span-6 relative flex bg-scheme-background px-section-horizontal-spacing py-section-vertical-spacing text-scheme-text items-center"> 4697 <div 4698 class="text-scale-n2 lg:text-scale-n6 text-left w-full" 4699 > 4700 <ul class="font-heading break-word inline-block max-w-full"><li > 4701 <div class=" relative inline-block max-w-full"> 4702 <a 4703 href="/pages/custom-caps" 4704 class="font-heading break-word hover:text-scheme-accent" 4705 x-on:mouseenter="currentLink = 'link_hydgl7'" 4706 x-on:mouseleave=" 4707 setTimeout( 4708 () => { 4709 if (currentLink == 'link_hydgl7') { 4710 currentLink = '' 4711 } 4712 }, 200) 4713 " 4714 x-on:focus="currentLink = 'link_hydgl7'" 4715 x-on:blur=" 4716 setTimeout( 4717 () => { 4718 if (currentLink == 'link_hydgl7') { 4719 currentLink = '' 4720 } 4721 }, 200) 4722 " 4723 > 4724 <span class="hover:underline">Custom caps</span> 4725 </a> 4726 </div> 4727 </li></ul> 4728 </div> 4729 </div> 4730</data-island> 4731 4732 4733<style> #shopify-section-template--21296459939910__custom_links_with_image_UnEXb9 .text-scheme-text {padding-left: 50px; padding-right: 50px;} #shopify-section-template--21296459939910__custom_links_with_image_UnEXb9 .gap-gutter {border-bottom: 1px solid black;} </style></div><div id="shopify-section-template--21296459939910__main" class="shopify-section blog-template"> 4734 4735 4736 <section 4737 class="blog border-b-gridline border-gridline-color bg-scheme-background text-scheme-text" 4738 data-color-scheme="scheme5" 4739 ><div class="border-b-gridline border-gridline-color bg-scheme-background px-section-horizontal-spacing pb-theme pt-theme-double text-scheme-text"> 4740 <h1 class="font-heading flex items-baseline gap-1.5 text-heading-feature"> 4741 Blog 4742 4743 </h1> 4744 </div> 4745 4746 <ol class="grid grid-cols-1 gap-gutter bg-gridline-color lg:grid-cols-3"> 4747<li class="group relative bg-scheme-background text-scheme-text"> 4748 <a class="absolute inset-0 z-10" href="/blogs/the-print-room-nz/fast-15-with-cat-mackenzie-everitt" 4749 ><span class="sr-only">Read more: Fast 15 with Cat Mackenzie Everitt</span></a 4750 > 4751 <div class="block h-full"><div class="full-h bg-scheme-background pt-2 px-section-horizontal-spacing lg:pt-4"> 4752 <div class="relative"> 4753 4754 4755 <image-with-placeholder 4756 class="relative w-full" 4757 style="padding-bottom: 100%;" 4758 ><img src="//printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=3000" alt="Fast 15 with Cat Mackenzie Everitt" srcset="//printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=200 200w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=350 350w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=450 450w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=750 750w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=850 850w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=960 960w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=1280 1280w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=1440 1440w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=1536 1536w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=1706 1706w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=1782 1782w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=1920 1920w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=2560 2560w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=2880 2880w, //printroom.co/cdn/shop/articles/Screen_Shot_2025-06-10_at_4.24.26_PM.png?v=1760939848&width=3000 3000w" width="3000" height="3006" loading="lazy" class="peer/image absolute inset-0 w-full h-full object-cover" sizes="(min-width: 1024px) calc(100vw / 3), 100vw"> 4759 <div 4760 class="absolute inset-0 h-full w-full bg-scheme-text opacity-[0.05] peer-[.is-complete]/image:opacity-0 no-js:hidden" 4761 ></div> 4762 </image-with-placeholder> 4763 4764 4765 </div> 4766 </div><div class="px-section-horizontal-spacing py-section-vertical-spacing"> 4767 <h2 class="font-heading break-word text-heading-secondary"> 4768 Fast 15 with Cat Mackenzie Everitt 4769 </h2><div class="rte mt-4"> 4770 1. What is your role at The Print Room? 4771 4772I work in the heat press department. I press all the Supacolour transfers! 4773 4774 2. Share a portrait of ... 4775</div> 4776 4777 4778 4779 4780 <div class="mt-4">
4781 <span 4782 class="theme-link group-hover:text-scheme-accent" 4783 href="/blogs/the-print-room-nz/fast-15-with-cat-mackenzie-everitt" 4784 aria-label="Read more: Fast 15 with Cat Mackenzie Everitt" 4785 >Read more 4786 </span> 4787 </div></div> 4788 </div> 4789 </li> 4790 4791<li class="group relative bg-scheme-background text-scheme-text"> 4792 <a class="absolute inset-0 z-10" href="/blogs/the-print-room-nz/what-makes-a-good-branded-tote-bag" 4793 ><span class="sr-only">Read more: What makes a good branded tote bag</span></a 4794 > 4795 <div class="block h-full"><div class="full-h bg-scheme-background pt-2 px-section-horizontal-spacing lg:pt-4"> 4796 <div class="relative"> 4797 4798 4799 <image-with-placeholder 4800 class="relative w-full" 4801 style="padding-bottom: 100%;" 4802 ><img src="//printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=3000" alt="What makes a good branded tote bag" srcset="//printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=200 200w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=350 350w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=450 450w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=750 750w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=850 850w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=960 960w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=1280 1280w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=1440 1440w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=1536 1536w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=1706 1706w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=1782 1782w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=1920 1920w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=2560 2560w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=2880 2880w, //printroom.co/cdn/shop/articles/Untitled_design_96_cb8beb0a-4919-497e-8aa4-5fcd7437aca9.png?v=1749609090&width=3000 3000w" width="3000" height="3000" loading="lazy" class="peer/image absolute inset-0 w-full h-full object-cover" sizes="(min-width: 1024px) calc(100vw / 3), 100vw"> 4803 <div 4804 class="absolute inset-0 h-full w-full bg-scheme-text opacity-[0.05] peer-[.is-complete]/image:opacity-0 no-js:hidden" 4805 ></div> 4806 </image-with-placeholder> 4807 4808 4809 </div> 4810 </div><div class="px-section-horizontal-spacing py-section-vertical-spacing"> 4811 <h2 class="font-heading break-word text-heading-secondary"> 4812 What makes a good branded tote bag 4813 </h2><div class="rte mt-4">If you're planning to create branded tote bags for your business or event, you're probably asking some practical questions. What materials work bes... 4814</div> 4815 4816 4817 4818 4819 <div class="mt-4"> 4820 <span 4821 class="theme-link group-hover:text-scheme-accent" 4822 href="/blogs/the-print-room-nz/what-makes-a-good-branded-tote-bag" 4823 aria-label="Read more: What makes a good branded tote bag" 4824 >Read more 4825 </span> 4826 </div></div> 4827 </div> 4828 </li> 4829 4830<li class="group relative bg-scheme-background text-scheme-text"> 4831 <a class="absolute inset-0 z-10" href="/blogs/the-print-room-nz/case-study-making-good-merch-with-parrotdog-brewery" 4832 ><span class="sr-only">Read more: Custom Merchandise Case Study: Wellington's Parrotdog Brewery</span></a 4833 > 4834 <div class="block h-full"><div class="full-h bg-scheme-background pt-2 px-section-horizontal-spacing lg:pt-4"> 4835 <div class="relative"> 4836 4837 4838 <image-with-placeholder 4839 class="relative w-full" 4840 style="padding-bottom: 100%;" 4841 ><img src="//printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=3000" alt="Custom Merchandise Case Study: Wellington's Parrotdog Brewery" srcset="//printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=200 200w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=350 350w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=450 450w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=750 750w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=850 850w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=960 960w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=1280 1280w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=1440 1440w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=1536 1536w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=1706 1706w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=1782 1782w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=1920 1920w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=2560 2560w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=2880 2880w, //printroom.co/cdn/shop/articles/parrotdog.webp?v=1760941869&width=3000 3000w" width="3000" height="3000" loading="lazy" class="peer/image absolute inset-0 w-full h-full object-cover" sizes="(min-width: 1024px) calc(100vw / 3), 100vw"> 4842 <div 4843 class="absolute inset-0 h-full w-full bg-scheme-text opacity-[0.05] peer-[.is-complete]/image:opacity-0 no-js:hidden" 4844 ></div> 4845 </image-with-placeholder> 4846 4847 4848 </div> 4849 </div><div class="px-section-horizontal-spacing py-section-vertical-spacing"> 4850 <h2 class="font-heading break-word text-heading-secondary"> 4851 Custom Merchandise Case Study: Wellington's Parrotdog Brewery 4852 </h2><div class="rte mt-4">Some partnerships in New Zealand's custom merchandise industry evolve naturally. What started as a few simple screen printing runs with Wellington'... 4853</div> 4854 4855 4856 4857 4858 <div class="mt-4">
4859 <span 4860 class="theme-link group-hover:text-scheme-accent" 4861 href="/blogs/the-print-room-nz/case-study-making-good-merch-with-parrotdog-brewery" 4862 aria-label="Read more: Custom Merchandise Case Study: Wellington's Parrotdog Brewery" 4863 >Read more 4864 </span> 4865 </div></div> 4866 </div> 4867 </li> 4868 4869<li class="group relative bg-scheme-background text-scheme-text"> 4870 <a class="absolute inset-0 z-10" href="/blogs/the-print-room-nz/how-much-does-it-cost-to-print-a-hoodie-for-your-brand" 4871 ><span class="sr-only">Read more: How much does it cost to print a hoodie for your brand</span></a 4872 > 4873 <div class="block h-full"><div class="full-h bg-scheme-background pt-2 px-section-horizontal-spacing lg:pt-4"> 4874 <div class="relative"> 4875 4876 4877 <image-with-placeholder 4878 class="relative w-full" 4879 style="padding-bottom: 100%;" 4880 ><img src="//printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=3000" alt="How much does it cost to print a hoodie for your brand" srcset="//printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=200 200w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=350 350w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=450 450w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=750 750w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=850 850w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=960 960w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=1280 1280w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=1440 1440w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=1536 1536w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=1706 1706w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=1782 1782w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=1920 1920w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=2560 2560w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=2880 2880w, //printroom.co/cdn/shop/articles/Untitled_design_93_7416da8d-8684-4d81-b03a-11744ea55d5a.png?v=1760926440&width=3000 3000w" width="3000" height="3000" loading="lazy" class="peer/image absolute inset-0 w-full h-full object-cover" sizes="(min-width: 1024px) calc(100vw / 3), 100vw"> 4881 <div 4882 class="absolute inset-0 h-full w-full bg-scheme-text opacity-[0.05] peer-[.is-complete]/image:opacity-0 no-js:hidden" 4883 ></div> 4884 </image-with-placeholder> 4885 4886 4887 </div> 4888 </div><div class="px-section-horizontal-spacing py-section-vertical-spacing"> 4889 <h2 class="font-heading break-word text-heading-secondary"> 4890 How much does it cost to print a hoodie for your brand 4891 </h2><div class="rte mt-4">Creating custom hoodies for your brand is a smart move. They're worn year-round, appeal to a wide range of people, and offer a great canvas for you... 4892</div> 4893 4894 4895 4896 4897 <div class="mt-4">
4898 <span 4899 class="theme-link group-hover:text-scheme-accent" 4900 href="/blogs/the-print-room-nz/how-much-does-it-cost-to-print-a-hoodie-for-your-brand" 4901 aria-label="Read more: How much does it cost to print a hoodie for your brand" 4902 >Read more 4903 </span> 4904 </div></div> 4905 </div> 4906 </li> 4907 4908<li class="group relative bg-scheme-background text-scheme-text"> 4909 <a class="absolute inset-0 z-10" href="/blogs/the-print-room-nz/10-creative-marketing-swag-ideas-worth-the-spend" 4910 ><span class="sr-only">Read more: 10 Creative marketing swag ideas worth the spend</span></a 4911 > 4912 <div class="block h-full"><div class="full-h bg-scheme-background pt-2 px-section-horizontal-spacing lg:pt-4"> 4913 <div class="relative"> 4914 4915 4916 <image-with-placeholder 4917 class="relative w-full" 4918 style="padding-bottom: 100%;" 4919 ><img src="//printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=3000" alt="Creative marketing swag ideas including custom caps, tote bags, and promotional products from The Print Room NZ" srcset="//printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=200 200w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=350 350w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=450 450w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=750 750w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=850 850w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=960 960w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=1280 1280w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=1440 1440w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=1536 1536w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=1706 1706w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=1782 1782w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=1920 1920w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=2560 2560w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=2880 2880w, //printroom.co/cdn/shop/articles/Untitled_design_92_eb0c8c77-e416-487f-a7b0-045d3601742b.png?v=1761532382&width=3000 3000w" width="3000" height="3000" loading="lazy" class="peer/image absolute inset-0 w-full h-full object-cover" sizes="(min-width: 1024px) calc(100vw / 3), 100vw"> 4920 <div 4921 class="absolute inset-0 h-full w-full bg-scheme-text opacity-[0.05] peer-[.is-complete]/image:opacity-0 no-js:hidden" 4922 ></div> 4923 </image-with-placeholder> 4924 4925 4926 </div> 4927 </div><div class="px-section-horizontal-spacing py-section-vertical-spacing"> 4928 <h2 class="font-heading break-word text-heading-secondary"> 4929 10 Creative marketing swag ideas worth the spend 4930 </h2><div class="rte mt-4">Marketing swag has moved beyond giveaways and gimmicks.Today, the most impactful merchandise reflects your brandâs values, offers something useful,... 4931</div> 4932 4933 4934 4935 4936 <div class="mt-4">
4937 <span 4938 class="theme-link group-hover:text-scheme-accent" 4939 href="/blogs/the-print-room-nz/10-creative-marketing-swag-ideas-worth-the-spend" 4940 aria-label="Read more: 10 Creative marketing swag ideas worth the spend" 4941 >Read more 4942 </span> 4943 </div></div> 4944 </div> 4945 </li> 4946 4947<li class="group relative bg-scheme-background text-scheme-text"> 4948 <a class="absolute inset-0 z-10" href="/blogs/the-print-room-nz/how-to-create-merchandise-for-your-business-that-builds-loyalty-and-sells-fast-7" 4949 ><span class="sr-only">Read more: How to create merchandise for your business that builds loyalty and sells fast</span></a 4950 > 4951 <div class="block h-full"><div class="full-h bg-scheme-background pt-2 px-section-horizontal-spacing lg:pt-4"> 4952 <div class="relative"> 4953 4954 4955 <image-with-placeholder 4956 class="relative w-full" 4957 style="padding-bottom: 100%;" 4958 ><img src="//printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=3000" alt="How to create merchandise for your business that builds loyalty and sells fast" srcset="//printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=200 200w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=350 350w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=450 450w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=750 750w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=850 850w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=960 960w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=1280 1280w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=1440 1440w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=1536 1536w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=1706 1706w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=1782 1782w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=1920 1920w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=2560 2560w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=2880 2880w, //printroom.co/cdn/shop/articles/Untitled_design_91_d88d86fc-18da-4f5d-b4b4-37c5fa60a848.png?v=1761869320&width=3000 3000w" width="3000" height="3000" loading="lazy" class="peer/image absolute inset-0 w-full h-full object-cover" sizes="(min-width: 1024px) calc(100vw / 3), 100vw"> 4959 <div 4960 class="absolute inset-0 h-full w-full bg-scheme-text opacity-[0.05] peer-[.is-complete]/image:opacity-0 no-js:hidden" 4961 ></div> 4962 </image-with-placeholder> 4963 4964 4965 </div> 4966 </div><div class="px-section-horizontal-spacing py-section-vertical-spacing"> 4967 <h2 class="font-heading break-word text-heading-secondary"> 4968 How to create merchandise for your business that builds loyalty and sells fast 4969 </h2><div class="rte mt-4">Knowing how to create merchandise for your business is more important than ever. Done thoughtfully, merchandise strengthens loyalty, builds brand p... 4970</div> 4971 4972 4973 4974 4975 <div class="mt-4">
4976 <span 4977 class="theme-link group-hover:text-scheme-accent" 4978 href="/blogs/the-print-room-nz/how-to-create-merchandise-for-your-business-that-builds-loyalty-and-sells-fast-7" 4979 aria-label="Read more: How to create merchandise for your business that builds loyalty and sells fast" 4980 >Read more 4981 </span> 4982 </div></div> 4983 </div> 4984 </li> 4985 4986</ol> 4987 4988 4989 4990 <div 4991 class="border-t-gridline border-gridline-color bg-scheme-background px-section-horizontal-spacing pb-theme-double pt-theme text-right text-sm text-scheme-text md:text-base" 4992 data-color-scheme="scheme5" 4993> 4994 <ul class="pagination flex items-center"> 4995 <li class="mr-auto w-28 text-left md:w-1/3"> 4996 4997 </li><li 4998 class="active hidden border-b-text border-scheme-text px-2 py-1 md:inline-block" 4999 aria-current="page" 5000 > 5001 <span class="sr-only">page</span> 1 5002 </li><li class="hidden md:inline-block"> 5003 <a 5004 class="inline-block border-b-text border-transparent px-2 py-1" 5005 href="/blogs/the-print-room-nz?page=2" 5006 > 5007 <span class="sr-only">page</span> 2 5008 </a> 5009 </li><li class="hidden md:inline-block"> 5010 <a 5011 class="inline-block border-b-text border-transparent px-2 py-1" 5012 href="/blogs/the-print-room-nz?page=3" 5013 > 5014 <span class="sr-only">page</span> 3 5015 </a> 5016 </li><li class="hidden border-b-text border-transparent px-2 py-1 md:inline-block"> 5017 <span class="sr-only">page</span> … 5018 </li><li class="hidden md:inline-block"> 5019 <a 5020 class="inline-block border-b-text border-transparent px-2 py-1" 5021 href="/blogs/the-print-room-nz?page=24" 5022 > 5023 <span class="sr-only">page</span> 24 5024 </a> 5025 </li><li class="ml-auto w-28 text-right md:w-1/3"> 5026 5027 <a 5028 class="theme-link hover:text-scheme-accent" 5029 href="/blogs/the-print-room-nz?page=2" 5030 >Next</a> 5031 5032 </li> 5033 </ul> 5034</div> 5035 5036 5037 </section> 5038 5039 5040</div>
5040<script data-locksmith> 5041 var load = function () { 5042 5043 if (document.querySelectorAll('.locksmith-manual-trigger').length > 0) { 5044 Locksmith.ping(); 5045 } 5046 5047 5048 Locksmith.util.on('submit', 'locksmith-resource-form', function (event) { 5049 event.preventDefault(); 5050 var data = Locksmith.util.serializeForm(event.target); 5051 var options = { spinner: false, container: 'locksmith-content' }; 5052 // a form rendered inline (section replacement) must keep that context 5053 // on resubmit: same enclosing container (there may be several on the 5054 // page), and no layout classes or cancel affordance in the re-render 5055 var inlineContainer = event.target.closest && event.target.closest('[id^="locksmith-content"]'); 5056 if (inlineContainer) { 5057 options.container = inlineContainer; 5058 } 5059 if (event.target.getAttribute('data-locksmith-inline') === 'true') { 5060 options.include_layout_classes = false; 5061 } 5062 Locksmith.postResource(data, options); 5063 }); 5064 5065 Locksmith.util.on('click', 'locksmith-manual-trigger', function (event) { 5066 event.preventDefault(); 5067 Locksmith.postResource({}, { spinner: true, container: document }); 5068 }); 5069 5070 Locksmith.submitPasscode = function (passcode) { 5071 Locksmith.postResource( 5072 { passcode: passcode }, 5073 { spinner: false, container: 'locksmith-content' } 5074 ); 5075 }; 5076 }; 5077 5078 if (typeof Locksmith !== 'undefined') { 5079 load(); 5080 } else { 5081 window.addEventListener('load', load); 5082 } 5083 </script>
5083 5084 </main> 5085 5086 <!-- BEGIN sections: footer-group --> 5087<div id="shopify-section-sections--21296457154630__176903720293717250" class="shopify-section shopify-section-group-footer-group"> 5088 5089 5090 5091</div><div id="shopify-section-sections--21296457154630__footer" class="shopify-section shopify-section-group-footer-group"><footer 5092 class="bg-scheme-background text-scheme-text" 5093 data-color-scheme="scheme2" 5094 data-theme-footer 5095> 5096 5097 <section 5098 class="border-b-gridline border-gridline-color bg-scheme-background py-section-vertical-spacing text-scheme-text" 5099 data-color-scheme="scheme2" 5100> 5101 <div class="justify-center px-section-horizontal-spacing lg:flex lg:items-center lg:justify-between"> 5102 <div class="text-base"> 5103 5104 5105 5106 <div class="[&_a[href]]:underline [&_a[href]]:hover:text-scheme-accent"> 5107 <h2>We occasionally send out <strong>newsletters</strong>. You should sign up â</h2> 5108 </div> 5109 5110 </div> 5111 5112 <div class="mt-theme-half lg:mt-0"> 5113 <form method="post" action="/contact#Contact-sections--21296457154630__footer" id="Contact-sections--21296457154630__footer" accept-charset="UTF-8" class="contact-form"><input type="hidden" name="form_type" value="customer" /><input type="hidden" name="utf8" value="â" /> 5114 5115 5116 5117 <input type="hidden" name="contact[tags]" value="newsletter"> 5118 <div class="items-end lg:ml-4 lg:flex"> 5119 <label class="sr-only" for="Email-sections--21296457154630__footer">Email address</label> 5120 <input 5121 type="email" 5122 class="font-body block w-full border-b-text border-current bg-transparent pb-1 leading-[inherit] placeholder-current" 5123 name="contact[email]" 5124 id="Email-sections--21296457154630__footer" 5125 value="" 5126 placeholder="Email address" 5127 autocorrect="off" 5128 autocapitalize="off" 5129 > 5130 <button 5131 class="theme-link mt-2 shrink-0 py-1 leading-[inherit] hover:text-scheme-accent lg:ml-2 lg:mt-0" 5132 type="submit" 5133 name="commit" 5134 id="Subscribe" 5135 >Subscribe</button> 5136 </div> 5137 5138 </form> 5139 </div> 5140 </div> 5141</section> 5142 5143 5144 5145 <div class="border-b-gridline border-gridline-color"> 5146 <div 5147 class="grid lg:grid-cols-var bg-gridline-color" 5148 style="--grid-cols: 12;" 5149 ><div 5150 class="break-word bg-scheme-background px-section-horizontal-spacing py-section-vertical-spacing text-scheme-text lg:col-span-var" 5151 style="--col-span: 3;" 5152 5153 ><div class="inline-block text-left"> 5154 5155 5156 <h2 class="font-heading mb-4 text-base"> 5157 Explore 5158 </h2> 5159 5160 <ul class="list-none space-y-1"> 5161 5162<li> 5163 <a 5164 href="/pages/all-products" 5165 class="hover:text-scheme-accent" 5166 > 5167 Products 5168 </a> 5169 </li> 5170 5171<li> 5172 <a 5173 href="/pages/services" 5174 class="hover:text-scheme-accent" 5175 > 5176 Services 5177 </a> 5178 </li> 5179 5180<li> 5181 <a 5182 href="https://www.theprintroom.nz/apps/order-tracker" 5183 class="hover:text-scheme-accent" 5184 > 5185 Track your order 5186 </a> 5187 </li> 5188 5189<li> 5190 <a 5191 href="/pages/responsibility" 5192 class="hover:text-scheme-accent" 5193 > 5194 Responsibility 5195 </a> 5196 </li> 5197 5198<li> 5199 <a 5200 href="/pages/about-print-room" 5201 class="hover:text-scheme-accent" 5202 > 5203 About us 5204 </a> 5205 </li> 5206 5207 </ul> 5208 </div></div><div 5209 class="break-word bg-scheme-background px-section-horizontal-spacing py-section-vertical-spacing text-scheme-text lg:col-span-var" 5210 style="--col-span: 3;" 5211 5212 ><div class="inline-block text-left"> 5213 5214 5215 <h2 class="font-heading mb-4 text-base"> 5216 Helpful stuff 5217 </h2> 5218 5219 <ul class="list-none space-y-1"> 5220 5221<li> 5222 <a 5223 href="/pages/screen-printing-faqs-the-print-room-quality-screen-printing-garment-design-blank-clothing" 5224 class="hover:text-scheme-accent" 5225 > 5226 FAQs 5227 </a> 5228 </li> 5229 5230<li> 5231 <a 5232 href="https://help.theprintroom.nz/" 5233 class="hover:text-scheme-accent" 5234 > 5235 Resource hub 5236 </a> 5237 </li> 5238 5239<li> 5240 <a 5241 href="/pages/catalogue" 5242 class="hover:text-scheme-accent" 5243 > 5244 Catalogues 5245 </a> 5246 </li> 5247 5248<li> 5249 <a 5250 href="/blogs/the-print-room-nz" 5251 class="hover:text-scheme-accent" 5252 > 5253 Blogs 5254 </a> 5255 </li> 5256 5257<li> 5258 <a 5259 href="/pages/policies" 5260 class="hover:text-scheme-accent" 5261 >
5262 Policies & T&Cs 5263 </a> 5264 </li> 5265 5266 </ul> 5267 </div></div><div 5268 class="break-word bg-scheme-background px-section-horizontal-spacing py-section-vertical-spacing text-scheme-text lg:col-span-var" 5269 style="--col-span: 3;" 5270 5271 > 5272 <h2 class="font-heading break-word mb-4 text-base"> 5273 Get in touch - NZ 5274 </h2> 5275 5276<div class="rte"> 5277 <p>21 Grosvenor St, Kensington, Dunedin,<br/>9012<br/>[email protected]<br/>NZ: 03 425 9694</p> 5278 </div></div><div 5279 class="break-word bg-scheme-background px-section-horizontal-spacing py-section-vertical-spacing text-scheme-text lg:col-span-var" 5280 style="--col-span: 3;" 5281 5282 > 5283 <h2 class="font-heading break-word mb-4 text-base"> 5284 Get in touch - AUS 5285 </h2> 5286 5287<div class="rte"> 5288 <p>The Commons, 10â20 Gwynne St, Cremorne VIC 3121<br/>[email protected]<br/>+61 (0) 451 701 385</p> 5289 </div></div></div> 5290 </div> 5291 5292 5293 <div> 5294 <div class="px-section-horizontal-spacing py-section-vertical-spacing lg:flex lg:flex-wrap lg:items-center lg:justify-between"> 5295 <div class="mb-4 space-y-2 text-sm lg:mb-0 lg:flex-1"> 5296 <p> 5297 © 2026, 5298 <a href="/" title="">The Print Room</a>. 5299 </p> 5300 <ul class="flex flex-wrap gap-1 text-sm [&>li:last-child]:after:content-none [&>li]:after:content-['\00B7']"> 5301 <li> 5302 5303 </li></ul> 5304 </div> 5305 5306</div> 5307 </div> 5308</footer> 5309 5310 5311 <style> 5312 .footer-logo-image { 5313 display: block; 5314 max-width: px; 5315 } 5316 </style> 5317 5318 5319 5320<style> #shopify-section-sections--21296457154630__footer .text-base {font-size: 20px;} #shopify-section-sections--21296457154630__footer .font-heading {text-decoration: underline;} #shopify-section-sections--21296457154630__footer .inline-block {line-height: 1.7;} #shopify-section-sections--21296457154630__footer /*.bg-scheme-background {border-top: 1px solid black;}*/.text-scheme-text {border-bottom: 1px solid black;} </style></div> 5321<!-- END sections: footer-group --><!-- BEGIN sections: overlay-group --> 5322<div id="shopify-section-sections--21296457220166__promo-popup" class="shopify-section shopify-section-group-overlay-group contents"> 5323 5324 5325</div><div id="shopify-section-sections--21296457220166__age-check" class="shopify-section shopify-section-group-overlay-group contents"> 5326</div><div id="shopify-section-sections--21296457220166__privacy-banner" class="shopify-section shopify-section-group-overlay-group contents"> 5327 5328 5329</div> 5330<!-- END sections: overlay-group --> 5331 5332 <div 5333 id="screenreader-announce" 5334 class="sr-only" 5335 aria-live="polite" 5336 role="status" 5337 ></div> 5338 5339 <ul hidden> 5340 <li id="a11y-refresh-page-message"> 5341 Choosing a selection results in a full page refresh. 5342 </li> 5343 <li id="a11y-selection-message"> 5344 Press the space key then arrow keys to make a selection. 5345 </li> 5346 </ul> 5347 5348 5349 <data-island 5350 role="complementary" 5351 aria-labelledby="left-drawer-slot" 5352 x-data 5353 on="load" 5354> 5355 <template x-teleport="body"> 5356 <div 5357 x-show="$store.modals.leftDrawer.open" 5358 @keydown.escape.prevent.stop="$store.modals.close('leftDrawer')" 5359 @click="$store.modals.close('leftDrawer')" 5360 class="fixed inset-0 z-110" 5361 data-color-scheme="scheme1" 5362 id="modals-leftDrawer" 5363 > 5364 <div 5365 @click.stop 5366 x-show="$store.modals.leftDrawer.open" 5367 x-transition:enter="duration-300 motion-reduce:duration-0 outline-0" 5368 x-transition:enter-start="opacity-0 -translate-x-full" 5369 x-transition:leave="duration-300 motion-reduce:duration-0 outline-0" 5370 x-transition:leave-end="-translate-x-full" 5371 x-trap.noscroll.inert="$store.modals.leftDrawer.open" 5372 class="mr-auto h-full w-11/12 max-w-md transform overflow-y-auto border-r-gridline border-gr
5372idline-color bg-scheme-background text-scheme-text transition-transform" 5373 id="left-drawer-slot" 5374 role="dialog" 5375 @left-drawer-is-open.window="setTimeout(() => { $el.setAttribute('aria-modal', 'true') }, 120)" 5376 @left-drawer-is-closed.window="setTimeout(() => { $el.removeAttribute('aria-modal') }, 120)" 5377 :aria-label="getModalLabel('leftDrawer', $el)" 5378 tabindex="-1" 5379 > 5380 <!-- Modal content is teleported here --> 5381 </div> 5382 </div> 5383 </template> 5384</data-island> 5385<data-island 5386 role="complementary" 5387 aria-labelledby="right-drawer-slot" 5388 x-data 5389 on="load" 5390> 5391 <template x-teleport="body"> 5392 <div 5393 x-show="$store.modals.rightDrawer.open" 5394 @keydown.escape.prevent.stop="$store.modals.close('rightDrawer')" 5395 @click="$store.modals.close('rightDrawer')" 5396 class="fixed inset-0 z-110" 5397 style="background: rgba(208,208,208,0.2); backdrop-filter: blur(1.5px); -webkit-backdrop-filter: blur(1.5px);" 5398 data-color-scheme="scheme1" 5399 id="modals-rightDrawer" 5400 > 5401 <div 5402 @click.stop 5403 x-show="$store.modals.rightDrawer.open" 5404 x-transition:enter="duration-300 motion-reduce:duration-0 outline-0" 5405 x-transition:enter-start="translate-x-full" 5406 x-transition:leave="duration-300 motion-reduce:duration-0 outline-0" 5407 x-transition:leave-end="translate-x-full" 5408 x-trap.noscroll.inert="$store.modals.rightDrawer.open" 5409 class="ml-auto h-full w-11/12 max-w-lg transform overflow-y-auto bg-scheme-background text-scheme-text" 5410 style="border-left: 2px solid black;" 5411 id="right-drawer-slot" 5412 role="dialog" 5413 @right-drawer-is-open.window="setTimeout(() => { $el.setAttribute('aria-modal', 'true') }, 120)" 5414 @right-drawer-is-closed.window="setTimeout(() => { $el.removeAttribute('aria-modal') }, 120)" 5415 :aria-label="getModalLabel('rightDrawer', $el)" 5416 tabindex="-1" 5417 > 5418 <!-- Modal content is teleported here --> 5419 </div> 5420 </div> 5421 </template> 5422</data-island> 5423<data-island 5424 role="complementary" 5425 aria-labelledby="quick-buy-drawer-slot-container" 5426 x-data 5427 on="load" 5428> 5429 <template x-teleport="body"> 5430 <div 5431 x-show="$store.modals.quickBuyDrawer.open" 5432 @keydown.escape.prevent.stop="$store.modals.close('quickBuyDrawer')" 5433 @click="$store.modals.close('quickBuyDrawer')" 5434 class="fixed inset-0 z-110 flex lg:block" 5435 data-color-scheme="scheme1" 5436 id="modals-quickBuyDrawer" 5437 > 5438 <div 5439 @click.stop 5440 id="quick-buy-drawer-slot-container" 5441 x-show="$store.modals.quickBuyDrawer.open" 5442 x-transition:enter="duration-300 motion-reduce:duration-0 outline-0" 5443 x-transition:enter-start="max-lg:translate-y-full lg:translate-x-full" 5444 x-transition:leave="duration-300 motion-reduce:duration-0 outline-0" 5445 x-transition:leave-end="max-lg:translate-y-full lg:translate-x-full" 5446 x-trap.noscroll.inert="$store.modals.quickBuyDrawer.open" 5447 class="mt-auto h-auto w-full transform border-gridline-color bg-scheme-background text-scheme-text lg:ml-auto lg:h-full lg:w-11/12 lg:max-w-md lg:overflow-y-auto lg:border-l-gridline" 5448 role="dialog" 5449 @quick-buy-drawer-is-open.window="setTimeout(() => { $el.setAttribute('aria-modal', 'true') }, 120)" 5450 @quick-buy-drawer-is-closed.window="setTimeout(() => { $el.removeAttribute('aria-modal') }, 120)" 5451 :aria-label="getModalLabel('quickBuyDrawer', document.getElementById('quick-buy-drawer-slot'))" 5452 tabindex="-1" 5453 > 5454 <div class="sticky top-0 z-1 flex items-center justify-between border-y-gridline border-gridline-color bg-scheme-background px-section-horizontal-spacing py-4 lg:border-t-0"> 5455 <div> 5456 Choose options 5457 </div> 5458 <button 5459 @click.prevent="$store.modals.close('quickBuyDrawer')" 5460 class="absolute right-0 top-0 block h-full" 5461 type="button" 5462 > 5463 <span class="sr-only">Close</span> 5464 <div class="my-auto mr-section-horizontal-spacing h-6 w-6"> 5465 <svg 5466 class="theme-icon" 5467 xmlns="http://www.w3.org/2000/svg" 5468 fill="none" 5469 viewBox="0 0 24 24" 5470> 5471 <path stroke="currentColor" d="m1.5 1.5 21 21m0-21-21 21" vector-effect="non-scaling-stroke"/> 5472</svg> 5473 5474 </div> 5475 </button> 5476 </div> 5477 <div 5478 id="quick-buy-drawer-slot" 5479 class="max-lg:h-fit max-lg:max-h-[65vh] max-lg:overflow-y-auto" 5480 ></div> 5481 </div> 5482 </div> 5483 </template> 5484</data-island> 5485<data-island 5486 x-data 5487 on="load" 5488> 5489 <template x-teleport="body"> 5490 <div 5491 x-show="$store.modals.promo.open" 5492 class="pointer-events-none fixed inset-0 z-110" 5493 id="modals-promo" 5494 > 5495 <div 5496 x-show="$store.modals.promo.open" 5497 class="flex h-full w-full" 5498 > 5499 <div 5500 x-show="$store.modals.promo.open" 5501 x-transition:enter="transition duration-300 motion-reduce:duration-0 delay-75 outline-0" 5502 x-transition:enter-start="translate-y-full" 5503 x-transition:enter-end="translate-y-0" 5504 x-transition:leave="transition duration-300 motion-reduce:duration-0 outline-0" 5505 x-transition:leave-start="translate-y-0" 5506 x-transition:leave-end="translate-y-full" 5507 class="pointer-events-auto relative bottom-0 left-0 right-0 top-auto mt-auto w-full overflow-y-auto" 5508 id="promo-slot" 5509 role="dialog" 5510 @promo-is-open.window="setTimeout(() => { $el.setAttribute('aria-modal', 'true') }, 120)" 5511 @promo-is-closed.window="setTimeout(() => { $el.removeAttribute('aria-modal') }, 120)" 5512 :aria-label="getModalLabel('promo', $el)" 5513 tabindex="-1" 5514 > 5515 <!-- Modal content is teleported here --> 5516 </div> 5517 </div> 5518 </div> 5519 </template> 5520</data-island> 5521<data-island x-data on="load"> 5522 <template x-teleport="body"> 5523 <div 5524 x-show="$store.modals.popup.open" 5525 @keydown.escape.prevent.stop="$store.modals.close('popup')" 5526 @click="$store.modals.close('popup')" 5527 class="fixed inset-0 z-110 p-8 lg:p-24" 5528 data-color-scheme="scheme1" 5529 id="modals-popup" 5530 > 5531 <div 5532 x-show="$store.modals.popup.open" 5533 class="fixed inset-0 bg-transparent" 5534 > 5535 <!-- Overlay --> 5536 </div> 5537 <div 5538 x-show="$store.modals.popup.open" 5539 class="flex h-full w-full" 5540 > 5541 <div 5542 @click.stop 5543 x-show="$store.modals.popup.open" 5544 x-trap.noscroll.inert="$store.modals.popup.open" 5545 class="relative m-auto max-h-full w-full max-w-2xl overflow-y-auto border-gr
5545idline border-gridline-color bg-scheme-background text-scheme-text" 5546 id="popup-slot" 5547 role="dialog" 5548 @popup-is-open.window="setTimeout(() => { $el.setAttribute('aria-modal', 'true') }, 120)" 5549 @popup-is-closed.window="setTimeout(() => { $el.removeAttribute('aria-modal') }, 120)" 5550 :aria-label="getModalLabel('popup', $el)" 5551 tabindex="-1" 5552 > 5553 <!-- Modal content is teleported here --> 5554 </div> 5555 </div> 5556 </div> 5557 </template> 5558</data-island> 5559<data-island x-data on="load"> 5560 <template x-teleport="body"> 5561 <div 5562 x-show="$store.modals.modal.open" 5563 x-transition:enter="transition ease-out duration-300" 5564 x-transition:enter-start="opacity-0" 5565 x-transition:enter-end="opacity-100" 5566 x-transition:leave="transition ease-in duration-200" 5567 x-transition:leave-start="opacity-100" 5568 x-transition:leave-end="opacity-0" 5569 @keydown.escape.prevent.stop="$store.modals.close('modal')" 5570 @click="$store.modals.close('modal')" 5571 class="fixed inset-0 z-110 bg-black/40 backdrop-blur-md" 5572 style="backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);" 5573 data-color-scheme="scheme1" 5574 id="modals-modal" 5575 > 5576 <div 5577 x-show="$store.modals.modal.open" 5578 class="flex h-full w-full justify-center p-2 sm:p-4 md:p-6 lg:p-8" 5579 :class="$store.modals.modal.contents === 'quoteRequest' ? 'items-stretch sm:items-center sm:p-6 lg:p-10' : 'items-center'" 5580 > 5581 <div 5582 @click.stop 5583 x-show="$store.modals.modal.open" 5584 x-transition:enter="transition ease-out duration-300" 5585 x-transition:enter-start="opacity-0 scale-95 translate-y-4" 5586 x-transition:enter-end="opacity-100 scale-100 translate-y-0" 5587 x-transition:leave="transition ease-in duration-200" 5588 x-transition:leave-start="opacity-100 scale-100 translate-y-0" 5589 x-transition:leave-end="opacity-0 scale-95 translate-y-4" 5590 x-trap.inert="$store.modals.modal.open" 5591 class="relative flex w-full flex-col overflow-hidden text-scheme-text" 5592 :class="$store.modals.modal.contents === 'quoteRequest' 5593 ? 'max-w-2xl max-h-[100dvh] sm:max-h-[calc(100dvh-48px)] rounded-none sm:rounded-[24px]' 5594 : 'max-w-lg sm:max-w-xl md:max-w-2xl lg:max-w-3xl max-h-[calc(100vh-24px)] sm:max-h-[calc(100vh-48px)] md:max-h-[calc(100vh-64px)] lg:max-h-[calc(100vh-96px)] rounded-[20px]'" 5595 style="background: #FBFBF6; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);" 5596 id="modal-slot" 5597 role="dialog" 5598 @modal-is-open.window="setTimeout(() => { $el.setAttribute('aria-modal', 'true') }, 120)" 5599 @modal-is-closed.window="setTimeout(() => { $el.removeAttribute('aria-modal') }, 120)" 5600 :aria-label="getModalLabel('modal', $el)" 5601 tabindex="-1" 5602 > 5603 <!-- Modal content is teleported here --> 5604 </div> 5605 </div> 5606 </div> 5607 </template> 5608</data-island> 5609 5610 5611 5612 5613 5614 5615 <style> 5616 /* Push chatbot left when quote drawer is open */ 5617 body:has([data-favorites-drawer]:not([style*="display: none"])) #tidio-chat, 5618 body:has([data-favorites-drawer]:not([style*="display: none"])) .tidio-chat, 5619 body:has([data-favorites-drawer]:not([style*="display: none"])) iframe[title*="chat" i], 5620 body:has([data-favorites-drawer]:not([style*="display: none"])) iframe[title*="tidio" i], 5621 body:has([data-favorites-drawer]:not([style*="display: none"])) [class*="chat-widget"], 5622 body:has([data-favorites-drawer]:not([style*="display: none"])) [id*="chat-widget"] { 5623 transform: translateX(-464px) !important; 5624 transition: transform 0.3s ease !important; 5625 } 5626 5627 /* Push AI chatbot trigger left when drawer is open - desktop only */ 5628 @media (min-width: 768px) { 5629 body:has([data-favorites-drawer]:not([style*="display: none"])) .ai-chatbot__trigger { 5630 right: calc(32rem + 24px) !important; 5631 transition: right 0.3s ease, transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease !important; 5632 } 5633 } 5634 5635 /* Override theme color scheme â force black text throughout drawer */ 5636 [data-favorites-drawer] { 5637 --color-scheme-text: 0 0 0 !important; 5638 } 5639 [data-favorites-drawer] h2 { 5640 letter-spacing: 0px !important; 5641 } 5642 @media (max-width: 639px) { 5643 [data-favorites-drawer] h2 { 5644 text-align: left !important; 5645 } 5646 } 5647 [data-favorites-drawer] *, 5648 [data-favorites-drawer] h2, 5649 [data-favorites-drawer] p, 5650 [data-favorites-drawer] a, 5651 [data-favorites-drawer] span, 5652 [data-favorites-drawer] div, 5653 [data-favorites-drawer] li { 5654 color: black !important; 5655 } 5656 5657 /* Close button stays muted */ 5658 [data-favorites-drawer] button[aria-label*="Close"], 5659 [data-favorites-drawer] button[aria-label*="Close"] svg { 5660 color: rgba(0,0,0,0.4) !important; 5661 } 5662 5663 /* Remove button stays muted, red on hover */ 5664 [data-favorites-drawer] button[aria-label*="Remove"],
5665 [data-favorites-drawer] button[aria-label*="Remove"] svg { 5666 color: rgba(0,0,0,0.3) !important; 5667 } 5668 [data-favorites-drawer] button[aria-label*="Remove"]:hover, 5669 [data-favorites-drawer] button[aria-label*="Remove"]:hover svg { 5670 color: #ef4444 !important; 5671 } 5672 5673 /* Product dividers â solid black */ 5674 [data-favorites-drawer] li { 5675 border-bottom: 1px solid black !important; 5676 } 5677 [data-favorites-drawer] li:last-child { 5678 border-bottom: none !important; 5679 } 5680 5681 /* Footer dividers â solid black */ 5682 [data-favorites-drawer] .drawer-divider { 5683 border-top: 1px solid black !important; 5684 } 5685 5686 /* Start quote button â visible border */ 5687 [data-favorites-drawer] .drawer-cta-btn { 5688 border: 2px solid #4B4D72 !important; 5689 color: #4B4D72 !important; 5690 } 5691 [data-favorites-drawer] .drawer-cta-btn:hover { 5692 background-color: #4B4D72 !important; 5693 color: #fff !important; 5694 } 5695</style> 5696 5697<data-island 5698 x-data="FavoritesDrawer" 5699 on="idle" 5700 x-cloak 5701> 5702 <div> 5703 <template x-teleport="#right-drawer-slot"> 5704 <div 5705 class="flex h-full flex-col overflow-hidden" style="background: #FBFBF6;" 5706 :data-modal-label="`Your current project - ${$store.favorites.countWithText()}`" 5707 x-show="$store.modals.rightDrawer.contents === 'favorites'" 5708 data-favorites-drawer 5709 ><div class="relative shrink-0" style="padding: 80px 40px 24px;"> 5710 <button 5711 @click.prevent="$store.modals.close('favorites')" 5712 class="absolute rounded-full p-2 transition-colors" 5713 style="top: 19px; right: 19px; color: rgba(0,0,0,0.4);" 5714 type="button" 5715 > 5716 <span class="sr-only">Close project drawer</span> 5717 <svg width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-width="2" d="m6 6 12 12m0-12-12 12"/></svg> 5718 </button> 5719 <h2 id="FavoritesTitle" tabindex="-1" class="font-bold" style="font-size: 41px; letter-spacing: 0px; line-height: 1; color: black; text-align: center;"> 5720 Your current project 5721 </h2> 5722 </div><div class="flex-1 overflow-y-auto" style="padding: 20px 40px; min-height: 0;"><template x-if="$store.favorites.count === 0"> 5723 <div class="flex flex-col items-center justify-center py-12 text-center"> 5724 <p class="mb-2 text-base font-medium text-scheme-text">No products yet</p> 5725 <p class="mx-auto mb-8 max-w-xs text-sm text-scheme-text/60">Browse our products and add items to your project.</p> 5726 <a 5727 href="/collections/product-library" 5728 class="inline-flex items-center justify-center font-light transition" 5729 style="border: 2px solid #4B4D72; color: #4B4D72; border-radius: 50px; padding: 18px 48px; font-size: 24px;" 5730 onmouseover="this.style.backgroundColor='#4B4D72'; this.style.color='#fff';" 5731 onmouseout="this.style.backgroundColor='transparent'; this.style.color='#4B4D72';" 5732 @click="$store.modals.close('favorites')" 5733 > 5734 Browse Products 5735 </a> 5736 </div> 5737 </template><template x-if="$store.favorites.count > 0"> 5738 <ul> 5739 <template x-for="item in $store.favorites.items" :key="item.key"> 5740 <li class="flex items-center" style="padding: 20px 0; gap: 16px;"> 5741 <button 5742 @click="$store.favorites.remove(item.key)" 5743 class="shrink-0 rounded-full p-1 transition-colors hover:text-red-500" 5744 style="color: rgba(0,0,0,0.3);" 5745 :aria-label="'Remove ' + item.title" 5746 > 5747 <svg width="19" height="19" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-width="2" d="m6 6 12 12m0-12-12 12"/></svg> 5748 </button> 5749 <a :href="item.url" class="block shrink-0 overflow-hidden bg-gray-100" style="width: 90px; height: 90px;"> 5750 <img :src="item.image" :alt="item.title" class="h-full w-full object-cover" loading="lazy" width="90" height="90"> 5751 </a> 5752 <div class="min-w-0 flex-1"> 5753 <p style="font-size: 16px; font-weight: 300; line-height: 18px; color: black;" x-text="item.vendor || ''"></p> 5754 <a :href="item.url" class="line-clamp-1" style="font-size: 16px; font-weight: 600; line-height: 18px; color: black;" x-text="item.title"></a> 5755 <p class="text-xs text-gray-600" x-text="item.colour || (item.hasColours ? 'Colour TBC' : '')"></p> 5756 </div> 5757 </li> 5758 </template> 5759 </ul> 5760 </template> 5761 </div><div class="shrink-0" style="padding: 0 40px 48px;"> 5762 <template x-if="$store.favorites.count > 0"> 5763 <div>
5764 <div class="drawer-divider" style="padding-top: 28px;"> 5765 <p style="font-size: 23px; font-weight: 300; line-height: 30px;">Get a quote for these products.</p> 5766 </div> 5767 <div class="drawer-divider" style="margin-top: 24px; padding-top: 24px;"> 5768 <p style="font-size: 15px; line-height: 20px;">Once submitted, one of our team will provide a more accurate quote based on the information provided. We aim to have a quote back to you within 5 working days.</p> 5769 </div> 5770 <button 5771 @click="$store.modals.close('favorites'); setTimeout(() => $store.modals.open('quoteRequest'), 300)" 5772 class="drawer-cta-btn inline-flex w-full items-center justify-center text-center transition" 5773 style="margin-top: 24px; min-height: 79px; border-radius: 50px; font-size: 27px; font-weight: 300;" 5774 > 5775 Start quote request 5776 </button> 5777 </div> 5778 </template> 5779 </div> 5780 </div> 5781 </template> 5782 </div> 5783</data-island> 5784 5785 5786 5787 <style> 5788 :root { 5789 --color-quote-accent: #2B3990; 5790 } 5791 5792 /* Modal inputs */ 5793 .qr-input, 5794 .qr-select { 5795 width: 100%; 5796 min-height: 2.15rem; 5797 border: 0.666px solid black; 5798 border-radius: 9999px; 5799 padding: 0.5rem 1rem; 5800 background: transparent; 5801 color: #111827; 5802 font-size: 0.875rem; 5803 transition: border-color 0.2s ease, box-shadow 0.2s ease; 5804 } 5805 5806 .qr-textarea { 5807 width: 100%; 5808 border: 0.75px solid black; 5809 border-radius: 10px; 5810 padding: 0.75rem 1rem; 5811 background: transparent; 5812 color: #111827; 5813 font-size: 0.875rem; 5814 resize: vertical; 5815 transition: border-color 0.2s ease, box-shadow 0.2s ease; 5816 } 5817 5818 .qr-input:focus, 5819 .qr-select:focus, 5820 .qr-textarea:focus { 5821 outline: none; 5822 border-color: var(--color-quote-accent, #2B3990); 5823 box-shadow: 0 0 0 3px rgba(43, 57, 144, 0.1); 5824 } 5825 5826 /* Ensure date & select inputs stay pill-shaped */ 5827 input[type="date"].qr-input, 5828 select.qr-select { 5829 border-radius: 9999px !important; 5830 padding-left: 1rem; 5831 padding-right: 2.5rem; 5832 } 5833 5834 input[type="date"].qr-input::-webkit-calendar-picker-indicator { 5835 opacity: 0.4; 5836 cursor: pointer; 5837 } 5838 5839 /* Budget slider */ 5840 .qr-slider { 5841 -webkit-appearance: none; 5842 appearance: none; 5843 width: 100%; 5844 height: 28px; 5845 background: transparent; 5846 outline: none; 5847 cursor: pointer; 5848 position: relative; 5849 z-index: 2; 5850 touch-action: none; 5851 margin: 0; 5852 padding: 0; 5853 } 5854 5855 .qr-slider::-webkit-slider-runnable-track { 5856 height: 6px; 5857 border-radius: 9999px; 5858 background: var(--slider-track, #e5e7eb); 5859 cursor: pointer; 5860 } 5861 5862 .qr-slider::-webkit-slider-thumb { 5863 -webkit-appearance: none; 5864 appearance: none; 5865 width: 24px; 5866 height: 24px; 5867 border-radius: 50%; 5868 background: #658a6a; 5869 cursor: grab; 5870 box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15); 5871 margin-top: -9px; 5872 border: 2px solid #fff; 5873 } 5874 5875 .qr-slider::-webkit-slider-thumb:active { 5876 cursor: grabbing; 5877 transform: scale(1.1); 5878 box-shadow: 0 3px 8px rgba(0, 0, 0, 0.2); 5879 } 5880 5881 .qr-slider::-moz-range-track { 5882 height: 6px; 5883 border-radius: 9999px; 5884 background: var(--slider-track, #e5e7eb); 5885 cursor: pointer; 5886 } 5887 5888 .qr-slider::-moz-range-thumb { 5889 width: 24px; 5890 height: 24px; 5891 border: 2px solid #fff; 5892 border-radius: 50%; 5893 background: #658a6a; 5894 cursor: grab; 5895 box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15); 5896 } 5897 5898 .qr-slider::-moz-range-thumb:active { 5899 cursor: grabbing; 5900 } 5901 5902 .qr-slider::-moz-range-progress { 5903 height: 6px; 5904 border-radius: 9999px; 5905 background: #658a6a; 5906 } 5907 5908 /* Pill buttons for per-product fields */ 5909 .qr-pill { 5910 display: inline-flex; 5911 height: 23px; 5912 align-items: center; 5913 justify-content: center; 5914 gap: 0.25rem; 5915 border: 0.666px solid black; 5916 border-radius: 9999px; 5917 padding: 0 0.75rem; 5918 background: #eee; 5919 color: #111827; 5920 font-size: 10.65px; 5921 font-weight: 400; 5922 cursor: pointer; 5923 transition: border-color 0.15s, background 0.15s; 5924 white-space: nowrap; 5925 position: relative; 5926 } 5927 5928 .qr-pill:hover { 5929 border-color: black; 5930 background: #e2e2e2; 5931 } 5932 5933 .qr-pill--active { 5934 border-color: black; 5935 color: #111827; 5936 background: #e2e2e2; 5937 } 5938 5939 .qr-pill--required { 5940 border-color: #dc2626; 5941 } 5942 5943 /* Pills grid: fixed equal columns across all rows */ 5944 .qr-pills-row { 5945 display: grid; 5946 grid-template-columns: repeat(3, 1fr); 5947 } 5948 5949 /* Popover for pill fields */ 5950 .qr-popover { 5951 position: absolute; 5952 top: calc(100% + 6px); 5953 left: 0; 5954 z-index: 50; 5955 min-width: 14rem; 5956 border: 0.666px solid black; 5957 border-radius: 8px; 5958 background: #fff; 5959 padding: 0.75rem; 5960 box-shadow: 0 3px 7px 0 rgba(0, 0, 0, 0.4); 5961 } 5962 5963 /* Product item rows */ 5964 .qr-product-row { 5965 border-bottom: 1px solid black !important; 5966 padding: 0.75rem 0; 5967 } 5968 5969 .qr-product-row:last-child { 5970 border-bottom: none !important; 5971 } 5972 5973 /* Submit button */ 5974 .qr-submit { 5975 display: flex; 5976 height: 70px; 5977 width: 100%; 5978 max-width: 351px; 5979 margin-left: auto; 5980 margin-right: auto; 5981 align-items: center; 5982 justify-content: center; 5983 border-radius: 50px; 5984 border: 2px solid #4B4D72; 5985 padding: 0.85rem 1.5rem; 5986 background: #4B4D72; 5987 color: #fff; 5988 font-size: 1.5rem; 5989 font-weight: 400; 5990 transition: opacity 0.2s ease, transform 0.2s ease; 5991 } 5992 5993 .qr-submit:hover { 5994 background: #3d3f5e; 5995 border-color: #3d3f5e; 5996 transform: translateY(-1px); 5997 } 5998 5999 .qr-submit:disabled { 6000 opacity: 0.4;
6001 cursor: not-allowed; 6002 transform: none; 6003 } 6004 6005 /* Outlined button */ 6006 .qr-btn-outline { 6007 display: inline-flex; 6008 min-height: 2.75rem; 6009 align-items: center; 6010 justify-content: center; 6011 border: 1.5px solid #4B4D72; 6012 border-radius: 9999px; 6013 padding: 0.65rem 1.5rem; 6014 background: transparent; 6015 color: #4B4D72; 6016 font-size: 0.875rem; 6017 font-weight: 600; 6018 transition: background-color 0.2s ease, color 0.2s ease; 6019 } 6020 6021 .qr-btn-outline:hover { 6022 background: #4B4D72; 6023 color: #fff; 6024 } 6025 6026 @media (max-width: 639px) { 6027 .qr-popover { 6028 position: fixed; 6029 top: auto; 6030 bottom: 0; 6031 left: 0; 6032 right: 0; 6033 min-width: 100%; 6034 border-radius: 8px 8px 0 0; 6035 padding: 1rem; 6036 box-shadow: 0 -3px 7px 0 rgba(0, 0, 0, 0.4); 6037 } 6038 } 6039 6040 /* Fix: Tailwind arbitrary rounded class not compiled */ 6041 @media (min-width: 640px) { 6042 .sm\:rounded-\[24px\] { 6043 border-radius: 27px; 6044 } 6045 } 6046 6047 /* Fix: Tailwind sm:grid-cols-2 not compiled in this theme */ 6048 @media (min-width: 640px) { 6049 [data-quote-request-modal] .sm\:grid-cols-2 { 6050 grid-template-columns: repeat(2, minmax(0, 1fr)); 6051 } 6052 } 6053 6054 /* Make overlay scroll instead of modal body */ 6055 #modals-modal:has([data-quote-request-modal]) { 6056 overflow-y: auto; 6057 } 6058 6059 /* Flex container: min-height instead of fixed height, always center */ 6060 #modals-modal:has([data-quote-request-modal]) > div { 6061 height: auto; 6062 min-height: 100%; 6063 align-items: center; 6064 } 6065 6066 /* Card: remove max-height constraint, allow natural sizing, always rounded */ 6067 #modals-modal:has([data-quote-request-modal]) #modal-slot { 6068 max-height: none !important; 6069 overflow: visible !important; 6070 border-radius: 27px; 6071 border: 1.75px solid black; 6072 box-shadow: 0px 4px 13px 2px rgba(0, 0, 0, 0.1); 6073 } 6074 6075 /* Fix: Tailwind sm:flex-nowrap not compiled */ 6076 @media (min-width: 640px) { 6077 .qr-product-row { 6078 flex-wrap: nowrap; 6079 } 6080 } 6081 6082 /* Content div: match card rounding */ 6083 [data-quote-request-modal] { 6084 border-radius: 27px; 6085 overflow: visible !important; 6086 } 6087 6088 /* All modal text defaults to black per Figma */ 6089 [data-quote-request-modal] label, 6090 [data-quote-request-modal] h3, 6091 [data-quote-request-modal] p, 6092 [data-quote-request-modal] span { 6093 color: black; 6094 } 6095 6096 /* Preserve intentional non-black colors */ 6097 [data-quote-request-modal] .text-gray-400 { 6098 color: #9ca3af !important; 6099 } 6100 [data-quote-request-modal] .text-emerald-600 { 6101 color: #059669 !important; 6102 } 6103 [data-quote-request-modal] .text-red-500 { 6104 color: #ef4444 !important; 6105 } 6106 /* Keep submit button text white */ 6107 [data-quote-request-modal] .qr-submit span { 6108 color: #fff !important; 6109 } 6110 6111 /* Modal title letter spacing */ 6112 [data-quote-request-modal] h2 { 6113 letter-spacing: 0px !important; 6114 } 6115 6116 /* All labels should be black per Figma */ 6117 [data-quote-request-modal] label { 6118 color: black !important; 6119 } 6120 6121 /* Placeholder text should be grey, not blue */ 6122 [data-quote-request-modal] textarea::placeholder, 6123 [data-quote-request-modal] input::placeholder { 6124 color: #9ca3af !important; 6125 } 6126</style> 6127 6128<data-island 6129 x-data="QuoteRequestForm" 6130 on="idle" 6131 x-cloakdata-webhook-url="https://print-room-chatbot-api.vercel.app/api/quote-request" 6132 data-turnstile-site-key="0x4AAAAAAETPnb_3iHel2J69" 6133> 6134 <template x-teleport="#modal-slot"> 6135 <div 6136 x-show="$store.modals.modal.contents === 'quoteRequest'" 6137 class="flex w-full flex-col h-full" 6138 style="background: #FBFBF6;" 6139 data-quote-request-modal 6140 ><div class="shrink-0 px-5 py-4 sm:px-8 sm:py-5"> 6141 <div class="flex items-center justify-between"> 6142 <h2 x-show="!successMessage" class="font-bold" style="font-size: 2.75rem; letter-spacing: 0px; color: black;">Project quote request</h2> 6143 <div x-show="successMessage" class="flex-1"></div> 6144 <button 6145 @click.prevent="$store.modals.close('quoteRequest')" 6146 type="button" 6147 class="rounded-full p-2 text-gray-400 transition hover:text-gray-600" 6148 > 6149 <span class="sr-only">Close</span> 6150 <svg width="20" height="20" fill="none" viewBox="0 0 24 24">
6150<path stroke="currentColor" stroke-width="2" d="m6 6 12 12m0-12-12 12"/></svg> 6151 </button> 6152 </div> 6153 </div><div class="overflow-y-auto flex-1 px-5 py-5 sm:px-8 sm:py-6"> 6154 <div class="mx-auto max-w-2xl"> 6155 <template x-if="!successMessage"> 6156 <form @submit.prevent="submitQuote" class="space-y-8"><section style="padding-bottom: 2rem;"> 6157 <h3 class="text-sm font-normal" style="color: black;" x-text="'Selected products (' + ($store.chatQuote.active ? $store.chatQuote.count : $store.favorites.count) + ')'">Selected products</h3><template x-if="$store.chatQuote.active && $store.chatQuote.count > 0"> 6158 <div class="mt-3"> 6159 <template x-for="item in $store.chatQuote.items" :key="item.id"> 6160 <div class="qr-product-row flex items-start gap-3"> 6161 <div class="shrink-0 overflow-hidden rounded-lg bg-gray-100" style="width: 53px; height: 53px;"> 6162 <template x-if="item.image"> 6163 <img :src="item.image" :alt="item.title" class="h-full w-full object-cover" width="53" height="53"> 6164 </template> 6165 </div> 6166 <div class="min-w-0 flex-1"> 6167 <p class="text-sm font-semibold text-gray-900" x-text="item.title"></p> 6168 <div class="mt-2 flex flex-wrap gap-2"> 6169 <span x-show="item.quantity" class="qr-pill" x-text="'Qty ' + item.quantity"></span> 6170 <span x-show="item.colors && item.colors.length > 0" class="qr-pill" x-text="item.colors.join(', ')"></span> 6171 <span x-show="item.sizes && item.sizes.length > 0" class="qr-pill" x-text="item.sizes.join(', ')"></span> 6172 <span x-show="item.decorationMethod" class="qr-pill" x-text="item.decorationMethod"></span> 6173 </div> 6174 </div> 6175 </div> 6176 </template> 6177 </div> 6178 </template><template x-if="!$store.chatQuote.active && $store.favorites.count > 0"> 6179 <div class="mt-3" x-data="{ openPill: null }" 6180 @click.document="if (openPill && !$event.target.closest('.qr-pill') && !$event.target.closest('.qr-popover')) openPill = null"> 6181 <template x-for="item in $store.favorites.items" :key="item.key"> 6182 <div class="qr-product-row flex items-center gap-3 flex-wrap sm:flex-nowrap" x-init="if(item.handle === 'mystery-product') { $nextTick(() => openPill = item.key + '-notes') }"> 6183 <template x-if="item.handle === 'mystery-product'"> 6184 <div class="shrink-0 flex items-center justify-center" style="width: 53px; height: 53px;"> 6185 <span style="width: 33px; height: 33px; color: black;"><span class="h-full w-full fill-current"> 6186 <svg 6187 aria-hidden="true" 6188 focusable="false" 6189 role="presentation" 6190 class="icon icon-product-question-mark" 6191 viewBox="0 0 24 24" 6192 > 6193 <path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1Zm0 1.375a9.625 9.625 0 1 0 0 19.25 9.625 9.625 0 0 0 0-19.25Zm0 13.75.112.006a1.031 1.031 0 1 1-.224 0l.112-.006Zm3.35-7.646a3.437 3.437 0 0 1-2.204 4.012.688.688 0 0 0-.452.553l-.007.096v.922a.687.687 0 0 1-1.368.094l-.007-.094v-.921c0-.823.488-1.562 1.233-1.89l.143-.056a2.062 2.062 0 1 0-2.745-2.094l-.006.15a.688.688 0 1 1-1.374-.001 3.438 3.438 0 0 1 6.787-.771Z"></path> 6194 </svg> 6195</span> 6196</span> 6197 </div> 6198 </template> 6199 <template x-if="item.handle !== 'mystery-product'"> 6200 <div class="shrink-0 overflow-hidden rounded-lg bg-gray-100" style="width: 53px; height: 53px;"> 6201 <img :src="item.image" :alt="item.title" class="h-full w-full object-cover" width="53" height="53"> 6202 </div> 6203 </template> 6204 <div class="min-w-0" style="width: 5rem; flex: 0 0 5rem;"> 6205 <p style="font-size: 10px; font-weight: 300; line-height: 11px; color: black;" x-text="item.vendor || ''"></p> 6206 <p class="truncate" style="font-size: 10px; font-weight: 600; line-height: 11px; color: black;" x-text="item.title"></p> 6207 </div><div class="qr-pills-row flex-1" style="margin-left: 1rem; gap: 0.75rem; align-items: center;"> 6208 <div class="relative" x-show="item.hasColours"> 6209 <button type="button" class="qr-pill" :class="{ 'qr-pill--active': openPill === item.key + '-colour' }" 6210 @click="openPill = openPill === item.key + '-colour' ? null : item.key + '-colour'; if (openPill) $store.favorites.loadColourChoices(item.key)">
6211 <span x-text="item.colour || 'Colour TBC'"></span> 6212 <svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> 6213 </button> 6214 <div x-show="openPill === item.key + '-colour'" x-transition class="qr-popover" style="min-width: 10rem; max-height: 15rem; overflow-y: auto;"> 6215 <button 6216 type="button" 6217 data-quote-colour-tbc 6218 class="block w-full text-left text-sm py-1" 6219 :disabled="!$store.favorites.canSelectTbc(item)" 6220 :class="!$store.favorites.canSelectTbc(item) ? 'opacity-40 cursor-not-allowed' : ''" 6221 @click="if ($store.favorites.rekey(item.key, { variantId: null, colour: null })) openPill = null" 6222 >TBC (decide later)</button> 6223 <p class="text-xs text-gray-600" x-show="!($store.favorites.colourChoicesByHandle[item.handle] || []).length">We'll confirm colour with you</p> 6224 <template x-for="choice in ($store.favorites.colourChoicesByHandle[item.handle] || [])" :key="choice.variantId"> 6225 <button type="button" class="block w-full text-left text-sm py-1" x-text="choice.label" 6226 :disabled="$store.favorites.colourChoiceTaken(item, choice)" 6227 :class="$store.favorites.colourChoiceTaken(item, choice) ? 'opacity-40 cursor-not-allowed' : ''" 6228 @click="if ($store.favorites.rekey(item.key, choice)) openPill = null"></button> 6229 </template> 6230 </div> 6231 </div><div class="relative"> 6232 <button type="button" class="qr-pill" :class="{ 'qr-pill--active': openPill === item.key + '-qty' }" @click="openPill = openPill === item.key + '-qty' ? null : item.key + '-qty'"> 6233 <span x-text="'Quantity' + (item.quantity ? ' ' + (item.quantity >= 1000 ? '1000+' : item.quantity) : '')"></span> 6234 <svg class="h-3 w-3 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> 6235 </button> 6236 <div x-show="openPill === item.key + '-qty'" x-transition class="qr-popover" style="min-width: 8rem; padding: 0.5rem 0.75rem;"> 6237 <div class="flex items-baseline gap-2"> 6238 <span class="text-sm font-normal text-gray-900" x-text="item.quantity || item.moq || 24"></span> 6239 <span class="text-xs font-light text-gray-500">units</span> 6240 </div> 6241 <input x-show="item.sizeSplit === null" 6242 type="range" 6243 min="1" 6244 max="1000" 6245 step="1" 6246 class="qr-slider" 6247 style="height: 18px; margin-top: 2px;" 6248 :value="item.quantity || item.moq || 24" 6249 @input="$store.favorites.updateItemMeta(item.key, 'quantity', parseInt($event.target.value, 10))" 6250 :style="'--slider-track: linear-gradient(to right, #658a6a ' + ((item.quantity - 1) / 999 * 100) + '%, #e5e7eb ' + ((item.quantity - 1) / 999 * 100) + '%)'" 6251 > 6252 <label x-show="item.sizeOptions && item.sizeOptions.length" class="mt-2 flex items-center gap-2 text-xs"> 6253 <input type="checkbox" :checked="item.sizeSplit !== null" @change="$store.favorites.setSizeSplit(item.key, $event.target.checked ? {} : null)"> 6254 Split by size (optional) 6255 </label> 6256 <div x-show="item.sizeSplit !== null && item.sizeOptions && item.sizeOptions.length" class="mt-2 space-y-1"> 6257 <template x-for="size in item.sizeOptions" :key="size"> 6258 <label class="flex items-center gap-2 text-xs">
6259 <span x-text="size" class="w-10"></span> 6260 <input type="number" min="0" max="100000" step="1" class="w-20 border rounded px-1" 6261 :value="(item.sizeSplit || {})[size] || 0" 6262 @input="$store.favorites.setSizeSplit(item.key, { ...(item.sizeSplit || {}), [size]: parseInt($event.target.value, 10) || 0 })"> 6263 </label> 6264 </template> 6265 </div> 6266 </div> 6267 </div><div class="relative"> 6268 <button type="button" class="qr-pill" :class="{ 'qr-pill--active': openPill === item.key + '-artwork' || (item.artworks && item.artworks.length > 0) || item.artworkLink }" @click="openPill = openPill === item.key + '-artwork' ? null : item.key + '-artwork'"> 6269 <template x-if="item.artworks && item.artworks.length > 0"> 6270 <span class="flex items-center gap-1"> 6271 <svg class="h-3 w-3 shrink-0" style="color: #658a6a;" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/></svg> 6272 <span x-text="item.artworks.length === 1 ? '1 file' : item.artworks.length + ' files'"></span> 6273 </span> 6274 </template> 6275 <template x-if="item.artworkLink && !(item.artworks && item.artworks.length > 0)"> 6276 <span class="flex items-center gap-1"> 6277 <svg class="h-3 w-3 shrink-0" style="color: #658a6a;" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/></svg> 6278 <span>Artwork linked</span> 6279 </span> 6280 </template> 6281 <template x-if="!(item.artworks && item.artworks.length > 0) && !item.artworkLink"> 6282 <span x-text="'Upload artwork \u2191'"></span> 6283 </template> 6284 </button> 6285 <div x-show="openPill === item.key + '-artwork'" x-transition class="qr-popover" style="min-width: 14rem;"> 6286 <p class="mb-2 text-xs text-gray-500">Max <strong>5 files</strong>, <strong>10MB</strong> each</p><template x-if="item.artworks && item.artworks.length > 0"> 6287 <div class="mb-2 space-y-3"> 6288 <template x-for="(aw, awIdx) in item.artworks" :key="aw.fileName + awIdx"> 6289 <div class="text-xs"> 6290 <div class="flex items-center gap-1.5"> 6291 <template x-if="aw.status === 'uploading'"> 6292 <svg class="h-3 w-3 shrink-0 animate-spin text-gray-400" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"/><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"/></svg> 6293 </template> 6294 <template x-if="aw.status === 'done'"> 6295 <svg class="h-3 w-3 shrink-0 text-emerald-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg> 6296 </template> 6297 <template x-if="aw.status === 'error'"> 6298 <svg class="h-3 w-3 shrink-0 text-red-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
6298<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/></svg> 6299 </template> 6300 <span class="flex-1 truncate" :class="aw.status === 'error' ? 'text-red-600' : 'text-gray-700'" x-text="aw.fileName"></span> 6301 <span class="shrink-0 text-gray-400" style="font-size: 10px;" x-text="aw.fileSize ? (aw.fileSize / 1024 < 1024 ? Math.round(aw.fileSize / 1024) + 'KB' : (aw.fileSize / (1024*1024)).toFixed(1) + 'MB') : ''"></span> 6302 <template x-if="aw.status === 'error'"> 6303 <button type="button" class="shrink-0 text-blue-600 underline" @click="retryArtworkUpload(item.key, awIdx)">Retry</button> 6304 </template> 6305 <button type="button" class="shrink-0 text-red-400 hover:text-red-600" @click="removeArtwork(item.key, awIdx)" title="Remove file"> 6306 <svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/></svg> 6307 </button> 6308 </div><template x-if="aw.status === 'done'"> 6309 <div class="relative" style="margin-top: 3px; margin-left: 18px;" x-data="{ placementOpen: false }"> 6310 <button 6311 type="button" 6312 @click="placementOpen = !placementOpen" 6313 class="flex w-full items-center justify-between" 6314 style="height: 20px; padding: 0 8px; font-size: 10px; border: 0.666px solid black; border-radius: 9999px; background: #eee; cursor: pointer;" 6315 > 6316 <span x-text="aw.placement || 'Placementâ¦'" :style="aw.placement ? 'color: black' : 'color: #9ca3af'"></span> 6317 <svg :style="placementOpen ? 'transform: rotate(180deg)' : ''" width="6" height="4" viewBox="0 0 6 4" fill="none" style="margin-left: 4px; flex-shrink: 0; transition: transform 0.15s;"> 6318 <path d="M0.5 0.5L3 3L5.5 0.5" stroke="black" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/> 6319 </svg> 6320 </button> 6321 <div 6322 x-show="placementOpen" 6323 x-transition 6324 @click.outside="placementOpen = false" 6325 style="position: absolute; top: calc(100% + 3px); left: 0; z-index: 60; background: white; border: 0.666px solid black; border-radius: 10px; padding: 0.35rem 0; min-width: 110px; box-shadow: 0 3px 7px 0 rgba(0,0,0,0.15);" 6326 > 6327 <template x-for="pl in ['Front','Left Chest','Right Chest','Back','Sleeve','Other']" :key="pl"> 6328 <button 6329 type="button" 6330 class="block w-full text-left" 6331 style="padding: 0.2rem 0.65rem; font-size: 10px; line-height: 13px; color: #4b5563; cursor: pointer; background: none; border: none;" 6332 @click="updateArtworkPlacement(item.key, awIdx, pl); placementOpen = false" 6333 @mouseover="$el.style.background = '#f3f4f6'" 6334 @mouseout="$el.style.background = 'none'" 6335 x-text="pl" 6336 ></button> 6337 </template> 6338 </div> 6339 </div> 6340 </template> 6341 </div> 6342 </template> 6343 </div> 6344 </template><template x-if="!item.artworks || item.artworks.length < 5"> 6345 <label class="flex cursor-pointer items-center justify-center gap-2 rounded-xl border border-dashed border-gray-300 px-4 py-2.5 text-sm text-gray-600 transition hover:border-gray-400"> 6346 <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
6346<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2M7 10l5-5m0 0l5 5m-5-5v12"/></svg> 6347 <span x-text="item.artworks && item.artworks.length > 0 ? 'Add more files' : 'Select files'"></span> 6348 <input 6349 type="file" 6350 class="hidden" 6351 multiple 6352 accept=".png,.jpg,.jpeg,.svg,.pdf,.ai,.eps" 6353 @change="handlePerProductFileUpload($event, item.key)" 6354 > 6355 </label> 6356 </template><div style="margin-top: 0.75rem; padding-top: 0.75rem; border-top: 1px solid #e5e7eb;"> 6357 <p class="text-xs text-gray-500">For <strong>larger files</strong>: via shared link</p> 6358 <input 6359 type="url" 6360 class="qr-input text-sm" 6361 style="margin-top: 0.5rem; font-size: 0.75rem;" 6362 placeholder="Link address" 6363 :value="item.artworkLink || ''" 6364 @input="$store.favorites.updateItemMeta(item.key, 'artworkLink', $event.target.value)" 6365 > 6366 <p class="mt-1 text-gray-400" style="font-size: 9px;">Eg. Google drive, Dropbox</p> 6367 </div> 6368 </div> 6369 </div><div class="relative"> 6370 <button type="button" class="qr-pill" :class="{ 'qr-pill--active': openPill === item.key + '-notes' || (item.notes && item.notes.length > 0), 'qr-pill--required': item.handle === 'mystery-product' && (!item.notes || !item.notes.trim()) }" @click="openPill = openPill === item.key + '-notes' ? null : item.key + '-notes'"> 6371 <span class="qr-pill-notes-text" x-text="item.notes && item.notes.length > 0 ? 'Notes added' : 'Notes\u2026'"></span> 6372 <template x-if="item.handle === 'mystery-product'"><span style="color: #dc2626; margin-left: 2px;">*</span></template> 6373 </button> 6374 <div x-show="openPill === item.key + '-notes'" x-transition class="qr-popover" style="left: auto; right: 0;"> 6375 <label class="mb-1.5 block text-xs font-medium text-gray-500">Notes</label> 6376 <textarea 6377 rows="3" 6378 class="qr-textarea text-sm" 6379 :placeholder="item.handle === 'mystery-product' ? 'Include the brand, product name or SKU you require' : 'Tell us how and where you would like your artwork printed.'" 6380 :value="item.notes || ''" 6381 @input="$store.favorites.updateItemMeta(item.key, 'notes', $event.target.value)" 6382 ></textarea> 6383 </div> 6384 </div> 6385 </div> 6386 </div> 6387 </template> 6388 <template x-for="shortfall in $store.favorites.moqShortfalls()" :key="shortfall.id"> 6389 <p class="mt-2 text-xs text-red-600" role="alert" x-text="shortfall.title + ' total ' + shortfall.total + ' â minimum ' + shortfall.moq"></p> 6390 </template> 6391 </div> 6392 </template><template x-if="!$store.chatQuote.active && $store.favorites.count === 0"> 6393 <p class="mt-3 text-sm text-gray-400">No products added yet. Browse products and add items to your quote.</p> 6394 </template> 6395 </section><section style="padding-bottom: 2rem;"> 6396 <div style="border: 0.75px solid black; border-radius: 10px; padding: 0.65rem 1.25rem;"> 6397 <p style="font-size: 11px; color: black; margin-bottom: 2px;">Additional notes:</p> 6398 <textarea 6399 id="project-description" 6400 x-model="formData.description" 6401 rows="2" 6402 placeholder="Is there anything else we might need to know about your project?" 6403 style="width: 100%; border: none; padding: 0; background: transparent; font-size: 11.5px; color: #111827; resize: vertical; outline: none;" 6404 ></textarea> 6405 </div> 6406 </section><section style="padding-bottom: 2rem;"> 6407 <label class="text-sm" style="color: black;">Your budget</label> 6408 <div class="flex items-center justify-between" style="margin-top: 0.25rem;">
6409 <span class="text-xs text-gray-400">$500</span> 6410 <span style="font-size: 1.95rem; font-weight: 400; line-height: 1; color: #658a6a;" x-text="'$' + Number(formData.budget).toLocaleString()"></span> 6411 <span class="text-xs text-gray-400">$10,000+</span> 6412 </div> 6413 <div @mousedown.stop @touchstart.stop> 6414 <input 6415 type="range" 6416 x-model.number="formData.budget" 6417 @input="formData.budget = parseInt($event.target.value, 10)" 6418 @click.stop 6419 min="500" 6420 max="10000" 6421 step="500" 6422 class="qr-slider" 6423 :style="'--slider-track: linear-gradient(to right, #658a6a ' + ((formData.budget - 500) / 9500 * 100) + '%, #e5e7eb ' + ((formData.budget - 500) / 9500 * 100) + '%)'" 6424 > 6425 </div> 6426 </section><section class="grid grid-cols-1 gap-4 sm:grid-cols-2"> 6427 <div> 6428 <label for="in-hand-date" class="mb-1.5 block text-sm">The date I need my merch*</label> 6429 <input 6430 type="date" 6431 id="in-hand-date" 6432 x-model="formData.inHandDate" 6433 required 6434 class="qr-input text-sm" 6435 :min="(() => { let d = new Date(), a = 0; while (a < 7) { d.setDate(d.getDate() + 1); if (d.getDay() !== 0 && d.getDay() !== 6) a++; } return d.toISOString().split('T')[0]; })()" 6436 > 6437 </div> 6438 <div x-data="{ locationOpen: false }"> 6439 <label class="mb-1.5 block text-sm" style="color: black;">I need it sent to*</label> 6440 <div class="relative"><select x-model="formData.location" required class="sr-only" tabindex="-1" aria-hidden="true"> 6441 <option value="">Select location</option> 6442 <optgroup label="New Zealand"> 6443 <option value="Northland">Northland</option> 6444 <option value="Auckland">Auckland</option> 6445 <option value="Waikato">Waikato</option> 6446 <option value="Bay of Plenty">Bay of Plenty</option> 6447 <option value="Gisborne">Gisborne</option> 6448 <option value="Hawke's Bay">Hawke's Bay</option> 6449 <option value="Taranaki">Taranaki</option> 6450 <option value="ManawatÅ«-Whanganui">Manawatū-Whanganui</option> 6451 <option value="Wellington">Wellington</option> 6452 <option value="Tasman">Tasman</option> 6453 <option value="Nelson">Nelson</option> 6454 <option value="Marlborough">Marlborough</option> 6455 <option value="West Coast">West Coast</option> 6456 <option value="Canterbury">Canterbury</option> 6457 <option value="Otago">Otago</option> 6458 <option value="Southland">Southland</option> 6459 </optgroup> 6460 <optgroup label="Australia"> 6461 <option value="New South Wales">New South Wales</option> 6462 <option value="Victoria">Victoria</option> 6463 <option value="Queensland">Queensland</option> 6464 <option value="Western Australia">Western Australia</option> 6465 <option value="South Australia">South Australia</option> 6466 <option value="Tasmania">Tasmania</option> 6467 <option value="Australian Capital Territory">Australian Capital Territory</option> 6468 <option value="Northern Territory">Northern Territory</option> 6469 </optgroup> 6470 <option value="International">International</option> 6471 </select><button 6472 type="button" 6473 @click="locationOpen = !locationOpen" 6474 class="qr-select flex w-full items-center justify-between text-sm" 6475 style="cursor: pointer;" 6476 >
6477 <span x-text="formData.location || 'Select location'" :style="formData.location ? 'color: black' : 'color: #9ca3af'"></span> 6478 <svg class="h-4 w-4 shrink-0 transition-transform" :style="locationOpen ? 'transform: rotate(180deg)' : ''" fill="none" stroke="currentColor" viewBox="0 0 24 24" style="color: black;"> 6479 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path> 6480 </svg> 6481 </button><div 6482 x-show="locationOpen" 6483 x-transition 6484 @click.outside="locationOpen = false" 6485 style="position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 50; background: white; border: 0.666px solid black; border-radius: 15.5px; max-height: 232px; overflow-y: auto; padding: 0.75rem 0;" 6486 > 6487 <template x-for="loc in ['Northland','Auckland','Waikato','Bay of Plenty','Gisborne','Hawke\'s Bay','Taranaki','Manawat\u016b-Whanganui','Wellington','Tasman','Nelson','Marlborough','West Coast','Canterbury','Otago','Southland','New South Wales','Victoria','Queensland','Western Australia','South Australia','Tasmania','Australian Capital Territory','Northern Territory','International']" :key="loc"> 6488 <button 6489 type="button" 6490 class="block w-full text-left" 6491 style="padding: 0.25rem 1rem; font-size: 12.65px; line-height: 13.313px; color: #4b5563; cursor: pointer; background: none; border: none;" 6492 @click="formData.location = loc; locationOpen = false" 6493 @mouseover="$el.style.background = '#f3f4f6'" 6494 @mouseout="$el.style.background = 'none'" 6495 x-text="loc" 6496 ></button> 6497 </template> 6498 </div> 6499 </div> 6500 </div> 6501 <div> 6502 <label for="contact-name" class="mb-1.5 block text-sm">Your name*</label> 6503 <input 6504 type="text" 6505 id="contact-name" 6506 x-model="formData.name" 6507 required 6508 placeholder="Your name here" 6509 class="qr-input text-sm" 6510 > 6511 </div> 6512 <div> 6513 <label for="contact-email" class="mb-1.5 block text-sm">Email*</label> 6514 <input 6515 type="email" 6516 id="contact-email" 6517 x-model="formData.email" 6518 required 6519 placeholder="[email protected]" 6520 class="qr-input text-sm" 6521 > 6522 </div> 6523 <div> 6524 <label for="contact-phone" class="mb-1.5 block text-sm">Phone*</label> 6525 <input 6526 type="tel" 6527 id="contact-phone" 6528 x-model="formData.phone" 6529 required 6530 placeholder="Your phone number" 6531 class="qr-input text-sm" 6532 > 6533 </div> 6534 <div> 6535 <label for="contact-company" class="mb-1.5 block text-sm">Company</label> 6536 <input 6537 type="text" 6538 id="contact-company" 6539 x-model="formData.company" 6540 placeholder="Your company's name" 6541 class="qr-input text-sm" 6542 > 6543 </div> 6544 <div x-data="{ heardAboutOpen: false }" class="sm:col-span-2"><label id="heard-about-label" class="mb-1.5 block text-sm" style="color: black;">How did you hear about us?*</label> 6545 <div class="relative"><select x-model="formData.heardAbout" required class="sr-only" tabindex="-1" aria-hidden="true"> 6546 <option value="">Select an option</option><option value="Google search">Google search</option><option value="Social media">Social media</option><option value="Referral or word of mouth">Referral or word of mouth</option><option value="Repeat customer">Repeat customer</option><option value="Saw our work in the wild">Saw our work in the wild</option><option value="Email or newsletter">Email or newsletter</option><option value="Event or trade show">Event or trade show</option><option value="Other">Other</option><option value="Prefer not to say">Prefer not to say</option></select><button 6547 type="button" 6548 @click="heardAboutOpen = !heardAboutOpen" 6549 :aria-expanded="heardAboutOpen" 6550 aria-labelledby="heard-about-label" 6551 class="qr-select flex w-full items-center justify-between text-sm" 6552 style="cursor: pointer;" 6553 >
6554 <span x-text="formData.heardAbout || 'Select an option'" :style="formData.heardAbout ? 'color: black' : 'color: #9ca3af'"></span> 6555 <svg class="h-4 w-4 shrink-0 transition-transform" :style="heardAboutOpen ? 'transform: rotate(180deg)' : ''" fill="none" stroke="currentColor" viewBox="0 0 24 24" style="color: black;"> 6556 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path> 6557 </svg> 6558 </button><div 6559 x-show="heardAboutOpen" 6560 x-transition 6561 @click.outside="heardAboutOpen = false" 6562 style="position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 50; background: white; border: 0.666px solid black; border-radius: 15.5px; max-height: 232px; overflow-y: auto; padding: 0.75rem 0;" 6563 > 6564 <template x-for='opt in ["Google search","Social media","Referral or word of mouth","Repeat customer","Saw our work in the wild","Email or newsletter","Event or trade show","Other","Prefer not to say"]' :key="opt"> 6565 <button 6566 type="button" 6567 class="block w-full text-left" 6568 style="padding: 0.25rem 1rem; font-size: 12.65px; line-height: 13.313px; color: #4b5563; cursor: pointer; background: none; border: none;" 6569 @click="selectHeardAbout(opt); heardAboutOpen = false" 6570 @mouseover="$el.style.background = '#f3f4f6'" 6571 @mouseout="$el.style.background = 'none'" 6572 x-text="opt" 6573 ></button> 6574 </template> 6575 </div> 6576 </div><p x-show="formData.heardAbout === 'Social media'" x-transition class="mt-1.5 text-xs" style="color: #6b7280;"> 6577 Instagram, Facebook, TikTok or LinkedIn 6578 </p><div 6579 x-show="formData.heardAbout === 'Referral or word of mouth' || formData.heardAbout === 'Other'" 6580 x-transition 6581 class="mt-3" 6582 > 6583 <label for="contact-heard-detail" class="mb-1.5 block text-sm" x-text="formData.heardAbout === 'Other' ? 'Tell us more*' : 'Who referred you? (optional)'"></label> 6584 <input 6585 type="text" 6586 id="contact-heard-detail" 6587 x-model="formData.heardAboutDetail" 6588 :required="formData.heardAbout === 'Other'" 6589 :placeholder="formData.heardAbout === 'Other' ? 'How you found us' : 'Their name or company'" 6590 class="qr-input text-sm" 6591 > 6592 </div> 6593 </div> 6594 </section><template x-if="errorMessage"> 6595 <div class="rounded-2xl px-4 py-3 text-center" style="border: 1px solid #e5e7eb; background: #FFFBEB;"> 6596 <p class="text-sm" style="color: #92400e;"> 6597 <span style="font-size: 1.25rem; vertical-align: middle; margin-right: 0.25rem;">🙂</span> 6598 <span x-text="errorMessage"></span> 6599 </p> 6600 </div> 6601 </template><button 6602 type="submit" 6603 class="qr-submit" 6604 style="margin-top: 2.5rem;" 6605 :disabled="submitting || ($store.favorites.count === 0 && !$store.chatQuote.active) || (!$store.chatQuote.active && $store.favorites.moqShortfalls().length > 0)" 6606 > 6607 <span x-show="!submitting">Submit quote request</span> 6608 <span x-show="submitting" class="flex items-center justify-center gap-2"> 6609 <svg class="h-4 w-4 animate-spin" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"> 6610 <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> 6611 <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path> 6612 </svg> 6613 Sending... 6614 </span> 6615 </button> 6616 </form> 6617 </template><template x-if="successMessage"> 6618 <div class="flex flex-col items-center justify-center text-center" style="padding: 3rem 1.5rem 4rem;"><img src="//printroom.co/cdn/shop/t/59/assets/success-thumbs-up.svg?v=51729750037822013731787098435" alt="Success" width="141" height="179" style="width: 141px; height: 179px;"> 6619 6620 <h3 style="margin-top: 1.5rem; font-size: clamp(48px, 12vw, 80px); font-weight: 300; line-height: 1; color: black;">Success</h3> 6621 6622 <div style="margin-top: 3rem; max-width: 414px; font-size: clamp(18px, 4vw, 25px); line-height: 1.16; color: black; text-align: center;"> 6623 <p style="margin: 0;">Nice! Your quote request has successfully been submitted. 6624 Our team will try and have a quote back to you within 1 working day.</p> 6625 <p style="margin: 1.5rem 0 0;">In the meantime, a confirmation email has been sent to you.</p> 6626 </div> 6627 6628 <a 6629 href="/collections/product-library" 6630 @click="$store.modals.close('quoteRequest'); successMessage = ''" 6631 class="flex items-center justify-center" 6632 style="margin-top: 2.5rem; width: min(300px, 80vw); max-width: 100%; height: 64px; border: 2.7px solid #4B4D72; border-radius: 40px; font-size: clamp(18px, 5vw, 25px); font-weight: 400; color: #4B4D72; letter-spacing: -1.24px; text-decoration: none; transition: background-color 0.2s ease, color 0.2s ease;" 6633 onmouseover="this.style.backgroundColor='#4B4D72';this.style.color='#fff'" 6634 onmouseout="this.style.backgroundColor='transparent';this.style.color='#4B4D72'" 6635 > 6636 Browse more products 6637 </a> 6638 </div> 6639 </template> 6640 </div> 6641 </div> 6642 </div> 6643 </template> 6644</data-island> 6645 6646 6647 6648 6649 6650 6651 6652 <style> 6653 .cwp-overlay { 6654 position: fixed; 6655 top: var(--header-group-height, 119px); 6656 left: 0; 6657 right: 0; 6658 bottom: 0; 6659 z-index: 999; 6660 display: flex; 6661 align-items: center; 6662 justify-content: center; 6663 backdrop-filter: blur(6px); 6664 -webkit-backdrop-filter: blur(6px); 6665 background: rgba(247, 247, 247, 0.6); 6666 opacity: 0; 6667 transition: opacity 0.3s ease; 6668 } 6669 6670 .cwp-card { 6671 position: relative; 6672 width: 100%; 6673 max-width: 598px; 6674 margin: 1rem; 6675 background: #FBFBF6; 6676 border: 1.565px solid black; 6677 border-radius: 23px; 6678 box-shadow: 0 3.5px 11.5px 1.75px rgba(0, 0, 0, 0.1); 6679 padding: 2.5rem 3rem 2.5rem; 6680 overflow: visible; 6681 } 6682 6683 .cwp-close { 6684 position: absolute; 6685 top: 1.25rem; 6686 right: 1.25rem; 6687 background: none; 6688 border: none; 6689 cursor: pointer; 6690 padding: 0.5rem; 6691 color: black; 6692 } 6693 6694 .cwp-title { 6695 font-size: 70px; 6696 font-weight: 300; 6697 line-height: 1; 6698 color: black; 6699 margin: 0 0 1.5rem; 6700 } 6701 6702 .cwp-body { 6703 font-size: 19px; 6704 line-height: 22px; 6705 color: black; 6706 margin: 0 0 1rem; 6707 } 6708 6709 .cwp-body + .cwp-body { 6710 margin-top: 1rem; 6711 } 6712 6713 .cwp-btn { 6714 display: inline-flex; 6715 align-items: center; 6716 justify-content: center; 6717 margin-top: 1.25rem; 6718 height: 37px; 6719 padding: 0 1.5rem; 6720 background: white; 6721 border: 0.722px solid black; 6722 border-radius: 29px; 6723 font-size: 21.67px; 6724 font-weight: 400; 6725 color: black; 6726 cursor: pointer; 6727 transition: background 0.2s ease; 6728 } 6729 6730 .cwp-btn:hover { 6731 background: #f0f0f0; 6732 } 6733 6734 .cwp-pointer-left { 6735 position: fixed; 6736 left: 240px; 6737 top: 50%; 6738 transform: translateY(-50%) rotate(-15deg); 6739 width: 240px; 6740 opacity: 0; 6741 transition: opacity 0.6s ease; 6742 pointer-events: none; 6743 z-index: 1000; 6744 } 6745 .cwp-pointer-left.visible { 6746 opacity: 1; 6747 animation: cwp-bob-left 1.8s ease-in-out infinite; 6748 } 6749 6750 .cwp-pointer-up { 6751 position: fixed; 6752 top: calc(var(--header-group-height, 119px) - 60px); 6753 right: 60px; 6754 width: 180px; 6755 opacity: 0; 6756 transition: opacity 0.6s ease; 6757 pointer-events: none; 6758 z-index: 1000; 6759 } 6760 .cwp-pointer-up.visible { 6761 opacity: 1; 6762 animation: cwp-bob-up 1.8s ease-in-out infinite; 6763 } 6764 6765 @keyframes cwp-bob-left { 6766 0%, 100% { transform: translateY(-50%) rotate(-15deg) translateX(0); } 6767 50% { transform: translateY(-50%) rotate(-15deg) translateX(-10px); } 6768 } 6769 6770 @keyframes cwp-bob-up { 6771 0%, 100% { transform: translateY(0); } 6772 50% { transform: translateY(-10px); } 6773 } 6774 6775 @media (max-width: 639px) { 6776 .cwp-card { 6777 padding: 2rem 1.5rem; 6778 } 6779 6780 .cwp-title { 6781 font-size: 48px; 6782 } 6783 6784 .cwp-body { 6785 font-size: 16px; 6786 line-height: 20px; 6787 } 6788 6789 .cwp-btn { 6790 font-size: 18px; 6791 } 6792 6793 .cwp-pointer-left, 6794 .cwp-pointer-up { 6795 display: none; 6796 } 6797 } 6798</style> 6799 6800 6801 <style>
6802 /* ââ "Can't find something?" scroll-triggered tab ââ */ 6803 .cft-container { 6804 position: fixed; 6805 right: 0; 6806 bottom: 100px; 6807 z-index: 998; 6808 display: none; 6809 font-family: 'DM Sans', sans-serif; 6810 } 6811 6812 /* ââ Tab state (collapsed) ââ */ 6813 .cft-tab { 6814 position: relative; 6815 width: 77px; 6816 height: 96px; 6817 cursor: pointer; 6818 opacity: 0; 6819 transform: translateX(20px); 6820 transition: opacity 0.4s ease, transform 0.4s ease; 6821 } 6822 6823 .cft-tab-bg { 6824 position: absolute; 6825 inset: 0; 6826 display: flex; 6827 align-items: center; 6828 justify-content: center; 6829 } 6830 6831 .cft-tab-bg-inner { 6832 width: 96px; 6833 height: 77px; 6834 flex-shrink: 0; 6835 transform: rotate(90deg); 6836 background: var(--cant-find-bg, #EFFE9C); 6837 border-bottom: 1.03px solid black; 6838 border-left: 1.03px solid black; 6839 border-right: 1.03px solid black; 6840 border-top: none; 6841 border-radius: 0 0 16px 16px; 6842 box-shadow: -2.94px 3.13px 5.88px 0px rgba(0, 0, 0, 0.2); 6843 } 6844 6845 .cft-tab-icon { 6846 position: absolute; 6847 top: 5%; 6848 left: 10%; 6849 width: 65%; 6850 height: 50%; 6851 background-size: contain; 6852 background-repeat: no-repeat; 6853 background-position: center; 6854 } 6855 6856 .cft-tab-text { 6857 position: absolute; 6858 bottom: 13%; 6859 left: 0; 6860 right: 0; 6861 font-weight: 600; 6862 font-size: 10px; 6863 line-height: 11.3px; 6864 color: black; 6865 text-align: center; 6866 } 6867 6868 .cft-tab:hover { 6869 transform: translateX(0) scale(1.04); 6870 } 6871 6872 /* ââ Card state (expanded) â ~3Ã original size ââ */ 6873 .cft-card { 6874 position: relative; 6875 width: 300px; 6876 height: 200px; 6877 opacity: 0; 6878 transform: translateX(20px); 6879 transition: opacity 0.4s ease, transform 0.4s ease; 6880 cursor: default; 6881 } 6882 6883 .cft-card-bg { 6884 position: absolute; 6885 inset: 0; 6886 } 6887 6888 .cft-card-bg-inner { 6889 width: 100%; 6890 height: 100%; 6891 background: var(--cant-find-bg, #EFFE9C); 6892 border: 0.75px solid black; 6893 border-right: none; 6894 border-radius: 20px 0 0 20px; 6895 box-shadow: -1.17px 2.34px 2.34px 0px rgba(0, 0, 0, 0.14); 6896 } 6897 6898 .cft-card-content { 6899 position: absolute; 6900 inset: 0; 6901 z-index: 1; 6902 padding: 18px 22px; 6903 } 6904 6905 .cft-card-close { 6906 position: absolute; 6907 top: 8px; 6908 right: 8px; 6909 z-index: 2; 6910 background: none; 6911 border: none; 6912 cursor: pointer; 6913 padding: 4px; 6914 color: black; 6915 opacity: 0.5; 6916 transition: opacity 0.2s; 6917 line-height: 1; 6918 } 6919 6920 .cft-card-close:hover { 6921 opacity: 1; 6922 } 6923 6924 .cft-card-title { 6925 font-weight: 500; 6926 font-size: 18px; 6927 line-height: 20px; 6928 color: black; 6929 margin: 0 0 10px; 6930 } 6931 6932 .cft-card-body { 6933 font-weight: 400; 6934 font-size: 13px; 6935 line-height: 16px; 6936 color: black; 6937 margin: 0; 6938 max-width: 180px; 6939 } 6940 6941 .cft-card-link { 6942 font-weight: 400; 6943 font-size: 22px; 6944 line-height: 24px; 6945 color: black; 6946 text-decoration: underline; 6947 cursor: pointer; 6948 background: none; 6949 border: none; 6950 padding: 0; 6951 font-family: inherit; 6952 position: absolute; 6953 bottom: 18px; 6954 left: 22px; 6955 z-index: 1; 6956 } 6957 6958 .cft-card-link:hover { 6959 opacity: 0.7; 6960 } 6961 6962 .cft-card-doodle { 6963 position: absolute; 6964 bottom: -2px; 6965 right: 2px; 6966 width: 110px; 6967 height: 65px; 6968 transform: rotate(-24.8deg); 6969 pointer-events: none; 6970 z-index: 1; 6971 background-size: contain; 6972 background-repeat: no-repeat; 6973 background-position: center; 6974 } 6975 6976 /* ââ Visible states (applied by JS) ââ */ 6977 .cft-tab.visible, 6978 .cft-card.visible { 6979 opacity: 1; 6980 transform: translateX(0); 6981 } 6982 6983 /* ââ Hide when favorites drawer is open ââ */ 6984 body:has([data-favorites-drawer]:not([style*="display: none"])) .cft-container { 6985 display: none !important; 6986 } 6987 6988 /* ââ Mobile adjustments ââ */ 6989 @media (max-width: 639px) { 6990 .cft-container { 6991 bottom: 80px; 6992 } 6993 6994 .cft-tab { 6995 width: 66px; 6996 height: 82px; 6997 } 6998 6999 .cft-tab-bg-inner { 7000 width: 82px; 7001 height: 66px; 7002 } 7003 7004 .cft-tab-text { 7005 font-size: 9px; 7006 line-height: 10px; 7007 } 7008 7009 .cft-card { 7010 width: 270px; 7011 height: 180px; 7012 } 7013 } 7014</style> 7015 7016 7017 <div id="shopify-section-ai-chatbot" class="shopify-section contents"><link href="//printroom.co/cdn/shop/t/59/assets/ai-chatbot.css?v=112900874753543053291788472410" rel="stylesheet" type="text/css" media="all" /> 7018<data-island 7019 x-data=" 7020 AIChatbot({ 7021 apiEndpoint: "https:\/\/print-room-chatbot-api.vercel.app\/", 7022 questionsApiUrl: "https:\/\/print-room-chatbot-api.vercel.app\/", 7023 welcomeMessage: "Hi! I'm here to help you with your printing needs. How can I assist you today?", 7024 unavailableMessage: "Chat is temporarily unavailable. Please request a quote or contact us directly.", 7025 suggestedPrompts: [] 7026 }) 7027 " 7028 src="ai-chatbot" 7029 on="idle" 7030 id="ai-chatbot-ai-chatbot" 7031 class="ai-chatbot" 7032 data-color-scheme="scheme1" 7033 ><button 7034 @click="toggle()" 7035 class="ai-chatbot__trigger" 7036 :class="{ 'ai-chatbot__trigger--hidden': isOpen }" 7037 aria-label="Chat with us" 7038 type="button" 7039 > 7040 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 7041 <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path> 7042 </svg>
7043 <span>Chat with us</span> 7044 </button><template x-teleport="body"> 7045 <div 7046 x-show="isOpen" 7047 x-transition:enter="ai-chatbot-enter" 7048 x-transition:enter-start="ai-chatbot-enter" 7049 x-transition:enter-end="ai-chatbot-enter-active" 7050 x-transition:leave="ai-chatbot-leave" 7051 x-transition:leave-start="ai-chatbot-leave" 7052 x-transition:leave-end="ai-chatbot-leave-active" 7053 class="ai-chatbot__window" 7054 :class="{ 'ai-chatbot__window--minimized': isMinimized }" 7055 data-color-scheme="scheme1" 7056 role="dialog" 7057 aria-label="Chat with us" 7058 @keydown.escape="close()" 7059 ><div class="ai-chatbot__header"> 7060 <div class="ai-chatbot__header-title"> 7061 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 7062 <polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"></polygon> 7063 </svg> 7064 <span>Chat with us</span> 7065 </div> 7066 <div class="ai-chatbot__header-actions"> 7067 <button 7068 x-show="messages.length > 0 && !isMinimized" 7069 @click="clearHistory()" 7070 class="ai-chatbot__header-btn" 7071 type="button" 7072 :disabled="isLoading" 7073 aria-label="Clear history" 7074 > 7075 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 7076 <polyline points="3 6 5 6 21 6"></polyline> 7077 <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path> 7078 </svg> 7079 </button> 7080 <button 7081 @click="minimize()" 7082 class="ai-chatbot__header-btn" 7083 type="button"
7084 :aria-label="isMinimized ? 'Expand' : 'Minimize'" 7085 > 7086 <template x-if="isMinimized"> 7087 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 7088 <polyline points="15 3 21 3 21 9"></polyline> 7089 <polyline points="9 21 3 21 3 15"></polyline> 7090 <line x1="21" y1="3" x2="14" y2="10"></line> 7091 <line x1="3" y1="21" x2="10" y2="14"></line> 7092 </svg> 7093 </template> 7094 <template x-if="!isMinimized"> 7095 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 7096 <polyline points="4 14 10 14 10 20"></polyline> 7097 <polyline points="20 10 14 10 14 4"></polyline> 7098 <line x1="14" y1="10" x2="21" y2="3"></line> 7099 <line x1="3" y1="21" x2="10" y2="14"></line> 7100 </svg> 7101 </template> 7102 </button> 7103 <button 7104 @click="close()" 7105 class="ai-chatbot__header-btn" 7106 type="button" 7107 aria-label="Close" 7108 > 7109 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 7110 <line x1="18" y1="6" x2="6" y2="18"></line> 7111 <line x1="6" y1="6" x2="18" y2="18"></line> 7112 </svg> 7113 </button> 7114 </div> 7115 </div><div class="ai-chatbot__body" x-show="!isMinimized"><div class="ai-chatbot__messages" x-ref="messagesContainer"><template x-if="messages.length === 0"> 7116 <div class="ai-chatbot__welcome"> 7117 <svg class="ai-chatbot__welcome-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 7118 <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path> 7119 </svg> 7120 <p class="ai-chatbot__welcome-text" x-text="welcomeMessage"></p> 7121 <p class="ai-chatbot__welcome-subtext">Ask me anything about our products and services.</p> 7122 </div> 7123 </template><template x-for="(message, index) in messages" :key="message.id"> 7124 <div 7125 class="ai-chatbot__message-row" 7126 :class="'ai-chatbot__message-row--' + message.role" 7127 ><template x-if="message.role === 'system'"> 7128 <div class="ai-chatbot__message-content ai-chatbot__message-content--system" x-text="message.content"></div> 7129 </template><template x-if="message.role !== 'system'"> 7130 <div class="ai-chatbot__message-stack"><template x-if="message.role === 'staff'"> 7131 <div class="ai-chatbot__staff-meta"> 7132 <span class="ai-chatbot__staff-avatar" x-text="message.initials"></span> 7133 <span class="ai-chatbot__staff-name" x-text="message.senderName"></span> 7134 <span 7135 class="ai-chatbot__staff-time" 7136 x-show="message.timestamp" 7137 x-text="message.timestamp ? new Date(message.timestamp).toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' }) : ''" 7138 ></span> 7139 </div> 7140 </template> 7141 7142 <div 7143 class="ai-chatbot__message-bubble" 7144 :class="'ai-chatbot__message-bubble--' + message.role" 7145 ><div class="ai-chatbot__message-content"><span x-text="message.content"></span><span x-show="message.isStreaming && message.content" class="ai-chatbot__cursor"></span></div><template x-if="message.role === 'assistant' && message.options && message.options.choices.length > 0"> 7146 <div class="ai-chatbot__options" :class="{ 'ai-chatbot__options--submitted': message.optionsSubmitted }"> 7147 <p class="ai-chatbot__options-prompt" x-show="message.options.prompt" x-text="message.options.prompt"></p> 7148 <div class="ai-chatbot__options-list"> 7149 <template x-for="(choice, ci) in message.options.choices" :key="choice.value"> 7150 <button 7151 @click="selectOption(index, choice.value)" 7152 class="ai-chatbot__option-chip" 7153 :class="{ 7154 'ai-chatbot__option-chip--selected': message.selectedOptions.includes(choice.value), 7155 'ai-chatbot__option-chip--disabled': message.optionsSubmitted 7156 }" 7157 :disabled="message.optionsSubmitted" 7158 type="button" 7159 x-text="choice.label" 7160 ></button> 7161 </template> 7162 </div> 7163 <button 7164 x-show="message.options.multiSelect && !message.optionsSubmitted && message.selectedOptions.length > 0" 7165 @click="submitOptions(index)" 7166 class="ai-chatbot__options-submit" 7167 type="button" 7168 > 7169 Continue 7170 </button> 7171 </div> 7172 </template> 7173 </div> 7174 </div> 7175 </template> 7176 </div> 7177 </template><template x-if="isLoading && messages.length > 0 && !messages[messages.length - 1].content"> 7178 <div class="ai-chatbot__message-row ai-chatbot__message-row--assistant"> 7179 <div class="ai-chatbot__message-stack"> 7180 <div class="ai-chatbot__message-bubble ai-chatbot__message-bubble--assistant ai-chatbot__message-bubble--typing"> 7181 <div class="ai-chatbot__typing" aria-label="Assistant is typing">
7182 <span></span> 7183 <span></span> 7184 <span></span> 7185 </div> 7186 </div> 7187 </div> 7188 </div> 7189 </template> 7190 </div><div x-show="error" class="ai-chatbot__error"> 7191 <svg class="ai-chatbot__error-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 7192 <circle cx="12" cy="12" r="10"></circle> 7193 <line x1="12" y1="8" x2="12" y2="12"></line> 7194 <line x1="12" y1="16" x2="12.01" y2="16"></line> 7195 </svg> 7196 <div class="ai-chatbot__error-content"> 7197 <p class="ai-chatbot__error-text" x-text="error"></p> 7198 <div class="ai-chatbot__error-actions"> 7199 <button @click="openQuoteRequest()" class="ai-chatbot__error-action" type="button"> 7200 Request a quote 7201 </button> 7202 <a href="/pages/contact-us" class="ai-chatbot__error-action"> 7203 Contact us 7204 </a> 7205 </div> 7206 <button @click="clearError()" class="ai-chatbot__error-dismiss" type="button"> 7207 Dismiss 7208 </button> 7209 </div> 7210 </div><div x-show="messages.length === 0 && (getActivePrompts().length > 0 || questionsLoading)" class="ai-chatbot__prompts"> 7211 <p class="ai-chatbot__prompts-label">Try asking:</p><template x-if="questionsLoading && getActivePrompts().length === 0"> 7212 <div class="ai-chatbot__prompts-loading"> 7213 <span class="ai-chatbot__prompt-skeleton"></span> 7214 <span class="ai-chatbot__prompt-skeleton"></span> 7215 <span class="ai-chatbot__prompt-skeleton"></span> 7216 </div> 7217 </template><template x-for="(prompt, index) in getActivePrompts()" :key="index"> 7218 <button 7219 @click="useSuggestedPrompt(prompt)" 7220 class="ai-chatbot__prompt-btn" 7221 type="button" 7222 x-text="prompt" 7223 ></button> 7224 </template> 7225 </div><div x-show="ctaButton && ctaButton.show" x-cloak class="ai-chatbot__cta"> 7226 <button 7227 @click="handleCTAClick()" 7228 class="ai-chatbot__cta-btn" 7229 type="button" 7230 x-text="ctaButton?.text || 'Request a Quote'" 7231 ></button> 7232 <button 7233 @click="dismissCTA()" 7234 class="ai-chatbot__cta-dismiss" 7235 type="button" 7236 aria-label="Dismiss" 7237 > 7238 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 7239 <line x1="18" y1="6" x2="6" y2="18"></line> 7240 <line x1="6" y1="6" x2="18" y2="18"></line> 7241 </svg> 7242 </button> 7243 </div><div x-show="conversationStatus === 'resolved'" x-cloak class="ai-chatbot__resolved-banner"> 7244 Chat ended â send a message to start again. 7245 </div><div x-show="showContactAsk" x-cloak class="ai-chatbot__contact-ask"> 7246 <p class="ai-chatbot__contact-ask-prompt" x-show="contactAskMode === 'email_chip'">Leave your email in case you step away.</p> 7247 <p class="ai-chatbot__contact-ask-prompt" x-show="contactAskMode === 'progressive'">Mind sharing your name and email so we can follow up?</p> 7248 <form @submit.prevent="submitContact()" class="ai-chatbot__contact-ask-form"> 7249 <input 7250 x-show="contactAskMode !== 'email_chip' && !contactName" 7251 x-model="contactNameInput" 7252 type="text" 7253 class="ai-chatbot__contact-ask-input" 7254 placeholder="Your name" 7255 :disabled="contactSubmitting" 7256 > 7257 <input 7258 x-show="!contactEmail" 7259 x-model="contactEmailInput" 7260 type="email" 7261 class="ai-chatbot__contact-ask-input" 7262 placeholder="Your email" 7263 :disabled="contactSubmitting" 7264 > 7265 <button 7266 type="submit" 7267 class="ai-chatbot__contact-ask-submit" 7268 :disabled="contactSubmitting" 7269 > 7270 Send 7271 </button> 7272 <button 7273 type="button" 7274 @click="dismissContactAsk()" 7275 class="ai-chatbot__contact-ask-dismiss" 7276 aria-label="Dismiss" 7277 > 7278 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 7279 <line x1="18" y1="6" x2="6" y2="18"></line> 7280 <line x1="6" y1="6" x2="18" y2="18"></line> 7281 </svg> 7282 </button> 7283 </form> 7284 </div><div class="ai-chatbot__input-area"> 7285 <form @submit.prevent="sendMessage()" class="ai-chatbot__input-form"> 7286 <textarea 7287 x-ref="chatInput" 7288 x-model="inputText" 7289 @keydown="handleKeyDown($event)" 7290 class="ai-chatbot__input" 7291 placeholder="Type your message..." 7292 rows="1" 7293 :disabled="isLoading" 7294 ></textarea> 7295 <button 7296 type="submit" 7297 class="ai-chatbot__send-btn" 7298 :disabled="isLoading || !inputText.trim()" 7299 aria-label="Send" 7300 > 7301 <template x-if="isLoading"> 7302 <svg class="ai-chatbot__spinner" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 7303 <line x1="12" y1="2" x2="12" y2="6"></line> 7304 <line x1="12" y1="18" x2="12" y2="22"></line> 7305 <line x1="4.93" y1="4.93" x2="7.76" y2="7.76"></line> 7306 <line x1="16.24" y1="16.24" x2="19.07" y2="19.07"></line> 7307 <line x1="2" y1="12" x2="6" y2="12"></line> 7308 <line x1="18" y1="12" x2="22" y2="12"></line> 7309 <line x1="4.93" y1="19.07" x2="7.76" y2="16.24"></line> 7310 <line x1="16.24" y1="7.76" x2="19.07" y2="4.93"></line> 7311 </svg> 7312 </template> 7313 <template x-if="!isLoading"> 7314 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
7315 <line x1="22" y1="2" x2="11" y2="13"></line> 7316 <polygon points="22 2 15 22 11 13 2 9 22 2"></polygon> 7317 </svg> 7318 </template> 7319 </button> 7320 </form><p 7321 class="ai-chatbot__disclaimer" 7322 x-show="conversationStatus === null || conversationStatus === 'bot'" 7323 > 7324 Responses are generated by AI and may be inaccurate. 7325 </p> 7326 </div> 7327 </div> 7328 </div> 7329 </template> 7330 </data-island> 7331</div> 7332 7333 7334 <section id="shopify-section-branding-service-cards" class="shopify-section branding-service-cards-section"><style data-shopify> 7335 .branding-floating-overlay { 7336 position: fixed; 7337 inset: 0; 7338 z-index: 9999; 7339 background: rgba(0, 0, 0, 0.5); 7340 opacity: 0; 7341 transition: opacity 300ms ease; 7342 pointer-events: none; 7343 } 7344 7345 .branding-floating-overlay.active { 7346 opacity: 1; 7347 pointer-events: auto; 7348 } 7349 7350 /* Floating card - matches carousel expanded card styling */ 7351 .branding-floating-card { 7352 position: fixed; 7353 z-index: 10000; 7354 background: rgb(var(--color-scheme-background, 255 255 255)); 7355 border-radius: 16px; 7356 box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.4); 7357 display: none; 7358 flex-direction: column; 7359 max-height: 85vh; 7360 overflow: hidden; 7361 /* No default top/left/bottom - JS controls position */ 7362 } 7363 7364 /* Close button - matches carousel style */ 7365 .branding-floating-card .branding-pill-close { 7366 position: absolute; 7367 top: 12px; 7368 right: 12px; 7369 z-index: 10; 7370 width: 32px; 7371 height: 32px; 7372 border-radius: 50%; 7373 background: rgba(255, 255, 255, 0.9); 7374 border: none; 7375 cursor: pointer; 7376 display: flex; 7377 align-items: center; 7378 justify-content: center; 7379 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); 7380 transition: background 200ms ease; 7381 } 7382 7383 .branding-floating-card .branding-pill-close:hover { 7384 background: rgba(255, 255, 255, 1); 7385 } 7386 7387 .branding-floating-card .branding-pill-close svg { 7388 width: 16px; 7389 height: 16px; 7390 stroke: #333; 7391 } 7392 7393 /* Image link - matches carousel style */ 7394 .branding-floating-card .branding-pill-image-link { 7395 display: block; 7396 flex-shrink: 0; 7397 background: rgba(var(--color-scheme-text, 0 0 0), 0.05); 7398 min-height: 200px; 7399 } 7400 7401 .branding-floating-card .branding-pill-image-link.has-image { 7402 min-height: 0; 7403 } 7404 7405 .branding-floating-card .branding-pill-image { 7406 border-radius: 16px 16px 0 0; 7407 width: 100%; 7408 height: auto; 7409 max-height: 280px; 7410 object-fit: cover; 7411 display: block; 7412 } 7413 7414 .branding-floating-card .branding-pill-image:not([src]), 7415 .branding-floating-card .branding-pill-image[src=""] { 7416 display: none; 7417 } 7418 7419 /* Label button overlay - matches carousel style */ 7420 .branding-floating-card .branding-pill-label { 7421 display: none; /* Hidden in expanded state like carousel */ 7422 } 7423 7424 /* Expanded content - matches carousel style */ 7425 .branding-floating-card .branding-pill-content { 7426 padding: 20px; 7427 flex-shrink: 0; 7428 } 7429 7430 .branding-floating-card .branding-expanded-title { 7431 margin: 0 0 12px 0; 7432 font-size: 1.25rem; 7433 font-weight: 600; 7434 color: black; 7435 7436 } 7437 7438 .branding-floating-card .branding-expanded-loading { 7439 display: flex; 7440 align-items: center; 7441 justify-content: center; 7442 padding: 20px; 7443 } 7444 7445 .branding-floating-card .branding-expanded-spinner { 7446 width: 24px; 7447 height: 24px; 7448 border: 2px solid rgba(var(--color-scheme-text, 0 0 0), 0.1); 7449 border-top-color: rgb(var(--color-scheme-text, 0 0 0)); 7450 border-radius: 50%; 7451 animation: branding-pill-spin 0.8s linear infinite; 7452 } 7453 7454 @keyframes branding-pill-spin { 7455 to { transform: rotate(360deg); } 7456 } 7457 7458 .branding-floating-card .branding-expanded-description { 7459 margin-bottom: 16px; 7460 line-height: 1.6; 7461 color: black; 7462 } 7463 7464 .branding-floating-card .branding-expanded-description p { 7465 margin: 0; 7466 } 7467 7468 .branding-floating-card .branding-expanded-description p + p { 7469 margin-top: 0.75em; 7470 } 7471 7472 @media (max-width: 749px) { 7473 .branding-floating-card { 7474 width: calc(100vw - 48px) !important; 7475 left: 24px !important; 7476 max-width: none !important; 7477 } 7478 } 7479</style> 7480 7481<!-- Overlay backdrop --> 7482<div 7483 id="branding-floating-overlay" 7484 class="branding-floating-overlay" 7485 onclick="window.closeBrandingServiceCard()" 7486></div> 7487 7488<!-- Floating card - HTML structure matches carousel expanded cards --> 7489<div 7490 id="branding-floating-card" 7491 class="branding-floating-card color-scheme5" 7492> 7493 <!-- Close button (top right over image) --> 7494 <button type="button" class="branding-pill-close" onclick="window.closeBrandingServiceCard()"> 7495 <span class="sr-only">Close</span> 7496 <svg fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> 7497 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" /> 7498 </svg> 7499 </button> 7500 7501 <!-- Image with link --> 7502 <a id="branding-card-image-link" href="#" class="branding-pill-image-link"> 7503 <img 7504 id="branding-card-image" 7505 class="branding-pill-image" 7506 src="" 7507 alt="" 7508 loading="lazy" 7509 width="300" 7510 height="300" 7511 > 7512 </a> 7513 7514 <!-- Label button (hidden in expanded state, like carousel) --> 7515 <a id="branding-card-label" href="#" class="branding-pill-label"></a> 7516 7517 <!-- Expanded content --> 7518 <div class="branding-pill-content"> 7519 <h3 id="branding-card-title" class="branding-expanded-title"></h3> 7520 <div id="branding-card-loading" class="branding-expanded-loading" style="display: none;"> 7521 <div class="branding-expanded-spinner"></div> 7522 </div> 7523 <div id="branding-card-description" class="branding-expanded-description"></div> 7524 </div> 7525</div> 7526
7527<script> 7528(function() { 7529 // Build service data from Shopify blocks 7530 // Key is the lowercase metafield value (e.g., "screen print", "custom neck tags") 7531 const brandingServiceData = { 7532 7533 'high density transfer': { 7534 title: "High density transfer", 7535 description: "\u003cp\u003eA high density transfer is a heat-applied decoration that creates a raised, textured print using layered ink, producing a bold, dimensional effect with sharp edges and strong durability on garments.\u003c\/p\u003e", 7536 image: '//printroom.co/cdn/shop/files/heat_transfer_2_1b6dd18d-7ae5-452a-a0ca-fef697ba6400.jpg?v=1761181341&width=800', 7537 imageAlt: "High density transfer", 7538 ctaText: "Learn more", 7539 ctaUrl: '#' 7540 }, 7541 7542 'printed seam tape': { 7543 title: "printed seam tape", 7544 description: "\u003cp\u003eAdd a custom touch to the inside of your cap with printed seam tape. This often-overlooked detail offers a unique way to showcase your brand, giving your caps a polished finish that stands out from the inside out. Fully customisable, itâs a small touch that makes a big impression.\u003c\/p\u003e", 7545 image: '//printroom.co/cdn/shop/files/speights_cap_inner_3.jpg?v=1743540305&width=800', 7546 imageAlt: "custom caps NZ", 7547 ctaText: "Learn more", 7548 ctaUrl: '#' 7549 }, 7550 7551 'knitted all-over': { 7552 title: "Knitted all-over", 7553 description: "\u003cp\u003eKnitted all-over designs weave patterns directly into the fabric of your custom socks, creating a seamless, durable look that wonât fade over time. Ideal for intricate, full-length designs with lasting quality.\u003c\/p\u003e", 7554 image: '//printroom.co/cdn/shop/files/knitted_all_over_detail.jpg?v=1772668725&width=800', 7555 imageAlt: "Knitted all-over", 7556 ctaText: "Learn more", 7557 ctaUrl: '#' 7558 }, 7559 7560 'dye-sublimation': { 7561 title: "Dye-sublimation", 7562 description: "\u003cp\u003eDye-sublimation allows vibrant, full-colour designs to be seamlessly printed on your custom socks. The process ensures high-quality, durable prints that wonât fade, perfect for intricate patterns or all-over designs.\u003c\/p\u003e", 7563 image: '//printroom.co/cdn/shop/files/dye_sub_detail.jpg?v=1772673144&width=800', 7564 imageAlt: "Dye-sublimation", 7565 ctaText: "Learn more", 7566 ctaUrl: '#' 7567 }, 7568 7569 'additional cushioning': { 7570 title: "Additional cushioning", 7571 description: "\u003cp\u003eAdd extra cushioning to your custom socks for improved comfort and support. The soft padding underfoot reduces impact, perfect for all-day wear or active use.\u003c\/p\u003e", 7572 image: '//printroom.co/cdn/shop/files/cushion_detail.jpg?v=1772673175&width=800', 7573 imageAlt: "Additional cushioning", 7574 ctaText: "Learn more", 7575 ctaUrl: '#' 7576 }, 7577 7578 'added grip': { 7579 title: "Added grip", 7580 description: "\u003cp\u003eEnhance your custom socks with added grip to prevent slipping! The textured grip on the sole ensures better traction, or adds an extra dimension to your custom product.\u003c\/p\u003e", 7581 image: '//printroom.co/cdn/shop/files/added_grip_detail.jpg?v=1772675209&width=800', 7582 imageAlt: "Added grip", 7583 ctaText: "Learn more", 7584 ctaUrl: '#' 7585 }, 7586 7587 'custom neck tags': { 7588 title: "Custom neck tags", 7589 description: "\u003cp\u003eMake your brand stand out with custom neck tags! Whether you choose woven labels or screen printing, our high-quality neck tags offer a professional finish and are ideal for showcasing your unique brand identity.\u003c\/p\u003e", 7590 image: '//printroom.co/cdn/shop/files/cardrona_4_2_936c38b5-e634-4f0f-b224-0c9ed7b76ed9.jpg?v=1648584454&width=800', 7591 imageAlt: "garment relabelling and custom neck tags christchurch", 7592 ctaText: "Learn more", 7593 ctaUrl: '#' 7594 }, 7595 7596 'screen print': { 7597 title: "Screen Printing", 7598 description: "\u003cp\u003eOur most popular print method for good reasonâit delivers \u003cstrong\u003etop-tier qual
7598ity\u003c\/strong\u003e, long-lasting results, and exceptional value for larger orders.\u003c\/p\u003e", 7599 image: '//printroom.co/cdn/shop/files/PrintRoomMay2024Image-16.jpg?v=1733350366&width=800', 7600 imageAlt: "Screen Printing", 7601 ctaText: "Learn more", 7602 ctaUrl: '#' 7603 }, 7604 7605 'embroidery': { 7606 title: "Embroidery", 7607 description: "\u003cp\u003eUnmatched in durability, embroidery is a simple choice for those wanting texture, dimension and a high-end finish.\u003c\/p\u003e", 7608 image: '//printroom.co/cdn/shop/files/The_print_room_custom_embroidery_new_zealand.jpg?v=1613753361&width=800', 7609 imageAlt: "Embroidery", 7610 ctaText: "Learn more", 7611 ctaUrl: '#' 7612 }, 7613 7614 'heat transfer': { 7615 title: "Heat Transfers", 7616 description: "\u003cp\u003ePerfect for producing vibrant, detail-rich prints that require low minimums.\u003c\/p\u003e", 7617 image: '//printroom.co/cdn/shop/files/heat_press_print_room.jpg?v=1776795804&width=800', 7618 imageAlt: "Heat Transfers", 7619 ctaText: "Learn more", 7620 ctaUrl: '/pages/heat-transfers' 7621 }, 7622 7623 'custom patches': { 7624 title: "Custom Patches", 7625 description: "\u003cp\u003eDurable and versatile, add dimension to your merch with embroidered, woven or iron-on custom patches.\u003c\/p\u003e", 7626 image: '//printroom.co/cdn/shop/files/PrintRoomApril2024Image-42_28acbdcf-7baf-4834-9201-752d656019ad.jpg?v=1754535298&width=800', 7627 imageAlt: "custom patches NZ", 7628 ctaText: "Learn more", 7629 ctaUrl: '#' 7630 }, 7631 7632 'custom packaging': { 7633 title: "Custom packaging", 7634 description: "\u003cp\u003eThe ultimate finishing touch; custom packaging. Itâs the first thing your customer sees, make the best impression possible and package your products inline with your brand.\u003c\/p\u003e", 7635 image: '//printroom.co/cdn/shop/files/socks_label.jpg?v=1743476398&width=800', 7636 imageAlt: "custom socks", 7637 ctaText: "Learn more", 7638 ctaUrl: '#' 7639 }, 7640 7641 'custom woven label': { 7642 title: "Custom woven label", 7643 description: "\u003cp\u003eGive all of the details you need while putting the finishing touches on your product.\u003c\/p\u003e", 7644 image: '//printroom.co/cdn/shop/files/garage_project_cap_4.1.jpg?v=1770086525&width=800', 7645 imageAlt: "Custom woven label", 7646 ctaText: "Learn more", 7647 ctaUrl: '#' 7648 }, 7649 7650 'pip tags': { 7651 title: "Pip tags", 7652 description: "\u003cp\u003eElevate your garments with custom pip tags. Perfect for adding subtle branding, a small detail with a big impact for your apparel collection.\u003c\/p\u003e", 7653 image: '//printroom.co/cdn/shop/files/cardrona_3_19a3035b-75a5-4fd0-9604-01d159cdc102.jpg?v=1648585469&width=800', 7654 imageAlt: "garment relabelling and custom neck tags nz", 7655 ctaText: "Learn more", 7656 ctaUrl: '#' 7657 }, 7658 7659 'additional print placements': { 7660 title: "Additional print placements", 7661 description: "\u003cp\u003eAdd extra visibility to your brand by adding additional prints\/decorations. Back of the cap, sleeve of your sweatshirt; you name it, we can most likely do it. Make the most of your products' full 360 degrees.\u003c\/p\u003e", 7662 image: '//printroom.co/cdn/shop/files/garage_project_cap_3.1.jpg?v=1770083144&width=800', 7663 imageAlt: "Additional print placements", 7664 ctaText: "Learn more", 7665 ctaUrl: '#' 7666 }, 7667 7668 'various attachments available': { 7669 title: "Various attachments available", 7670 description: "\u003cp\u003eMake the most of customisation and choose the attachment style that works for your project. Robust, intricate, elegantâ¦your choice.\u003c\/p\u003e", 7671 image: '//printroom.co/cdn/shop/files/pack-a-punch.jpg?v=1760925265&width=800', 7672 imageAlt: "Various attachments available", 7673 ctaText: "Learn more", 7674 ctaUrl: '#' 7675 }, 7676 7677 'add additional colours': { 7678 title: "Add additional colours", 7679 description: "\u003cp\u003eCreate more depth and complexity when your brand needs it. Specific limitations apply to each product. Consult your account manager for specific limitations.\u003c\/p\u003e", 7680 image: '//printroom.co/cdn/shop/files/ombre.jpg?v=1770253000&width=800', 7681 imageAlt: "Add additional colours", 7682 ctaText: "Learn more", 7683 ctaUrl: '#' 7684 }, 7685 7686 'various closures available': { 7687 title: "Various closures available", 7688 description: "\u003cp\u003eAchieve the result you want with control over what closure you go with.\u003c\/p\u003e", 7689 image: '//printroom.co/cdn/shop/files/closure_options_2.1_76d53ef9-c502-45b4-b915-66543d3c7f40.jpg?v=1769654951&width=800', 7690 imageAlt: "Various closures available", 7691 ctaText: "Learn more", 7692 ctaUrl: '#' 7693 }, 7694 7695 'glow in the dark': { 7696 title: "Glow in the dark", 7697 description: "\u003cp\u003eBe seenâ¦in the dark! Add a novel element to your product and have some fun with it.\u003c\/p\u003e", 7698 image: '//printroom.co/cdn/shop/files/glow_in_the_dark.jpg?v=1770253668&width=800', 7699 imageAlt: "Glow in the dark", 7700 ctaText: "Learn more", 7701 ctaUrl: '#' 7702 }, 7703 7704 'applique': { 7705 title: "Applique", 7706 description: "\u003cp\u003eAppliqué embroidery isa technique where small pieces of fabric are laser cut and layered and stitched onto a garment, adding texture to the design.\u003c\/p\u003e", 7707 image: '//printroom.co/cdn/shop/files/Screenshot-2026-04-22-at-6.18.38_AM.jpg?v=1776795959&width=800', 7708 imageAlt: "Applique", 7709 ctaText: "Learn more", 7710 ctaUrl: '#' 7711 }, 7712 7713 'spreadsheet': { 7714 title: "Spreadsheet", 7715 description: "\u003cp\u003eWe send you a formatted spreadsheet that can be shared around your year group for each student to input the
7715ir garment style, size and custom name. \u003c\/p\u003e", 7716 image: null, 7717 imageAlt: "Spreadsheet", 7718 ctaText: "Learn more", 7719 ctaUrl: '#' 7720 }, 7721 7722 'online portal': { 7723 title: "Online portal", 7724 description: "\u003cp\u003eWe setup an password portected online portal for your year group to log into and purchased or order their garments. \u003c\/p\u003e", 7725 image: '//printroom.co/cdn/shop/files/product_1db770e9-3325-4bd4-8636-6f4b6d5e566a_slot_5.jpg?v=1776753322&width=800', 7726 imageAlt: "Earth Positive Premium Jersey T-shirt EP185 T-shirt branded merchandise nz", 7727 ctaText: "Click", 7728 ctaUrl: '#' 7729 } 7730 7731 }; 7732 7733 // Also build hyphenated keys for matching 7734 const brandingServiceDataNormalized = {}; 7735 Object.keys(brandingServiceData).forEach(key => { 7736 // Store with original key 7737 brandingServiceDataNormalized[key] = brandingServiceData[key]; 7738 // Also store with hyphenated version 7739 const hyphenated = key.replace(/\s+/g, '-'); 7740 brandingServiceDataNormalized[hyphenated] = brandingServiceData[key]; 7741 // Also store with spaced version (in case key was hyphenated) 7742 const spaced = key.replace(/-/g, ' '); 7743 brandingServiceDataNormalized[spaced] = brandingServiceData[key]; 7744 }); 7745 7746 // Configuration from section settings 7747 const config = { 7748 maxWidth: 400, 7749 animationDuration: 300, 7750 showOverlay: false 7751 }; 7752 7753 // State 7754 let isCardOpen = false; 7755 let originRect = null; 7756 7757 // DOM elements 7758 const overlay = document.getElementById('branding-floating-overlay'); 7759 const card = document.getElementById('branding-floating-card'); 7760 const cardImageLink = document.getElementById('branding-card-image-link'); 7761 const cardImage = document.getElementById('branding-card-image'); 7762 const cardLabel = document.getElementById('branding-card-label'); 7763 const cardTitle = document.getElementById('branding-card-title'); 7764 const cardLoading = document.getElementById('branding-card-loading'); 7765 const cardDescription = document.getElementById('branding-card-description'); 7766 7767 // Find service data by matching the label text 7768 function findServiceData(label) { 7769 if (!label) return null; 7770 const searchKey = label.toLowerCase().trim(); 7771 const searchKeyHyphenated = searchKey.replace(/\s+/g, '-'); 7772 7773 // Direct match 7774 if (brandingServiceDataNormalized[searchKey]) { 7775 return brandingServiceDataNormalized[searchKey]; 7776 } 7777 7778 // Try hyphenated version 7779 if (brandingServiceDataNormalized[searchKeyHyphenated]) { 7780 return brandingServiceDataNormalized[searchKeyHyphenated]; 7781 } 7782 7783 // Partial match - check if any key is contained in the label or vice versa 7784 for (const key of Object.keys(brandingServiceDataNormalized)) { 7785 if (searchKey.includes(key) || key.includes(searchKey)) { 7786 return brandingServiceDataNormalized[key]; 7787 } 7788 } 7789 7790 return null; 7791 } 7792 7793 // Populate card content 7794 function populateCard(data, serviceUrl) { 7795 const url = data.ctaUrl || serviceUrl || '#'; 7796 7797 // Set image 7798 if (data.image) { 7799 cardImage.src = data.image; 7800 cardImage.alt = data.imageAlt || data.title || ''; 7801 cardImageLink.classList.add('has-image'); 7802 } else { 7803 cardImage.src = ''; 7804 cardImage.alt = ''; 7805 cardImageLink.classList.remove('has-image'); 7806 } 7807 7808 // Set links 7809 cardImageLink.href = url; 7810 cardLabel.href = url; 7811 cardLabel.textContent = data.title || ''; 7812 7813 // Set content 7814 cardTitle.textContent = data.title || ''; 7815 7816 // Handle description - if we have static content use it, otherwise fetch 7817 if (data.description && data.description.trim() !== '' && data.description !== '<p>Add a description of this branding service.</p>') { 7818 cardDescription.innerHTML = data.description; 7819 cardLoading.style.display = 'none'; 7820 } else { 7821 // Fetch description from service page 7822 cardDescription.innerHTML = ''; 7823 cardLoading.style.display = 'flex'; 7824 7825 if (url && url !== '#') { 7826 fetch(url) 7827 .then(response => response.text()) 7828 .then(html => { 7829 const parser = new DOMParser(); 7830 const doc = parser.parseFromString(html, 'text/html'); 7831 const main = doc.querySelector('main') || doc.querySelector('.page-content') || doc.querySelector('.shopify-section') || doc.body; 7832 let description = '<p>Discover our premium branding service.</p>'; 7833 if (main) { 7834 const firstP = main.querySelector('p'); 7835 if (firstP) description = '<p>' + firstP.textContent.trim() + '</p>'; 7836 } 7837 cardDescription.innerHTML = description; 7838 cardLoading.style.display = 'none'; 7839 }) 7840 .catch(() => { 7841 cardDescription.innerHTML = '<p>Discover our premium branding service.</p>'; 7842 cardLoading.style.display = 'none'; 7843 }); 7844 } else { 7845 cardDescription.innerHTML = '<p>Discover our premium branding service.</p>'; 7846 cardLoading.style.display = 'none'; 7847 } 7848 } 7849 } 7850 7851 // Show card with animation from button position 7852 function showCardWithData(data, buttonElement, serviceUrl) { 7853 if (!data) { 7854 console.warn('No service data provided'); 7855 return; 7856 } 7857 7858 // Get button position for animation origin 7859 const buttonRect = buttonElement 7860 ? buttonElement.getBoundingClientRect() 7861 : { left: window.innerWidth / 2 - 50, top: window.innerHeight / 2, width: 100, height: 40 }; 7862 7863 originRect = { ...buttonRect }; 7864 7865 // Populate content 7866 populateCard(data, serviceUrl); 7867 7868 // Calculate target dimensions 7869 const expandedWidth = Math.min(window.innerWidth - 40, config.maxWidth); 7870 const padding = 20; 7871 const headerHeight = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--header-height') || '0', 10); 7872 7873 // Center expanded card horizontally on the button's center 7874const buttonCenterX = buttonRect.left + (buttonRect.width / 2); 7875let targetLeft = buttonCenterX - (expandedWidth / 2); 7876 7877// Clamp to viewport bounds horizontally 7878targetLeft = Math.max(padding, Math.min(targetLeft, window.innerWidth - expandedWidth - padding)); 7879 7880// Position vertically: expand from button's top, but ensure it stays in viewport 7881// Start from the button's vertical position 7882let targetTop = buttonRect.top; 7883 7884// Get actual card content height or use a more realistic estimate 7885const cardContent = card.querySelector('.card__content') || card; 7886const estimatedCardHeight = cardContent.scrollHeight || 600; // Increased from 400 to 600 7887 7888// Calculate available space below and above the button 7889const spaceBelow = window.innerHeight - buttonRect.bottom - padding; 7890const spaceAbove = buttonRect.top - headerHeight - padding; 7891 7892// If card would go below viewport, shift it up 7893if (targetTop + estimatedCardHeight > window.innerHeight - padding) { 7894 targetTop = Math.max(headerHeight + padding, window.innerHeight - estimatedCardHeight - padding); 7895} 7896 7897// If card would go above header, shift it down 7898if (targetTop < headerHeight + padding) { 7899 targetTop = headerHeight + padding; 7900} 7901 7902// Final safety check: ensure card fits in viewport 7903const maxAllowedHeight = window.innerHeight - headerHeight - (padding * 2); 7904if (estimatedCardHeight > maxAllowedHeight) { 7905 targetTop = headerHeight + padding; 7906 card.style.maxHeight = maxAllowedHeight + 'px'; 7907 card.style.overflowY = 'auto'; 7908} 7909 7910 7911 // Show overlay 7912 if (config.showOverlay) { 7913 overlay.classList.add('active'); 7914 } 7915 7916 // Set initial state at EXACT button position 7917 card.style.position = 'fixed'; 7918 card.style.top = buttonRect.top + 'px'; 7919 card.style.left = buttonRect.left + 'px'; 7920 card.style.width = buttonRect.width + 'px'; 7921 card.style.height = buttonRect.height + 'px'; 7922 card.style.zIndex = '10000'; 7923 card.style.margin = '0'; 7924 card.style.display = 'flex'; 7925 card.style.opacity = '1'; 7926 card.style.pointerEvents = 'auto'; 7927 card.style.overflow = 'hidden';
7928 card.style.transition = 'none'; 7929 card.style.flexDirection = 'column'; 7930 card.style.borderRadius = '16px'; 7931 7932 // Force reflow to ensure initial position is applied 7933 card.getBoundingClientRect(); 7934 7935 // Now animate to expanded position 7936 requestAnimationFrame(() => { 7937 requestAnimationFrame(() => { 7938 card.style.transition = ` 7939 top ${config.animationDuration}ms cubic-bezier(0.32, 0.72, 0, 1), 7940 left ${config.animationDuration}ms cubic-bezier(0.32, 0.72, 0, 1), 7941 width ${config.animationDuration}ms cubic-bezier(0.32, 0.72, 0, 1), 7942 height ${config.animationDuration}ms cubic-bezier(0.32, 0.72, 0, 1) 7943 `; 7944 card.style.top = targetTop + 'px'; 7945 card.style.left = targetLeft + 'px'; 7946 card.style.width = expandedWidth + 'px'; 7947 card.style.height = 'auto'; 7948 }); 7949 }); 7950 7951 isCardOpen = true; 7952 } 7953 7954 // Close card with animation back to origin 7955 window.closeBrandingServiceCard = function() { 7956 if (!isCardOpen) return; 7957 7958 // Animate back to origin position (exactly like carousel collapseCard) 7959 if (originRect) { 7960 card.style.transition = ` 7961 top ${config.animationDuration}ms cubic-bezier(0.32, 0.72, 0, 1), 7962 left ${config.animationDuration}ms cubic-bezier(0.32, 0.72, 0, 1), 7963 width ${config.animationDuration}ms cubic-bezier(0.32, 0.72, 0, 1), 7964 height ${config.animationDuration}ms cubic-bezier(0.32, 0.72, 0, 1) 7965 `; 7966 card.style.top = originRect.top + 'px'; 7967 card.style.left = originRect.left + 'px'; 7968 card.style.width = originRect.width + 'px'; 7969 card.style.height = originRect.height + 'px'; 7970 card.style.overflow = 'hidden'; 7971 } 7972 7973 // Hide overlay 7974 overlay.classList.remove('active'); 7975 7976 // Clean up after animation 7977 setTimeout(() => { 7978 card.style.display = 'none'; 7979 card.style.transition = ''; 7980 card.style.top = ''; 7981 card.style.left = ''; 7982 card.style.width = ''; 7983 card.style.height = ''; 7984 card.style.opacity = ''; 7985 card.style.pointerEvents = ''; 7986 card.style.overflow = ''; 7987 isCardOpen = false; 7988 originRect = null; 7989 }, config.animationDuration); 7990 }; 7991 7992 // Event listener for pill button clicks 7993 // Alpine's $dispatch bubbles from the element through the DOM 7994 document.addEventListener('branding-modal:open', (event) => { 7995 // Prevent duplicate handling 7996 if (event._handled) return; 7997 event._handled = true; 7998 7999 const { label, url, element } = event.detail || {}; 8000 8001 // Get the pill text from the button element if available 8002 const pillText = element ? (element.querySelector('.branding-service-pill__text')?.textContent || label) : label; 8003 8004 // Find service data by matching the pill text 8005 const serviceData = findServiceData(pillText); 8006 if (!serviceData) { 8007 console.warn('No service data configured for:', pillText); 8008 return; 8009 } 8010 8011 // If a card is already open, close it first 8012 if (isCardOpen) { 8013 window.closeBrandingServiceCard(); 8014 setTimeout(() => { 8015 showCardWithData(serviceData, element, url); 8016 }, config.animationDuration + 50); 8017 } else { 8018 showCardWithData(serviceData, element, url); 8019 } 8020 }); 8021 8022 // Escape key handler 8023 document.addEventListener('keydown', (e) => { 8024 if (e.key === 'Escape' && isCardOpen) { 8025 window.closeBrandingServiceCard(); 8026 } 8027 }); 8028})(); 8029</script>
8029 8030 8031 8032</section> 8033 8034
8034<script src="//printroom.co/cdn/shop/t/59/assets/global.bundle.js?v=149077486339995821341790734057" type="module"></script>
8034 8035 8036
8036<script> 8037 window.Shopify = window.Shopify || {}; 8038 window.Shopify.locale = "en"; 8039 window.Shopify.currency = { 8040 active: "USD", 8041 rate: "" 8042 }; 8043 </script>
8043 8044 <div id="shopify-block-AWDJwL3lGQkF3Zitrd__39280165312039977" class="shopify-block shopify-app-block"> 8045 8046�
8046<script> 8047 console.log('[FulfillmentFee] Namespace: app--313853968385--fulfillment_fee'); 8048 console.log('[FulfillmentFee] Key: config'); 8049 console.log('[FulfillmentFee] Config value:', {"vendorFees":{"WÄtÄ FX Crew":5.75},"feeProductVariantId":"gid:\/\/shopify\/ProductVariant\/44486403227718","isEnabled":true}); 8050</script>
8050<script> 8051 (function() { 8052 // The metafield .value is already a parsed JSON object 8053 var configData = {"vendorFees":{"WÄtÄ FX Crew":5.75},"feeProductVariantId":"gid:\/\/shopify\/ProductVariant\/44486403227718","isEnabled":true}; 8054 if (configData && typeof configData === 'object') { 8055 window.__FULFILLMENT_FEE_CONFIG__ = configData; 8056 console.log('[FulfillmentFee] Config loaded:', window.__FULFILLMENT_FEE_CONFIG__); 8057 } else { 8058 console.error('[FulfillmentFee] Invalid config data:', configData); 8059 window.__FULFILLMENT_FEE_CONFIG__ = null; 8060 } 8061 })(); 8062</script>
vendor: 2 bytes, line 8062
8062
8063<script src="https://cdn.shopify.com/extensions/019d45d2-6a70-7eed-8da1-d1e8fd0fae86/fulfillment-fee-app-100/assets/fulfillment-fee-manager.js" defer></script>
8063 8064</div><div id="shopify-block-AWitpMC8rZDJCSlg4R__15573056287721514228" class="shopify-block shopify-app-block json-ld-for-seo"><!-- generated: 2026-10-04 21:38:25 +1300 --> 8065<!-- BEGIN app snippet: json_ld_for_seo_web_page -->
8065<script type="application/ld+json"> 8066 { 8067 "@context": "https://schema.org", 8068 "@type": "WebPage", 8069 "@id": "https:\/\/printroom.co\/blogs\/the-print-room-nz#json-ld-for-seo-webpage", 8070 "url": "https:\/\/printroom.co\/blogs\/the-print-room-nz", 8071 "image": null, 8072 "primaryImageOfPage": null, 8073 "dateCreated": null, 8074 "datePublished": null 8075 } 8076</script>
8076 8077<!-- END app snippet --> 8078<!-- wp 3 --><!-- BEGIN app snippet: json_ld_for_seo_organization -->
8079<script type="application/ld+json"> 8080{ 8081 "@context": "https://schema.org", 8082 "@type": "Organization","@id": "https:\/\/printroom.co\/#org", 8083 "name": "The Print Room", 8084 "url": "https:\/\/printroom.co", 8085 "description": "NZâs experts in custom t-shirt printing, tote bags, uniforms, and branded merchandise. Print Room offers high-quality screen printing and embroidery using eco-friendly inks. Fast turnaround, sustainable production, and trusted by leading New Zealand brands.", 8086 "telephone": "+6434259694", 8087 "logo": "https:\/\/cdn.shopify.com\/s\/images\/admin\/no-image-large.gif", 8088 "image": "https:\/\/cdn.shopify.com\/s\/images\/admin\/no-image-large.gif", 8089 "sameAs": ["","https:\/\/www.instagram.com\/printroomnz\/"], 8090 "address": { 8091 "@type": "PostalAddress", 8092 "streetAddress": "21 Grosvenor Street, 21", 8093 "addressLocality": "Dunedin", 8094 "addressRegion": "Otago", 8095 "postalCode": "9011", 8096 "addressCountry": "NZ" 8097 }, 8098 "contactPoint": [ 8099 { 8100 "@type": "ContactPoint", 8101 "telephone": "+6434259694", 8102 "email": "" 8103 } 8104 ]} 8105</script>
8105 8106<!-- END app snippet --> <!-- o 4 --><!-- BEGIN app snippet: json_ld_for_seo_product_group --><!-- END app snippet --> 8107<!-- p 1 --><!-- A 13 --> 8108 8109 8110</div>
8110<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
8110 8111</body> 8112</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.