preorder_button_colors_enabled":true,"markets_enabled":false,"shopify_market_ids":[],"use_shopify_selling_plan":true,"use_simplified_shipping_text":true,"payment_options":[{"billing_type":"no_remaining_balance","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","billing_at":"2025-07-26T09:20:38.472Z","billing_after_n_intervals":7,"billing_after_interval_type":"day","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"billing_title":"Full payment","billing_description":null,"discount_text":"Save {{ discount }}","shopify_selling_plan_id":713071886719,"is_default":true,"type":"full","translations":{}}],"require_preorder_acknowledgement":false,"preorder_acknowledgement_text":"I acknowledge and agree to the preorder terms and conditions for this product.","disable_button_until_acknowledged":false,"acknowledgement_line_item_property_enabled":false,"acknowledgement_line_item_property_text":"Preorder Terms Accepted","
Switzerland (CHFCHF)
ndow._RestockRocketConfig.enabledNotifyMeVariantIds = [];window._RestockRocketConfig.disabledNotifyMeVariantIds = [];window._RestockRocketConfig.backInStockTemplates = [];window._RestockRocketConfig.restockNotes = {};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.product = {"id":8182070542562,"title":"Surly Nice Rack - Front","handle":"surly-nice-rack-front","description":"\u003cp\u003e \u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eSurly Racks are well-thought-out, durable, expedition-worthy racks that work with most pannFinland (EUR€)
North Macedonia (MKDден)
space for more stuff. It’s worth mentioning the Front Rack hardware has been redesigned to be simpler to attach and more compatible with things like disc calipers and fenders. Surly have also made attachment plates specifically for our Uni-Crown forks for yet more fork compatibility. This simpler design has fewer moving parts and costs less to manufacture, ergo costs less for you to purchase.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eThe Surly front rack\u003cstrong data-mce-fragment=\"1\"\u003e\u003cspan data-mce-fragment=\"1\"\u003e \u003c\/span\u003eWILL\u003cspan data-mce-fragment=\"1\"\u003e \u003c\/span\u003e\u003c\/strong\u003ework with disc brakes on our Troll, Ogre, and Disc Trucker frames. It may take a bit of work to get clearance around the front caliper since the many different calipers out there are many different shapes. The new attachment plates will limit any DIY ingenuity you might need, but if you need to throw a washer or three behind the lower left bolt where the plate
ly Nice Rack - Front - black","public_title":"black","options":["black"],"price":14000,"weight":0,"compare_at_price":14999,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":44441826623714,"title":"Silver","option1":"Silver","option2":null,"option3":null,"sku":"RASUNRF2S","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Surly Nice Rack - Front - Silver","public_title":"Silver","options":["Silver"],"price":14000,"weight":0,"compare_at_price":14999,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}}],"images":["\/\/projektride.co.uk\/cdn\/shop\/files\/Screenshot2023-10-23at12.18.37.png?v=1698060064","\/\/projektride.co.uk\/cdn\/shop\/files\/Screenshot2023-10-23at12.18.43.png?v=1698060063"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/Screens
Libya (GBP£)
work with most panniers. While their racks aren’t limited solely to heavy duty touring, that is what they were designed for.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eWhen you’re out on the road, the best option is to never ever have anything ever go wrong ever. Right? That’s never a guarantee though; so having something that you can repair if it does brake can be pretty clutch. Thusly, the main bodies of Surly's front and rear racks are made from tubular CroMoly steel with stainless hardware. This means you can probably find someone out there that can torch it back into one piece in the rare instance things go south.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eThe front Rack is height adjustable and provides either a low or high pannier mounting position, which can be handy depending on terrain. When the ground gets rough, keep your gear high and dry. When the path is smooth and easy, you can load things low and keep everything balanced and stable, with the platform above the whee
Looking to purchase with a cycle to work scheme?
Tanzania (TZSSh)
bolt where the plate attaches to the fork dropout, that’s not a big deal.\u003c\/p\u003e\n\u003ch4 data-mce-fragment=\"1\"\u003eFront Rack specifications:\u003c\/h4\u003e\n\u003cul data-mce-fragment=\"1\"\u003e\n\u003cli data-mce-fragment=\"1\"\u003eTubing diameter: 10mm\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003ePlatform dimensions: 230 x 170mm\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eWeight: 1382g\u003c\/li\u003e\n\u003c\/ul\u003e"};window._RestockRocketConfig.variantsInventoryPolicy = {44441826590946 : "deny",44441826623714 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {44441826590946 : parseInt("5"),44441826623714 : parseInt("5"),};
window._RestockRocketConfig.variantsPreorderCount = {44441826590946 : parseInt(""),44441826623714 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {44441826590946 : null,44441826623714 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {44441826590946 : parseInt(""),44France (EUR€)
Norway (GBP£)
sqPreCount);
} catch (e) { }
try {
var _sqc = window._RestockRocketConfig;
var _sqOn = !!(_sqc.cachedSettings && _sqc.cachedSettings.block_accelerated_checkout);
var _sqPre = (_sqc.cachedPreorderVariantIds &&
_sqc.cachedPreorderVariantIds.preorder_variant_ids) || [];
var _sqArm = false;
if (_sqOn && _sqc.preordersConfigured) {
if (_sqc.pageType === 'product' && _sqc.product && _sqc.product.variants) {
_sqArm = _sqc.product.variants.some(function (v) { return _sqPre.indexOf(Number(v.id)) !== -1; });
} else {
_sqArm = (_sqc.integrations || []).some(function (i) {
return i && i.type === 'featured_product' && i.enabled &&
Array.isArray(i.page_types) && i.page_types.indexOf(_sqc.pageType) !== -1;
});
}
}
if (_sqArm && document.documentElement) {
_sqc.acceleratedGateArmed = true;
document.documentElement.classList.add('stoq-buy-now-pending');
setTimeout(function () {
document.documentEleme
._RestockRocketConfig.cachedSettings && window._RestockRocketConfig.cachedSettings.api_host) || 'https://app.restockrocket.io'
try {
const _stoqVersionMatch = window._RestockRocketConfig.scriptHost.match(/(\d+)\/?(?:assets\/?)?$/);
window._RestockRocketConfig.appVersion = (_stoqVersionMatch && _stoqVersionMatch[1]) || '';
} catch (e) {
window._RestockRocketConfig.appVersion = '';
}
const SETTINGS_CACHE_DURATION = 15 * 60 * 1000;
const LIQUID_CACHE_MAX_AGE = 15 * 60;
const liquidRenderedAt = window._RestockRocketConfig.liquidRenderedAt;
if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) {
console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh');
window._RestockRocketConfig.isLiquidCacheFresh = true;
window._RestockRocketConfig.liquidCacheAge = null;
} else {
const now = Math.floor(Date.now() / 1000);
const liquidCacheAge = now - liquidRenderedAt;
window._RestockRocketConfig.liquidCacheAge = M
Click hereLiechtenstein (CHFCHF)
<
to get in touch and get the ball rolling!
Togo (XOFFr)
Poland (PLNzł)
&
!Object.prototype.hasOwnProperty.call(settings.translations, window._RestockRocketConfig.normalizedLocale)) {
console.debug('STOQ - locale not explicitly translated, will use default language from cache');
}
}
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 = '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')
try {
const _stoqInitConfig = window._RestockRocketConfig;
const _stoqDetectedVariantIds = (_stoqInitConfig.product && Array.isArray(_stoqI
Lithuania (EUR€)
liquid_cache_age: _stoqInitConfig.liquidCacheAge,
inventory_policy: (_stoqInitConfig.variantsInventoryPolicy || {})[_stoqSelectedVariantId] || '',
inventory_quantity: (_stoqInitConfig.variantsInventoryQuantity || {})[_stoqSelectedVariantId],
});
} catch (e) {
console.debug('STOQ - stoq_initialized publish failed:', e);
}
try {
var _sqTrack = window._RestockRocketConfig;
if (_sqTrack.preordersConfigured) {
document.addEventListener('click', function (e) {
try {
var t = e.target;
if (!t || !t.closest) return;
var host = t.closest('.shopify-payment-button, shopify-payment-terms');
if (!host) return;
var channel = host.matches && host.matches('shopify-payment-terms')
? 'shop_pay_installments' : 'buy_now';
var form = host.closest('form');
var vidEl = form && form.querySelector('[name="id"]');
var variantId = (vidEl && vidEl.value) || _sqTrack.selected_variant_id || '';
Tristan da Cunha (GBP£)
ck.product.id) || '',
channel: channel,
market_id: _sqTrack.marketId || '',
country_code: _sqTrack.countryIsoCode || '',
page_type: _sqTrack.pageType || '',
cart_token: _sqTrack.cartToken || '',
page_url: (window.location && window.location.href) || '',
properties: {
is_preorder_variant: (function () {
var vid = Number(variantId);
var has = function (a) { return Array.isArray(a) && a.indexOf(vid) !== -1; };
return has(_sqTrack.preorderVariantIds) ||
has(_sqTrack.cachedPreorderVariantIds &&
_sqTrack.cachedPreorderVariantIds.preorder_variant_ids);
})(),
in_enabled_plan: !!_sqPlan,
is_instock_variant: (function () {
var has = function (a) { return Array.isArray(a) && a.indexOf(_sqVidNum) !== -1; };
return has(_sqTrack.inStockVariantIds) ||
h
Portugal (EUR€)
} catch (err) { }
}, true);
}
} catch (e) { }
function applyTranslations(settings) {
try {
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) {
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(
no cart selling plan updates needed');
}
})
.catch(error => {
console.error('STOQ - error updating cart selling plans:', error);
});
}
});
}
(function loadStorefrontSettings() {
const cfg = window._RestockRocketConfig;
if (!cfg.storefrontAccessToken || cfg.disableStorefrontApi === true) return;
function run() {
const query = 'query StoqSettings($namespace: String!) { shop { metafield(namespace: $namespace, key: "settings") { value } } }';
fetch(
`https://${cfg.shop}/api/2026-07/graphql.json`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Shopify-Storefront-Access-Token': cfg.storefrontAccessToken,
},
body: JSON.stringify({ query: query, variables: { namespace: cfg.metafieldNamespace } }),
}
)
.then(function(response) {
if (!response.ok) { throw new Error('Storefront API HTTP ' + response.st
Luxembourg (EUR€)
ngs;
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_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 no
Tunisia (GBP£)
onsole.error('STOQ - apply failed for ' + endpoint + ':', applyError);
throw applyError;
}
})
.catch(function(error) {
console.debug(`STOQ - using cached ${endpoint}:`, error.message);
});
}
function initializeScripts(settings) {
settings = applyTranslations(settings);
window._RestockRocketConfig.settings = settings;
console.debug(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`);
if (!window._RestockRocketConfig.isLiquidCacheFresh && !settings.disable_refresh_on_stale_liquid) {
console.debug('STOQ - Liquid cache stale, refreshing selling_plans + integrations');
Promise.race([
Promise.all([
fetchEmbedConfig('selling_plans', function(data) {
if (data && Array.isArray(data.plans)) {
window._RestockRocketConfig.sellingPlans = data.plans;
window._RestockRocketConfig.disabledSellingPlanIds = data.disabled_plan_ids || [];
}
if (data && data.read_f
Réunion (EUR€)
._RestockRocketConfig.sellingPlans.some(function(plan) { return plan && plan.enabled; });
const hasDisabledPlanIds = Array.isArray(window._RestockRocketConfig.disabledSellingPlanIds)
&& window._RestockRocketConfig.disabledSellingPlanIds.length > 0;
const usePreorderBuild = settings.preorder_enabled || hasEnabledOffer || hasDisabledPlanIds;
const collectionScriptUrl = usePreorderBuild
? window._RestockRocketConfig.scriptUrlCollection
: window._RestockRocketConfig.scriptUrlCollectionBis;
const productScriptUrl = usePreorderBuild
? window._RestockRocketConfig.scriptUrlProduct
: window._RestockRocketConfig.scriptUrlProductBis;
const pageType = window._RestockRocketConfig.pageType;
const collectionPageTypes = ['collection', 'index', 'search', 'page'];
if(collectionPageTypes.indexOf(pageType) !== -1 && (settings[`show_button_on_${pageType}`] || settings[`preorder_${pageType}_enabled`])) {
createRestockRocketScript(collectio-
Malawi (MWKMK)
-
Uganda (UGXUSh)
Rwanda (RWFFRw)
-
Mali (XOFFr)
-
Ukraine (UAH₴)
San Marino (EUR€)
-
Malta (EUR€)
-
United Kingdom (GBP£)
São Tomé & Príncipe (STDDb)
Mauritania (GBP£)
United States (GBP£)
Senegal (XOFFr)
Mauritius (MUR₨)
Vatican City (EUR€)
Serbia (RSDРСД)
Mayotte (EUR€)
-
Western Sahara (MADد.م.)
Seychelles (GBP£)
-
Moldova (MDLL)
-
Zambia (GBP£)
Sierra Leone (SLLLe)
-
Monaco (EUR€)
-
Zimbabwe (USD$)
Slovakia (EUR€)
-
Montenegro (EUR€)
-
Slovenia (EUR€)
-
Morocco (MADد.م.)
-
Somalia (GBP£)
-
Mozambique (GBP£)
-
Shop All
South Africa (GBP£)
-
Namibia (GBP£)
-
South Sudan (GBP£)
-
Netherlands (EUR€)
-
Spain (EUR€)
-
Niger (XOFFr)
-
St. Helena (SHP£)
-
Nigeria (NGN₦)
Sudan (GBP£)
North Macedonia (MKDден)
Svalbard & Jan Mayen (GBP£)
Norway (GBP£)
Sweden (SEKkr)