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.hasOwnProper
<

!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

eCartSellingPlans() .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 metafie
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 - settings configured for ${window._RestockRocketConfig.pageType}`); // Setup cart selling plan updater BEFORE loading any scripts to avoid race conditions setupCartSellingPlanUpdater(settings); if(settings.enab
1+
Wheels Open

More
Trek -slr-disc-frameset-gen-3?variant=54945351729535" }, { "@type" : "Offer","sku": "5264898","availability" : "http://schema.org/InStock", "price" : 4150.0, "priceCurrency" : "GBP", "url" : "https:\/\/projektride.co.uk\/products\/trek-domane-slr-disc-frameset-gen-3?variant=54945351762303" }, { "@type" : "Offer","sku": "5264900","availability" : "http://schema.org/InStock", "price" : 4150.0, "priceCurrency" : "GBP", "url" : "https:\/\/projektride.co.uk\/products\/trek-domane-slr-disc-frameset-gen-3?variant=54945351795071" } ] } Tubeless
#FeaturedImage--template--24610452406655__1645734801adfd4c07 { --overlay-opacity: 0.2; }Tools & Maintenance
div class="featured-image__bg bg-pos-center-center" style="background-image: url('//projektride.co.uk/cdn/shop/files/2571D9FF-E9AE-4004-9A55-C7FD4DD999D6_2048x.jpg?v=1640941114');"> > ProjektRide MerchandiseOpen search bar Gloves Questions and answers
Socks
SERVICES
Header Image
{},"updated_at":"2026-02-17T03:08:27Z","shopify_market_id":382140642,"market_locations_enabled":false}; window._RestockRocketConfig.cachedVariantShippingTextsMarketKey = "variant_shipping_texts_for_market_382140642";window._RestockRocketConfig.sellingPlans = [{"shopify_selling_plan_group_id":98590196095,"shopify_selling_plan_id":713071886719,"enabled":true,"variant_ids":[55569712382335,55569712415103,55569712480639,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_pre _line_item_property_enabled":false,"shipping_line_item_property_enabled":true,"custom_line_item_property_text":null,"preorder_button_text_color":"#ffffff","preorder_button_background_color":"#565557","preorder_button_colors_enabled":true,"markets_enabled":false,"market_id":13779632354,"shopify_market_ids":[],"use_shopify_selling_plan":true,"use_simplified_shipping_text":false,"translations":{},"payment_options":[{"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_schedule_dates":true,"countdown_timer_custom_start_date":null,"countdown_timer_custom_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased separately from regular items. Please complete your current order first, or clear your cart to continue.","b2b_enabled":true,"preorder_progress_bar_enabled":false,"preorder_progress_bar_text":"{{ sold }} of {{ total }} claimed","preorder_progre ss_bar_fill_color":"#000000","preorder_progress_bar_background_color":"#e5e5e5","preorder_progress_bar_text_color":"#FFFFFF","preorder_progress_bar_border_radius":4,"preorder_progress_bar_show_percentage":false}];window._RestockRocketConfig.integrations = [{"id":"15c94526-b6b8-4de1-9bc1-23b1ca52ddb0","shop_id":38436,"enabled":true,"page_types":["product","collection","index","search","page","cart","list-collections","article","blog"],"configuration":{"toastDuration":10000,"toastPosition":"bottom-right","enableXHRHijack":true,"enableFetchHijack":true,"quantityLimitDisabled":false},"type":"hijack","css_config":null,"js_config":null,"created_at":"2025-07-26T09:16:04.076Z","updated_at":"2025-07-26T09:16:04.076Z"}];window._RestockRocketConfig.obfuscateInventoryQuantity = false;window._RestockRocketConfig.product = {"id":14907866546559,"title":"Trek Domane SLR Disc Frameset Gen 3","handle":"trek-domane-slr-disc-frameset-gen-3","description":"\u003cdiv data-v-e224ae82=\"\" class=\"b2b-buying-zone__info cell medium-6ESI XL 6.75' Chunky large-12\"\u003e\n\u003cdiv data-v-e224ae82=\"\" class=\"buying-zone__positioning-statement mb-2 pt-2 border-t border-gray-10\"\u003e\n\u003cp data-v-e224ae82=\"\"\u003eThe award-winning Domane SLR Disc Frame Set is built with 700 Series OCLV Carbon and has both Front and Adjustable Rear IsoSpeed so you can fine-tune your compliance. This is the lightest endurance road bike frame we make. It's designed for flat-mount disc brakes, has an internal storage compartment, and includes a head set, 12 mm thru axles and a Domane Disc full carbon fork.\u003c\/p\u003e\n\u003cp\u003e*Please note – spec applies to all sizes unless listed separately\u003c\/p\u003e\n\u003cp\u003e\u003cbr\u003e\u003cstrong\u003eFrameset\u003c\/strong\u003e\u003cbr\u003eFrame    700 Series OCLV Carbon, front IsoSpeed, adjustable rear IsoSpeed, internal storage, tapered head tube, internal cable routing, 3S chain keeper, DuoTrap S-compatible, mudguard mounts, flat-mount disc, 142x12 mm thru axle\u003cbr\u003eFork    Domane SLR carbon, t apered carbon steerer, internal brake routing, mudguard mounts, flat-mount disc, carbon dropouts, 12x100 mm thru axle\u003cbr\u003eFrame fit    Endurance\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWeight\u003c\/strong\u003e\u003cbr\u003eWeight    56 - 2.24 kg\/4.94 lb\u003cbr\u003eWeight limit    This bike has a maximum total weight limit (combined weight of bicycle, rider and cargo) of 125 kg (275 lb).\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eDrivetrain\u003c\/strong\u003e\u003cbr\u003eFront derailleur    Mechanical front derailleurs must have a full-housing stop (example: Shimano toggle front derailleurs)\u003cbr\u003eMax. chainring size    1x: 46T, 2x: 52\/36\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWheels\u003c\/strong\u003e\u003cbr\u003eSkewer front    Bontrager Switch thru axle, removable lever\u003cbr\u003eSkewer rear    Bontrager Switch thru-axle, removable lever\u003cbr\u003eMax tyre size    38mm\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eComponents\u003c\/strong\u e.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_22_33101_B_Primary.webp?v=1736598701","variant_ids":[54945351631231,54945351663999,54945351696767,54945351729535,54945351762303,54945351795071]},"available":false,"name":"Trek Domane SLR Disc Frameset Gen 3 - Lithium Grey\/Trek Black \/ 56","public_title":"Lithium Grey\/Trek Black \/ 56","options":["Lithium Grey\/Trek Black","56"],"price":350000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","featured_media":{"alt":null,"id":63841765622143,"position":2,"preview_image":{"aspect_ratio":1.333,"height":1440,"width":1920,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_22_33101_B_Primary.webp?v=1736598701"}},"requires_selling_plan":false,"selling_plan_allocations":[]},{"id":54945351762303,"title":"Dark Prismatic\/Trek Black \/ 47","option1":"Dark Prismatic\/Trek Black","option2":"47","option3":null,"sku":"5264898","requires_shipping":true,"taxable":true,"featured_image":{"id":72853055275391,"product_id":14907866
ismatic\/Trek Black","option2":"52","option3":null,"sku":"5264900","requires_shipping":true,"taxable":true,"featured_image":{"id":72853055275391,"product_id":14907866546559,"position":2,"created_at":"2025-01-11T12:31:39+00:00","updated_at":"2025-01-11T12:31:41+00:00","alt":null,"width":1920,"height":1440,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_22_33101_B_Primary.webp?v=1736598701","variant_ids":[54945351631231,54945351663999,54945351696767,54945351729535,54945351762303,54945351795071]},"available":true,"name":"Trek Domane SLR Disc Frameset Gen 3 - Dark Prismatic\/Trek Black \/ 52","public_title":"Dark Prismatic\/Trek Black \/ 52","options":["Dark Prismatic\/Trek Black","52"],"price":415000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","featured_media":{"alt":null,"id":63841765622143,"position":2,"preview_image":{"aspect_ratio":1.333,"height":1440,"width":1920,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_22_33101_B_Primar
y.webp?v=1736598701"}},"requires_selling_plan":false,"selling_plan_allocations":[]}],"images":["\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_21_33101_A_Primary.webp?v=1736598691","\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_22_33101_B_Primary.webp?v=1736598701","\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_21_33101_A_Alt1.webp?v=1736598710"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_21_33101_A_Primary.webp?v=1736598691","options":["Colour","Size"],"media":[{"alt":null,"id":63841765163391,"position":1,"preview_image":{"aspect_ratio":1.333,"height":1440,"width":1920,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_21_33101_A_Primary.webp?v=1736598691"},"aspect_ratio":1.333,"height":1440,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_21_33101_A_Primary.webp?v=1736598691","width":1920},{"alt":null,"id":63841765622143,"position":2,"preview_image":{"aspect_ra tio":1.333,"height":1440,"width":1920,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_22_33101_B_Primary.webp?v=1736598701"},"aspect_ratio":1.333,"height":1440,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_22_33101_B_Primary.webp?v=1736598701","width":1920},{"alt":null,"id":63841765949823,"position":3,"preview_image":{"aspect_ratio":1.333,"height":1440,"width":1920,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_21_33101_A_Alt1.webp?v=1736598710"},"aspect_ratio":1.333,"height":1440,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneSLRDiscFrameset_21_33101_A_Alt1.webp?v=1736598710","width":1920}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cdiv data-v-e224ae82=\"\" class=\"b2b-buying-zone__info cell medium-6 large-12\"\u003e\n\u003cdiv data-v-e224ae82=\"\" class=\"buying-zone__positioning-statement mb-2 pt-2 border-t border-gray-10\"\u003e\n\u003cp data-v-e224ae82=\"\"\u0ESI XL 6.75' Chunky03eThe award-winning Domane SLR Disc Frame Set is built with 700 Series OCLV Carbon and has both Front and Adjustable Rear IsoSpeed so you can fine-tune your compliance. This is the lightest endurance road bike frame we make. It's designed for flat-mount disc brakes, has an internal storage compartment, and includes a head set, 12 mm thru axles and a Domane Disc full carbon fork.\u003c\/p\u003e\n\u003cp\u003e*Please note – spec applies to all sizes unless listed separately\u003c\/p\u003e\n\u003cp\u003e\u003cbr\u003e\u003cstrong\u003eFrameset\u003c\/strong\u003e\u003cbr\u003eFrame    700 Series OCLV Carbon, front IsoSpeed, adjustable rear IsoSpeed, internal storage, tapered head tube, internal cable routing, 3S chain keeper, DuoTrap S-compatible, mudguard mounts, flat-mount disc, 142x12 mm thru axle\u003cbr\u003eFork    Domane SLR carbon, tapered carbon steerer, internal brake routing, mudguard mounts, flat-mount disc, carbon dropouts, 12x100 mm thru axle\u003cbr\u003eFrame fit    Endurance\u003c\/p\u0 { "@context": "http://schema.org", "@type": "Organization", "name": "ProjektRide","sameAs": [ null, null, null, null, null, null, null ], "url": "https:\/\/projektride.co.uk" } 03e\n\u003cp\u003e\u003cstrong\u003eWeight\u003c\/strong\u003e\u003cbr\u003eWeight    56 - 2.24 kg\/4.94 lb\u003cbr\u003eWeight limit    This bike has a maximum total weight limit (combined weight of bicycle, rider and cargo) of 125 kg (275 lb).\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eDrivetrain\u003c\/strong\u003e\u003cbr\u003eFront derailleur    Mechanical front derailleurs must have a full-housing stop (example: Shimano toggle front derailleurs)\u003cbr\u003eMax. chainring size    1x: 46T, 2x: 52\/36\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWheels\u003c\/strong\u003e\u003cbr\u003eSkewer front    Bontrager Switch thru axle, removable lever\u003cbr\u003eSkewer rear    Bontrager Switch thru-axle, removable lever\u003cbr\u003eMax tyre size    38mm\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eComponents\u003c\/strong\u003e\u003cbr\u003eSeatpost    Not included\u003cbr\u003eRotor size    Max brake rotor sizes: 160mm front \u0026amp; rear\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\< 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
< console.log("pr-product-page");= 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 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 age = Date.now() - updatedAt.getTime(); if (age ESI XL 6.75' Chunky 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 || _RestockRocketConfig.pageType === 'collection' && (settings.show_button_on_collection || settings.preorder_collection_enabled)) { createRestockRocketScript(window._RestockRocketConfig.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.scriptUrlPro
ESI XL 6.75' Chunky

<
window.appBlockPlacements ||= []; if (window.klarnaAppBlocksManager) { window.klarnaAppBlocksManager.push({ productVariants: [{"id":42133855994082,"title":"Default Title","option1":"Default Title","option2":null,"option3":null,"sku":"295-CT","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Muc-Off Bio Drivetrain Cleaner 500ml","public_title":null,"options":["Default Title"],"price":1799,"weight":900,"compare_at_price":1799,"inventory_management":"shopify","barcode":"5037835295009","requires_selling_plan":false,"selling_plan_allocations":[]}], templateName: 'product', dataKey: 'top-strip-promotion-badge', storefrontCurrency: 'GBP', storefrontCountry: 'GB', storefrontLanguage: 'en', shopLocale: 'en', shopDomain: 'projektride.co.uk', variantPrice: '1799', cartPrice: '0', selector: 'shopify-osm-ASUorQUNvQS9uckFQO__klarna_on_site_messaging_app_block_8gNReH', topPadding: '0', bottomPadding: '0', }); } else { window.appBlockPlacements.push({ productVariants: [{"id":42133855994082,"title":"Default Title","option1":"Default Title","option2":null,"option3":null,"sku":"295-CT","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Muc-Off Bio Drivetrain Cleaner 500ml","public_title":null,"options":["Default Title"],"price":1799,"weight":900,"compare_at_price":1799,"inventory_management":"shopify","barcode":"5037835295009","requires_selling_plan":false,"selling_plan_allocations":[]}], templateName: 'product', shopLocale: 'en', dataKey: 'top-strip-promotion-badge', storefrontCurrency: 'GBP', storefrontCountry: 'GB', storefrontLanguage: 'en', shopDomain: 'projektride.co.uk', variantPrice: '1799', cartPrice: '0', selector: 'shopify-osm-ASUorQUNvQS9uc
< a class="product__media product__media--featured" href="/collections/maintenance/products/hire-smith-convoy-helmet" title="Hire Lazer Compact Helmet" aria-label="Hire Lazer Compact Helmet" style="background-image: url(//projektride.co.uk/cdn/shop/files/my2023_tempo-kineticore-black_right_1400x1011800x600-removebg-preview_1_600x.png?v=1747484784)">
£0.00
< a class="product__media product__media--featured" href="/collections/maintenance/products/hire-ortlieb-40l-pannier-bags" title="Hire Ortlieb 40L Pannier Bags" aria-label="Hire Ortlieb 40L Pannier Bags" style="background-image: url(//projektride.co.uk/cdn/shop/files/resize_width_1000_600x.jpg?v=1741085512)">
< span class="visually-hidden">Hire Ortlieb 40L Pannier Bags £0.00

  • <
a class="product__media product__media--featured" href="/collections/maintenance/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)"> <

span class="visually-hidden">Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cableGreat for riders with wider bars:

>
  • Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable
  • Touring bikes
  • £0.00
  • Track and pursuit bars
  • Fixed Gear
  • BMX

      < img src="//projektride.co.uk/cdn/shop/files/logo_header_2048x2048.png?v=1634060673" alt="" class="logo--footer">
      < = 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, fetchi ng 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 age = Date.now() - updatedAt.getTime(); if (age

      FAQ

      Questions and answers