"\/\/projektride.co.uk\/cdn\/shop\/files\/Marlin4-26-57361-B-Portrait_7e463973-64b2-4769-aaaa-b0176ff6e50c.png?v=1762953031","width":1920},{"alt":null,"id":68644131733887,"position":3,"preview_image":{"aspect_ratio":1.333,"height":1440,"width":1920,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/Marlin4-26-57361-C-Portrait_0d1a7fd9-d84a-4df6-bc7f-5522cafe728a.png?v=1762953030"},"aspect_ratio":1.333,"height":1440,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/Marlin4-26-57361-C-Portrait_0d1a7fd9-d84a-4df6-bc7f-5522cafe728a.png?v=1762953030","width":1920},{"alt":null,"id":68644131766655,"position":4,"preview_image":{"aspect_ratio":1.333,"height":1440,"width":1920,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/Marlin4-26-57361-A-Alt4_255cbe99-3e56-4bad-a7ba-6f9b8d4a6041.jpg?v=1762953030"},"aspect_ratio":1.333,"height":1440,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/Marlin4-26-57361-A-Alt4_255cbe99-3e56-4bad-a7ba-6f9b8d4a6041.jpg?v=1762953030","width":1920},{"alt":
null,"id":68644131799423,"position":5,"preview_image":{"aspect_ratio":1.333,"height":1440,"width":1920,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/Marlin4-26-57361-A-Alt2_b788321c-7249-424d-ae7f-81ef418388e3.jpg?v=1762953029"},"aspect_ratio":1.333,"height":1440,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/Marlin4-26-57361-A-Alt2_b788321c-7249-424d-ae7f-81ef418388e3.jpg?v=1762953029","width":1920},{"alt":null,"id":68644131832191,"position":6,"preview_image":{"aspect_ratio":1.333,"height":1440,"width":1920,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/Marlin4-26-57361-A-Alt3_dfd86b86-467b-495e-9133-1039affdaf73.jpg?v=1762953029"},"aspect_ratio":1.333,"height":1440,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/Marlin4-26-57361-A-Alt3_dfd86b86-467b-495e-9133-1039affdaf73.jpg?v=1762953029","width":1920}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cdiv data-v-fa0c522c=\"\" class=\"b2b-buying-zone__info cell medium-6 large-12\"\u003e\n\u003cdiv data-v-fa0c522c=\"\" class=\"buying-zone__positioning-statement mb-2 pt-2 border-t border-gray-10\"\u003e\n\u003cp data-v-fa0c522c=\"\"\u003eMarlin 4 is a trail-worthy daily rider that's perfectly suited for everyday adventures, on and off the trail. It features a trail-savvy frame with a suspension fork, 8-speed Shimano ESSA shifting and mounts for a rack and kickstand that make it an ideal choice for trail riders or anyone looking for a comfortable, stable commuter with the ruggedness of a real mountain bike.\u003c\/p\u003e\n\u003cp data-v-fa0c522c=\"\"\u003e \u003c\/p\u003e\n\u003cdiv data-v-631a2fc2=\"\" class=\"pdl-collapse\"\u003e\n\u003cp data-v-631a2fc2=\"\"\u003e*Please note – spec applies to all sizes unless listed separately\u003c\/p\u003e\n\u003cdiv data-v-631a2fc2=\"\" id=\"pdl-collapse-item-0xtga\" class=\"pdl-collapse-item is-active\" data-name=\"cdf78c8a-8a2e-4be9-a285-9a91ff20ba2d\"\u003e\n\u003ch2 class=\"\"\u003e\u003cbutton id=\"pdl-collapse-head-0xtga\" class=\"pdl-collapse-it
em__header font-medium is-active flex-row-reverse items-center font-heading font-bold text-lg border-b-2 focusing\" type=\"button\" aria-expanded=\"true\" aria-controls=\"pdl-collapse-content-0xtga\" tabindex=\"0\"\u003e\u003cspan class=\"flex items-center grow\"\u003eFrameset\u003c\/span\u003e\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentcolor\" aria-hidden=\"true\" role=\"presentation\" class=\"pdl-icon inline-block align-middle fill-current pdl-collapse-item__icon is-active\"\u003e\u003cpath d=\"M0 0h24v24H0z\" fill=\"none\"\u003e\u003c\/path\u003e\u003cpath d=\"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/button\u003e\u003c\/h2\u003e\n\u003cdiv data-v-0b4f5d85=\"\" id=\"pdl-collapse-content-0xtga\" class=\"pdl-collapse-item__wrap\" role=\"region\" aria-hidden=\"false\" aria-labelledby=\"pdl-collapse-head-0xtga\" data-old-padding-top=\"\" data-old-padding-bottom=\"\" data-old-overflow=\"\"\u003e\n\u003cdiv class=\"pdl-collapse-item__content is-active flex-row-reverse items-center font-heading font-bold text-lg border-b-2 focusing\"\u003e\n\u003cdl class=\"font-body flex flex-row flex-wrap text-gray-80 text-lg\" aria-label=\"Specifications\"\u003e\n\u003cdt class=\"flex-none w-full md:w-1\/5 mb-0 py-2 pr-1 font-medium border-b-2 md:border-r-2 border-gray-10\"\u003e*Frame\u003c\/dt\u003e\n\u003cdd class=\"flex-none w-full md:w-4\/5 font-normal\"\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eXS\u003cbr\u003e\u003c\/span\u003e\n\u003cdiv\u003eAlpha Silver Aluminium, curved top tube, internal derailleur and dropper post routing, rack and kickstand mount, 135x5 mm ThruSkew\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eS , M , ML , L , XL , XXL\u003cbr
\u003e\u003c\/span\u003e\n\u003cdiv\u003eAlpha Silver Aluminium, internal derailleur and dropper post routing, rack and kickstand mount, 135x5 mm ThruSkew\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/dd\u003e\n\u003cdt class=\"flex-none w-full md:w-1\/5 mb-0 py-2 pr-1 font-medium border-b-2 md:border-r-2 border-gray-10\"\u003e*Fork\u003c\/dt\u003e\n\u003cdd class=\"flex-none w-full md:w-4\/5 font-normal\"\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eXS\u003cbr\u003e\u003c\/span\u003e\n\u003cdiv\u003eSR Suntour XCE 28, coil spring, preload, 42 mm offset for 27.5\" wheel, 100 mm QR, 80 mm travel\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eS\u003cbr\u003e\u003c\/span\u003e\n\u003cdiv\u003eSR Suntour XCE 28, coil spring, preload, 42 mm offset for 27.5\" wheel, 100 mm00); })
]).then(function() { loadScripts(settings); });
return;
}
loadScripts(settings);
}
function loadScripts(settings) {
// Setup cart selling plan updater BEFORE loading any scripts to avoid race conditions
setupCartSellingPlanUpdater(settings);
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._RestockRocketConfig.pageType === 'search' && (settings.show_button_on_search || settings.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 if(settings.preorder_enabled) {
// Load the bundle so updateCartSellingPlans runs even when hijack is not enabled
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else {
console.debug(`STOQ - no scripts enabled for ${window._RestockRocketC
QR, 100 mm travel\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eM , ML , L , XL , XXL\u003cbr\u003e\u003c\/span\u003e\n\u003cdiv\u003eSR Suntour XCE 28, coil spring, preload, 46 mm offset for 29\" wheel, 100 mm QR, 100 mm travel\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/dd\u003e\n\u003c\/dl\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv data-v-631a2fc2=\"\" id=\"pdl-collapse-item-ez9s1e\" class=\"pdl-collapse-item is-active\" data-name=\"97afe046-e24a-4f65-a204-6820e8fc09c1\"\u003e\n\u003ch2 class=\"\"\u003e\u003cbutton id=\"pdl-collapse-head-ez9s1e\" class=\"pdl-collapse-item__header font-medium is-active flex-row-reverse items-center font-heading font-bold text-lg border-b-2 focusing\" type=\"button\" aria-expanded=\"true\" aria-controls=\"pdl-collapse-content-ez9s1e\" tabindex=\"0\"\u003e\u003cspan class=\"flex items-center grow\"\u003eWhe
els\u003c\/span\u003e\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentcolor\" aria-hidden=\"true\" role=\"presentation\" class=\"pdl-icon inline-block align-middle fill-current pdl-collapse-item__icon is-active\"\u003e\u003cpath d=\"M0 0h24v24H0z\" fill=\"none\"\u003e\u003c\/path\u003e\u003cpath d=\"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/button\u003e\u003c\/h2\u003e\n\u003cdiv data-v-0b4f5d85=\"\" id=\"pdl-collapse-content-ez9s1e\" class=\"pdl-collapse-item__wrap\" role=\"region\" aria-hidden=\"false\" aria-labelledby=\"pdl-collapse-head-ez9s1e\" data-old-padding-top=\"\" data-old-padding-bottom=\"\" data-old-overflow=\"\"\u003e\n\u003cdiv class=\"pdl-collapse-item__content is-active flex-row-reverse items-center font-heading font-bold text-lg border-b-2 focusing\"\u003e\n\u003cdl class=\"font-body flex flex-row flex-wrap text-gray-80 text-lg\" aria-label=\"Specifications\"\u003e\n\u0 .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 fetchEmbedConfig(endpoint, apply) {
return fetch(
`${window._RestockRocketConfig.host}/api/v1/embed/${endpoint}.json`,
{
headers: {
'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.Shopify.shop,
'ngrok-skip-browser-warning': 'skip'
}
}
)
.then(function(response) {
if (!response.ok) throw new Error(`Failed to fetch ${endpoint}`);
return response.json();
})
.then(function(data) {
try {
apply(data);
} catch (applyError) {
// Apply failures are programming bugs (e.g. response shape changed
// server-side and the assignment threw). Surface them as console.error
// so they're visible in browser logs, then re-throw to fall through
// to the same Liquid-cached fallback as a fetch failure.
console.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._Resto
ckRocketConfig.settings = settings;
console.debug(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`);
// Stale-Liquid resilience (default-on, per-shop opt-out via the
// `disable_refresh_on_stale_liquid` Toggle, surfaced as the negative
// `disable_refresh_on_stale_liquid` flag in settings.json so that
// `undefined` -- in CDN-cached metafield payloads that predate this
// key -- reads as `!undefined === true` and gets default-on behavior
// immediately, no metafield rewrite required).
// When the Liquid CDN cache is older than LIQUID_CACHE_MAX_AGE the in-page
// selling_plans / integrations metafields can be wrong; refresh both from
// the API before launching scripts. Race against a 1000ms timeout so a slow
// API can't block init indefinitely. If the timeout wins, the in-flight
// fetches still complete and update window._RestockRocketConfig — the
// bundle re-reads sellingPlans/integrations on every interaction, so the
// la
te-arriving values benefit subsequent renders even though the first
// paint may use the Liquid-cached values. On any failure the existing
// Liquid-loaded values stay in place via fetchEmbedConfig's catch.
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 || [];
}
}),
fetchEmbedConfig('integrations', function(data) {
if (Array.isArray(data)) {
window._RestockRocketConfig.integrations = data;
}
})
]),
new Promise(function(resolve) { setTimeout(resolve, 10
');
}
})
.catch(error => {
console.error('STOQ - error updating cart selling plans:', error);
});
}
});
}
// 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_version;
headers['X-Shopify-Theme-Store-Id'] = window.Shopify
Trek Speed Concept Rim Frame Set
Looking to purchase with a cycle to work scheme?
Click here to get in touch and get the ball rolling!
Frequently Asked Questions
-
Please get in touch with a member of the team either by phone (01313745324) or email ([email protected]) where on of the team will be more than happy to help.
ProjektRide Bike Shop Edinburgh
-
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.
Postage is free on orders over £50. Orders under £50, our postage charge is £3.99.
We also have a physical store, if you are local please pop in -
ProjektRide Bike Shop Edinburgh
Please get in touch with a member of the team either by phone (


British Indian Ocean Territory (USD$)
y-2 pr-1 font-medium border-b-2 md:border-r-2 border-gray-10\"\u003e*Frame\u003c\/dt\u003e\n\u003cdd class=\"flex-none w-full md:w-4\/5 font-normal\"\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eXS\u003cbr\u003e\u003c\/span\u003e\n\u003cdiv\u003eAlpha Silver Aluminium, curved top tube, internal derailleur and dropper post routing, rack and kickstand mount, 135x5 mm ThruSkew\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eS , M , ML , L , XL , XXL\u003cbr\u003e\u003c\/span\u003e\n\u003cdiv\u003eAlpha Silver Aluminium, internal derailleur and dropper post routing, rack and kickstand mount, 135x5 mm ThruSkew\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/dd\u003e\n\u003cdt class=\"flex-none w-full md:w-1\/5 mb-0 py-2 pr-1 font-medium border-b-2 md:border-r-2 border-gray-1
0\"\u003e*Fork\u003c\/dt\u003e\n\u003cdd class=\"flex-none w-full md:w-4\/5 font-normal\"\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eXS\u003cbr\u003e\u003c\/span\u003e\n\u003cdiv\u003eSR Suntour XCE 28, coil spring, preload, 42 mm offset for 27.5\" wheel, 100 mm QR, 80 mm travel\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eS\u003cbr\u003e\u003c\/span\u003e\n\u003cdiv\u003eSR Suntour XCE 28, coil spring, preload, 42 mm offset for 27.5\" wheel, 100 mm QR, 100 mm travel\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eM , ML , L , XL , XXL\u003cbr\u003e\u003c\/span\u003e\n\u003cdiv\u003eSR Suntour XCE 28, coil spring, preload, 46 m
\/5 mb-0 py-2 pr-1 font-medium border-b-2 md:border-r-2 border-gray-10\"\u003eShifter\u003c\/dt\u003e\n\u003cdd class=\"flex-none w-full md:w-4\/5 font-normal\"\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cdiv\u003eShimano M315, 8-speed\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/dd\u003e\n\u003cdt class=\"flex-none w-full md:w-1\/5 mb-0 py-2 pr-1 font-medium border-b-2 md:border-r-2 border-gray-10\"\u003eRear derailleur\u003c\/dt\u003e\n\u003cdd class=\"flex-none w-full md:w-4\/5 font-normal\"\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cdiv\u003eShimano ESSA U2000\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/dd\u003e\n\u003cdt class=\"flex-none w-full md:w-1\/5 mb-0 py-2 pr-1 font-medium border-b-2 md:border-r-2 border-gray-10\"\u003e*Crank\u003c\/dt\u003e\n\u003cdd class=\"flex-none w-full md:w-4\/5 font-normal\"\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003c
span\u003eXS\u003cbr\u003e\u003c\/span\u003e\n\u003cdiv\u003eProWheel alloy, 30T narrow-wide steel ring, 160 mm length\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eS , M , ML\u003cbr\u003e\u003c\/span\u003e\n\u003cdiv\u003eProWheel alloy, 30T narrow-wide steel ring, 170 mm length\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"p-2 border-b-2 border-gray-10\"\u003e\n\u003cspan\u003eSize:\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eL , XL , XXL\u003cbr\u003e\u003c\/span\u003e\n\u003cdiv\u003eProWheel alloy, 30T narrow-wide steel ring, 175 mm length\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/dd\u003e\n\u003cdt class=\"flex-none w-full md:w-1\/5 mb-0 py-2 pr-1 font-medium border-b-2 md:border-r-2 border-gray-10\"\u003eCassette\u003c\/dt\u003e\n\u003cdd class=\"flex-none w-full md:w-4\/5 font-normal\"\u003e\n\u003cdiv class=\"p-2 border-b-2
arseInt(""),56385024491903 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {56385023836543 : null,56385023869311 : null,56385023902079 : null,56385023934847 : null,56385023967615 : null,56385024000383 : null,56385024033151 : null,56385024065919 : null,56385024098687 : null,56385024131455 : null,56385024164223 : null,56385024196991 : null,56385024229759 : null,56385024262527 : null,56385024295295 : null,56385024328063 : null,56385024360831 : null,56385024393599 : null,56385024426367 : null,56385024459135 : null,56385024491903 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {56385023836543 : parseInt(""),56385023869311 : parseInt(""),56385023902079 : parseInt(""),56385023934847 : parseInt(""),56385023967615 : parseInt(""),56385024000383 : parseInt(""),56385024033151 : parseInt(""),56385024065919 : parseInt(""),56385024098687 : parseInt(""),56385024131455 : parseInt(""),56385024164223 : parseInt(""),56385024196991 : parseInt(""),56385024229759 : parseInt(""
),56385024262527 : parseInt(""),56385024295295 : parseInt(""),56385024328063 : parseInt(""),56385024360831 : parseInt(""),56385024393599 : parseInt(""),56385024426367 : parseInt(""),56385024459135 : parseInt(""),56385024491903 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {56385023836543 : null,56385023869311 : null,56385023902079 : null,56385023934847 : null,56385023967615 : null,56385024000383 : null,56385024033151 : null,56385024065919 : null,56385024098687 : null,56385024131455 : null,56385024164223 : null,56385024196991 : null,56385024229759 : null,56385024262527 : null,56385024295295 : null,56385024328063 : null,56385024360831 : null,56385024393599 : null,56385024426367 : null,56385024459135 : null,56385024491903 : null,};
window._RestockRocketConfig.variantsShippingText = {56385023836543 : "",56385023869311 : "",56385023902079 : "",56385023934847 : "",56385023967615 : "",56385024000383 : "",56385024033151 : "",56385024065919 : "",56385024098687 : "",563850241
];
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;
}
}
// Setup event listener for cart selling plan updates
// This must be called before any scripts are loaded to avoid race conditions
function setupCartSellingPlanUpdater(settings) {
// Setup listener regardless - updateCartSellingPlans has its own guards
// This ensures cleanup happens even when preorders are disabled globally
// Listen for stoq:inventory-data-loaded event dispatched by api.js
window.addEventListener('stoq:inventory-data-loaded', function(event) {
console.debug('STOQ - Inventory data loaded, updating cart selling plans');
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