ode":"5037835871005","requires_selling_plan":false,"selling_plan_allocations":[]}],"images":["\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-03-09at19.39.56.png?v=1646854971"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-03-09at19.39.56.png?v=1646854971","options":["Title"],"media":[{"alt":null,"id":29418355753186,"position":1,"preview_image":{"aspect_ratio":0.939,"height":890,"width":836,"src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-03-09at19.39.56.png?v=1646854971"},"aspect_ratio":0.939,"height":890,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-03-09at19.39.56.png?v=1646854971","width":836}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cmeta charset=\"utf-8\"\u003e\n\u003cp data-mce-fragment=\"1\"\u003eC3 Dry Ceramic Chain Lube raises the bar when it comes to providing the ultimate lubrication. It provides total corrosion protection and unparalleled performance in dry, dusty and
0026amp; dusty conditions\u003c\/li\u003e\n\u003cli\u003ePetroleum free formula for eco protection\u003c\/li\u003e\n\u003cli\u003eCeramic coating for increased drive chain protection\u003c\/li\u003e\n\u003cli\u003eSynthetic polymers for long distance performance\u003c\/li\u003e\n\u003cli\u003eIncredible durability\u003c\/li\u003e\n\u003cli\u003ePipette system for easy application\u003c\/li\u003e\n\u003cli\u003eIncludes UV torch to check for 100% coverage\u003c\/li\u003e\n\u003c\/ul\u003e"}[]
{
"@context": "http://schema.org/",
"@type": "Product",
"name": "Muc-Off C3 Ceramic Dry Lube 50ml",
"url": "https:\/\/projektride.co.uk\/products\/muc-off-c3-dry-ceramic-lube","image": [
"https:\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-03-09at19.39.56_836x.png?v=1646854971"
],"description": "\nC3 Dry Ceramic Chain Lube raises the bar when it comes to providing the ultimate lubrication. It provides total corrosion protection and unparalleled performance in dry, dusty and damp conditions. With added nano ceramic particles and synthetic polymers, C3 Dry Ceramic Chain Lube maximises your power output by reducing metal to metal contact to a ground breaking, low level and provides up to 10 times the performance of conventional chain oils and lubes. The Muc-Off R\u0026amp;D team definitely didn’t cut corners when they brought the future of bike lubes to the masses.\nIn fact, our team made sure the C3 Dry Ceramic Lube is safe by creating a biodegradable, petroleum free formula so you don’t have to worry about yourself, your bike or the planet. The new C3 Dry Ceramic Lube is available in 50ml and 120ml so whether you’re in the workshop, on the road or hitting the trails, we’ve got you covered.\n \n\nIdeal for Road Cycling, Cyclocross \u0026amp; MTB\nProvides the ultimate performance in damp, dry \u0026amp; dusty conditions\nPetroleum free formula for eco protection\nCeramic coating for increased drive chain protection\nSynthetic polymers for long distance performance\nIncredible durability\nPipette system for easy application\nIncludes UV torch to check for 100% coverage\n","sku": "871","brand": {
"@type": "Thing",
"name": "Muc-Off"
},"gtin8": "5037835871005","gtin13": "5037835871005","offers": [{
"@type" : "Offer","sku": "871","availability" : "http://schema.org/OutOfStock",
"price" : 15.0,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/muc-off-c3-dry-ceramic-lube?variant=42577949556962"
}
]
}
Would you like to add on any equipment?
3cspan style=\"font-weight: 400;\" data-mce-fragment=\"1\" data-mce-style=\"font-weight: 400;\"\u003ePromax mechanical disc brakes provide easy maintenance stopping power where ever your Tour takes you and Fast rolling Vittoria Randonneur tyres help you get there that bit easier.\u003c\/span\u003e\u003cspan style=\"font-weight: 400;\" data-mce-fragment=\"1\" data-mce-style=\"font-weight: 400;\"\u003e\u003cbr data-mce-fragment=\"1\"\u003e\u003c\/span\u003e\u003cspan style=\"font-weight: 400;\" data-mce-fragment=\"1\" data-mce-style=\"font-weight: 400;\"\u003e\u003cbr data-mce-fragment=\"1\"\u003e\u003c\/span\u003e\u003cspan style=\"font-weight: 400;\" data-mce-fragment=\"1\" data-mce-style=\"font-weight: 400;\"\u003eMudguards and a rear panier rack complete the package.\u003c\/span\u003e\u003cspan style=\"font-weight: 400;\" data-mce-fragment=\"1\" data-mce-style=\"font-weight: 400;\"\u003e\u003cbr data-mce-fragment=\"1\"\u003e\u003c\/span\u003e\u003cspan style=\"font-weight: 400;\" data-mce-fragment=\"1\" dat
{
"@context": "http://schema.org/",
"@type": "Product",
"name": "Ridgeback Tour",
"url": "https:\/\/projektride.co.uk\/products\/ridgeback-tour","image": [
"https:\/\/projektride.co.uk\/cdn\/shop\/files\/rb23500_tour_detail_01_1800x.jpg?v=1722527167"
],"description": "The ultimate great value tourer.The Ridgeback Tour offers the best in wallet friendly touring capability. Based on our 6061 heat treated aluminium frame featuring all the rack, mudguard and cage mounts you could need.Utilising the ever-dependable Shimano Claris groupset with a triple chainset and 8 speed cassette you will always the right gear no matter your situation.Promax mechanical disc brakes provide easy maintenance stopping power where ever your Tour takes you and Fast rolling Vittoria Randonneur tyres help you get there that bit easier.Mudguards and a rear panier rack complete the package.The Ridgeback Tour makes that dream trip that little bit more affordable.\n \n\n\nBrake Type :\n Mechanical Disc\n\n\n\n\nFork Material :\n Chromoly\n\n\n\n\nFrame Material :\n Alloy\n\n\n\n\nWheel Size :\n 700c\n\n\n\n\nBrake Levers :\n Shimano Claris ST-R2030\n\n\n\n\nIntended Use :\n Touring\n\n\n\n\nBrakes :\n Promax DSK-300R\n\n\n\n\nCassette Freewheel :\n Shimano HG31 8-Speed 11-32T\n\n\n\n\nChain :\n KMC X8\n\n\n\n\nChain Set :\n Shimano Claris FC-R2030 50\/39\/30T XS-MD = 170mm LG-XL = 175mm\n\n\n\n\nFork :\n Ridgeback Chromoly Disc 1-1\/8\"\"\n\n\n\n\nFront Derailleur :\n Shimano Claris FD-R2030 Triple\n\n\n\n\nHandlebars :\n Ridgeback Alloy 31.8mm 12 Deg Flare XS = 400mm SM\/MD = 420mm LG\/XL = 440mm\n\n\n\n\nHeadset :\n Prestine PT-1606\n\n\n\n\nHubs :\n KT68F\/KT68R\n\n\n\n\nMudguard :\n Fitted\n\n\n\n\nRear Derailleur :\n Shimano Claris RD-R2000GS 8-Speed\n\n\n\n\nRims :\n Shining DB-31\n\n\n\n\nSaddle :\n Madison Flux\n\n\n\n\nSeat Post :\n Ridgeback Alloy 27.2 x 350mm\n\n\n\n\nShifters :\n Shimano Claris ST-R2030 3 x 8-Speed\n\n\n\n\nStem :\n Ridgeback Alloy 100 x 31.8mm -7 deg\n\n\n\n\nTyres :\n Vittoria Randonneur 700 x 32mm\n\n\n\n\nGender :\n Mens, Womens\n\n\n\n\nSpecification Disclaimer :\n Ridgeback reserves the right to change product specifications without notice. Ridgeback will always ensure that these changes do not detract from the ride experience of the bike.\n\n","sku": "RB23500XL","brand": {
"@type": "Thing",
"name": "Ridgeback"
},"gtin8": "","offers": [{
"@type" : "Offer","sku": "RB23500XS","availability" : "http://schema.org/InStock",
"price" : 899.99,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/ridgeback-tour?variant=45760542376162"
},
{
"@type" : "Offer","sku": "RB23500SM","availability" : "http://schema.org/InStock",
"price" : 899.99,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/ridgeback-tour?variant=45760542408930"
},
{
"@type" : "Offer","sku": "RB23500MD","availability" : "http://schema.org/InStock",
"price" : 899.99,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/ridgeback-tour?variant=45760542441698"
},
{
"@type" : "Offer","sku": "RB23500LG","availability" : "http://schema.org/InStock",
"price" : 899.99,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/ridgeback-tour?variant=45760542474466"
},
{
"@type" : "Offer","sku": "RB23500XL","availability" : "http://schema.org/InStock",
"price" : 899.99,
"priceCurreHire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable
_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":"Estimated to ship within 2 months","payment_type":"full","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"discount_text":"Save {{ discount }}","billing_title":"Full payment","billing_description":null,"e
c_title":null,"options":["Default Title"],"price":1500,"weight":0,"compare_at_price":1150,"inventory_management":"shopify","barcode":"5037835871005","requires_selling_plan":false,"selling_plan_allocations":[]}],"images":["\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-03-09at19.39.56.png?v=1646854971"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-03-09at19.39.56.png?v=1646854971","options":["Title"],"media":[{"alt":null,"id":29418355753186,"position":1,"preview_image":{"aspect_ratio":0.939,"height":890,"width":836,"src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-03-09at19.39.56.png?v=1646854971"},"aspect_ratio":0.939,"height":890,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-03-09at19.39.56.png?v=1646854971","width":836}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cmeta charset=\"utf-8\"\u003e\n\u003cp data-mce-fragment=\"1\"\u003eC3 Dry Ceramic Chain Lube raises the bar when it co
Building Your Bike From the Box
mes to providing the ultimate lubrication. It provides total corrosion protection and unparalleled performance in dry, dusty and damp conditions. With added nano ceramic particles and synthetic polymers, C3 Dry Ceramic Chain Lube maximises your power output by reducing metal to metal contact to a ground breaking, low level and provides up to 10 times the performance of conventional chain oils and lubes. The Muc-Off R\u0026amp;D team definitely didn’t cut corners when they brought the future of bike lubes to the masses.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eIn fact, our team made sure the C3 Dry Ceramic Lube is safe by creating a biodegradable, petroleum free formula so you don’t have to worry about yourself, your bike or the planet. The new C3 Dry Ceramic Lube is available in 50ml and 120ml so whether you’re in the workshop, on the road or hitting the trails, we’ve got you covered.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e \u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eId
eal for Road Cycling, Cyclocross \u0026amp; MTB\u003c\/li\u003e\n\u003cli\u003eProvides the ultimate performance in damp, dry \u0026amp; dusty conditions\u003c\/li\u003e\n\u003cli\u003ePetroleum free formula for eco protection\u003c\/li\u003e\n\u003cli\u003eCeramic coating for increased drive chain protection\u003c\/li\u003e\n\u003cli\u003eSynthetic polymers for long distance performance\u003c\/li\u003e\n\u003cli\u003eIncredible durability\u003c\/li\u003e\n\u003cli\u003ePipette system for easy application\u003c\/li\u003e\n\u003cli\u003eIncludes UV torch to check for 100% coverage\u003c\/li\u003e\n\u003c\/ul\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {42577949556962 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {42577949556962 : parseInt("0"),};
window._RestockRocketConfig.variantsPreorderCount = {42577949556962 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {42577949556962 : null,};
window._RestockRocketConfig.varian
Insure Your BikeServicestsPreorderMaxCount = {42577949556962 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {42577949556962 : null,};
window._RestockRocketConfig.variantsShippingText = {42577949556962 : "",};
window._RestockRocketConfig.variantsShippingTextForMarket = {42577949556962 : null,};
window._RestockRocketConfig.selected_variant_id = 42577949556962;
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/019af0d1-c518-7a22-bdbf-9ceff49063ad/restockrocket-1-402/assets/restockrocket-product.js'
window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019af0d1-c518-7a22-bdbf-9ceff49063ad/restockrocket-1-402/assets/restockrocket-collection.js'
window._RestockRocketConfig.scriptHost = window._RestockRocketConfi
g.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
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 cach
Privacy Policye, 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
!settings.multi_language_enabled) {
return settings;
}
if (!settings.translations) {
console.debug
Terms of Service('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;
}
geType: window._RestockRocketConfig.pageType,
enabled: settings.enable_app,
settings: settings
}
});
console.debug('STOQ - dispatching app loaded event');
window.dispatchEvent(appLoadedEvent);
}
}
function updateCartSellingPlans() {
// Wait for the API to be available with retries
const maxRetries = 10;
const retryDelay = 500;
function attemptCartCheck(attempt = 1) {
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);
});
} else if (attempt
<
For cycle touring in the ultimate comfort, the Ridgeback Expedition is the perfect partner. A riser handlebar and positive rise stem all bring the front of the bike higher, allowing for a more upright riding position.<
But we haven't stopped there. Ergonomic grips provide palm relief and the integrated bar end gives another position to rest your hands.<
A wide range of 27-gears give the flexibility needed to conquer the steepest climbs without being tiresome, and being Shimano shifting quality and longevity is assured. Wide Schwalbe Marathon tyres are hardwearing and puncture resistant and feature a reflective sidewall for added visibility.
Full-length mudguards provide protection from road spray and disc brakes give reassuring stopping power in all conditions. Mountain Bikes
Chain Set :img src="//projektride.co.uk/cdn/shop/files/ftp_f_freewheel_imagessportlinefwbikesrb22791_detail02_2048x2048.webp?v=1722607141" alt="Ridgeback Destiny" class="mfp-zoom-in-cur" id="34382314832098">
Track Your ServiceShimano FC-T4010 48-36-26T
img src="//projektride.co.uk/cdn/shop/files/ftp_f_freewheel_imagessportlinefwbikesrb22790_detail01_98x.webp?v=1722607140" alt="" class="product-single__thumbnail-img">
Other
Custom Builds
Fork :
Cycle To Work SchemesChromoly Steelimg src="//projektride.co.uk/cdn/shop/files/ftp_f_freewheel_imagessportlinefwbikesrb22790_detail05_98x.webp?v=1722607140" alt="" class="product-single__thumbnail-img">
Brakes
Complete Brakes
Fitted
Home
Brake Rotors/
All Products
/
Brake PadsRidgeback Destiny
Ridgeback Destiny
Pedals :
Brake Spares£399.99FPD Road / Toe Clips
Forks
// Create "window.Shoppad.apps.infiniteoptions" object if it doesn't already exist
'Shoppad.apps.infiniteoptions'.split('.').reduce(function (o, x) {
if (!o[x]) {
o[x] = {};
}
return o[x];
}, window);
// Note we are using the theme app extension
window.Shoppad.apps.infiniteoptions.themeAppExtensionActive = true;
Ridgeback reserves the right to change product specifications without notice. Ridgeback will always ensure that these changes do not detract from the ride experience of the bike.I'm looking to find out more information about a product, where can I find this?Tools & Maintenance
Please get in touch with a member of the team either by phone (
>
6546,43981369049314,43981374914786,43981374947554,43981374980322,43981392904418,43981695844578,43981695877346,43981695910114,43981695942882,43981986070754,43981987905762,43981987938530,44052906967266,44052907327714,44052907360482,44052907393250,44052907426018,44052907458786,44052907491554,44052909097186,44052909129954,44140302827746,44140302893282,44140317016290,44155590508770,44155590541538,44155594211554,44155594244322,44155594277090,44155594309858,44155594342626,44155594375394,44155594440930,44155594473698,44155594506466,44195991847138,44195991945442,44329993437410,44329993470178,44329993502946,44329993535714,44329993568482,44957136584930,44957136781538,44957136945378,45068753961186,45068753993954,45069622640866,45069622903010,45069622968546,45069750730978,45069750763746,45353010921698,45353010954466,45353010987234,45353018261730,45353018294498,45353018327266,55569712382335,55569712447871,55569712480639,55569933074815,55570550194559,55570550227327,55604008976767,55638316908927,55638316941695,55638316974463
>
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":[55569933140351,55569712382335,55569712415103,55569712480639,55569933173119,55570017616255,55569933074815,55570017550719,55569712447871,55569933107583,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,"
>
ine_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 term
p class="result__title">
},"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":8663422533858,"title":"Ridgeback Destiny","handle":"ridgeback-destiny-1","description":"\u003cul\u003e\n\u003cli\u003e Ridgeback Destiny is a lightweight bike for kids between 9 to 13 years old and is full of great features to help your little one on their wheeled adventure. Built with a lightweight aluminium frame, the Ridgeback Destiny is perfectly proportioned to provide young riders the best comfort and control.\u003c\/li\u003e\n\u003cli\u003eWeight - 12.85kg\u003c\/li\u003e\n\u003cli\u003eHeight range 140cm - 150cm\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c!----\u003e","published_at":"2024-08-02T14:58:44+01:00","created_at":"2024-08-02T14:59:00+01:00","vendor":"Ridgeback","type":"Bicycles","tags":["Destiny","spo-cs-disabled","spo-default","spo-disabled","spo-notify-m
a href="{{ it.product.url }}">{{ it.product.title }}cdn\/shop\/files\/ftp_f_freewheel_imagessportlinefwbikesrb22790_detail03.webp?v=1722607140","\/\/projektride.co.uk\/cdn\/shop\/files\/ftp_f_freewheel_imagessportlinefwbikesrb22791_detail05.webp?v=1722607140","\/\/projektride.co.uk\/cdn\/shop\/files\/ftp_f_freewheel_imagessportlinefwbikesrb22791_detail01.webp?v=1722607140","\/\/projektride.co.uk\/cdn\/shop\/files\/ftp_f_freewheel_imagessportlinefwbikesrb22791_detail04.webp?v=1722607140","\/\/projektride.co.uk\/cdn\/shop\/files\/ftp_f_freewheel_imagessportlinefwbikesrb22791_detail03.webp?v=1722607140","\/\/projektride.co.uk\/cdn\/shop\/files\/ftp_f_freewheel_imagessportlinefwbikesrb22791_detail02.webp?v=1722607141"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/ftp_f_freewheel_imagessportlinefwbikesrb22790_detail01.webp?v=1722607140","options":["Title"],"media":[{"alt":null,"id":34382314569954,"position":1,"preview_image":{"aspect_ratio":1.534,"height":1000,"width":1534,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/ftp_f_freewheel_imagessportline
>
tlinefwbikesrb22790_detail04.webp?v=1722607140","width":1229},{"alt":null,"id":34382314668258,"position":4,"preview_image":{"aspect_ratio":1.581,"height":970,"width":1534,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/ftp_f_freewheel_imagessportlinefwbikesrb22790_detail03.webp?v=1722607140"},"aspect_ratio":1.581,"height":970,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/ftp_f_freewheel_imagessportlinefwbikesrb22790_detail03.webp?v=1722607140","width":1534},{"alt":null,"id":34382314701026,"position":5,"preview_image":{"aspect_ratio":1.498,"height":1000,"width":1498,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/ftp_f_freewheel_imagessportlinefwbikesrb22791_detail05.webp?v=1722607140"},"aspect_ratio":1.498,"height":1000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/ftp_f_freewheel_imagessportlinefwbikesrb22791_detail05.webp?v=1722607140","width":1498},{"alt":null,"id":34382314733794,"position":6,"preview_image":{"aspect_ratio":1.534,"height":1000,"width":1534,"src
ed');
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')
<
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 ||
li class="result result--full">
ebug(`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;
}
}
// First try to get settings from metafields with expiry check
const cachedSettings = window._RestockRocketConfig.cachedSettings;
const validCachedSettings = cachedSettings ? checkSettingsExpiry(cachedSettings) : null;
if (
{{ it.item.text }}ipts(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}`);
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 === 'collectiodiv 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');">
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else {
console.debug(`STOQ - no scripts enabled for ${window._RestockRocketConfig.pageType}`);
}
// Check and update cart selling plans after scripts are loaded
if (settings.preorder_enabled) {
updateCartSellingPlans();
}
// Dispatch custom event when app is loaded
const appLoadedEvent = new CustomEvent('stoq:loaded', {
detail: {
pageType: window._RestockRocketConfig.pageType,
enabled: settings.enable_app,
settings: settings
}
});
console.debug('STOQ - dispatching app loaded event');
window.dispatchEvent(appLoadedEvent);
}
}
function updateCartSellingPlans() {
// Wait for the API to be available with retries
const maxRetries = 10;
const retryDelay = 500;
function attemptCartCheck(attempt = 1) {
if (window._RestockRocket && window._RestockRocket.updateCartSellingPlans) {
>
{
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);
});
} else if (attempt maxRetries) {
console.debug(`STOQ - API not ready, retry ${attempt}/${maxRetries}`);
setTimeout(() => attemptCartCheck(attempt + 1), retryDelay);
} else {
console.debug('STOQ - API not loaded after max retries, skipping cart selling plan check');
}
}
attemptCartCheck();
}