derVariantIds = {"preorder_variant_ids":[42167799447778,43916521013474,43934694998242,43934695031010,43934695620834,43935975440610,43935975473378,43935989399778,43935989432546,43935990284514,43935994118370,43935995625698,43935995855074,43936000835810,43936003195106,43936003227874,43936008012002,43936008044770,43936022757602,43936022790370,43936022823138,43936022855906,43936056115426,43936061030626,43936064930018,43936070631650,43936078037218,43936078069986,43936088195298,43936093470946,43936101138658,43936107266274,43936124076258,43936124109026,43936124141794,43936124174562,43936129941730,43936129974498,43936130007266,43936142393570,43936142426338,43936142459106,43936152060130,43936152092898,43936152125666,43936193118434,43936250429666,43936255803618,43936266682594,43936266715362,43936293978338,43936294011106,43936316424418,43936316457186,43936320880866,43936320913634,43936320946402,43936327041250,43936327074018,43936327106786,43936331661538,43936332349666,43936333103330,43936351224034,43936353714402,43936362
- 46,44140302893282,44140317016290,44155590508770,44155590541538,44155594211554,44155594244322,44155594277090,44155594309858,44155594342626,44155594375394,44155594440930,44155594473698,44155594506466,44195991847138,44195991945442,44329993437410,44329993470178,44329993502946,44329993535714,44329993568482,44957136584930,44957136781538,44957136945378,45068753961186,45068753993954,45069622640866,45069622903010,45069622968546,45069750730978,45069750763746,45353010921698,45353010954466,45353010987234,45353018261730,45353018294498,45353018327266,55569712382335,55569712447871,55569712480639,55570550194559,55570550227327,55604008976767,55638316908927,55638316941695,55638316974463,56220814999935,56220815032703,56270279606655,56270279639423,56270279672191,56314171064703,56314171097471,56398983725439,56398983758207,56398983790975,56399322251647,56565020721535,56565020754303,56565020787071],"updated_at":"2026-02-12T20:23:06Z","market_locations_enabled":false,"market_id":13779632354,"preorder_location_filter_enabled":false,"3,55569712480639,55570017616255,55570017550719,55569712447871,55570017583487],"product_variants_source":"custom","name":"Preorder","preorder_button_text":"Preorder","preorder_button_description":"Note: This is a preorder. Items will ship based on the estimated delivery date.","preorder_button_description_background_color":"#ebebeb","preorder_button_description_text_color":"#000000","preorder_button_description_border_radius":10,"preorder_button_description_show_quantity_limit":false,"preorder_button_description_quantity_limit_suffix":" units available for preorder","preorder_button_description_shipping_text_prefix":"Shipping: ","delivery_exact_time":null,"delivery_after_n_intervals":null,"delivery_at":"2025-07-26T09:20:18.169Z","delivery_type":"asap","quantity_limit_text":"{{ quantity }} units available for preorder","preorder_button_description_show_shipping":true,"preorder_button_description_icons_enabled":true,"preorder_shipping_text":"Shipping: {{ date }}","shipping_applies_to_all_products":true,"shippingoptions":[{"billing_type":"no_remaining_balance","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","billing_at":"2025-07-26T09:20:38.472Z","billing_after_n_intervals":7,"billing_after_interval_type":"day","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"billing_title":"Full payment","billing_description":null,"discount_text":"Save {{ discount }}","shopify_selling_plan_id":713071886719,"is_default":true,"type":"full","translations":{}}],"require_preorder_acknowledgement":false,"preorder_acknowledgement_text":"I acknowledge and agree to the preorder terms and conditions for this product.","disable_button_until_acknowledged":false,"preorder_min_quantity":null,"preorder_max_quantity":null,"countdown_timer_enabled":false,"countdown_timer_style":"text","countdown_timer_text_color":"#000000","countdown_timer_background_color":"#f5f5f5","countdown_timer_border_radius":8,"countdown_timer_format":"DHMS","countdown_
- -collections","article","blog"],"configuration":{"toastDuration":10000,"toastPosition":"bottom-right","enableXHRHijack":true,"enableFetchHijack":true,"quantityLimitDisabled":false},"type":"hijack","css_config":null,"js_config":null,"created_at":"2025-07-26T09:16:04.076Z","updated_at":"2025-07-26T09:16:04.076Z"}];window._RestockRocketConfig.obfuscateInventoryQuantity = false;window._RestockRocketConfig.product = {"id":7920181477602,"title":"Surly Straggler Frameset - Black 700c","handle":"surly-straggler-frameset-black","description":"\u003cmeta charset=\"utf-8\"\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cspan data-mce-fragment=\"1\"\u003ePlease get in touch with a member of the team to discuss the availability of size, build kit, and colour if the option you require is out of stock - 0131 374 5324 \/ edinburgh@projektride.co.uk\u003c\/span\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cspan data-mce-fragment=\"1\"\u003eSurly Straggler\u003c\/span\u003e\u003c\/p\u003e\n\u003cp data-mce
-fragment=\"1\"\u003eSo what is this Straggler anyway? The easy answer is to say that we added disc brakes to a Cross-Check and this is close to accurate. People have asked us to make a disc version of our highly versatile Cross-Check for a long time now and almost everything about the two are very similar. Straggler is slightly different, though.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eThe most obvious difference of course is that the Straggler has disc caliper mounts instead of rim brake studs. It'll accept rotors up to 160mm. The rear dropouts are unique, too. They're a partially closed horizontal design that accommodates singlespeed or geared drivetrains. They feature stop screws that thread in from the rear to further secure the wheel and to position the rear wheel for optimal shifting, plus a forward-mounted stop screw on the drive side to keep the wheel from slipping forward under the force of your gargantuan legs. The rear dropouts are spaced 135mm instead of 132.5mm like the Cross-Check Helmetsst_item\" data-mce-fragment=\"1\"\u003e\n\u003cspan class=\"ui-list-title\" data-mce-fragment=\"1\"\u003eSeatpost\u003c\/span\u003e\u003cspan class=\"ui-list-info\" data-mce-fragment=\"1\"\u003e27.2mm\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli class=\"ui-list_item\" data-mce-fragment=\"1\"\u003e\n\u003cspan class=\"ui-list-title\" data-mce-fragment=\"1\"\u003eSeat Clamp\u003c\/span\u003e\u003cspan class=\"ui-list-info\" data-mce-fragment=\"1\"\u003e30.0mm (we include our Surly stainless clamp with our framesets)\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli class=\"ui-list_item\" data-mce-fragment=\"1\"\u003e\n\u003cspan class=\"ui-list-title\" data-mce-fragment=\"1\"\u003eFront Derailleur\u003c\/span\u003e\u003cspan class=\"ui-list-info\" data-mce-fragment=\"1\"\u003e28.6 mm band-on\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli class=\"ui-list_item\" data-mce-fragment=\"1\"\u003e\n\u003cspan class=\"ui-list-title\" data-mce-fragment=\"1\"\u003eBB Shell\u003c\/span\u003e\u003cspan class=\"ui-list-info\" da
- \"\u003e\u003cspan class=\"ui-list-info\" data-mce-fragment=\"1\"\u003ehttps:\/\/projektride.co.uk\/collections\/custom-builds\u003c\/span\u003e\u003c\/p\u003e","published_at":"2022-10-14T20:40:47+01:00","created_at":"2022-10-14T20:40:45+01:00","vendor":"Surly","type":"","tags":["bike","bikes","Frame","frames","New","surly"],"price":80000,"price_min":80000,"price_max":80000,"available":false,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":43525609914594,"title":"54cm","option1":"54cm","option2":null,"option3":null,"sku":"FMSUG54K","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Surly Straggler Frameset - Black 700c - 54cm","public_title":"54cm","options":["54cm"],"price":80000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":43525609947362,"title":"56cm","option1":"56cm","optio700c - 60cm","public_title":"60cm","options":["60cm"],"price":80000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":43525610045666,"title":"62cm","option1":"62cm","option2":null,"option3":null,"sku":"FMSUG62K","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Surly Straggler Frameset - Black 700c - 62cm","public_title":"62cm","options":["62cm"],"price":80000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]}],"images":["\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-10-14at20.39.15.png?v=1665776448","\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-10-14at20.42.11.png?v=1665776545"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-10-14at20.39.15.png?v=1665776448","options":["Size"],"media":[{"alt":null,"id":30948351082722,"position":1 is out of stock - 0131 374 5324 \/ edinburgh@projektride.co.uk\u003c\/span\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cspan data-mce-fragment=\"1\"\u003eSurly Straggler\u003c\/span\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eSo what is this Straggler anyway? The easy answer is to say that we added disc brakes to a Cross-Check and this is close to accurate. People have asked us to make a disc version of our highly versatile Cross-Check for a long time now and almost everything about the two are very similar. Straggler is slightly different, though.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eThe most obvious difference of course is that the Straggler has disc caliper mounts instead of rim brake studs. It'll accept rotors up to 160mm. The rear dropouts are unique, too. They're a partially closed horizontal design that accommodates singlespeed or geared drivetrains. They feature stop screws that thread in from the rear to further secure the wheel and to position the
- gment=\"1\"\u003eSpecifications\u003c\/h4\u003e\n\u003cul class=\"ui-list ui-list-main\" data-mce-fragment=\"1\"\u003e\n\u003cli class=\"ui-list_item\" data-mce-fragment=\"1\"\u003e\n\u003cspan class=\"ui-list-title\" data-mce-fragment=\"1\"\u003eMaterial\u003c\/span\u003e\u003cspan class=\"ui-list-info\" data-mce-fragment=\"1\"\u003e100% Surly proprietary 4130 CroMoly tubing\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli class=\"ui-list_item\" data-mce-fragment=\"1\"\u003e\n\u003cspan class=\"ui-list-title\" data-mce-fragment=\"1\"\u003eFork\u003c\/span\u003e\u003cspan class=\"ui-list-info\" data-mce-fragment=\"1\"\u003e4130 CroMoly, disc only\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli class=\"ui-list_item\" data-mce-fragment=\"1\"\u003e\n\u003cspan class=\"ui-list-title\" data-mce-fragment=\"1\"\u003eSteerer\u003c\/span\u003e\u003cspan class=\"ui-list-info\" data-mce-fragment=\"1\"\u003e1 1\/8\" threadless\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli class=\"ui-list_item\" data-mce-fragment=\"1\"\u003e\n8.6 mm band-on\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli class=\"ui-list_item\" data-mce-fragment=\"1\"\u003e\n\u003cspan class=\"ui-list-title\" data-mce-fragment=\"1\"\u003eBB Shell\u003c\/span\u003e\u003cspan class=\"ui-list-info\" data-mce-fragment=\"1\"\u003e68mm English\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli class=\"ui-list_item\" data-mce-fragment=\"1\"\u003e\n\u003cspan class=\"ui-list-title\" data-mce-fragment=\"1\"\u003eRear spacing\u003c\/span\u003e\u003cspan class=\"ui-list-info\" data-mce-fragment=\"1\"\u003e135mm\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli class=\"ui-list_item\" data-mce-fragment=\"1\"\u003e\n\u003cspan class=\"ui-list-title\" data-mce-fragment=\"1\"\u003eColour\u003c\/span\u003e\u003cspan class=\"ui-list-info\" data-mce-fragment=\"1\"\u003eGlitter Dreams, Closet Black or Mint Green\u003c\/span\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cspan class=\"ui-list-info\" data-mce-fragment=\"1\"\u003eSurly Sizing guide is attached w._RestockRocketConfig.variantsPreorderCountForMarket = {43525609914594 : null,43525609947362 : null,43525609980130 : null,43525610012898 : null,43525610045666 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {43525609914594 : parseInt(""),43525609947362 : parseInt(""),43525609980130 : parseInt(""),43525610012898 : parseInt(""),43525610045666 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {43525609914594 : null,43525609947362 : null,43525609980130 : null,43525610012898 : null,43525610045666 : null,};
window._RestockRocketConfig.variantsShippingText = {43525609914594 : "",43525609947362 : "",43525609980130 : "",43525610012898 : "",43525610045666 : "",};
window._RestockRocketConfig.variantsShippingTextForMarket = {43525609914594 : null,43525609947362 : null,43525609980130 : null,43525610012898 : null,43525610045666 : null,};
window._RestockRocketConfig.selected_variant_id = 43525609914594;
window._RestockRocketConfig.selected_variant_ava
- nfig.liquidRenderedAt;
// Validate timestamp and calculate cache age
if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) {
console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh');
window._RestockRocketConfig.isLiquidCacheFresh = true;
} else {
const now = Math.floor(Date.now() / 1000); // Current time in seconds
const liquidCacheAge = now - liquidRenderedAt; // Age in seconds
// 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
// Translations object exists in metafield - cache is valid
// If current locale isn't translated, applyTranslations will gracefully use default locale from base fields
if (window._RestockRocketConfig.normalizedLocale &&
!Object.prototype.hasOwnProperty.call(settings.translations, window._RestockRocketConfig.normalizedLocale)) {
console.debug('STOQ - locale not explicitly translated, will use default language from cache');
}
// Don't return null - continue using cache even for untranslated locales
}
const updatedAt = new Date(settings.updated_at);
if (isNaN(updatedAt.getTime())) {
console.debug('STOQ - Invalid updated_at date format in settings');
return null;
}
const age = Date.now() - updatedAt.getTime();
if (age