Header Image
Information
Mon - Fri: 09:00 - 18:30

Sat: 9:00 - 16:00

Sun: Closed
0131 374 5324
Newington Road
Edinburgh
EH9 1QN
[email protected]
GBP£
  • Åland Islands (EUR€)
  • Albania (ALLL)
  • Algeria (DZDد.ج)
  • Andorra (EUR€)
  • Angola (GBP£)
  • Armenia (AMDդր.)
  • Ascension Island (SHP£)
  • Austria (EUR€)
  • Belarus (GBP£)
Belgium (EUR€)
Benin (XOFFr)
Bosnia & Herzegovina (BAMКМ)
Burkina Faso (XOFFr)
Discover
  • Czechia (CZKKč) Egypt (EGPج.م) Google Pay
    KlarnaDenmark (DKKkr.) Equatorial Guinea (XAFCFA) Maestro
    MastercardDjibouti (DJFFdj) Eritrea (GBP£)
    PayPal
    Egypt (EGPج.م) Estonia (EUR€) Shop Pay
    Union PayEquatorial Guinea (XAFCFA) Eswatini (GBP£)
    Visa
    Eritrea (GBP£) Ethiopia (ETBBr)
    Estonia (EUR€) Faroe Islands (DKKkr.)
    Eswatini (GBP£) Finland (EUR€)
    France (EUR€)
French Southern Territories (EUR€)
  • Greece (EUR€) Close
