Stems
StemsStems

Grips & Bar-Tape
Grips & Bar-TapeGrips & Bar-Tape

Grips & Bar-Tape
Header Image
M / Lava - £850.00 GBPLarge / 800WH / Black - £3,750.00 GBP
ML / Matte Lichen/Keswick Green Fade - £850.00 GBPExtra Large / 545WH / Red - £3,375.00 GBP
Add to cartML / Gloss Lavender Haze - £850.00 GBPExtra Large / 545WH / Blue - £3,375.00 GBPSelect variant dropdown L / Lava - £850.00 GBPExtra Large / 725WH / Black - £3,625.00 GBP
XL / Matte Lichen/Keswick Green Fade - £850.00 GBPExtra Large / 800WH / Red - £3,750.00 GBPXS / Gloss Dark Star/Matte Deep Smoke - Sold Out XL / Gloss Lavender Haze - £850.00 GBPExtra Large / 800WH / Blue - £3,750.00 GBP
XS / Matte Lavender Haze/Deep Smoke - Sold Out XL / Lava - £850.00 GBPExtra Large / 800WH / Black - £3,750.00 GBPM / Matte Lavender Haze/Deep Smoke - £4,000.00 GBP
M / Gloss Fury Red/Matte Deep Smoke - Sold Out 1
M / Gloss Crystal White/Matte Deep Smoke - Sold Out 1+
ML / Gloss Dark Star/Matte Deep Smoke - Sold Out
ML / Gloss Fury Red/Matte Deep Smoke - Sold Out 1

<
<

