08Z","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_p
"quantity_required":false,"storefront_form_quantity_label":"Quantity","enable_alerts":true,"sms_allowed":false,"email_allowed":true,"collect_promotion_consent_default":true,"insert_button_after_selector":null,"insert_button_after_selector_type":"afterend","storefront_button_position_type":"float-right","storefront_form_duplicate_error":"You've already subscribed for alerts to this product.","storefront_mixed_cart_error":"This item needs to be purchased separately. Please check out or clear your cart before adding this item.","storefront_error_heading":"Error","default_locale":"en","collection_page_button_text_color":"#FFFFFF","collection_page_button_background_color":"#202223","show_button_if_any_out_of_stock":false,"show_button_if_any_variant_out_of_stock_collection":false,"show_button_on_index":false,"insert_button_after_selector_collection":null,"insert_button_after_selector_index":null,"push_enabled":false,"push_allowed":false,"storefront_form_push_label":"Push","storefront_form_push_description":"Click '
5b6645/restock-rocket-shopify-436/assets/restockrocket-product.js'
window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019bf9e0-3016-7510-aaea-4318e35b6645/restock-rocket-shopify-436/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
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
updatedAt.getTime())) {
console.debug('STOQ - Invalid updated_at date format in settings');
return null;
}
const age = Date.now() - updatedAt.getTime();
if (age Shop All New Bikes
Spend
£50 to qualify for free shipping to qualify for free shipping£50
to qualify for free shipping
to qualify for free shippingBikes
Congratulations! Your order qualifies for free shippingCongratulations! Your order qualifies for free shippi
num freeQENCE in desired length\u003c\/p\u003e\n\u003cp\u003e1x Manual for operation, mounting, maintenance\u003c\/p\u003e\n\u003cp\u003e1x Gauge for testing the minimum distance from stem to head tube for freeQENCE 90\u003c\/p\u003e\n\u003ch3 class=\"text-align-center\" data-mce-fragment=\"1\"\u003e\u003cstrong data-mce-fragment=\"1\"\u003eTHE SUSPENSION STEM\u003c\/strong\u003e\u003c\/h3\u003e\n\u003cp class=\"text-align-center\" data-mce-fragment=\"1\"\u003eMore comfort, safety \u0026amp; fun.\u003cbr data-mce-fragment=\"1\"\u003eFor gravel, road, touring bikes,\u003cbr data-mce-fragment=\"1\"\u003esuspensionless (e-)bikes.\u003c\/p\u003e\n\u003cp class=\"text-align-center\" data-mce-fragment=\"1\"\u003e \u003c\/p\u003e\n\u003ch2\u003e\n\u003cstrong\u003eMORE FUN ON THE BIKE \u003cbr\u003e\u003c\/strong\u003eUP TO 75% LESS VIBRATIONS AND IMPACTS\u003c\/h2\u003e\n\u003cp class=\"\"\u003eThe suspension stem freeQENCE absorbs up to 75% of all vibrations and impacts and therefore reduces your fatigue. You are
E YOUR BIKE\u003c\/h2\u003e\n\u003cp class=\"\"\u003eThe suspension stem freeQENCE is simply mounted like a standard a-head stem. Upgrading is easy and done in a few minutes. Thanks to the open face 4-screw clamping, nothing needs to be dismounted from your handlebars.\u003c\/p\u003e\n\u003cp class=\"\"\u003e \u003c\/p\u003e\n\u003ch2\u003e\n\u003cstrong\u003eIN 3 LENGTHS \u003c\/strong\u003e\u003cbr\u003eFOR ALL SUSPENSIONLESS BIKES\u003c\/h2\u003e\n\u003cp class=\"\"\u003eAvailable in 3 lengths - 90 mm, 105 mm, 120 mm. \u003cbr\u003eFor 1⅛ inch forks and all handlebar types with 31,8 mm diameter including carbon handlebars. Please note the required shaft length of your fork.\u003c\/p\u003e\n\u003cp class=\"\"\u003e \u003c\/p\u003e\n\u003ch2\u003e\n\u003cstrong\u003eDESIGN. BUILD. RIDE.\u003c\/strong\u003e\u003cbr\u003eVECNUM ALLGAEU GERMANY\u003c\/h2\u003e\n\u003cp class=\"\"\u003eAt Vecnum, development, CNC processing, assembly and field testing is all single source and under one roof. As usual we focu
and 10mm negative travel - similar to the sag of a supension fork. The supension stem freeQENCE has a homogeneous, linear spring characteristic with srong progression towards the end of stroke. \n \n\nEXTERNALLY ADUSTABLEFROM 50 TO 120 KG\nThe suspension stem freeQENCE offers you an external and steples adjustment to your weight and inteded riding style. The patented internal spring linkage makes setting up your desired spring characteristics easier than on any suspension fork.\n \n\nSPIRIT OF GRAVEL LIGHTWEIGHT, AGILE, STRONG\nThe freeQENCE design is consequently optimized for high loads and low weight - starting with 287 grams at 90mm length. That is only about 150 grams additional weight compared to a standard stem. Without the disadvantages of a supension fork, your bike does not suffer ftom aerodynamic losses, it remains light and agile when sprinting and riding out of the saddle. The bike geometry remains unchanged. You do not need a lockout for your freeQENCE stem.\n \n\nSIMPLYUPGRADE YOUR BIKE\nT
<<
<
Blue Sage
Bronze Age
Carbon Black
Carbon Red Smoke
CHRIS KING R45D BLACK HUB
Chris King R45D Black Hub
Cobra Blood/Viper Red/Rage Red
Cobra Blood/Viper Red/Rage Red
Dark Blue
Dark Green/Ivy Smoke Splatter
<
<
Dark Red/Carbon Red Smoke Splatter
>
Era White/Supernova Marble
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.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":"Please 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,"collect_promotion_consent_default":true,"insert_button_after_selector":null,"insert_button_after_selector_type":"afterend","storefront_button_position_type":"float-right","storefront_form_duplicate_error":"You've already subscribed for alerts to this product.","storefront_mixed_cart_error":"This item needs to be purchased separately. Please ch
Era White/Supernova Marble
_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,"enable_billing_widget":false,"inventory_provider":"stoq","preorder_badge_enabled":false,"preorder_badge_text":"Preorder","preorder_badge_text_color":"#FFFFFF","preorder_badge_background_color":"#000000","preorder_discounted_price_enabled":null,"payment_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":f
Black
Fjord Bluetimer_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_progress_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","ind
NCE in desired length\u003c\/p\u003e\n\u003cp\u003e1x Manual for operation, mounting, maintenance\u003c\/p\u003e\n\u003cp\u003e1x Gauge for testing the minimum distance from stem to head tube for freeQENCE 90\u003c\/p\u003e\n\u003ch3 class=\"text-align-center\" data-mce-fragment=\"1\"\u003e\u003cstrong data-mce-fragment=\"1\"\u003eTHE SUSPENSION STEM\u003c\/strong\u003e\u003c\/h3\u003e\n\u003cp class=\"text-align-center\" data-mce-fragment=\"1\"\u003eMore comfort, safety \u0026amp; fun.\u003cbr data-mce-fragment=\"1\"\u003eFor gravel, road, touring bikes,\u003cbr data-mce-fragment=\"1\"\u003esuspensionless (e-)bikes.\u003c\/p\u003e\n\u003cp class=\"text-align-center\" data-mce-fragment=\"1\"\u003e \u003c\/p\u003e\n\u003ch2\u003e\n\u003cstrong\u003eMORE FUN ON THE BIKE \u003cbr\u003e\u003c\/strong\u003eUP TO 75% LESS VIBRATIONS AND IMPACTS\u003c\/h2\u003e\n\u003cp class=\"\"\u003eThe suspension stem freeQENCE absorbs up to 75% of all vibrations and impacts and therefore reduces your fatigue. You are riding moFjord Blue
mpare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":43414855287010,"title":"90mm","option1":"90mm","option2":null,"option3":null,"sku":"","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Vecnum FreeQence Suspension Stem - 90mm","public_title":"90mm","options":["90mm"],"price":29900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":43414855319778,"title":"105mm","option1":"105mm","option2":null,"option3":null,"sku":"","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Vecnum FreeQence Suspension Stem - 105mm","public_title":"105mm","options":["105mm"],"price":29900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":43414855352546,"title":"120mm","option1":"120mm","option2":null,"option3":null,"sku":"
<
Fjord Blue to Miami Green Fadeect_ratio":0.857,"height":1536,"width":1316,"src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-08-29at11.06.52.png?v=1664639518"},"aspect_ratio":0.857,"height":1536,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-08-29at11.06.52.png?v=1664639518","width":1316},{"alt":null,"id":30594427191522,"position":2,"preview_image":{"aspect_ratio":0.857,"height":1536,"width":1316,"src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-08-29at11.07.13.png?v=1664639518"},"aspect_ratio":0.857,"height":1536,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-08-29at11.07.13.png?v=1664639518","width":1316},{"alt":null,"id":30594427224290,"position":3,"preview_image":{"aspect_ratio":0.857,"height":1536,"width":1316,"src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-08-29at11.07.22.png?v=1664639518"},"aspect_ratio":0.857,"height":1536,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot
a class="product__media product__media--featured"
href="/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)">
<
03c\/strong\u003eTHE ultimate suspension stem with the longest travel, damping an sag. Effectively absorbs up to 75% of vibrations and shocks.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eScope of delivery: \u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e1x Suspension stem Vecnum freeQENCE in desired length\u003c\/p\u003e\n\u003cp\u003e1x Manual for operation, mounting, maintenance\u003c\/p\u003e\n\u003cp\u003e1x Gauge for testing the minimum distance from stem to head tube for freeQENCE 90\u003c\/p\u003e\n\u003ch3 class=\"text-align-center\" data-mce-fragment=\"1\"\u003e\u003cstrong data-mce-fragment=\"1\"\u003eTHE SUSPENSION STEM\u003c\/strong\u003e\u003c\/h3\u003e\n\u003cp class=\"text-align-center\" data-mce-fragment=\"1\"\u003eMore comfort, safety \u0026amp; fun.\u003cbr data-mce-fragment=\"1\"\u003eFor gravel, road, touring bikes,\u003cbr data-mce-fragment=\"1\"\u003esuspensionless (e-)bikes.\u003c\/p\u003e\n\u003cp class=\"text-align-center\" data-mce-fragment=\"1\"Fjord Blue to Miami Green Fadespan class="visually-hidden">Hire Ortlieb 40L Pannier Bags
u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp class=\"\"\u003eRequired minimum distance from stem to head tube has to be tested with gauge included in freeQENCE 90 package\u003c\/p\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003e\u003cbr\u003e\u003c\/p\u003e\n\u003ctable class=\"table table-bordered table-striped table-condensed table-hover\"\u003e\n\u003ctbody\u003e\n\u003ctr class=\"thead\"\u003e\n\u003cth scope=\"col\"\u003eType\u003cspan class=\"visible-inline-xs\"\u003e\u003cspan\u003e \u003c\/span\u003efreeQENCE\u003c\/span\u003e\n\u003c\/th\u003e\n\u003cth class=\"align-right\" scope=\"col\"\u003e\n\u003cspan class=\"hidden-inline-xs\"\u003efreeQENCE\u003cbr\u003e\u003c\/span\u003e90 mm\u003c\/th\u003e\n\u003cth class=\"align-right\" scope=\"col\"\u003e\n\u003cspan class=\"hidden-inline-xs\"\u003efreeQENCE\u003cbr\u003e\u003c\/span\u003e105 mm\u003c\/th\u003e\n\u003cth class=\"align-right\" scope=\"col\"\u003e\n\u003cspan class=\"hidden-inline-xs\"\u003efreeQENCE\u003cbr\u003e\u003c\/span\u
e=\"row\"\u003eRider weight\u003c\/th\u003e\n\u003ctd class=\"align-center\" colspan=\"3\" rowspan=\"1\"\u003eStepless and external adjustment from 50 to 120 kg\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth scope=\"row\"\u003eStem clamping height\u003c\/th\u003e\n\u003ctd class=\"align-center\" colspan=\"3\" rowspan=\"1\"\u003e43 mm\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"bottom\"\u003e\n\u003cth scope=\"row\"\u003e\u003ca href=\"https:\/\/www.vecnum.com\/en\/products\/freeqence#jump-1\"\u003e\u003csmall\u003eRequired for mounting\u003c\/small\u003e\u003cbr\u003eMinium shaft length\u003csup\u003e1\u003c\/sup\u003e\u003c\/a\u003e\u003c\/th\u003e\n\u003ctd class=\"align-center\" colspan=\"3\" rowspan=\"1\"\u003e42 mm\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"bottom\"\u003e\n\u003cth scope=\"row\"\u003eHead tube diameter\u003c\/th\u003e\n\u003ctd class=\"align-center\" colspan=\"3\" rowspan=\"1\"\u003e1⅛ inches\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"bottom\"\u00
3e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {43414855287010 : "deny",43414855319778 : "deny",43414855352546 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {43414855287010 : parseInt("0"),43414855319778 : parseInt("0"),43414855352546 : parseInt("0"),};
window._RestockRocketConfig.variantsPreorderCount = {43414855287010 : parseInt(""),43414855319778 : parseInt(""),43414855352546 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {43414855287010 : null,43414855319778 : null,43414855352546 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {43414855287010 : parseInt(""),43414855319778 : parseInt(""),43414855352546 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {43414855287010 : null,43414855319778 : null,43414855352546 : null,};
window._RestockRocketConfig.variantsShippingText = {43414855287010 : "",43414855319778
Hire Ortlieb 40L Pannier Bags
Fury Red://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 cache, fetching fresh');
return null;
}
// Translations object exists in metafield - cache is valid
// If curre
!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
Fury Red
eCartSellingPlans()
.then(hasUpdates => {
if (hasUpdates) {
console.debug('STOQ - cart selling plans updated successfully');
} else {
console.debug('STOQ - no cart selling plan updates needed');
re_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 - settings configured for
ings.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 enabled for ${window._RestockRocketConfig.pageType}`);
}
// Dispatch custom event when app is loaded
// Cart selling plan updates will be triggered by stoq:preorder-api-ready event
const appLoadedEvent = new CustomEvent('stoq:loaded', {
detail: {
pageType: window._RestockRocketConfig.pageType,
enabled: set
Life Systems Pocket First Aid Kit - HIRE
Fury Red Fade
Gecko Phaze
Gecko Phaze
Gloss Crystal White/Matte Deep Smoke
Gloss Crystal White/Matte Deep SmokeLife Systems Pocket First Aid Kit - HIRE
Gloss Dark Star/Matte Deep Smoke
Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable
Gloss Dark Star/Matte Deep Smoke
>
Gloss Fury Red/Matte Deep Smoke>
Gloss Fury Red/Matte Deep Smoke
Gloss Lavender Haze
Gloss Lavender Haze
Glowstick to Living Coral Fade
Glowstick to Living Coral Fade
ProjektRide Bike Shop Edinburgh
Green
Green
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.
Grey
Postage is free on orders over £50. Orders under £50, our postage charge is £3.99.
GreyWe also have a physical store, if you are local please pop in -
Matte Dark Webs":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,"enable_billing_widget":false,"inventory_provider":"stoq","preorder_badge_enabled":false,"preorder_badge_text":"Preorder","preorder_badge_text_color":"#FFFFFF","preorder_badge_background_color":"#000000","preorder_discounted_price_enabled":null,"payment_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,"translati
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_progress_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","p
ll,};
window._RestockRocketConfig.selected_variant_id = 43936177291490;
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/019bf9e0-3016-7510-aaea-4318e35b6645/restock-rocket-shopify-436/assets/restockrocket-product.js'
window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019bf9e0-3016-7510-aaea-4318e35b6645/restock-rocket-shopify-436/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
function checkSettingsExpiry(settings) {
tr
Matte Dark Web/Clear Gloss&
!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 = 'resto
Matte Deep Smoke
.restock-rocket-button,.restock-rocket-button-float{opacity:1!important;border:none!important;cursor:pointer!important;background-image:none!important;box-shadow:none!important;padding:15px 20px;font-size:16px;width:100%;font-family:inherit}@font-face{font-family:OpenSans;font-weight:200;src:url(https://d382hokyqag45a.cloudfront.net/assets/OpenSans-Light.woff)}@font-face{font-family:OpenSans;font-weight:300;src:url(https://d382hokyqag45a.cloudfront.net/assets/OpenSans-Regular.woff)}@font-face{font-family:OpenSans;font-weight:600;src:url(https://d382hokyqag45a.cloudfront.net/assets/OpenSans-SemiBold.woff)}.restock-rocket-button-container{position:relative;z-index:1;width:100%}.restock-rocket-button-container-float-right{position:fixed;z-index:123123;top:calc(50% - 200px);right:0;transform:rotate(270deg);transform-origin:bottom right}.restock-rocket-bu
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/EmondaSL7_22_35046_A_Alt1_600x.webp?v=1728736008)">
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 = 'collection';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":"Please 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,"collect_promotion_consent_default":true,"insert_button_after_selector":null,"insert_button_after_selector_type":"afterend","storefront_button_position_type":"float-right","storefront_form_duplicate_error":"You've already subscribed for alerts to this product.","storefront_mixed_cart_error":"This item needs to be purchased separately. Please check out or clear your cart before adding this item.","storefront_error_heading":"Error","default_locale":"en","collection_page_button_text_color":"#FFFFFF","collection_page_button_background_color":"#202223","show_button_if_any_out_of_stock":false,"show_button_if_any_variant_out_of_stock_collection":false,"show_button_on_index":false,"insert_button_after_selector_collection":null,"insert_button_after_selector_inde>
sion_enable_url_variant_detection":true,"extension_enable_value_variant_detection":true,"extension_value_variant_selector":"[name='id']","resubscribe_text":"This product is out of stock. Get notified when it's restocked again by entering your details below!","preorder_enabled":true,"preorder_buy_button_selector":null,"preorder_add_to_cart_button_selector":"","preorder_badge_selector":"","preorder_button_out_of_stock_text":"Out of stock","preorder_button_add_to_cart_text":"Add to cart","preorder_form_selector":"form[action*=\"/cart/add\"]","preorder_collection_enabled":false,"preorder_collection_form_selector":"form[action*=\"/cart/add\"]","preorder_collection_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_index_enabled":false,"preorder_index_form_selector":"form[action*=\"/cart/add\"]","preorder_index_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_page_enabled":false,"preorder_page_form_selector":"form[action*=\"/cart/add\"]","preorder_page_add_to_cart
e 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
Blue