Iceland (ISKkr)
  • Close
  • Latvia (EUR€)
    • NonPreorderItem":false},"storefront_form_email_placeholder":"Email address","storefront_form_phone_placeholder":"SMS","storefront_form_phone_label":"Phone number","storefront_form_email_label":"Email","storefront_form_phone_error":"Please enter a valid phone number","storefront_form_customer_name_placeholder":"Name","storefront_form_customer_name_error":"Please enter your name","storefront_form_did_you_mean_error":"Did you mean %{suggested_email}? Or use %{current_email}","form_customer_name_enabled":false,"form_customer_name_required":false,"css_config":"","js_config":null,"collect_promotion_consent":false,"storefront_form_promotion_consent_label":"Notify me about other news, sales, discounts & offers too","show_button_on_collection":false,"sms_default_country":"us","sms_allowed_countries":[],"sms_restrict_country":false,"sms_default_channel":true,"optin_required":false,"optin_success_text":"Registration confirmed! You'll receive an alert when the product is restocked.","storefront_button_border_radius":0,"s
    • 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","preorder_price_container_selector":"","preorder_price_container_selector_insert_type":"afterend","preorder_terms_insert_selector":"","preorder_terms_insert_selector_type":"afterend","preorder_original_price_selector":"","preorder_price_format":"{{amount}} {{currency}}","show_badge_if_any_variant_is_preorder":false,"enable_console_debug":f
    • 54,44140279791842,44140279824610,44140279857378,44140279890146,44140279922914,44140292047074,44140292079842,44140292112610,44140293685474,44140302434530,44140302500066,44140302532834,44140302565602,44140302598370,44140302631138,44140302827746,44140302893282,44140302926050,44140315050210,44140317016290,44140321636578,44140335792354,44140335825122,44140335857890,44140339953890,44140339986658,44140340150498,44140340248802,44140340281570,44140340543714,44140340707554,44140340740322,44140340773090,44140345065698,44140352438498,44140388155618,44140388188386,44140397756642,44140404441314,44140404474082,44195991847138,44195991945442,44329993437410,44329993470178,44329993502946,44329993535714,44329993568482,45068753961186,45068753993954,45069622640866,45069622903010,45069622968546,45069750730978,45069750763746,45353010921698,45353010954466,45353010987234,45353018261730,45353018294498,45353018327266,55569712382335,55569712415103,55569712447871,55569712480639,55570017616255,55604008976767,55638316908927,55638316941695,5
    • 888610,42603186749666,42603186782434,42603337056482,42603347476706,42627516039394,42695182942434,42804934377698,43000663933154,43000791630050,43010895675618,43010895708386,43010900459746,43010957902050,43012307353826,43012307386594,43012307419362,43012486594786,43017325641954,43064942461154,43064942493922,43064951341282,43067643855074,43067643887842,43067668627682,43067673215202,43107806445794,43169620263138,43182366949602,43414855287010,43525453676770,43525453742306,43525453775074,43525453807842,43525453840610,43525453938914,43557711020258,43590980108514,43724401049826,43725342146786,43725342212322,43725342245090,43725371703522,43725531349218,43725531578594,43725531611362,43727258845410,43727342207202,43727599304930,43766825386210,43766825418978,43766825451746,43766825484514,43847032570082,43852281676002,43852281708770,43852281774306,43852281807074,43854809104610,43854820016354,43854833746146,43861164490978,43866540015842,43866540048610,43866540081378,43916542247138,43933115220194,43933117382882,439331174156
    • 66978,45671621099746,45671621132514,45671622246626,45671622279394,45671622312162,45671622344930,45694278959330,45694281089250,45694283186402,45694284103906,45694284890338,45694285021410,45694288822498,45694290297058,45694290821346,45694291968226,45694292197602,45694293475554,45694293803234,45694293836002,45696083656930,45696083689698,45696083722466,45760534905058,45760534937826,45760534970594,45760537592034,45760542474466,45760542507234,45760550535394,45760550568162,45760557711586,45760558268642,45760558596322,45760559087842,45764606394594,45764607803618,45764613308642,45764615897314,45764617928930,45764620157154,45764621664482,45764621697250,45767010451682,45767010484450,45767010517218,45767010549986,45767010746594,45767270531298,45767273513186,45767291371746,45767298482402,45767298711778,45767301726434,45767307264226,45767310868706,45767318601954,45817747276002,45817747308770,45817749143778,45817751470306,45817751503074,45817751535842,45817751568610,45817766117602,45817769459938,45817769525474,4581776959101
    • 4018,45824132546786,45824132579554,45824132612322,45824132645090,45824132677858,45824132710626,45824132743394,45824132776162,45824132808930,45824132841698,45824132874466,45824132907234,45824132940002,45824132972770,45824133005538,45824133038306,45824133071074,45824133103842,45824133136610,45824133169378,45824133202146,45824133234914,45824133267682,45824133300450,45824133333218,45824133365986,45824133398754,45824133431522,45824133464290,45824133497058,45824133529826,45824133562594,45824133595362,45824191791330,45824191824098,45824191856866,45824191889634,45824191922402,45824191955170,45824191987938,45824192020706,45824192053474,45824192086242,45824192119010,45824192151778,45824198705378,45824198738146,45824198770914,45824207978722,45824208011490,45824208044258,45824208077026,45824208109794,45824208142562,45824208175330,45824208208098,45824208240866,45824374767842,45824374800610,45824374833378,45824374866146,45824374898914,45824374931682,45824374964450,45824374997218,45824375029986,45824375062754,45824375095522
    • 938,45843590676706,45843590709474,45843590742242,45843615514850,45843615547618,45843615580386,45843615613154,45843615645922,45843615678690,45843615711458,45843615744226,45843615908066,45843615940834,45843615973602,45843616006370,45843616039138,45843616071906,45843616104674,45843616137442,45843616170210,45843616202978,45843616235746,45843616268514,45843656442082,45843656474850,45843656507618,45843656540386,45843833553122,45843858587874,45843858620642,45843858686178,45843858718946,45843858751714,45843858817250,45843858981090,45843859013858,45843859079394,45843893190882,45843893223650,45843893256418,45843893289186,45843893321954,45843893354722,45843893387490,45843893420258,45843893453026,45843893485794,45843893518562,45843893551330,45843893584098,45843893616866,45843893649634,45843893682402,45843893715170,45843893747938,45843893780706,45843893813474,45843893846242,45843893879010,45843893911778,45843893944546,45843974062306,45844333854946,45844333887714,45844355809506,45844355842274,45844355907810,45844355940578,
    • 10,46038087729378,46038087762146,46038087794914,46038087827682,46038087860450,46038087925986,46038087991522,46038088057058,46038088122594,46038088188130,46038088253666,46038088384738,46038088515810,46038088646882,46038088679650,46038088712418,46038088745186,46038088777954,46038088810722,46038088843490,46038088876258,46038088909026,46038088941794,46038088974562,46038089007330,46038203236578,46038203269346,46038229549282,46038229582050,46038232137954,46038232170722,46038232203490,46038232236258,46038232957154,46038232989922,46038233022690,46038233055458,46038233088226,46038233120994,46038233153762,46038233186530,46038233219298,46038245540066,46038245671138,46038245736674,46038245867746,46038245933282,46038246064354,46041328025826,46042261291234,46042261324002,46042261356770,46044399927522,46044399993058,46044400025826,46044400058594,46044411592930,46044414509282,46044465627362,46044465660130,46044617867490,46044618064098,46044618096866,46044618129634,46044618326242,46044618784994,46044618817762,46044618850530,4
    • 7,54945399406975,54945399439743,54945399472511,54945399505279,54945399538047,54945399570815,54945399603583,54945399636351,54945431683455,54945431716223,54945431748991,54945431781759,54945431814527,54945431847295,54945431880063,54945433125247,54945433158015,54945436467583,54945436500351,54945436533119,54945436565887,54945436598655,54945436631423,54945436664191,54945436696959,54945436729727,54945436762495,54945436795263,54945436828031,54945453048191,54945453080959,54945453113727,54945453146495,54945483260287,54945483293055,54945483325823,54945483358591,54945483391359,54945483424127,54945483456895,54945483489663,54945483522431,54945483555199,54945483587967,54945483620735,54945485029759,54945485062527,54945485095295,54945485128063,54945487389055,54945487421823,54945487454591,54945489486207,54945489518975,54945489551743,54945489617279,54945489650047,54945489682815,54945489715583,54945489781119,54945489813887,54945489846655,54945489879423,54945489912191,54945489944959,54945489977727,54945491353983,54945491386751,54
    • ,55333373313407,55333439340927,55333439373695,55333439406463,55333439439231,55333439471999,55333439504767,55333439537535,55333439570303,55333439603071,55333439635839,55333439668607,55333439701375,55333439734143,55333439766911,55333439832447,55333439865215,55333439897983,55333439930751,55333439963519,55333439996287,55333440061823,55333440094591,55333738185087,55333738217855,55333738250623,55333738283391,55333738316159,55333738348927,55333738381695,55333752865151,55372770935167,55464695333247,55464695366015,55464695398783,55464695431551,55464786264447,55464786297215,55464786329983,55464786362751,55464786395519,55464786428287,55464801927551,55464801960319,55464801993087,55464802025855,55464813035903,55464813068671,55464813101439,55464813134207,55464813166975,55464813199743,55482461389183,55482461421951,55482461454719,55482461487487,55482461520255,55482461553023,55482489176447,55482489209215,55482489241983,55482489274751,55482489307519,55482489340287,55482515620223,55482515652991,55482515685759,55482515718527,554
    • 56393231630719,56393231761791,56393231991167,56393232155007,56393232220543,56393232384383,56393232449919,56393232580991,56393232777599,56393232875903,56393232974207,56393233236351,56393233367423,56393233629567,56393233760639,56393234088319,56393234252159,56393234350463,56393234481535,56393234678143,56393235759487,56393238774143,56393238872447,56393239003519,56393239789951,56393240019327,56393240150399,56430641021311,56430641054079,56430641086847,56430641119615,56430641152383,56430641185151,56479895421311,56479895454079,56479895486847,56479895519615,56479895552383,56479895585151,56479930974591,56479931007359,56479931040127,56479931072895,56479931105663,56479931138431,56490205643135,56494084981119,56494085013887,56494085046655,56494085079423,56494085112191,56494085144959,56494085177727,56494085210495,56494085243263,56494085276031,56494085308799,56494085341567,56494085374335,56494085407103,56494085439871,56494085472639,56494085505407,56494085636479,56494085702015,56494085767551,56494085800319,56494085833087,5649 tomer interaction. // Detected variants: the variants present in this page's Liquid context (product page has them; // collection/index/etc. don't expose variants from Liquid). Used to disambiguate "embed didn't // load" vs "embed loaded but the variant wasn't a preorder/BIS candidate" in order debug. try { const _stoqInitConfig = window._RestockRocketConfig; const _stoqDetectedVariantIds = (_stoqInitConfig.product && Array.isArray(_stoqInitConfig.product.variants)) ? _stoqInitConfig.product.variants.map(function(v) { return v.id }) : []; const _stoqSelectedVariantId = _stoqInitConfig.selected_variant_id; Shopify?.analytics?.publish?.('stoq_initialized', { cart_token: _stoqInitConfig.cartToken || '', page_url: window.location.href, page_type: _stoqInitConfig.pageType || '', shop_domain: _stoqInitConfig.shop || '', market_id: _stoqInitConfig.marketId || '', detected_variant_ids: _stoqDetectedVariantIds, selected_variant_id: _stoqSele
    555007,56504950587775,56504950620543,56504950653311,56504950686079,56504950718847,56504950751615,56504961139071,56504961171839,56504961204607,56504961237375,56504961270143,56504961302911,56504961335679,56504961368447,56504961401215,56505064489343,56505064522111,56505064554879,56505064587647,56505064620415,56505064653183,56505064685951,56505064718719,56505064751487,56505064784255,56505064817023,56505064849791,56505064882559,56505064915327,56505064948095,56505064980863,56505065013631,56505065046399,56518714491263,56518714524031,56518714556799,56518714589567,56518714622335,56518716031359,56518716096895,56518716129663,56518716162431,56518716195199,56518716227967,56518716260735,56518716293503,56518716326271,56518716359039,56518716391807,56518716424575,56518716457343,56518716490111,56518716522879,56518716785023,56518716817791,56518716850559,56518716883327,56518716916095,56518716948863,56518716981631,56518717014399,56518717047167,56518717079935,56518717112703,56518717145471,56518717374847,56518717440383,565187174731 on block above) — nothing to bypass otherwise. variant_id is read per-clicked-button // from its form so it's correct on collection/index/search too. block_accelerated_checkout // context (STOQ-1612) rides in `properties` (forwarded verbatim by the pixel, no schema // change): a buy_now click on a preorder variant while the gate was armed is a visible // bypass signal for order debug. Also sends page_url (top-level, like the pixel's native // events) and two preorder signals in properties (see below). 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.close
    7284690215295,57284690248063,57284690313599,57284690346367,57284690379135,57284690411903,57311934513535,57311934546303,57311934579071,57311934611839,57318991724927,57318991790463,57318991823231,57319008797055,57319008829823,57319008862591,57319008895359,57392715465087,57392715497855,57392715530623,57392715563391,57392715596159,57578627137919,57578627170687,57579681808767,57579681841535,57579681874303,57579681907071,57579681939839,57579773362559,57579773395327,57579773428095,57579773460863,57579773493631,57579861377407,57579861410175,57579861442943,57579861475711,57579861508479,57581101154687,57581101187455,57581101220223,57581101252991,57581101285759,57582419149183,57582419181951,57582419214719,57582419247487,57582419280255,57596170535295,57596170568063,57596170600831,57596170633599,57596170666367,57596170699135,57596170731903,57596170764671,57596170797439,57596170830207,57596170862975,57596170895743,57596171092351,57596171125119,57596171157887,57596171190655,57596171223423,57596171256191,57596171288959,57596 ack.product && _sqTrack.product.id) || '', channel: channel, market_id: _sqTrack.marketId || '', page_type: _sqTrack.pageType || '', cart_token: _sqTrack.cartToken || '', page_url: (window.location && window.location.href) || '', properties: { // Mirror the bundle's own preorder check (preorder.js checkInventoryProvider- // WithCachedFallback): the live set config.preorderVariantIds (refreshed after // page load by loadVariantInventoryData) OR the Liquid-injected // cachedPreorderVariantIds — always present, so it covers clicks before the // bundle loads (why this tracker is inline). ORing both (not preferring one) // matches the bundle and is correct even if the live set is an empty array. Both // hold integer ids; the click-time id comes off a DOM input (.value → string) or // selected_variant_id, so coerce with Number for ear your cart to continue.","b2b_enabled":true,"preorder_progress_bar_enabled":false,"preorder_progress_bar_text":"{{ sold }} of {{ total }} claimed","preorder_progress_bar_fill_color":"#000000","preorder_progress_bar_background_color":"#e5e5e5","preorder_progress_bar_text_color":"#FFFFFF","preorder_progress_bar_border_radius":4,"preorder_progress_bar_show_percentage":false}],"disabled_plan_ids":[713813721471,713176482175,714631872895],"cached_at":"2026-04-09T09:16:46Z"}; if (cachedData && typeof cachedData === 'object' && cachedData.cached_at) { // Find the maximum updated_at from all items in old array const oldPlans = window._RestockRocketConfig.sellingPlans; const maxUpdatedAt = Array.isArray(oldPlans) && oldPlans.length > 0 ? oldPlans.reduce(function(max, plan) { // Parse dates for proper comparison (handles mixed ISO formats) if (plan.updated_at) { const planDate = new Date(plan.updated_at); const maxDat 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 ' +
gPlans (cached_at: ' + cachedData.cached_at + ')'); } } else { // When using old format (stale cache), don't trust disabled_plan_ids window._RestockRocketConfig.disabledSellingPlanIds = []; console.debug('[RR] Using selling plans from old format (max updated_at: ' + maxUpdatedAt + ')'); } } })();window._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":"202 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 || [];
400;\" data-mce-fragment=\"1\" data-mce-style=\"font-weight: 400;\"\u003eThe Motion's aluminium frame is built to last and enjoys our limited lifetime warranty.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cspan style=\"font-weight: 400;\" data-mce-fragment=\"1\" data-mce-style=\"font-weight: 400;\"\u003eYou'll also ride in comfort because we have selected wide tyres a comfort saddle with pressure relief channel and ergonomically-shaped dual density grips.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cspan style=\"font-weight: 400;\" data-mce-fragment=\"1\" data-mce-style=\"font-weight: 400;\"\u003ePracticality is another area where the Motion really shines, with mounts for mudguards and racks, making this a truly adaptable bike.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cspan style=\"font-weight: 400;\" data-mce-fragment=\"1\" data-mce-style=\"font-weight: 400;\"\u003eWeight - 14.6\u003c\/span\u003e\u003c\/p\u003e 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
Luxembourg (EUR€) \/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"card grid-item\"\u003e\n\u003cdiv class=\"card-header pl-0 pr-0\" id=\"specheadingrims\"\u003e\n\u003cdiv class=\"btn btn-link pl-0 pr-0 text-center text-md-left collapsed text-uppercase\" aria-controls=\"specrims\" aria-expanded=\"true\" data-target=\"#specrims\" data-toggle=\"collapse\"\u003e\u003cstrong\u003eFrame Material :\u003c\/strong\u003e\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eAlloy\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"card grid-item\"\u003e\n\u003cdiv class=\"card-header pl-0 pr-0\" id=\"specheadingrims\"\u003e\n\u003cdiv class=\"btn btn-link pl-0 pr-0 text-center text-md-left collapsed text-uppercase\" aria-controls=\"specrims\" aria-expanded=\"true\" data-target=\"#specrims\" data-toggle=\"collapse\"\u003e\u003cstrong\u003eBottom Bracket :\u003c\/strong\u003e\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eShimano BB-UN100 BSA 68\/122.5mm\u003c\/span\u003e\n\ocketConfig.pageType, enabled: settings.enable_app, settings: settings, preorderEnabled: settings.preorder_enabled } }); console.debug('STOQ - dispatching app loaded event'); window.dispatchEvent(appLoadedEvent); } } Mali (XOFFr)
rogress-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;} \/div\u003e\n\u003cdiv class=\"card grid-item\"\u003e\n\u003cdiv class=\"card-header pl-0 pr-0\" id=\"specheadingrims\"\u003e\n\u003cdiv class=\"btn btn-link pl-0 pr-0 text-center text-md-left collapsed text-uppercase\" aria-controls=\"specrims\" aria-expanded=\"true\" data-target=\"#specrims\" data-toggle=\"collapse\"\u003e\u003cstrong\u003eSpecification Disclaimer :\u003c\/strong\u003e\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eRidgeback reserves the right to change product specifications without notice. Ridgeback will always ensure that these changes do not detract from the ride experience of the bike.\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e","published_at":"2024-12-08T20:03:23+00:00","created_at":"2024-07-06T10:11:58+01:00","vendor":"Ridgeback","type":"Bicycles","tags":["Motion","spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled"],"price":54999,"price_min":54999,"price_max":54999,"available":true,"price_varies":false,"compare_at_price":null,"c
\/files\/rb21040_detail_01.jpg?v=1720257118"}},"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":45671617528034,"title":"X-Small \/ Blue","option1":"X-Small","option2":"Blue","option3":null,"sku":"RB21041XS","requires_shipping":true,"taxable":true,"featured_image":{"id":41546772447458,"product_id":8632811946210,"position":12,"created_at":"2024-07-06T10:11:58+01:00","updated_at":"2024-07-06T10:11:58+01:00","alt":null,"width":1800,"height":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/rb21041_detail_01.jpg?v=1720257118","variant_ids":[45671617528034,45671617593570,45671617659106,45671617724642,45671617790178]},"available":false,"name":"Ridgeback Motion Open Frame - X-Small \/ Blue","public_title":"X-Small \/ Blue","options":["X-Small","Blue"],"price":54999,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"featured_media":{"alt":null,"id":34199527981282,"position":12,"preview_image":{"aspect_ratio":1.0,"h
  • "compare_at_price":null,"inventory_management":"shopify","barcode":null,"featured_media":{"alt":null,"id":34199527620834,"position":1,"preview_image":{"aspect_ratio":1.0,"height":1800,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/rb21040_detail_01.jpg?v=1720257118"}},"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":45671617659106,"title":"Medium \/ Blue","option1":"Medium","option2":"Blue","option3":null,"sku":"RB21041MD","requires_shipping":true,"taxable":true,"featured_image":{"id":41546772447458,"product_id":8632811946210,"position":12,"created_at":"2024-07-06T10:11:58+01:00","updated_at":"2024-07-06T10:11:58+01:00","alt":null,"width":1800,"height":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/rb21041_detail_01.jpg?v=1720257118","variant_ids":[45671617528034,45671617593570,45671617659106,45671617724642,45671617790178]},"available":true,"name":"Ridgeback Motion Open Frame - Medium \/ Blue","public_title":"Medium \/ Bl
  • 17495266,45671617560802,45671617626338,45671617691874,45671617757410]},"available":false,"name":"Ridgeback Motion Open Frame - X-Large \/ White","public_title":"X-Large \/ White","options":["X-Large","White"],"price":54999,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"featured_media":{"alt":null,"id":34199527620834,"position":1,"preview_image":{"aspect_ratio":1.0,"height":1800,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/rb21040_detail_01.jpg?v=1720257118"}},"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":45671617790178,"title":"X-Large \/ Blue","option1":"X-Large","option2":"Blue","option3":null,"sku":"RB21041XL","requires_shipping":true,"taxable":true,"featured_image":{"id":41546772447458,"product_id":8632811946210,"position":12,"created_at":"2024-07-06T10:11:58+01:00","updated_at":"2024-07-06T10:11:58+01:00","alt":null,"width":1800,"height":1800,"src":"\/\/projektride.co.uk\/cdn\/shop
  • 18"},"aspect_ratio":1.0,"height":1800,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/rb21040_detail_04.jpg?v=1720257118","width":1800},{"alt":null,"id":34199527751906,"position":5,"preview_image":{"aspect_ratio":1.0,"height":1800,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/rb21040_detail_05.jpg?v=1720257118"},"aspect_ratio":1.0,"height":1800,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/rb21040_detail_05.jpg?v=1720257118","width":1800},{"alt":null,"id":34199527784674,"position":6,"preview_image":{"aspect_ratio":1.0,"height":1800,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/rb21040_detail_06.jpg?v=1720257118"},"aspect_ratio":1.0,"height":1800,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/rb21040_detail_06.jpg?v=1720257118","width":1800},{"alt":null,"id":34199527817442,"position":7,"preview_image":{"aspect_ratio":1.0,"height":1800,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/rb21040_detail_07.jpg
  • ragment=\"1\" data-mce-style=\"font-weight: 400;\"\u003eThe Motion's aluminium frame is built to last and enjoys our limited lifetime warranty.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cspan style=\"font-weight: 400;\" data-mce-fragment=\"1\" data-mce-style=\"font-weight: 400;\"\u003eYou'll also ride in comfort because we have selected wide tyres a comfort saddle with pressure relief channel and ergonomically-shaped dual density grips.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cspan style=\"font-weight: 400;\" data-mce-fragment=\"1\" data-mce-style=\"font-weight: 400;\"\u003ePracticality is another area where the Motion really shines, with mounts for mudguards and racks, making this a truly adaptable bike.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cspan style=\"font-weight: 400;\" data-mce-fragment=\"1\" data-mce-style=\"font-weight: 400;\"\u003eWeight - 14.6\u003c\/span\u003e\u003c\/p\u003e\n\u003cp data-mc
  • \n\u003c\/div\u003e\n\u003cdiv class=\"card grid-item\"\u003e\n\u003cdiv class=\"card-header pl-0 pr-0\" id=\"specheadingrims\"\u003e\n\u003cdiv class=\"btn btn-link pl-0 pr-0 text-center text-md-left collapsed text-uppercase\" aria-controls=\"specrims\" aria-expanded=\"true\" data-target=\"#specrims\" data-toggle=\"collapse\"\u003e\u003cstrong\u003eIntended Use :\u003c\/strong\u003e\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eUrban and Commute\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"card grid-item\"\u003e\n\u003cdiv class=\"card-header pl-0 pr-0\" id=\"specheadingrims\"\u003e\n\u003cdiv class=\"btn btn-link pl-0 pr-0 text-center text-md-left collapsed text-uppercase\" aria-controls=\"specrims\" aria-expanded=\"true\" data-target=\"#specrims\" data-toggle=\"collapse\"\u003e\u003cstrong\u003eBrakes :\u003c\/strong\u003e\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003ePromax TX-117 V-Brake\u003c\/span\u003e\n\u003c\/div\u003e\n\u
  • \u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"card grid-item\"\u003e\n\u003cdiv class=\"card-header pl-0 pr-0\" id=\"specheadingrims\"\u003e\n\u003cdiv class=\"btn btn-link pl-0 pr-0 text-center text-md-left collapsed text-uppercase\" aria-controls=\"specrims\" aria-expanded=\"true\" data-target=\"#specrims\" data-toggle=\"collapse\"\u003e\u003cstrong\u003eHubs :\u003c\/strong\u003e\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eKT A16F\/AY1R \/ front \/ rear\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"card grid-item\"\u003e\n\u003cdiv class=\"card-header pl-0 pr-0\" id=\"specheadingrims\"\u003e\n\u003cdiv class=\"btn btn-link pl-0 pr-0 text-center text-md-left collapsed text-uppercase\" aria-controls=\"specrims\" aria-expanded=\"true\" data-target=\"#specrims\" data-toggle=\"collapse\"\u003e\u003cstrong\u003ePedals :\u003c\/strong\u003e\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eResin Metro\u003c\/s
  • /div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"card grid-item\"\u003e\n\u003cdiv class=\"card-header pl-0 pr-0\" id=\"specheadingrims\"\u003e\n\u003cdiv class=\"btn btn-link pl-0 pr-0 text-center text-md-left collapsed text-uppercase\" aria-controls=\"specrims\" aria-expanded=\"true\" data-target=\"#specrims\" data-toggle=\"collapse\"\u003e\u003cstrong\u003eStem :\u003c\/strong\u003e\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eRidgeback 70mm +7deg\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"card grid-item\"\u003e\n\u003cdiv class=\"card-header pl-0 pr-0\" id=\"specheadingrims\"\u003e\n\u003cdiv class=\"btn btn-link pl-0 pr-0 text-center text-md-left collapsed text-uppercase\" aria-controls=\"specrims\" aria-expanded=\"true\" data-target=\"#specrims\" data-toggle=\"collapse\"\u003e\u003cstrong\u003eTyres :\u003c\/strong\u003e\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eVee Tire Zilent 700 x 42c\u003c\/span\u003e\n\u003c\/div\u
  • reorderMaxCount = {45671617495266 : parseInt(""),45671617528034 : parseInt(""),45671617560802 : parseInt(""),45671617593570 : parseInt(""),45671617626338 : parseInt(""),45671617659106 : parseInt(""),45671617691874 : parseInt(""),45671617724642 : parseInt(""),45671617757410 : parseInt(""),45671617790178 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {45671617495266 : null,45671617528034 : null,45671617560802 : null,45671617593570 : null,45671617626338 : null,45671617659106 : null,45671617691874 : null,45671617724642 : null,45671617757410 : null,45671617790178 : null,}; window._RestockRocketConfig.variantsShippingText = {45671617495266 : "",45671617528034 : "",45671617560802 : "",45671617593570 : "",45671617626338 : "",45671617659106 : "",45671617691874 : "",45671617724642 : "",45671617757410 : "",45671617790178 : "",}; window._RestockRocketConfig.variantsShippingTextForMarket = {45671617495266 : null,45671617528034 : null,45671617560802 : null,45671617593570 : nul
  • ions/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.scriptUrlProductBis = 'https://cdn.shopify.com/extensions/019f37a7-f058-7bcb-a02d-3fb0b8a7522a/restockrocket-1-539/assets/restockrocket-product-bis.js' window._RestockRocketConfig.scriptUrlCollectionBis = 'https://cdn.shopify.com/extensions/019f37a7-f058-7bcb-a02d-3fb0b8a7522a/restockrocket-1-539/assets/restockrocket-collection-bis.js' window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1) // Canary override (STOQ-1287): prefer the Render host emitted into the // metafield-cached settings (api_host) when present, mirroring the same // override in assets/js/api.js. cachedSettings is populate
  • <
  • 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
    • = 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
    • 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') // Fire stoq_initialized once per page load so the funnel pipeline has a definitive // "our code ran on this page" signal independent of any cus
    • st('form'); var vidEl = form && form.querySelector('[name="id"]'); var variantId = (vidEl && vidEl.value) || _sqTrack.selected_variant_id || ''; // The enabled STOQ selling plan the clicked variant belongs to (if any), found once and // reused for in_enabled_plan / enrolled_plan_id / enrolled_plan_provider below. var _sqVidNum = Number(variantId); var _sqPlan = null; // Array.isArray guard (not `|| []`) so a truthy non-array sellingPlans can't throw and // silently drop the whole publish. var _sqPlans = Array.isArray(_sqTrack.sellingPlans) ? _sqTrack.sellingPlans : []; _sqPlans.forEach(function (pl) { if (!_sqPlan && pl && pl.enabled && Array.isArray(pl.variant_ids) && pl.variant_ids.indexOf(_sqVidNum) !== -1) { _sqPlan = pl; } }); Shopify?.analytics?.publish?.('stoq_accelerated_checkout_clicked', { variant_id: variantId, product_id: (_sqTr
    • cceleratedGateArmed, gate_active_at_click: !!(document.documentElement && document.documentElement.classList.contains('stoq-buy-now-pending')), }, }); } catch (err) { /* never break checkout */ } }, true); } } catch (e) { /* fail open */ } 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 || {})
Norway (GBP£) Réunion (EUR€)
Réunion (EUR€) San Marino (EUR€)
San Marino (EUR€) Serbia (RSDРСД)
São Tomé & Príncipe (STDDb) Seychelles (GBP£)
Senegal (XOFFr)
Poland (PLNzł) Shop Pay < 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