rget=\"GeometryComponent\" class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\"\u003e\u003c\/section\u003e\n\u003csection class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\" data-magellan-target=\"GeometryComponent\" id=\"GeometryComponent\" data-v-05762449=\"\"\u003e\u003c\/section\u003e\n\u003csection class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\" data-magellan-target=\"GeometryComponent\" id=\"GeometryComponent\" data-v-05762449=\"\"\u003e\u003c\/section\u003e\n\u003csection class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\" data-magellan-target=\"GeometryComponent\" id=\"GeometryComponent\" data-v-05762449=\"\"\u003e\u003c\/section\u003e\n\u003csection data-v-05762449=\"\" id=\"GeometryComponent\" data-magellan-target=\"GeometryComponent\" class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\"\u003e\u003c\/section\u003e\n\u003csection data-v-05762449=\"\" id=\"Geome
50,"weight":0,"compare_at_price":351000,"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\/EmondaSL6Disc_21_32561_B_Primary.webp?v=1728738969","\/\/projektride.co.uk\/cdn\/shop\/files\/EmondaSL6Disc_21_32561_B_Alt2.webp?v=1728738977","\/\/projektride.co.uk\/cdn\/shop\/files\/EmondaSL6Disc_21_32561_B_Alt8.webp?v=1728738988","\/\/projektride.co.uk\/cdn\/shop\/files\/EmondaSL6Disc_21_32561_B_Alt9.webp?v=1728739004"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/EmondaSL6Disc_21_32561_B_Primary.webp?v=1728738969","options":["Size","Colour"],"media":[{"alt":null,"id":34802898993378,"position":1,"preview_image":{"aspect_ratio":1.333,"height":1080,"width":1440,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/EmondaSL6Disc_21_32561_B_Primary.webp?v=1728738969"},"aspect_ratio":1.333,"height":1080,"media_type":"image","src":"\/\/projektride.co.uk\/Chad (XAFCFA)
bp?v=1728739004"},"aspect_ratio":1.333,"height":1080,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/EmondaSL6Disc_21_32561_B_Alt9.webp?v=1728739004","width":1440}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cp\u003eThe Émonda SL 6 Disc has all the advantages of an ultra-light carbon road bike, with the added benefit of aero tube shaping that will make you faster on flats and up climbs, too. A performance drive train and front and rear thru axles make it a great choice for fast roadies who want the extra confidence of disc brakes that perform in any conditions.\u003c\/p\u003e\n\u003carticle id=\"overview\" data-magellan-target=\"overview\" class=\"pdp-overview--upper kf-block grid-x grid-margin-x\"\u003e\n\u003cdiv class=\"kf-block--intro cell small-12 large-4 mb-4\" qaid=\"product-overview-1\"\u003e\n\u003ch3 class=\"header--md mb-1\"\u003eIt's right for you if...\u003c\/h3\u003e\n\u003cp\u003eYou're no stranger to long, fast rides. You want an ultra-light, a erodynamic bike with race-ready parts, and you favour the better modulation and extra power of disc brakes.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"kf-block--intro cell small-12 large-4 mb-4\" qaid=\"product-overview-2\"\u003e\n\u003ch3 class=\"header--md mb-1\"\u003eThe tech you get\u003c\/h3\u003e\n\u003cp\u003eA lightweight and aerodynamic 500 Series OCLV Carbon frame and fork, a full Shimano Ultegra 2x11 group set and quality Bontrager Paradigm Tubeless Ready wheels. Disc brakes give you better stopping power and more precise modulation.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"kf-block--intro cell small-12 large-4 mb-4\" qaid=\"product-overview-3\"\u003e\n\u003ch3 class=\"header--md mb-1\"\u003eThe final word\u003c\/h3\u003e\n\u003cp\u003eYes, you can have it all: The Émonda SL 6 features a super lightweight, aero frame for more speed on any terrain, exceptional handling characteristics, a race-level drivetrain and all-weather stopping power – all without the sticker shock.\u0
03c\/p\u003e\n\u003ch2\u003eHow tall are you?\u003c\/h2\u003e\n\u003cp\u003e\u003cbr\u003eTo measure your height, stand up straight, barefoot, with your back, heels, shoulders and head all touching a wall. While looking straight ahead, place a book or straight edge on your head and slowly push it against the wall. Your straight edge should be parallel with the floor. Mark the spot where the bottom of the book is touching the wall. The distance from the marked spot to the floor is your height.\u003c\/p\u003e\n\u003ch2\u003eWhat is your inside leg?\u003c\/h2\u003e\n\u003cp\u003e\u003cbr\u003eHow to measure: Stand barefoot with your back straight and against a wall. Tuck a ruler or something that extends to the floor between your legs. Using both hands, and keeping it level, pull the ruler up into your crotch as if you were sitting on the saddle. Measure the distance from the top edge of the ruler to the ground to find your inside leg measurement. Your inside leg is very important to your final bike size so plea se measure carefully.\u003c\/p\u003e\n\u003csection data-v-05762449=\"\" id=\"SizingComponent\" data-magellan-target=\"SizingComponent\" class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\"\u003e\n\u003cdiv data-v-05762449=\"\" class=\"rider-sizing mb-2\"\u003e\n\u003cdiv data-v-4052fbf6=\"\" data-v-05762449=\"\"\u003e\n\u003cdiv data-v-4052fbf6=\"\" class=\"size-table\"\u003e\n\u003ctable data-v-3ac87600=\"\" data-v-4052fbf6=\"\" class=\"trek-table trek-table--hstripe trek-table--borderless trek-table--centered trek-table--small trek-table--sticky-headers trek-table--row-headers\" qaid=\"size-table\"\u003e\n\u003cthead data-v-3ac87600=\"\"\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"col\" class=\"font-bold\" qaid=\"size-table-column-header-Size\"\u003eSize\u003c\/th\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"col\" class=\"font-bold\" qaid=\"size-table-column-header-Rider Height\"\u003eRider Height\u003c\/th\u003e\n\u003cth data-v-3ac87600=\"\Header Image" scope=\"col\" class=\"font-bold\" qaid=\"size-table-column-header-Inseam\"\u003eInseam\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody data-v-3ac87600=\"\"\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-47\"\u003e47\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e152 - 158 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e5'0\" - 5'2\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e71 - 75 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e28\" - 30\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-50\"\u003e50\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e158 - 163 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e5'2\" - 5'4\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u00 Comoros (KMFFr) 3cp class=\"m-0\"\u003e74 - 77 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e29\" - 30\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-52\"\u003e52\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e163 - 168 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e5'4\" - 5'6\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e76 - 79 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e30\" - 31\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-54\"\u003e54\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e168 - 174 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e5'6\" - 5'9\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e78 - 82 cm\u003c\/p\u
003e\n\u003cp class=\"m-0\"\u003e31\" - 32\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-56\"\u003e56\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e174 - 180 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e5'9\" - 5'11\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e81 - 85 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e32\" - 33\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-58\"\u003e58\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e180 - 185 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e5'11\" - 6'1\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e84 - 87 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e33\" - 34 \"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-60\"\u003e60\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e185 - 190 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e6'1\" - 6'3\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e86 - 90 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e34\" - 35\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-62\"\u003e62\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e190 - 195 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e6'3\" - 6'5\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e89 - 92 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e35\" - 36\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv data-v-05762449=\"\" class=\"rider-sizing__dots\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003csection data-v-05762449=\"\" id=\"GeometryComponent\" data-magellan-target=\"GeometryComponent\" class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\"\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\u003c\/article\u003e\n\u003csection data-v-05762449=\"\" id=\"GeometryComponent\" data-magellan-target=\"GeometryComponent\" class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\"\u003e\u003c\/section\u003e\n\u003csection data-v-05762449=\"\" id=\"GeometryComponent\" data-magellan-target=\"GeometryComponent\" class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\"\u003e\u003c\/section\u003e\n\u003csection class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\" data-magellan-target=\"G eometryComponent\" id=\"GeometryComponent\" data-v-05762449=\"\"\u003e\u003c\/section\u003e\n\u003csection class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\" data-magellan-target=\"GeometryComponent\" id=\"GeometryComponent\" data-v-05762449=\"\"\u003e\u003c\/section\u003e\n\u003csection class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\" data-magellan-target=\"GeometryComponent\" id=\"GeometryComponent\" data-v-05762449=\"\"\u003e\u003c\/section\u003e\n\u003csection data-v-05762449=\"\" id=\"GeometryComponent\" data-magellan-target=\"GeometryComponent\" class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\"\u003e\u003c\/section\u003e\n\u003csection data-v-05762449=\"\" id=\"GeometryComponent\" data-magellan-target=\"GeometryComponent\" class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\"\u003e\u003c\/section\u003e\n\u003csection class=\"sizing-and-fit-aftermarket-component sizing-table grid-container
mb-6\" data-magellan-target=\"GeometryComponent\" id=\"GeometryComponent\" data-v-05762449=\"\"\u003e\u003c\/section\u003e"}; window._RestockRocketConfig.variantsInventoryPolicy = {46046855332066 : "deny",}; window._RestockRocketConfig.variantsInventoryQuantity = {46046855332066 : parseInt("0"),}; window._RestockRocketConfig.variantsPreorderCount = {46046855332066 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderCountForMarket = {46046855332066 : null,}; window._RestockRocketConfig.variantsPreorderMaxCount = {46046855332066 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {46046855332066 : null,}; window._RestockRocketConfig.variantsShippingText = {46046855332066 : "",}; window._RestockRocketConfig.variantsShippingTextForMarket = {46046855332066 : null,}; window._RestockRocketConfig.selected_variant_id = 46046855332066; window._RestockRocketConfig.selected_variant_available = window._RestockRocketConfig.product.variants.find (function(variant) { return variant.id == window._RestockRocketConfig.selected_variant_id }).available;// STOQ-1595/1612 shared signal, derived once here so both the accelerated-checkout block // gate (STOQ-1612) and the click tracker (STOQ-1595) read one clearly-owned flag rather // than a side effect buried in either consumer's try/catch: whether this shop has preorders // configured at all — an enabled selling plan plus at least one preorder variant id, // independent of the block toggle. Fail-open: on error the flag stays unset and both // consumers no-op. try { var _sqCfg = window._RestockRocketConfig; var _sqPlanEnabled = Array.isArray(_sqCfg.sellingPlans) && _sqCfg.sellingPlans.some(function (p) { return p && p.enabled; }); var _sqPreCount = ((_sqCfg.cachedPreorderVariantIds && _sqCfg.cachedPreorderVariantIds.preorder_variant_ids) || []).length; _sqCfg.preordersConfigured = !!(_sqPlanEnabled && _sqPreCount); } catch (e) { /* fail open */ } // STOQ-1612: bl
ock (not hide) Buy Now / Shop Pay until our JS runs, so a tap in the // load window can't bypass preorder. pointer-events via .stoq-buy-now-pending (no // reflow); timeout releases; renderPreorderButton / featured_product.js lift it. // Gated by the `block_accelerated_checkout` toggle (default OFF) for gradual rollout. // Armed ONLY when we're sure preorder is in play — product page: THIS product has a // preorder variant (never block a plain product's Shop Pay); featured: integration // enabled for this page type. Rationale: PR #2784. 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) { Congo - Brazzaville (XAFCFA) 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.documentElement.classList.remove('stoq-buy-now-pending'); }, 6000); } } catch (e) { /* fail open */ } window._RestockRocketConfig.scriptUrlProduct = 'https://cdn.shopify.com/extensions/019f37a7-f058-7bcb-a02d-3fb0b8a7522a/restockrocket-1-539/assets/restockrocket-product.js' window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019f37a7-f058-7bcb-a02d-3fb0b8a7522a/restockrocket-1-539/assets/restockrocket-collection.js' window._RestockRocketConfig.scriptUrlPr< Congo - Kinshasa (CDFFr) version>/assets/... // Trailing digits (e.g. ".../restockrocket-1-521/assets/" -> "521"). Kept numeric to // match ParseStoqData, so funnel app_version lines up with the order-attribution // app_version. Reflects the ACTUAL deployed build. This is the SINGLE source of the // parsed version — preorder.js getAppVersion() reads it back off config rather than // re-parsing, so the regex lives in exactly one place. 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; // 15 minutes in milliseconds const LIQUID_CACHE_MAX_AGE = 15 * 60; // 15 minutes in seconds // Calculate Liquid cache freshness once at initialization const liquidRenderedAt = window._RestockRocketConfig.liquidRenderedAt; // Validate timestamp and calculate ca
che age 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); // Current time in seconds const liquidCacheAge = now - liquidRenderedAt; // Age in seconds // Surfaced into funnel events: a stale cache means the app rendered with // outdated inventory/selling-plan data — a real "had the opportunity but // failed" cause. Negative (client clock ahead) clamps to 0. window._RestockRocketConfig.liquidCacheAge = Math.max(0, liquidCacheAge); // Handle client clock ahead of server if (liquidCacheAge < 0) { console.debug(`STOQ - Client clock appears ahead of server by ${Math.abs(Math.round(liquidCacheAge / 60))} minutes, assuming cache fresh`); window._RestockRocketConfig.isLiquidCacheFresh = true; } else if (liquidCacheAge <
= LIQUID_CACHE_MAX_AGE) { console.debug(`STOQ - Liquid cache is fresh (${Math.round(liquidCacheAge / 60)} minutes old)`); window._RestockRocketConfig.isLiquidCacheFresh = true; } else { console.debug(`STOQ - Liquid cache is stale (${Math.round(liquidCacheAge / 60)} minutes old, max ${Math.round(LIQUID_CACHE_MAX_AGE / 60)} minutes)`); window._RestockRocketConfig.isLiquidCacheFresh = false; } } function checkSettingsExpiry(settings) { try { if (!settings || !settings.updated_at) { console.debug('STOQ - Invalid settings data structure'); return null; } if (!settings.cache) { console.debug('STOQ - settings caching disabled'); return null; } // Check if translations are enabled but missing from cache // This handles the backfill period where DB has translations but metafield doesn't if (settings.multi_language_enabled) { if (!settings.translations) { // Translations enabled but no translation data in metafield // Metafield hasn't been backfilled yet - force refresh console.debug('STOQ - multi-language enabled but no translation data in cache, fetching fresh'); return null; } // Translations object exists in metafield - cache is valid // If 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 < version>/graphql.json — never // CDN-cached — so it returns the live value on every page load. We fetch it // best-effort and stash it on `window._RestockRocketConfig.storefrontSettings` // so individual behaviours can migrate onto the fresh value over time. This is // PURELY ADDITIVE: it does NOT change the resolution flow below, never blocks // init, and silently no-ops on any failure / missing token. (function loadStorefrontSettings() { const cfg = window._RestockRocketConfig; if (!cfg.storefrontAccessToken || cfg.disableStorefrontApi === true) return; // Deferred to browser idle so this best-effort read runs strictly AFTER the // critical init flow and never competes with it for a connection — the call // is a live, uncached Storefront round-trip and can be slow (multi-second // TTFB observed). Nothing on the critical path waits for it. function run() { const query = 'query StoqSettings($namespace: String!) { shop { metafield(namespace: $namespace, key:
"settings") { value } } }'; fetch( `https://${cfg.shop}/api/2025-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.status); } return response.json(); }) .then(function(body) { if (body && body.errors && body.errors.length) { throw new Error('Storefront API errors: ' + body.errors.map(function(e) { return e && e.message; }).join(', ')); } const value = body && body.data && body.data.shop && body.data.shop.metafield && body.data.shop.metafield.value; if (!value) { throw new Error('Storefront API returned no settings metafield value'); } cfg.sto Cyprus (EUR€) refrontSettings = JSON.parse(value); console.debug('STOQ - stored live settings from Storefront API on config.storefrontSettings'); }) .catch(function(e) { console.debug('STOQ - Storefront settings fetch failed (non-fatal):', e && e.message); }); } if (typeof window.requestIdleCallback === 'function') { window.requestIdleCallback(run, { timeout: 5000 }); } else { setTimeout(run, 0); } })(); // 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': 'ski
p' }; 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 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('S TOQ - 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._RestockRocketConfig.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 scr ipts. 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 // late-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, 1000); }) ]).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); }) // STOQ-1520: serve the lean back-in-stock-only build (no preorder/hijack code) // only to shops with NO preorder plans. Use the full build if preorder is o n, // an enabled offer exists, or a disabled-but-kept plan id remains (cart sweep // must still strip those). Rationale in the PR. const hasEnabledOffer = Array.isArray(window._RestockRocketConfig.sellingPlans) && window._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 collecti
html.stoq-buy-now-pending .shopify-payment-button{pointer-events:none!important}.stoq-hide-buy-now .shopify-payment-button{display:none!important}.restock-rocket-button,.restock-rocket-button-float{opacity:1!important;border:none!important;cursor:pointer!important;background-image:none!important;box-shadow:none!important;padding:15px 20px;font-size:16px;width:100%;font-family:inherit}@font-face{font-family:OpenSans;font-weight:200;src:url(https://d382hokyqag45a.cloudfront.net/assets/OpenSans-Light.woff)}@font-face{font-family:OpenSans;font-weight:300;src:url(https://d382hokyqag45a.cloudfront.net/assets/OpenSans-Regular.woff)}@font-face{font-family:OpenSans;font-weight:600;src:url(https://d382hokyqag45a.cloudfront.net/assets/OpenSans-SemiBold.woff)}.restock-rocket-button-container{position:relative;z-index:1;width:100%}.restock-rocket-button-container-float-right{position:fixed;z-index:123123;top:calc(50% - 200px);right:0;transform:rotate(270deg);transform-origin:bottom right}.restock-rocket-button-container-float-left{position:fixed;z-index:123123;top:calc(50% - 200px);left:40px;transform:rotate(90deg);transform-origin:top left}.restock-rocket-button-container-float-left:hover,.restock-rocket-button-container-float-right:hover,.restock-rocket-button-container:hover,.restock-rocket-button-float:hover,.restock-rocket-button:hover{opacity:.8}.restock-rocket-button{min-height:50px;margin-top:10px;margin-bottom:10px}.restock-rocket-button-collection{position:relative;font-size:13px;line-height:1;padding:7px;height:auto;z-index:3}.restock-rocket-wrapper{background-color:rgba(0,0,0,.5);z-index:123123123;width:100%;height:100%;overflow:auto;position:fixed;right:0;top:0;transition-property:all;transition-duration:.3s;display:flex;flex-direction:column;justify-content:center;}.restock-rocket-wrapper-inline{width:100%;height:100%;margin-top:20px}.restock-rocket-preorder-description{padding:10px 15px;margin-top:20px;display:flex;flex-direction:column;gap:10px;}.preorder-description-details{margin-bottom:0;display:flex;flex-direction:column;gap:10px;}.preorder-detail-item{display:flex;flex-direction:row;justify-content:start;gap:8px;align-items:center;}.restock-rocket-payment-widget{border:1px solid #ebebeb;margin-bottom:20px;}.restock-rocket-payment-option{display:flex;flex-wrap:wrap;align-items:center;gap:5px;padding:15px 20px;}.restock-rocket-payment-option:not(:last-child){border-bottom:1px solid #ebebeb;}.restock-rocket-payment-input-container{flex:1 1 auto;min-width:0}.restock-rocket-preorder-discount-badge{background:#ebebeb;height:25px;line-height:25px;padding:0 15px;border-radius:25px;font-size:0.8rem;flex:0 0 auto}.restock-rocket-payment-input{margin-right:10px;margin-top:-3px;vertical-align:middle;margin-left:0;accent-color:#202223}.restock-rocket-payment-description{margin-top:4px;flex:1 1 100%}.restock-rocket-preorder-badge{font-size:13px;line-height:1;padding:5px 13px 6px;border-radius:40px;height:auto;border:none;width:auto;z-index:2;margin:0;background:0 0}.preorder-badge-collection{position:absolute;top:10px;right:10px}.preorder-badge-product{margin-left:10px}.restock-rocket-price-strike{text-decoration:line-through;color: #666666;}.restock-rocket-discounted-price{margin-left:10px;}.restock-rocket-acknowledgement-checkbox{margin-bottom:12px;display:flex;align-items:flex-start;gap:8px;font-size:14px;line-height: 1.5;}.restock-rocket-acknowledge-checkbox-input{width:18px;height:18px;margin-top:2px;cursor:pointer;flex-shrink:0;accent-color: #0d0d0d;}.restock-rocket-acknowledge-checkbox-label{flex:1;cursor:pointer;}.restock-rocket-preorder-countdown-timer{display:flex;flex-direction:column;align-items:center;padding:16px;margin:8px 0;font-family:inherit;}.restock-rocket-preorder-countdown-timer .countdown-header{font-size:16px;margin-bottom:6px;text-align:center}.restock-rocket-preorder-countdown-timer .countdown-units{display:flex;flex-wrap:wrap;gap:12px;justify-content:center}.restock-rocket-preorder-countdown-timer .countdown-unit{display:flex;flex-direction:column;align-items:center;gap:6px}.restock-rocket-preorder-countdown-timer .countdown-box{min-width:40px;padding:10px 6px;text-align:center;font-size:20px;line-height:1}.restock-rocket-preorder-countdown-timer .countdown-label{font-size:14px;font-weight:500;text-align:center;text-transform:capitalize;opacity:.7}@media (max-width:768px){.restock-rocket-preorder-countdown-timer{padding:14px}.restock-rocket-preorder-countdown-timer .countdown-box{min-width:55px;padding:14px 10px;font-size:26px}.restock-rocket-preorder-countdown-timer .countdown-label{font-size:11px}}@media (max-width:480px){.restock-rocket-preorder-countdown-timer{padding:12px}.restock-rocket-preorder-countdown-timer .countdown-units{width:100%;gap:10px}.restock-rocket-preorder-countdown-timer .countdown-box{width:100%;min-width:50px;padding:12px 8px;font-size:24px}.restock-rocket-preorder-countdown-timer .countdown-label{font-size:10px}}.restock-rocket-toast{position:fixed;cursor:pointer;background:#fff;border:0;min-width:40px;min-height:40px;box-shadow:0 0 15px rgba(0,0,0,.1)!important;z-index:622004;padding:20px 30px;font-family:inherit;font-size:inherit;color:#000;display:flex;justify-content:center;align-items:center}.restock-rocket-toast a{text-decoration:none;font-weight:700;color:#000}.restock-rocket-toast .dismiss{margin-left:15px;z-index:1;font-size:20px;}.restock-rocket-toast-top{top:60px}.restock-rocket-toast-bottom{bottom:75px}.restock-rocket-toast-left,.restock-rocket-toast-right{-webkit-animation:.5s forwards slide;animation:.5s forwards slide}.restock-rocket-toast-left{left:0;transform:translateX(-100%);-webkit-transform:translateX(-100%);border-radius:0 10px 10px 0}.restock-rocket-toast-left.slide-out{-webkit-animation:.5s forwards slide-out-left;animation:.5s forwards slide-out-left}.restock-rocket-toast-right{right:0;transform:translateX(100%);-webkit-transform:translateX(100%);border-radius:10px 0 0 10px}.restock-rocket-toast-right.slide-out{-webkit-animation:.5s forwards slide-out-right;animation:.5s forwards slide-out-right}@keyframes slide{100%{transform:translateX(0)}}@-webkit-keyframes slide{100%{-webkit-transform:translateX(0)}}@keyframes slide-out-left{0%{transform:translateX(0)}100%{transform:translateX(-100%)}}@-webkit-keyframes slide-out-left{0%{-webkit-transform:translateX(0)}100%{-webkit-transform:translateX(-100%)}}@keyframes slide-out-right{0%{transform:translateX(0)}100%{transform:translateX(100%)}}@-webkit-keyframes slide-out-right{0%{-webkit-transform:translateX(0)}100%{-webkit-transform:translateX(100%)}}.restock-rocket-preorder-progress-bar{padding:12px 15px;margin-bottom:20px;font-family:inherit;}.restock-rocket-preorder-progress-bar .preorder-progress-text{margin-bottom:8px;}.restock-rocket-preorder-progress-bar .preorder-progress-bar-row{display:flex;align-items:center;gap:10px;}.restock-rocket-preorder-progress-bar .preorder-progress-track{flex:1;height:12px;overflow:hidden;}.restock-rocket-preorder-progress-bar .preorder-progress-fill{display:block;height:100%;min-width:2px;transition:width 0.3s ease;}.restock-rocket-preorder-progress-bar .preorder-progress-percentage{font-weight:500;min-width:35px;text-align:right;} Denmark (DKKkr.)

Fork
Seychelles (GBP£)
SR Suntour Mobie 34, air spring, lockout, 100 mm travel
Sierra Leone (SLLLe)
Slovakia (EUR€)

Slovenia (EUR€)
Hub front
Somalia (GBP£)
Shimano TC500 alloy, CentreLock, 110x15 mm thru axle
South Africa (GBP£)
Hub rear
South Sudan (GBP£)
Shimano TC500 alloy, CentreLock, 148x12 mm thru axle
Skewer rear



COntact Us
Shimano LG500, 9/10/11-speed
Phone Us
Pedal
#productTemplate--template--26482385781119__main { --PT: 60px; --PB: 60px; }

Saddle
Open image lightbox
Selle Royal Vivo Moderate Ergo
*Seatpost
Open image lightboxSize:   L-XL
Aluminium with suspension, 350 mm long, with adjustable spring rate

StemOpen image lightbox
Aluminium, adjustable, 31.8 mm, Blendr-compatible, with display mount

Size:Colour  S-M, L-XL
Herrmans H-Black MR5-E, 140 Lumen, 40 Lux, LED, headlight
Matte Charcoal
Size:   S-M, L-XL
Spanninga Pimento Large, with brake light
Podium Champagne
Kickstand
Pletscher Comp Flex 40
Show more
Show less
Cargo rack
MIK-compatible alloy rear rack

M 54-56
Weight
S-M - 28.40 kg (600 Wh) / 29.30 kg (800 Wh)
L 57-59
Weight limit
This bike has a maximum total weight limit (combined weight of bicycle, rider and cargo) of 352 lb (160 kg).
XL 60-62

We reserve the right to make changes to the product information contained on this site at any time without notice, including with respect to equipment, specifications, models, colours, materials and pricing. Due to supply chain issues, compatible parts may be substituted at any time without notice.

Bike and frame weights are based on pre-production painted frames at time of publication. Weights may vary in final production. {"id":57933611598207,"title":"Matte Charcoal \/ S 51-53","option1":"Matte Charcoal","option2":"S 51-53","option3":null,"sku":"EQU.S.375C.3.2","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Argon 18 Equation Shimano 105 - Matte Charcoal \/ S 51-53","public_title":"Matte Charcoal \/ S 51-53","options":["Matte Charcoal","S 51-53"],"price":270000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}}

Quantity
1

Frequently Asked Questions

2
  • Please get in touch with a member of the team either by phone (3 01313745324 ) or email ( [email protected] ) where on of the team will be more than happy to help.

  • 5

    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.6

    We also have a physical store, if you are local please pop in -

    ProjektRide Bike Shop Edinburgh

    82 Newington Road, EH91QN, Edinburgh.

    7