Cartimg src="//projektride.co.uk/cdn/shop/files/Screenshot2023-06-25at11.50.29_2048x2048.png?v=1687690235" alt="BACKCOUNTRY TOP TUBE PACK (1L)" class="mfp-zoom-in-cur" id="31960269586658">
5'6"-5'10"
/
Best selling products29"-31"
Spend /
£50BACKCOUNTRY TOP TUBE PACK (1L)74-79cm to qualify for free shippingBACKCOUNTRY TOP TUBE PACK (1L)
52-54cmCongratulations! Your order qualifies for free shipping£50.00
52-54cm
52-54cm
SKU: TBM
Medium
<
a class="product__media product__media--featured"
href="/collections/best-selling-collection/products/kryptolok-standard-u-lock-with-4-foot-kryptoflex-cable-hire"
title="Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable"
aria-label="Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable"
style="background-image: url(//projektride.co.uk/cdn/shop/files/Screenshot2022-03-09at20.04.46_560e2033-8232-4bd3-a423-3ce8c9f11849_600x.png?v=1691610428)">
Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable
I'm looking to find out more information about a product, where can I find this?
Brake Rotors<
nter" style="background-image: url('//projektride.co.uk/cdn/shop/files/2571D9FF-E9AE-4004-9A55-C7FD4DD999D6_2048x.jpg?v=1640941114');">Please get in touch with a member of the team either by phone (
ellingPlanUpdater(settings) {
if (!settings || !settings.preorder_enabled) {
return;
}
// Listen for stoq:preorder-api-ready event dispatched by preorder.js
window.addEventListener('stoq:preorder-api-ready', function(event) {
console.debug('STOQ - Preorder API ready, updating cart selling plans');
if (window._RestockRocket && window._RestockRocket.updateCartSellingPlans) {
window._RestockRocket.updateCartSellingPlans()
.then(hasUpdates => {
if (hasUpdates) {
console.debug('STOQ - cart selling plans updated successfully');
} else {
console.debug('STOQ - no cart selling plan updates needed');
}
})
.catch(error => {
console.error('STOQ - error updating cart selling plans:', error);
});
}
});
}
// First try to get settings from metafields with expiry check
const cachedSettings = window._RestockRocketConfig.cachedSettings;
const validCache
window._RestockRocketConfig = window._RestockRocketConfig || {}
// Helper function to normalize locale format from hyphen to underscore (e.g., 'en-US' -> 'en_us')
// This matches the backend's Mobility.normalize_locale behavior
// Returns empty string if locale is empty or invalid (matches original behavior)
function normalizeLocale(locale) {
if (!locale || locale.trim() === '') {
return '';
}
return locale.toString().toLowerCase().replace(/-/g, '_');
}
window._RestockRocketConfig.locale = 'en';
window._RestockRocketConfig.normalizedLocale = normalizeLocale('en');
window._RestockRocketConfig.shop = 'projektride.myshopify.com';
window._RestockRocketConfig.pageType = 'product';
window._RestockRocketConfig.liquidRenderedAt = 1770940259;window._RestockRocketConfig.marketId = 382140642;window._RestockRocketConfig.countryName = 'United Kingdom';
window._RestockRocketConfig.countryIsoCode = 'GB';window._RestockRocketConfig.cartInventoryQuantity = {};window._RestockRocketConfig.cachedSettings = {"id":38500,"shop_id":38436,"currency":"GBP","created_at":"2025-07-26T09:13:57.337Z","updated_at":"2025-12-28T14:44:23.508Z","enable_app":true,"enable_signup_widget":false,"storefront_button_text":"Notify me when available","storefront_button_text_color":"#FFFFFF","storefront_button_background_color":"#202223","storefront_form_header":"Notify me","storefront_form_description":"Get a notification as soon as this product is back in stock by signing up below!","storefront_form_button_text":"Notify me when available","storefront_form_button_text_color":"#FFFFFF","storefront_form_button_background_color":"#202223","storefront_form_terms":"Promise we won't spam. You'll only receive notifications for this product.","storefront_form_error":"Please enter a valid email address","storefront_form_success":"Thank you! We will notify you when the product is available.","enable_powered_by":true,"show_button_on_preorder":true,"sms_enabled":false,"email_enabled":true,"storefront_button_disable_tag":"rocket-hide","theme_config":{"disableDebugLoggingForNonPreorderItem":false},"storefront_form_email_placeholder":"Email address","storefront_form_phone_placeholder":"SMS","storefront_form_phone_label":"Phone number","storefront_form_email_label":"Email","storefront_form_phone_error":"
dSettings = cachedSettings ? checkSettingsExpiry(cachedSettings) : null;
if (validCachedSettings) {
console.debug('STOQ - using cached settings');
initializeScripts(validCachedSettings);
} else {
console.debug('STOQ - fetching fresh settings');
const headers = {
'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.Shopify.shop,
'ngrok-skip-browser-warning': 'skip'
};
if (window.Shopify?.theme?.role === 'main') {
headers['X-Shopify-Theme-Schema-Name'] = window.Shopify.theme.schema_name;
headers['X-Shopify-Theme-Schema-Version'] = window.Shopify.theme.schema_version;
headers['X-Shopify-Theme-Store-Id'] = window.Shopify.theme.theme_store_id;
}
fetch(
`${window._RestockRocketConfig.host}/api/v1/setting.json?translation_locale=${window._RestockRocketConfig.normalizedLocale}`,
{ headers }
)
.then(function(response) {
if (!response.ok) {
throw new Error('Network response was not ok');
}
rPlease enter a valid phone number","storefront_form_customer_name_placeholder":"Name","storefront_form_customer_name_error":"Please enter your name","storefront_form_did_you_mean_error":"Did you mean %{suggested_email}? Or use %{current_email}","form_customer_name_enabled":false,"form_customer_name_required":false,"css_config":"","js_config":null,"collect_promotion_consent":false,"storefront_form_promotion_consent_label":"Notify me about other news, sales, discounts & offers too","show_button_on_collection":false,"sms_default_country":"us","sms_allowed_countries":[],"sms_restrict_country":false,"sms_default_channel":true,"optin_required":false,"optin_success_text":"Registration confirmed! You'll receive an alert when the product is restocked.","storefront_button_border_radius":0,"storefront_button_disable_tag_hides_button":true,"storefront_button_disable_tag_enabled":false,"quantity_required":false,"storefront_form_quantity_label":"Quantity","enable_alerts":true,"sms_allowed":false,"email_allowed":true,"colle
ore 11-36t 10spd\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"label\"\u003eCHAINGUIDE\u003c\/td\u003e\n\u003ctd class=\"data\"\u003en\/a\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"label\"\u003eF\/D\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eShimano Deore\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"label\"\u003eR\/D\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eShimano Deore SGS\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"label\"\u003eSHIFTERS\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eMicroShift\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"label\"\u003eBRAKE CALIPERS\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eTRP Spyre C Flat mount\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"label\"\u003eFRONT BRAKE ROTOR\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eTRP Spyre C 160mm\u003c\/td\u003e\n\u003c\/tr\u0
03e\n\u003ctr\u003e\n\u003ctd class=\"label\"\u003eREAR BRAKE ROTOR\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eTRP Spyre C 160mm\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"label\"\u003eBRAKE LEVERS\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eTektro RRL-A\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"label\"\u003eHEADSET\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eFSA No.1\/No.10\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"label\"\u003eHANDLEBAR\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eKona Road\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"label\"\u003eSTEM\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eKona Road\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"label\"\u003eSEATPOST\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eKona Deluxe Thumb w\/Offset 27.2mm\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"label\"\u003eSEAT CLAMP\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eKona Clamp\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"label\"\u003eGRIPS\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eKona Cork Tape\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"label\"\u003eSADDLE\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eBrooks B17 Leather\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"label\"\u003eFRONT HUB\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eFormula 100x12mm\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"label\"\u003eREAR HUB\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eFormula 142x12mm\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"label\"\u003eSPOKES\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eStainless Black 14g\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"label\"\u003eRIMS\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eWTB ST i23 TCS 2.0\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"label\"\u003eFRONT TIRE\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eSchwalbe Marathon Mondial 700x40c\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"label\"\u003eREAR TIRE\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eSchwalbe Marathon Mondial 700x40c\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"label\"\u003ePAINT COLOR\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eGloss Dusky Purple w\/ Avocado \u0026amp; Indigo Decals\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"label\"\u003eEXTRAS\u003c\/td\u003e\n\u003ctd class=\"data\"\u003eFenders w\/ Mudflaps, Pannier Rack\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/div\u003e\n\u003cp class=\"specs_disclaimer\"\u003eAll specifications are subject to change without notice\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"bike_geometry\"\u003e\n\u003ch2\u003eGEOMETRY\u003cspan class=\"s-geo\"\u003e\u003cspan class=\"s-current\" id=\"s-geo_mm\"\u003emm\u003c\/span\u003e\u003cspan id=\"s-geo_inch\"\u003einches\u003c\/span\u003e\u003c\/span\u003e\n\u003c\/h2\u003e\n\u003cdiv id=\"geo_mm\"\u003e\n\u003cdiv class=\"table_wrapper\"\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd class=\"geo_numbers\"\u003e \u003c\/td\u003e\n\u003ctd class=\"label\"\u003eSIZE\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e48\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e50\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e52\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e54\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e56\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e58\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"geo_numbers\"\u003e1\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eST LENGTH\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e480\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e500\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e520\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e540\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e560\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e580\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"geo_numbers\"\u003e2\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eTT LENGTH\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e523\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e538\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e555\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e571\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e588\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e606\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"geo_numbers\"\u003e3\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eREACH\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e375\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e380\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e385\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e390\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e395\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e400\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"geo_numbers\"\u003e4\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eSTACK\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e551\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e570\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e591\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e610\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e632\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e650\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"geo_numbers\"\u003e5\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eSTANDOVER\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e752\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e770\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e793\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e813\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e835\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e854\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"geo_numbers\"\u003e6\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eHT ANGLE\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e70.5\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e70.5\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e70.5\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e70.5\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e70.5\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e70.5\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"geo_numbers\"\u003e7\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eHT LENGTH\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e95\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e115\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e140\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e160\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e185\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e205\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"geo_numbers\"\u003e8\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eST ANGLE\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e75\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e74.5\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e74\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e73.5\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e73\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e72.5\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"geo_numbers\"\u003e9\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eCS LENGTH\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e445\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e445\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e445\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e445\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e445\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e445\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"geo_numbers\"\u003e10\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eBB DROP\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e74\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e74\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e72\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e72\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e70\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e70\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"geo_numbers\"\u003e11\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eBB HEIGHT\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e281\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e281\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e283\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e283\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e285\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e285\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"geo_numbers\"\u003e12\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eWHEELBASE\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e1035\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e1047\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e1061\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e1073\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e1086\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e1099\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"geo_numbers\"\u003e13\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eFRONT CENTER\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e601\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e613\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e626\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e638\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e651\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e663\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"geo_numbers\"\u003e14\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eFORK LENGTH\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e415\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e415\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e415\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e415\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e415\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e415\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\"\u003e\n\u003ctd class=\"geo_numbers\"\u003e15\u003c\/td\u003e\n\u003ctd class=\"label\"\u003eFORK OFFSET\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e50\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e50\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e50\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e50\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e50\u003c\/td\u003e\n\u003ctd class=\"data\"\u003e50\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"geo_diagram\"\u003e\u003cimg alt=\"KONA Geometry\" src=\"https:\/\/images.konaworld.com\/355e\/geo_diagram.png\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"sectionwrapper bike_sizing\"\u003e\n\u003cdiv data-scroll-index=\"2\" class=\"sectiontarget\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003cdiv class=\"section\"\u003e\n\u003ch2\u003eSIZING + FIT\u003c\/h2\u003e\n\u003ch4\u003eGRAVEL \/ DROP BAR \/ URBAN\u003c\/h4\u003e\n\u003cdiv class=\"table_wrapper\"\u003e\n\u003ctable class=\"sizing_chart\"\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eHEIGHT\/INCHES\u003c\/th\u003e\n\u003cth\u003eHEIGHT\/METRIC\u003c\/th\u003e\n\u003cth\u003eINSEAM\/INCHES\u003c\/th\u003e\n\u003cth\u003eINSEAM\/METRIC\u003c\/th\u003e\n\u003cth\u003eROVE\u003c\/th\u003e\n\u003cth\u003eLIBRE\u003c\/th\u003e\n\u003cth\u003eSUTRA\u003c\/th\u003e\n\u003cth\u003eDEWS\u003c\/th\u003e\n\u003cth\u003eCOCO\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e4'10\"-5'1\"\u003c\/td\u003e\n\u003ctd\u003e147-155cm\u003c\/td\u003e\n\u003ctd\u003e24”-27”\u003c\/td\u003e\n\u003ctd\u003e61-69cm\u003c\/td\u003e\n\u003ctd\u003e48cm\u003c\/td\u003e\n\u003ctd\u003e50cm\u003c\/td\u003e\n\u003ctd\u003e48cm\u003c\/td\u003e\n\u003ctd\u003eN\/A\u003c\/td\u003e\n\u003ctd\u003eXS\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5'0\"-5'3\"\u003c\/td\u003e\n\u003ctd\u003e152-160cm\u003c\/td\u003e\n\u003ctd\u003e26\"-29\"\u003c\/td\u003e\n\u003ctd\u003e66-74cm\u003c\/td\u003e\n\u003ctd\u003e48-50cm\u003c\/td\u003e\n\u003ctd\u003e50cm\u003c\/td\u003e\n\u003ctd\u003e48-50cm\u003c\/td\u003e\n\u003ctd\u003eSmall\u003c\/td\u003e\n\u003ctd\u003eSmall\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5'2\"-5'7\"\u003c\/td\u003e\n\u003ctd\u003e157-170cm\u003c\/td\u003e\n\u003ctd\u003e27\"-30\"\u003c\/td\u003e\n\u003ctd\u003e69-76cm\u003c\/td\u003e\n\u003ctd\u003e48-52cm\u003c\/td\u003e\n\u003ctd\u003e50-52cm\u003c\/td\u003e\n\u003ctd\u003e48-52cm\u003c\/td\u003e\n\u003ctd\u003eSmall, Medium\u003c\/td\u003e\n\u003ctd\u003eSmall, Medium\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5'6\"-5'10\"\u003c\/td\u003e\n\u003ctd\u003e168-178cm\u003c\/td\u003e\n\u003ctd\u003e29\"-31\"\u003c\/td\u003e\n\u003ctd\u003e74-79cm\u003c\/td\u003e\n\u003ctd\u003e52-54cm\u003c\/td\u003e\n\u003ctd\u003e52-54cm\u003c\/td\u003e\n\u003ctd\u003e52-54cm\u003c\/td\u003e\n\u003ctd\u003eMedium\u003c\/td\u003e\n\u003ctd\u003eMedium\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5'9\"-6'0\"\u003c\/td\u003e\n\u003ctd\u003e175-183cm\u003c\/td\u003e\n\u003ctd\u003e30\"-33\"\u003c\/td\u003e\n\u003ctd\u003e76-84cm\u003c\/td\u003e\n\u003ctd\u003e52-56cm\u003c\/td\u003e\n\u003ctd\u003e54-56cm\u003c\/td\u003e\n\u003ctd\u003e54-56cm\u003c\/td\u003e\n\u003ctd\u003eMedium, Large\u003c\/td\u003e\n\u003ctd\u003eMedium, Large\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5'11\"-6'2\"\u003c\/td\u003e\n\u003ctd\u003e180-188cm\u003c\/td\u003e\n\u003ctd\u003e32\"-35\"\u003c\/td\u003e\n\u003ctd\u003e81-89cm\u003c\/td\u003e\n\u003ctd\u003e54-58cm\u003c\/td\u003e\n\u003ctd\u003e54-58cm\u003c\/td\u003e\n\u003ctd\u003e54-58cm\u003c\/td\u003e\n\u003ctd\u003eLarge, XL\u003c\/td\u003e\n\u003ctd\u003eLarge\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e6'1\"-6'5\"\u003c\/td\u003e\n\u003ctd\u003e185-196cm\u003c\/td\u003e\n\u003ctd\u003e33\"-36\"\u003c\/td\u003e\n\u003ctd\u003e84-91cm\u003c\/td\u003e\n\u003ctd\u003e56-58cm\u003c\/td\u003e\n\u003ctd\u003e58cm\u003c\/td\u003e\n\u003ctd\u003e56-58cm\u003c\/td\u003e\n\u003ctd\u003eXL\u003c\/td\u003e\n\u003ctd\u003eN\/A\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e \u003cmeta charset=\"utf-8\"\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eThanks for considering ProjektRide for your next purchase. All bikes are fully assembled and test rode before leaving our bike shop in Edinburgh. Please allow 5-7 days for bicycle delivery although we aim to post bikes out the same day.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eIf any purchases are to be made using any cycle to work schemes, please either pop into the shop or get in touch via email\/phone to get the ball rolling. If you are not 100% sure with bike sizing, please feel free to contact us to double check.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eAll bike sales include a free running in service after 6-10 weeks.\u003c\/p\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {43916509610210 : "deny",43916509642978 : "deny",43916509675746 : "deny",43916509708514 : "deny",43916509741282 : "deny",43916509774050 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {43916509610210 : parseInt("0"),43916509642978 : parseInt("0"),43916509675746 : parseInt("0"),43916509708514 : parseInt("0"),43916509741282 : parseInt("0"),43916509774050 : parseInt("0"),};
window._RestockRocketConfig.variantsPreorderCount = {43916509610210 : parseInt(""),43916509642978 : parseInt(""),43916509675746 : parseInt(""),43916509708514 : parseInt(""),43916509741282 : parseInt(""),43916509774050 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {43916509610210 : null,43916509642978 : null,43916509675746 : null,43916509708514 : null,43916509741282 : null,43916509774050 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {43916509610210 : parseInt(""),43916509642978 : parseInt(""),43916509675746 : parseInt(""),43916509708514 : parseInt(""),43916509741282 : parseInt(""),43916509774050 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {43916509610210 : null,43916509642978 : null,43916509675746 : null,43916509708514 : null,43916509741282 : null,43916509774050 : null,};
window._RestockRocketConfig.variantsShippingText = {43916509610210 : "",43916509642978 : "",43916509675746 : "",43916509708514 : "",43916509741282 : "",43916509774050 : "",};
window._RestockRocketConfig.variantsShippingTextForMarket = {43916509610210 : null,43916509642978 : null,43916509675746 : null,43916509708514 : null,43916509741282 : null,43916509774050 : null,};
window._RestockRocketConfig.selected_variant_id = 43916509610210;
window._RestockRocketConfig.selected_variant_available = window._RestockRocketConfig.product.variants.find(function(variant) { return variant.id == window._RestockRocketConfig.selected_variant_id }).available;window._RestockRocketConfig.scriptUrlProduct = 'https://cdn.shopify.com/extensions/019c4de0-280f-760f-b566-2e2f8e837eb8/restock-rocket-shopify-454/assets/restockrocket-product.js'
window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019c4de0-280f-760f-b566-2e2f8e837eb8/restock-rocket-shopify-454/assets/restockrocket-collection.js'
window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1)
window._RestockRocketConfig.host = 'https://app.restockrocket.io'
const SETTINGS_CACHE_DURATION = 15 * 60 * 1000; // 15 minutes in milliseconds
const LIQUID_CACHE_MAX_AGE = 2 * 60 * 60; // 2 hours in seconds
// Calculate Liquid cache freshness once at initialization
const liquidRenderedAt = window._RestockRocketConfig.liquidRenderedAt;
// Validate timestamp and calculate cache age
if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) {
console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh');
window._RestockRocketConfig.isLiquidCacheFresh = true;
} else {
const now = Math.floor(Date.now() / 1000); // Current time in seconds
const liquidCacheAge = now - liquidRenderedAt; // Age in seconds
// Handle client clock ahead of server
if (liquidCacheAge <
0) {
console.debug(`STOQ - Client clock appears ahead of server by ${Math.abs(Math.round(liquidCacheAge / 60))} minutes, assuming cache fresh`);
window._RestockRocketConfig.isLiquidCacheFresh = true;
} else if (liquidCacheAge
<= LIQUID_CACHE_MAX_AGE) {
console.debug(`STOQ - Liquid cache is fresh (${Math.round(liquidCacheAge / 60)} minutes old)`);
window._RestockRocketConfig.isLiquidCacheFresh = true;
} else {
console.debug(`STOQ - Liquid cache is stale (${Math.round(liquidCacheAge / 60)} minutes old, max ${Math.round(LIQUID_CACHE_MAX_AGE / 60)} minutes)`);
window._RestockRocketConfig.isLiquidCacheFresh = false;
}
}
function checkSettingsExpiry(settings) {
try {
if (!settings || !settings.updated_at) {
console.debug('STOQ - Invalid settings data structure');
return null;
}
if (!settings.cache) {
console.debug('STOQ - settings caching disabled');
return null;
}
// Check if translations are enabled but missing from cache
// This handles the backfill period where DB has translations but metafield doesn't
if (settings.multi_language_enabled) {
if (!settings.translations) {
// Translations enabled but no
translation data in metafield
// Metafield hasn't been backfilled yet - force refresh
console.debug('STOQ - multi-language enabled but no translation data in cache, fetching fresh');
return null;
}
// Translations object exists in metafield - cache is vali
d
// If current locale isn't translated, applyTranslations will gracefully use default locale from base fields
if (window._RestockRocketConfig.normalizedLocale &&
!Object.prototype.hasOwnProperty.call(settings.translations, window._RestockRocketConfig.normalizedLocale)) {
console.debug('STOQ - locale not explicitly translated, will use default language from cache');
}
// Don't return null - continue using cache even for untranslated locales
}
const updatedAt = new Date(settings.updated_at);
if (isNaN(updatedAt.getTime())) {
console.debug('STOQ - Invalid updated_at date format in settings');
return null;
}
const age = Date.now() - updatedAt.getTime();
if (age
<
SETTINGS_CACHE_DURATION) {
console.debug('STOQ - settings changed recently, skipping cache');
return null;
}
return settings;
} catch (error) {
console.debug('STOQ - Error checking settings cache:', error);
return null;
}
}
function createRestockRocketContainer() {
const restockRocketContainer = document.createElement('div');
restockRocketContainer.id = 'restock-rocket';
document.body.appendChild(restockRocketContainer);
}
function createRestockRocketScript(scriptUrl) {
const restockRocketScriptElement = document.createElement('script');
restockRocketScriptElement.setAttribute('defer', 'defer');
restockRocketScriptElement.src = scriptUrl;
document.body.appendChild(restockRocketScriptElement);
}
createRestockRocketContainer()
console.debug('STOQ - extension activated')
function applyTranslations(settings) {
try {
// Skip translation logic entirely if multi-language is not enabled
if (!settings ||
!settings.multi_language_enabled) {
return settings;
}
if (!settings.translations) {
console.debug('STOQ - No translations found, skipping translation');
return settings;
}
const normalizedLocale = window._RestockRocketConfig.normalizedLocale;
const translations = settings.translations;
if (!normalizedLocale) {
// No matching locale has translations; drop payload to save memory
console.debug('STOQ - No matching locale for translations. Available:', Object.keys(translations || {}));
delete settings.translations;
return settings;
}
console.debug(`STOQ - Applying translations for normalized locale: ${normalizedLocale} (original: ${window._RestockRocketConfig.locale})`);
const translatedFields = translations[normalizedLocale];
if (translatedFields && typeof translatedFields === 'object') {
Object.keys(translatedFields).forEach(function(key) {
const value = translatedFields[key
];
if (value !== null && value !== undefined && value !== '') {
settings[key] = value;
}
});
} else {
console.debug('STOQ - No translated fields found for locale:', normalizedLocale);
}
delete settings.translations;
return settings;
} catch (e) {
console.debug('STOQ - error applying translations:', e);
return settings;
}
}
// Setup event listener for cart selling plan updates
// This must be called before any scripts are loaded to avoid race conditions
function setupCartSellingPlanUpdater(settings) {
if (!settings || !settings.preorder_enabled) {
return;
}
// Listen for stoq:preorder-api-ready event dispatched by preorder.js
window.addEventListener('stoq:preorder-api-ready', function(event) {
console.debug('STOQ - Preorder API ready, updating cart selling plans');
if (window._RestockRocket && window._RestockRocket.updateCartSellingPlans) {
window._RestockRocket.updat
eCartSellingPlans()
.then(hasUpdates => {
if (hasUpdates) {
console.debug('STOQ - cart selling plans updated successfully');
} else {
console.debug('STOQ - no cart selling plan updates n
eeded');
}
})
.catch(error => {
console.error('STOQ - error updating cart selling plans:', error);
});
}
});
}
// First try to get settings from metafields with expiry check
const cachedSettings = window._RestockRocketConfig.cachedSettings;
const validCachedSettings = cachedSettings ? checkSettingsExpiry(cachedSettings) : null;
if (validCachedSettings) {
console.debug('STOQ - using cached settings');
initializeScripts(validCachedSettings);
} else {
console.debug('STOQ - fetching fresh settings');
const headers = {
'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.Shopify.shop,
'ngrok-skip-browser-warning': 'skip'
};
if (window.Shopify?.theme?.role === 'main') {
headers['X-Shopify-Theme-Schema-Name'] = window.Shopify.theme.schema_name;
headers['X-Shopify-Theme-Schema-Version'] = window.Shopify.theme.schema_version;
headers['X-Shopify-Theme-Store-Id'] = window.Sh
opify.theme.theme_store_id;
}
fetch(
`${window._RestockRocketConfig.host}/api/v1/setting.json?translation_locale=${window._RestockRocketConfig.normalizedLocale}`,
{ headers }
)
.then(function(response) {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(function(settings) {
initializeScripts(settings);
})
.catch(function(error) {
// If request failed and we have cached settings (even if expired), use them as fallback
if (cachedSettings) {
console.debug('STOQ - using expired cached settings as fallback');
initializeScripts(cachedSettings);
} else {
console.error('STOQ - failed to load settings:', error);
}
})
.catch(function(e) {
console.error(e)
})
}
function initializeScripts(settings) {
settings = applyTranslations(settings);
window._RestockRocketConfig.settings = settings;
console.debug(`STOQ - se
Flexible bottles get an upgrade. The Flux is shaped like a hard bottle, compresses like a softflask, and cuts weight by 50%. Topped with a dust cover and twist-drink nozzle for grab-and-go hydration, plus a bail handle to keep hydration secure in your hand or on your pack. The Flux stands upright like a hard bottle but when you finish your drink, this bottle packs down to pocket size.
HIGH FLOW NOZZLE: Twist to Drink Nozzle drinks like that of a traditional wide mouth bottle but with more flow and less splash.
DUST COVER: Keeps dust off your drink nozzle. Quickly opens and closes the drink nozzle with one hand without any direct contact with dirty hands.
FLEXIBLE BAIL HANDLE: For comfortable carrying, quick attachment and securing the rolled up bottle when empty.
FITS IN PACK POCKETS: Designed to fit in pack pockets when full and to roll up when empty for space saving storage.
LIGHTWEIGHT & COMPACT: 50% lighter than a hard bottle and compresses down to pocket size when empty.
Flexible handle for comfortable carrying, quick attachment and securing the rolled up bottle when empty
Dual-layer film laminate construction adds structure
Made of ultra-durable, abrasion resistant TPU & RF welded seams for superior durability and elasticity
100% BPA & PVC free, wide working temperature range (can be frozen - max temp 60° C / 140° F)
Please get in touch with a member of the team either by phone (01313745324) or email ([email protected]) where on of the team will be more than happy to help.
ProjektRide Bike Shop Edinburgh
If the item is showing in stock, we aim to post the product within 24 hours. Please allow 5 working days to receive the item.
Postage is free on orders over £50. Orders under £50, our postage charge is £3.99.
We also have a physical store, if you are local please pop in -