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| Open navigation menurms":"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 |
"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
t/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_type":"afterend","preorder_collection_badge_selector_type":"afterend","preorder_button_child_selector":"span","preorder_button_disclaimer_insert_selector":"","preorder_button_disclaimer_insert_selector_type":"afterend","preorder_payment_insert_selector":"","preorder_payment_insert_selector_type":"afterend" | Open search bar22757602,43936022790370,43936022823138,43936022855906,43936056115426,43936061030626,43936064930018,43936070631650,43936078037218,43936078069986,43936088195298,43936093470946,43936101138658,43936107266274,43936124076258,43936124109026,43936124141794,43936124174562,43936129941730,43936129974498,43936130007266,43936142393570,43936142426338,43936142459106,43936152060130,43936152092898,43936152125666,43936193118434,43936250429666,43936255803618,43936266682594,43936266715362,43936293978338,43936294011106,43936316424418,43936316457186,43936320880866,43936320913634,43936320946402,43936327041250,43936327074018,43936327106786,43936331661538,43936332349666,43936333103330,43936351224034,43936353714402,43936362889442,43936362922210,43936388153570,43936389333218,43936395526370,43936398508258,43936401522914,43936408568034,43936414400738,43936700727522,43936706101474,43936706134242,43936706167010,43936706199778,43936706232546,43936706265314,43938308587746,43938308653282,43938308718818,43938308751586,43938308784354,4393830881
,45069750763746,45353010921698,45353010954466,45353010987234,45353018261730,45353018294498,45353018327266,55569712382335,55569712447871,55569712480639,55569933074815,55570550194559,55570550227327,55604008976767,55638316908927,55638316941695,55638316974463,56220814999935,56220815032703,56270279606655,56270279639423,56270279672191,56314171064703,56314171097471,56398983725439,56398983758207,56398983790975,56399322251647,56565020721535,56565020754303,56565020787071],"updated_at":"2025-12-15T14:52:15Z","market_locations_enabled":false,"market_id":382140642,"preorder_location_filter_enabled":false,"preorder_location_filter_ids":[],"collection_id":null};window._RestockRocketConfig.cachedInStockVariantIds = { in_stock_variant_ids: [] };window._RestockRocketConfig.cachedOutOfStockVariantIds = { out_of_stock_variant_ids: [] };window._RestockRocketConfig.cachedVariantPreorderLimits = {"variant_preorder_limits":{},"updated_at":"2025-12-15T14:53:22Z","shopify_market_id":382140642,"market_locations_enabled":false};
win |
ext_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
ing_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.","preorder_min_quantity":null,"preorder_max_quantity":null,"countdown_timer_enabled":false,"countdown_timer_insert_selector":null,"countdown_timer_insert_selector_type":"afterend","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,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true}];window._RestockRocketConfig.integrations = [{"id":"15c94526-b6b8-4de1-9b |
ecurely to Apidura’s Backcountry Handlebar Pack, the Backcountry Accessory Pocket is a convenient, removable compartment for storing anything you might need at a moment’s notice on the trail.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eWeighing only 155 grams, the Pocket keeps favourite snacks, a phone, or a small camera within arm’s reach. A velcro closure provides easy access, while an internal anti-rattle mesh pocket keeps contents secure. A reflective design and a light attachment help to increase visibility in low light.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cem data-mce-fragment=\"1\"\u003ePlease note: This bag does not function as a standalone product.\u003c\/em\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"wrap-details read-more\" data-mce-fragment=\"1\"\u003e\n\u003ch3 data-mce-fragment=\"1\"\u003eTECHNICAL\u003ci class=\"tab-arrow\" data-mce-fragment=\"1\"\u003e\u003c\/i\u003e\n\u003c\/h3\u003e\n\u003cdiv data-mce-fragment=\"1\"\u003
t air dry.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eDo not machine wash, machine dry, or iron.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e","published_at":"2023-06-25T11:56:44+01:00","created_at":"2023-06-25T11:56:44+01:00","vendor":"Apidura","type":"bags","tags":["Apidura","Bags and Transportation","Bike Packing","spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled"],"price":5800,"price_min":5800,"price_max":5800,"available":true,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":44140340543714,"title":"Default Title","option1":"Default Title","option2":null,"option3":null,"sku":"BBF","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"BACKCOUNTRY ACCESSORY POCKET (4L)","public_title":null,"options":["Default Title"],"price":5800,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"sel |
shop\/files\/Screenshot2023-06-25at11.57.38.png?v=1687690663","width":1234}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cmeta charset=\"utf-8\"\u003e\n\u003cdiv class=\"wrap-details read-more\" data-mce-fragment=\"1\"\u003e\n\u003cdiv data-mce-fragment=\"1\"\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cstrong data-mce-fragment=\"1\"\u003eConvenience without compromise – just clip and go.\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eClipping securely to Apidura’s Backcountry Handlebar Pack, the Backcountry Accessory Pocket is a convenient, removable compartment for storing anything you might need at a moment’s notice on the trail.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eWeighing only 155 grams, the Pocket keeps favourite snacks, a phone, or a small camera within arm’s reach. A velcro closure provides easy access, while an internal anti-rattle mesh pocket keeps contents secure. A reflective design and a light attachment help to in
s of off-road riding, these materials offer full waterproofing, light weight, low stretch, and high abrasion and tear resistance. Notably, it’s welded together at the seams, creating a watertight seal that ensures the Accessory Pocket remains completely waterproof.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cstrong data-mce-fragment=\"1\"\u003eCare\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eHand wash, using a mild diluted soap if necessary. Afterwards, let it air dry.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eDo not machine wash, machine dry, or iron.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {44140340543714 : "continue",};
window._RestockRocketConfig.variantsInventoryQuantity = {44140340543714 : parseInt("100"),};
window._RestockRocketConfig.variantsPreorderCount = {44140340543714 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {441403405 | Open cart 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 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.
< |
!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
e?.role === 'main') {
headers['X-Shopify-Theme-Schema |
or(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 === '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._RestockRocketC
nt = 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) {
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);
cachedVariantPreorderLimitsMarketKey = "variant_preorder_limits_for_market_382140642";window._RestockRocketConfig.cachedVariantShippingTexts = {"variant_shipping_texts":{},"updated_at":"2025-12-15T14:53:22Z","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":[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","pre
View allorder_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,"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,"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"8
,"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.","preorder_min_quantity":null,"preorder_max_quantity":null,"countdown_timer_enabled":false,"countdown_timer_insert_selector":null,"countdown_timer_insert_selector_type":"afterend","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,"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":8677938069730,"title":"Ortlieb Back-Roller Plus","handle":"ortlieb-back-roller-plus","description":"\u003cp\u003e \u003c\/p\u003e\n\u003cdiv class=\"tab-pane fade in active\" id=\"description\" role=\"tabpanel\"\u003e\n\u003cdiv class=\"product-description\"\u003e\n\u003cp\u003eThe Back-Roller Plus is more than just a rear pannier. It's the original, reimagined and perfected to meet all your requirements. Made from waterproof, durable Cordura fabric in an elegant textile look, it not only protects aga
inst moisture but also against dust and dirt - no matter what adventure you choose.\u003c\/p\u003e\n\u003cp\u003eThe waterproof outer pocket with a roll-top closure keeps smaller contents dry and safe yet easily accessible. Thanks to the side reflector, you'll be visible even in poor lighting conditions. And with the Quick-Lock mounting system, the durable rear pannier can be effortlessly attached to and removed from the bicycle.\u003c\/p\u003e\n\u003cp\u003eThe organizer inside allows for orderly storage of your belongings. And when you're not on the bike, you can conveniently transport the Back-Roller Plus with the shoulder carrying strap.\u003c\/p\u003e\n\u003cp\u003eWhether in everyday life or on extended bike tours, the sustainably produced Back-Roller Plus, made in Germany is ready for your next adventure!\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eFabric: PS36C\u003c\/li\u003e\n\u003cli\u003eFeatures: QL2.1\u003c\/li\u003e\n\u003cli\u003eHeight: 42cm\u003c\/li\u003e\n\u003cli\u003eWidth: 23 \/ 32cm\u003c\/li\u003e\n\u003cli\u003eDepth: 17cm\u003c\/li\u003e\n\u003cli\u003eVolume: 23L\u003c\/li\u003e\n\u003cli\u003eWeight: 1680g\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"tab-pane fade\" id=\"product-details\" role=\"tabpanel\" style=\"box-sizing: inherit; opacity: 1; transition: opacity 0.15s linear 0s; display: block; margin-bottom: 20px; color: rgb(0, 0, 0); font-family: 'Open Sans', Arial, Helvetica, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\"\u003e\u003c\/div\u003e\n\u003c!----\u003e","published_at":"2024-08-16T11:03:38+01:00","created_at":"2024-08-16T11:03:38+0ST ANGLE
1:00","vendor":"ortlieb","type":"Apparel \u0026 Accessories","tags":["Bike Packing","pannier","spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled"],"price":10000,"price_min":10000,"price_max":10000,"available":true,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":45820546908386,"title":"Green","option1":"Green","option2":null,"option3":null,"sku":"","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Ortlieb Back-Roller Plus - Green","public_title":"Green","options":["Green"],"price":10000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":45820546941154,"title":"Blue","option1":"Blue","option2":null,"option3":null,"sku":"","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Ortlieb Back-Roller Plus - Blue","public_title":"Blue","op | tions":["Blue"],"price":10000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":45820546973922,"title":"Black","option1":"Black","option2":null,"option3":null,"sku":"","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Ortlieb Back-Roller Plus - Black","public_title":"Black","options":["Black"],"price":10000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":45820547006690,"title":"Red","option1":"Red","option2":null,"option3":null,"sku":"","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Ortlieb Back-Roller Plus - Red","public_title":"Red","options":["Red"],"price":10000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]}],"images":["\/\/projektride.co.uk
Loading more\/cdn\/shop\/files\/17603.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17597.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17598.jpg?v=1723802376","\/\/projektride.co.uk\/cdn\/shop\/files\/17599.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17600.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17601.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17602.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17596.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17604.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17605.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17606.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17607.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17608.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17609.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17610.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17611.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17612.jpg?v=1723802376","\/\/projektride.co.uk\/cdn\/shop\/files\/17613.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17614.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17615.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17616.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17617.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17618.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17619.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17620.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17621.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17622.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17623.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17624.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17625.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17626.jpg?v=1723802375","\/\/projektride.co.uk\/75cdn\/shop\/files\/17627.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17628.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17838.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17839.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17840.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17841.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17842.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17843.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17844.jpg?v=1723802375","\/\/projektride.co.uk\/cdn\/shop\/files\/17845.jpg?v=1723802375"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/17603.jpg?v=1723802375","options":["Color"],"media":[{"alt":null,"id":34467845603554,"position":1,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17603.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\. |
":34467845505250,"position":5,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17600.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17600.jpg?v=1723802375","width":2000},{"alt":null,"id":34467845538018,"position":6,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17601.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17601.jpg?v=1723802375","width":2000},{"alt":null,"id":34467845570786,"position":7,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17602.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17602.jpg?v=1723802375","width":2000},{"alt":null,"id":34467845374178,"position":8,"preview_image":{"aspect_ratio".74.5k\/cdn\/shop\/files\/17606.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17606.jpg?v=1723802375","width":2000},{"alt":null,"id":34467845734626,"position":12,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17607.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17607.jpg?v=1723802375","width":2000},{"alt":null,"id":34467845767394,"position":13,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17608.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17608.jpg?v=1723802375","width":2000},{"alt":null,"id":34467845800162,"position":14,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17609.jpg?v=1723802375"},"aspect_rati. |
ktride.co.uk\/cdn\/shop\/files\/17612.jpg?v=1723802376","width":2000},{"alt":null,"id":34467845931234,"position":18,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17613.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17613.jpg?v=1723802375","width":2000},{"alt":null,"id":34467845964002,"position":19,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17614.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17614.jpg?v=1723802375","width":2000},{"alt":null,"id":34467845996770,"position":20,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17615.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17615.jpg?v=1723802375","w
74"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17619.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17619.jpg?v=1723802375","width":2000},{"alt":null,"id":34467846160610,"position":25,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17620.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17620.jpg?v=1723802375","width":2000},{"alt":null,"id":34467846193378,"position":26,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17621.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17621.jpg?v=1723802375","width":2000},{"alt":null,"id":34467846226146,"position":27,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":
|
.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17625.jpg?v=1723802375","width":2000},{"alt":null,"id":34467846357218,"position":31,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17626.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17626.jpg?v=1723802375","width":2000},{"alt":null,"id":34467846389986,"position":32,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17627.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17627.jpg?v=1723802375","width":2000},{"alt":null,"id":34467846422754,"position":33,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17628.jpg?v=1723802375"},"aspect_ratio":1.0,"height":2000,"medi
73.5es\/17840.jpg?v=1723802375","width":1200},{"alt":null,"id":34467846553826,"position":37,"preview_image":{"aspect_ratio":0.667,"height":1200,"width":800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17841.jpg?v=1723802375"},"aspect_ratio":0.667,"height":1200,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17841.jpg?v=1723802375","width":800},{"alt":null,"id":34467846586594,"position":38,"preview_image":{"aspect_ratio":1.5,"height":800,"width":1200,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17842.jpg?v=1723802375"},"aspect_ratio":1.5,"height":800,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17842.jpg?v=1723802375","width":1200},{"alt":null,"id":34467846652130,"position":39,"preview_image":{"aspect_ratio":0.667,"height":1200,"width":800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17843.jpg?v=1723802375"},"aspect_ratio":0.667,"height":1200,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/17843.jpg?v=1723802375","width":800},{"alt":null,"i
|
oof, durable Cordura fabric in an elegant textile look, it not only protects against moisture but also against dust and dirt - no matter what adventure you choose.\u003c\/p\u003e\n\u003cp\u003eThe waterproof outer pocket with a roll-top closure keeps smaller contents dry and safe yet easily accessible. Thanks to the side reflector, you'll be visible even in poor lighting conditions. And with the Quick-Lock mounting system, the durable rear pannier can be effortlessly attached to and removed from the bicycle.\u003c\/p\u003e\n\u003cp\u003eThe organizer inside allows for orderly storage of your belongings. And when you're not on the bike, you can conveniently transport the Back-Roller Plus with the shoulder carrying strap.\u003c\/p\u003e\n\u003cp\u003eWhether in everyday life or on extended bike tours, the sustainably produced Back-Roller Plus, made in Germany is ready for your next adventure!\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eFabric: PS36C\u003c\/li\u003e\n\u003cli\u003eFeatures: QL2.1\u003c\/li\u00
73"};
window._RestockRocketConfig.variantsInventoryPolicy = {45820546908386 : "deny",45820546941154 : "deny",45820546973922 : "deny",45820547006690 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {45820546908386 : parseInt("1"),45820546941154 : parseInt("1"),45820546973922 : parseInt("0"),45820547006690 : parseInt("1"),};
window._RestockRocketConfig.variantsPreorderCount = {45820546908386 : parseInt(""),45820546941154 : parseInt(""),45820546973922 : parseInt(""),45820547006690 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {45820546908386 : null,45820546941154 : null,45820546973922 : null,45820547006690 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {45820546908386 : parseInt(""),45820546941154 : parseInt(""),45820546973922 : parseInt(""),45820547006690 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {45820546908386 : null,45820546941154 : null,45820546973922 : null,45820547006690 : nu
| ll,};
window._RestockRocketConfig.variantsShippingText = {45820546908386 : "",45820546941154 : "",45820546973922 : "",45820547006690 : "",};
window._RestockRocketConfig.variantsShippingTextForMarket = {45820546908386 : null,45820546941154 : null,45820546973922 : null,45820547006690 : null,};
window._RestockRocketConfig.selected_variant_id = 45820546908386;
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/019b1405-52e0-7e89-a6c1-1ac7fea6dd8f/restock-rocket-shopify-410/assets/restockrocket-product.js'
window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019b1405-52e0-7e89-a6c1-1ac7fea6dd8f/restock-rocket-shopify-410/assets/restockrocket-collection.js'
window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.s<
criptUrlProduct.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 cache, li class="result">
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 <72.5
| 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 || <
!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[keya href="{{ it.product.url }}" class="result__image-link" aria-label='{{ it.product.title }}'>
];
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 (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-Th
div class="result__image-img product__media lazyload fade-in"
data-bgset="{{ it.product.image.thumb }}"
data-aspectratio="{{ it.product.image.aspectRatio }}"
data-sizes="auto">
{{@if(it.product.badgeText)}}
eme-Schema-Version'] = window.Shopify.theme.schema_version;
headers['X-Shopify-Theme-Store-Id'] = window.Shopify.theme.theme_store_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