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();
}
Singular
Bags and Transportation
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-11-11T14:27:02.312Z","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":{},"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_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
I'm looking to buy this product, when will it arrive and how much does postage cost?
BUY_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 'Allow' to be notified via push notification","storefront_form_push_error":"Permission rejected! Please review notification settings and try again","storefront_font_family":"OpenSans","insert_button_after_selector_collection_type":"afterend","show_channel_selector":false,"storefront_
form_empty_error":"Please fill in one or more of the options above","storefront_form_push_input":"Send notification to your browser","insert_button_after_selector_page":null,"show_button_on_page":false,"insert_button_after_selector_search":null,"show_button_on_search":false,"app_proxy_path_prefix":"/apps/restockrocket-production","collection_link_selector":"","index_link_selector":"","page_link_selector":"","search_link_selector":"","collection_check_link_visibility":true,"collection_buttons_container":null,"index_buttons_container":null,"page_buttons_container":null,"search_buttons_container":null,"extension_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_o
f_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_button_selector":"form[action*=\"/cart/add\"] button","preorder_search_enabled":false,"preorder_search_form_selector":"form[action*=\"/cart/add\"]","preorder_search_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_collection_badge_selector":null,"preorder_index_badge_selector":null,"preorder_page_badge_selector":null,"preorder_search_badge_selector":null,"preorder_badge_selector_ty
art_date":null,"countdown_timer_custom_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true}];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":8182070149346,"title":"Surly Nice Rack - Rear","handle":"surly-nice-rack","description":"\u003cmeta charset=\"utf-8\"\u003e\n\u003cp data-mce-fragment=\"1\"\u003eOur Rear Rack is made of tubular CroMoly steel and is design
ProjektRide Bike Shop Edinburgh
ed for expedition touring. We’re not saying you should quit your job, but if you did and needed a bike rack to haul your belongings this would be one that could stand up to the rigors of jobless wandering via bicycle. It is easily repairable on the road and strong enough that you’ll likely never have to worry.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eThe Rear Rack is also height adjustable and can fit a wide selection of wheel sizes while allowing you to keep the center of gravity as low as possible for a stable ride. There’s plenty of room up top to lash all kinds of things: small travel guitars, large bongs, medium pizzas, tents, camping chairs, cinder blocks, it’s really up to you. The stainless steel hardware we provide will enable you to fit them to most rigid 26\", 700c and some 29+ frames, and forks equipped with drum, caliper, or cantilever brakes. Disc brakes and suspension are generally not compatible with our rear Racks, though there is an increasing number of frames designed to
allow the use of racks and disc brakes.\u003c\/p\u003e\n\u003cul data-mce-fragment=\"1\"\u003e\n\u003cli data-mce-fragment=\"1\"\u003eStrong, reliable, repairable cro-moly. \u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eHeight-adjustable.\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eFits most 26\"\/700c Touring frames 42 to 62cm.\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eWide Cargo platform.\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eNot recommended with Disc brakes* and\/or suspension.\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003ePowder coat black or silver.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp data-mce-fragment=\"1\"\u003e* Rear rack WILL work with disc brakes on Surly Troll, Ogre, and Disc Trucker frames. This is accomplished by moving the rear caliper inside the rear triangle. It does limit you to a 160mm rotor but what the hell? Brakes only slow you down. We also have\u003cspan data-mce-fragment=\"1\"\u003e \u003c\/span\u003e\u003ca title=\"S
82 Newington Road, EH91QN, Edinburgh.
urly XL rack struts\" href=\"https:\/\/www.ison-distribution.com\/english\/product.php?part=RASUNRSX\" data-mce-fragment=\"1\" data-mce-href=\"https:\/\/www.ison-distribution.com\/english\/product.php?part=RASUNRSX\"\u003eaftermarket upper tubes\u003c\/a\u003e\u003cspan data-mce-fragment=\"1\"\u003e \u003c\/span\u003eavailable in longer 240mm length so you can fit the Rear Rack to smaller frames and still keep things level.\u003c\/p\u003e","published_at":"2023-10-23T12:17:17+01:00","created_at":"2023-10-23T12:17:17+01:00","vendor":"ProjektRide","type":"","tags":["Bags and Transportation","Bike Packing","pannier rack","surly"],"price":16000,"price_min":16000,"price_max":16000,"available":true,"price_varies":false,"compare_at_price":17000,"compare_at_price_min":17000,"compare_at_price_max":17000,"compare_at_price_varies":false,"variants":[{"id":44441822789858,"title":"BLACK","option1":"BLACK","option2":null,"option3":null,"sku":"RASUNRRK","requires_shipping":true,"taxable":true,"featured_image":null,"available a bike rack to haul your belongings this would be one that could stand up to the rigors of jobless wandering via bicycle. It is easily repairable on the road and strong enough that you’ll likely never have to worry.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eThe Rear Rack is also height adjustable and can fit a wide selection of wheel sizes while allowing you to keep the center of gravity as low as possible for a stable ride. There’s plenty of room up top to lash all kinds of things: small travel guitars, large bongs, medium pizzas, tents, camping chairs, cinder blocks, it’s really up to you. The stainless steel hardware we provide will enable you to fit them to most rigid 26\", 700c and some 29+ frames, and forks equipped with drum, caliper, or cantilever brakes. Disc brakes and suspension are generally not compatible with our rear Racks, though there is an increasing number of frames designed to allow the use of racks and disc brakes.\u003c\/p\u003e\n\u003cul data-mce-fragment=\"1\"\u003e\nRSX\" data-mce-fragment=\"1\" data-mce-href=\"https:\/\/www.ison-distribution.com\/english\/product.php?part=RASUNRSX\"\u003eaftermarket upper tubes\u003c\/a\u003e\u003cspan data-mce-fragment=\"1\"\u003e \u003c\/span\u003eavailable in longer 240mm length so you can fit the Rear Rack to smaller frames and still keep things level.\u003c\/p\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {44441822789858 : "deny",44441822822626 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {44441822789858 : parseInt("0"),44441822822626 : parseInt("5"),};
window._RestockRocketConfig.variantsPreorderCount = {44441822789858 : parseInt(""),44441822822626 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {44441822789858 : null,44441822822626 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {44441822789858 : parseInt(""),44441822822626 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {4444182278985
.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 cache, fetching fresh');
return null;
}
< !settings.multi_language_enabled) {
return settings;
}
if (!settings.translations) {
console.debug('STOQ - No translations found, skipping translation');
lated 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 (validCachedSettings) {
console.debug('STOQ - using cached settings');
initializeScripts(validCachedSettings);
} else {
console.debug('STOQ - fetching fresh settings');
const headers = {
'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.Shopify.shop,
'ngrok-skip-browser-warning': 'skip'
};
if (window.Shopify?.theme?.role === 'main') {
headers['X-Shopify-Theme-Schema-Name'] = window.Shopify.theme.schema_name;
headers['X-Shopify-Theme-Schema-Version'] = window.Shopify.theme.schema_versi
RO XL STEALTH SERIES MUDGUARD SET\u003c\/span\u003e\u003cspan\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cspan\u003ePerfect for someone looking for mudguards to fit a road bike that doesn't have any fixing points. The great thing with these is that they only take a couple of minutes to fit so you can remove on sunny days!\u003c\/span\u003e\u003c\/p\u003e\n\u003cp\u003eThe ultimate clip-on mudguard set for road and cyclocross bikes for tyre width between 25 and 32mm. Its smart, double hinged quick release fitting system also fits aero forks and is also compatible with disc brakes, direct mount brakes and thru axles. Mudguards can be perfectly adapted to the radius of the wheel by adjusting the length of the stays. Its superlight extra long mud flaps give additional spray protection. In addition to using the quick release rubber straps it can also be fixed in place with zip ties. Includes adhesive protection kit to avoid damaging the paintwork. * Disc brake compatible: Please be mindful of the br