<
<
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 valid // 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
<
!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
&& 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 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.S
hedSettings); } 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 - settings configured for ${window._RestockRocketConfig.pageType}`); // Setup cart selling plan updater BEFORE loading any scripts to avoid race conditions setupCartSellingPlanUpdater(settings); if(settings.enable_app) { const hijackIntegration = window._RestockRocketConfig.integrations.find(function(integration) { return integration.type === 'hijack' && integration.enabled && integration.page_types.includes(window._RestockRocketConfig.pageType); }) if(window._RestockRocketConfig.pageType === 'collection' && (settings.show_button_on_collection || settings.preorder_collection_enabled)) { createRestockRocketScript(window._RestockRocketCon
led for ${window._RestockRocketConfig.pageType}`); } // Dispatch custom event when app is loaded // Cart selling plan updates will be triggered by stoq:inventory-data-loaded event const appLoadedEvent = new CustomEvent('stoq:loaded', { detail: { pageType: window._RestockRocketConfig.pageType, enabled: settings.enable_app, settings: settings, preorderEnabled: settings.preorder_enabled } }); console.debug('STOQ - dispatching app loaded event'); window.dispatchEvent(appLoadedEvent); } }
.restock-rocket-button,.restock-rocket-button-float{opacity:1!important;border:none!impor

XS , S , M , ML
Shimano U4000, 30T chainring, 170 mm length
L , XL , XXL
Shimano U4000, 30T chainring, 175 mm length
Bottom bracket

Cassette
Shimano CUES LG300, LINKGLIDE, 11-48, 10-speed
Chain
Shimano LG500
Pedal
VP-536 nylon platform
Components
< Saddle
Bontrager Verse Short, stainless steel rails
Size:
 
XS , S
TranzX JD-YSI34, 100 mm travel, internal routing, 31.6 mm, 350 mm length
Size:
 
TranzX JD-YSI34, 125 mm travel, internal routing, 31.6 mm, 405 mm length
Size:
 

TranzX JD-YSI34, 150 mm travel, internal routing, 31.6 mm, 456 mm length
Size:
 
XXL
TranzX JD-YSI34, 170 mm travel, internal routing, 31.6 mm, 500 mm length
*Handlebar
Size: 
XS
Bontrager alloy, 31.8 mm, 5 mm rise, 690 mm width
Size: 
S
Bontrager alloy, 31.8 mm, 15 mm rise, 720 mm width
Size:
 
M , ML , L , XL , XXL Bontrager alloy, 31.8 mm, 15 mm rise, 750 mm width
Grips



-content-glv89i\" class=\"\" aria-expanded=\"true\" qaid=\"\"\u003e\n\u003cdiv data-v-5bd42f3c=\"\" class=\"flex items-center flex-grow\"\u003eFrameset\u003c\/div\u003e\n\u003cbutton data-v-5bd42f3c=\"\" id=\"pdl-collapse-head-glv89i\" type=\"button\" class=\"pdl-collapse-item__header is-active flex-row-reverse items-center\" tabindex=\"0\"\u003e\u003csvg data-v-1e7396ba=\"\" data-v-5bd42f3c=\"\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentcolor\" aria-hidden=\"true\" role=\"presentation\" class=\"pdl-collapse-item__icon pdl-icon pdl-icon--size-24 is-active\" qaid=\"\"\u003e\u003cpath d=\"M0 0h24v24H0z\" fill=\"none\"\u003e\u003c\/path\u003e\u003cpath d=\"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/button\u003e\n\u003c\/div\u003e\n\u003cdiv data-v-5bd42f3c=\"\" id=\"pdl-collapse-content-glv89i\" role=\"tabpanel\" aria-labelledby=\"pdl-collapse-head-glv89i\" class=\"pdl-collapse-item__wrap\" datwidth\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eXL\u003cbr\u003e\u003c\/span\u003e\u003ca href=\"https:\/\/www.trekbikes.com\/b2b\/gb\/en_GB\/p\/5307559\" class=\"block underline\"\u003eBontrager Comp, alloy, 31.8 mm, 80 mm reach, 121 mm drop, 42 cm control width, 46 cm drop width\u003c\/a\u003e\n\u003c\/div\u003e\n\u003c\/dd\u003e\n\u003cdt class=\"flex-none w-full md:w-1\/5 mb-0 py-2 pr-1 font-medium border-b-2 md:border-r-2 border-gray-10\"\u003eHandlebar tape\u003c\/dt\u003e\n\u003cdd class=\"flex-none w-full md:w-4\/5 font-normal\"\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\u003ca href=\"https:\/\/www.trekbikes.com\/b2b\/gb\/en_GB\/p\/5306316\" class=\"block underline\"\u003eTrek EcoTack\u003c\/a\u003e\u003c\/div\u003e\n\u003c\/dd\u003e\n\u003cdt class=\"flex-none w-full md:w-1\/5 mb-0 py-2 pr-1 font-medium border-b-2 md:border-r-2 border-gray-10Tel 0131 374 5324
M - 15.00 kg / 33.07 lbs Weight limit
Location
respect to equipment, specifications, models, colours, materials and pricing. Due to supply chain issues, compatible parts may be substituted at any time without notice.\u003c\/p\u003e\n\u003cp class=\"mb-1\" data-v-631a2fc2=\"\"\u003eBike and frame weights are based on pre-production painted frames at time of publication. Weights may vary in final production.\u003c\/p\u003e\n\u003c\/section\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/main\u003e\u003cfooter class=\"footer\"\u003e\n\u003cdiv class=\"grid-container\"\u003e\n\u003cdiv class=\"editorial-list horizontal\" id=\"footerLinkColumnsB2B\" data-v-1ddd8a4a=\"\"\u003e\n\u003cul data-v-1ddd8a4a=\"\"\u003e\n\u003cli class=\"list-item\"\u003e\n\u003cdiv data-accordion-explode=\"true\" class=\"editorial-list accordion\" id=\"shopFooterLinkListB2B\" data-v-1ddd8a4a=\"\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003c\/li\u003e\n\u003c\/ul
6096890239 : parseInt(""),56386096923007 : parseInt(""),56386096955775 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {56386096824703 : null,56386096857471 : null,56386096890239 : null,56386096923007 : null,56386096955775 : null,}; window._RestockRocketConfig.variantsShippingText = {56386096824703 : "",56386096857471 : "",56386096890239 : "",56386096923007 : "",56386096955775 : "",}; window._RestockRocketConfig.variantsShippingTextForMarket = {56386096824703 : null,56386096857471 : null,56386096890239 : null,56386096923007 : null,56386096955775 : null,}; window._RestockRocketConfig.selected_variant_id = 56386096824703; 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/019cd40b-736e-74a5-adbe-431365bfd910/restockrocket

= 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 Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable

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
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 || a class="product__media product__media--featured" href="/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)">
  • ]; 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) { // Setup listener regardless - updateCartSellingPlans has its own guards // This ensures cleanup happens even when preorders are disabled globally // Listen for stoq:inventory-data-loaded event dispatched by api.js window.addEventListener('stoq:inventory-data-loaded', function(event) { console.debug('STOQ - Inventory data loaded, updating cart selling plans'); if (window._RestockRocketspan class="visually-hidden">Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cablefig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'index' && (settings.show_button_on_index || settings.preorder_index_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'search' && (settings.show_button_on_search || settings.preorder_search_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'page' && (settings.show_button_on_page || settings.preorder_page_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'product') { createRestockRocketScript(window._RestockRocketConfig.scriptUrlProduct); } else if(hijackIntegration) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else { console.debug(`STOQ - no scripts enab>
  • #FeaturedImage--template--15326745395426__1645734801adfd4c07 { --overlay-opacity: 0.2; }>
ProjektRide
Buy Sell Ride Confident
ProjektRide
Tel
{"billing_type":"no_remaining_balance","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","billing_at":"2025-07-26T09:20:38.472Z","billing_after_n_intervals":7,"billing_after_interval_type":"day","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"billing_title":"Full payment","billing_description":null,"discount_text":"Save {{ discount }}","shopify_selling_plan_id":713071886719,"is_default":true,"type":"full","translations":{}}],"require_preorder_acknowledgement":false,"preorder_acknowledgement_text":"I acknowledge and agree to the preorder terms and conditions for this product.","disable_button_until_acknowledged":false,"preorder_min_quantity":null,"preorder_max_quantity":null,"countdown_timer_enabled":false,"countdown_timer_style":"text","countdown_timer_text_color":"#000000","countdown_timer_background_color":"#f5f5f5","countdown_timer_border_radius":8,"countdown_timer_format":"DHMS","countdown_timer_use_3e\u003cspan\u003e \u003c\/span\u003eXS, S, M\u003cbr data-v-05762449=\"\"\u003e\u003ca data-v-05762449=\"\" href=\"https:\/\/www.trekbikes.com\/gb\/en_GB\/p\/5262988\"\u003eBontrager alloy, 31.8 mm clamp, adjustable rise, Blendr-compatible, 85 mm length\u003c\/a\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-05762449=\"\"\u003e\n\u003ctd data-v-05762449=\"\"\u003e\n\u003cspan data-v-05762449=\"\"\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003eL, XL\u003cbr data-v-05762449=\"\"\u003e\u003ca data-v-05762449=\"\" href=\"https:\/\/www.trekbikes.com\/gb\/en_GB\/p\/5262987\"\u003eBontrager alloy, 31.8 mm clamp, adjustable rise, Blendr-compatible, 105 mm length\u003c\/a\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-05762449=\"\"\u003e\n\u003cth data-v-05762449=\"\" rowspan=\"1\" scope=\"row\"\u003eBrake\u003c\/th\u003e\n\u003ctd data-v-05762449=\"\"\u003eShimano MT200 hydraulic disc\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-05762449=\"\"\u003e\n\u003cth data-v-0570639,55570017616255,55570017550719,55569712447871,55570017583487],"product_variants_source":"custom","name":"Preorder","preorder_button_text":"Preorder","preorder_button_description":"Note: This is a preorder. Items will ship based on the estimated delivery date.","preorder_button_description_background_color":"#ebebeb","preorder_button_description_text_color":"#000000","preorder_button_description_border_radius":10,"preorder_button_description_show_quantity_limit":false,"preorder_button_description_quantity_limit_suffix":" units available for preorder","preorder_button_description_shipping_text_prefix":"Shipping: ","delivery_exact_time":null,"delivery_after_n_intervals":null,"delivery_at":"2025-07-26T09:20:18.169Z","delivery_type":"asap","quantity_limit_text":"{{ quantity }} units available for preorder","preorder_button_description_show_shipping":true,"preorder_button_description_icons_enabled":true,"preorder_shipping_text":"Shipping: {{ date }}","shipping_applies_to_all_products":true,"shipping_text":"Esti name=\"422\" class=\"pdl-collapse-item is-active\"\u003e\n\u003cdiv data-v-5bd42f3c=\"\" role=\"tab\" aria-controls=\"pdl-collapse-content-jl7h6\" aria-describedby=\"pdl-collapse-content-jl7h6\" class=\"\" aria-expanded=\"true\" qaid=\"\"\u003e\n\u003cdiv data-v-5bd42f3c=\"\" class=\"flex items-center flex-grow\"\u003eAccessories\u003c\/div\u003e\n\u003cbutton data-v-5bd42f3c=\"\" id=\"pdl-collapse-head-jl7h6\" type=\"button\" class=\"pdl-collapse-item__header is-active flex-row-reverse items-center\" tabindex=\"0\"\u003e\u003csvg data-v-1e7396ba=\"\" data-v-5bd42f3c=\"\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentcolor\" aria-hidden=\"true\" role=\"presentation\" class=\"pdl-collapse-item__icon pdl-icon pdl-icon--size-24 is-active\" qaid=\"\"\u003e\u003cpath d=\"M0 0h24v24H0z\" fill=\"none\"\u003e\u003c\/path\u003e\u003cpath d=\"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/button\u003e\n\u003w\"\u003eWeight\u003c\/div\u003e\n\u003cbutton data-v-5bd42f3c=\"\" id=\"pdl-collapse-head-vgqcl\" type=\"button\" class=\"pdl-collapse-item__header is-active flex-row-reverse items-center\" tabindex=\"0\"\u003e\u003csvg data-v-1e7396ba=\"\" data-v-5bd42f3c=\"\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentcolor\" aria-hidden=\"true\" role=\"presentation\" class=\"pdl-collapse-item__icon pdl-icon pdl-icon--size-24 is-active\" qaid=\"\"\u003e\u003cpath d=\"M0 0h24v24H0z\" fill=\"none\"\u003e\u003c\/path\u003e\u003cpath d=\"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/button\u003e\n\u003c\/div\u003e\n\u003cdiv data-v-5bd42f3c=\"\" id=\"pdl-collapse-content-vgqcl\" role=\"tabpanel\" aria-labelledby=\"pdl-collapse-head-vgqcl\" class=\"pdl-collapse-item__wrap\" data-old-padding-top=\"\" data-old-padding-bottom=\"\" data-old-overflow=\"\"\u003e\n\u003cdiv data-v-5bd42f3c=\"\" class=\"pdl-collapse-item_