e 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_timer_use_schedule_dates":true,"countdown_timer_custom_start_date":null,"countdown_timer_custom_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased separately from regular items. Please complete your current order first, or clear your cart to continue.","b2b_enabled":true,"preorder_progress_bar_enabled":false,"preorder_progress_bar_text":"{{ sold }} of {{ total }} claimed","preorder_progress_bar_fill_co
scription_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,"shipping_text":"Estimated to ship within 2 months","payment_type":"full","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"discount_text":"Save {{ discount }}","billing_title":"Full payment","billing_description":null,"enable_billing_widget":false,"inventory_provider":"stoq","preorder_badge_enabled":false,"preorder_badge_text":"Preorder","preorder_badge_text_color":"#FFFFFF","preorder_badge_background_color":"#000000","preorder_discounted_p
order_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_timer_use_schedule_dates":true,"countdown_timer_custom_start_date":null,"countdown_timer_custom_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased separately from regular items. Please complete your current order first, or clear your cart to continue.","b2b_enabled":true,"preorder_progress_bar_enabled":false,"preorder_progress_bar_text":"{{ sold }} of {{ total }
Congo - Kinshasa (CDFFr)
Sold Out - Notify Me When It’s Available : max;
}
return max;
}, '')
: null;
// Use cached if old array is empty/has no timestamps, or cached is newer
// Parse dates for comparison to handle format differences (+00:00 vs .000Z)
const cachedDate = new Date(cachedData.cached_at);
const maxDate = maxUpdatedAt ? new Date(maxUpdatedAt) : null;
const useCached = !maxUpdatedAt || (cachedDate && !isNaN(cachedDate) && (!maxDate || cachedDate > maxDate));
if (useCached) {
if (Array.isArray(cachedData.plans)) {
window._RestockRocketConfig.sellingPlans = cachedData.plans;
// Only use disabled_plan_ids when using cached plans
window._RestockRocketConfig.disabledSellingPlanIds = cachedData.disabled_plan_ids || [];
console.debug('[RR] Using selling plans from cachedSellingPlans (cached_at: ' + cachedData.cached_at + ')');
}
} else {
// When using old format (stale cache), don't trCyprus (EUR€)
Hope
tockRocketConfig.product = {"id":14928322789759,"title":"Hope Conventional Headset","handle":"hope-conventional-headset","description":"\u003cdiv class=\"main-indented\"\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cdiv class=\"product-listing center-wrap\"\u003e\n\u003cdiv class=\"new-page-intro-section\"\u003e\n\u003cdiv class=\"product-intro-right\"\u003e\n\u003ch5\u003eReliable and durable. Our conventional headset is designed to fit the standard 1 1\/8\" fork steerer. The headset uses custom made, replaceable stainless steel bearings to resist corrosion.\u003c\/h5\u003e\n\u003ch3\u003eKey Features\u003c\/h3\u003e\n\u003ch5\u003e\/\/ Replaceable stainless steel bearings (resist corrosion)\u003cbr\u003e\/\/ Split crown race for easy installation and removal\u003cbr\u003e\/\/ Comes complete with our Head Doctor top cap\u003cbr\u003e\/\/ Multiple seals to keep out the elements\u003cbr\u003e\/\/ Conventional headset is designed to fit standard frames and 1 1\/8\" fork steerers\u003cbr\u003e\/\/ Headset uses cus
ingPlans) &&
_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: block (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_acceler
Croatia (EUR€)
//cdn.shopify.com/extensions/019faf5b-94c9-7a24-9306-bf1118ca3099/restockrocket-1-554/assets/restockrocket-product.js'
window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019faf5b-94c9-7a24-9306-bf1118ca3099/restockrocket-1-554/assets/restockrocket-collection.js'
window._RestockRocketConfig.scriptUrlProductBis = 'https://cdn.shopify.com/extensions/019faf5b-94c9-7a24-9306-bf1118ca3099/restockrocket-1-554/assets/restockrocket-product-bis.js'
window._RestockRocketConfig.scriptUrlCollectionBis = 'https://cdn.shopify.com/extensions/019faf5b-94c9-7a24-9306-bf1118ca3099/restockrocket-1-554/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. ca
Denmark (DKKkr.)
Create account <
<
Cyprus (EUR€)
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 See MoreDjibouti (DJFFdj)
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
Search
age = Date.now() - updatedAt.getTime();
if (age
Czechia (CZKKč)
1285759,57582419149183,57582419181951,57582419214719,57582419247487,57582419280255,57596170535295,57596170568063,57596170600831,57596170633599,57596170666367,57596170699135,57596170731903,57596170764671,57596170797439,57596170830207,57596170862975,57596170895743,57596171092351,57596171125119,57596171157887,57596171190655,57596171223423,57596171256191,57596171288959,57596171321727,57596171354495,57596171387263,57596171420031,57596171452799,57596175384959,57596175417727,57596175450495,57596175483263,57596176138623,57596176171391,57596176204159,57596176236927,57596176269695,57596176302463,57596176335231,57596176367999,57596176662911,57596176695679,57596176728447,57596176761215,57596176793983,57596176859519,57596176925055,57596177056127,57596177088895,57596177121663,57596177252735,57596177285503,57596177351039,57596177383807,57596177416575,57596177449343,57596177514879,57596177547647,57596177613183,57596177645951,57596177809791,57596177842559,57596177875327,57596177908095,57602995126655,57602995159423,57602995192wledgement":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_timer_use_schedule_dates":true,"countdown_timer_custom_start_date":null,"countdown_timer_custom_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased separately from regular items. Please complete your current order first, or clear your cart to continue.","b2b_enabled":true,"preorder_progress_bar_enabled":false,"preorder_progress_bar_text":"{{
;window._RestockRocketConfig.cachedOutOfStockVariantIds = { out_of_stock_variant_ids: [] };window._RestockRocketConfig.cachedVariantPreorderLimits = {"variant_preorder_limits":{},"updated_at":"2026-07-30T15:06:20Z","shopify_market_id":382140642,"market_locations_enabled":false};
window._RestockRocketConfig.cachedVariantPreorderLimitsMarketKey = "variant_preorder_limits_for_market_382140642";window._RestockRocketConfig.cachedVariantShippingTexts = {"variant_shipping_texts":{},"updated_at":"2026-07-30T14:50:37Z","shopify_market_id":382140642,"market_locations_enabled":false};
window._RestockRocketConfig.cachedVariantShippingTextsMarketKey = "variant_shipping_texts_for_market_382140642";window._RestockRocketConfig.sellingPlans = [{"shopify_selling_plan_group_id":98590196095,"shopify_selling_plan_id":713071886719,"enabled":true,"variant_ids":[55569712382335,55569712415103,55569712480639,55570017616255,55570017550719,55569712447871,55570017583487],"product_variants_source":"custom","name":"Preorder","preorranslations":{}}],"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_timer_use_schedule_dates":true,"countdown_timer_custom_start_date":null,"countdown_timer_custom_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased separately from regular items. Please complete your current order first, or clear your cart to continue.","b2b_enabled":true,"preorder_progress_bar_enable
m_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased separately from regular items. Please complete your current order first, or clear 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}];(function() {
const cachedData = {"plans":[{"shopify_selling_plan_group_id":98590196095,"shopify_selling_plan_id":713071886719,"enabled":true,"variant_ids":[55569712382335,55569712415103,55569712480639,55570017616255,55570017550719,55569712447871,55570017583487],"product_variants_tockRocketConfig.obfuscateInventoryQuantity = false;window._RestockRocketConfig.product = {"id":8055181869282,"title":"Surly Preamble Frameset - horfrost White","handle":"preamble-frameset-horfrost-white","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\u003eDesigned to introduce unfamiliar riders to Surly’s pavement and gravel line, Preamble highlights Surly’s most essential features: Durable custom steel tubing, a renowned ride feel, and just the right mounts for running racks, fenders, and bottle cages. Available in flat-bar and drop-bar configurations, it’s disc-brake specific and shares a single-position vertical dropout with Surly Bridge Club. For new weekend riders and veteran commuters,
ype":"full","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"discount_text":"Save {{ discount }}","billing_title":"Full payment","billing_description":null,"enable_billing_widget":false,"inventory_provider":"stoq","preorder_badge_enabled":false,"preorder_badge_text":"Preorder","preorder_badge_text_color":"#FFFFFF","preorder_badge_background_color":"#000000","preorder_discounted_price_enabled":null,"payment_line_item_property_enabled":false,"shipping_line_item_property_enabled":true,"custom_line_item_property_text":null,"preorder_button_text_color":"#ffffff","preorder_button_background_color":"#565557","preorder_button_colors_enabled":true,"markets_enabled":false,"market_id":13779632354,"shopify_market_ids":[],"use_shopify_selling_plan":true,"use_simplified_shipping_text":false,"translations":{},"payment_options":[{"billing_type":"no_remaining_balance","billl,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":43936684310754,"title":"XS","option1":"XS","option2":null,"option3":null,"sku":"FMSUPA230W","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Surly Preamble Frameset - horfrost White - XS","public_title":"XS","options":["XS"],"price":65000,"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}},{"id":43936684343522,"title":"S","option1":"S","option2":null,"option3":null,"sku":"FMSUPA231W","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Surly Preamble Frameset - horfrost White - S","public_title":"S","options":["S"],"price":65000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"mm_start_date":null,"countdown_timer_custom_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased separately from regular items. Please complete your current order first, or clear 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 arra":"XL","option2":null,"option3":null,"sku":"FMSUPA234W","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Surly Preamble Frameset - horfrost White - XL","public_title":"XL","options":["XL"],"price":65000,"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}}],"images":["\/\/projektride.co.uk\/cdn\/shop\/products\/fmsu-23-preamble-whi.jpg?v=1679167729","\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-10-14at20.42.11_1296x_6cd10f9e-da7d-409b-b103-fec76fb87fa6.webp?v=1679167729"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/products\/fmsu-23-preamble-whi.jpg?v=1679167729","options":["Size"],"media":[{"alt":null,"id":31695312847074,"position":1,"preview_image":{"aspect_ratio":1.0,"height":1000,"width":1000,"src":"\/\/projektride.co.uk\/cdn\/shop\/products\/fmsu-23-preamble-whi.jpg?v=1679167729"},"aspect_ratio":1.0,"height
e > maxDate));
if (useCached) {
if (Array.isArray(cachedData.plans)) {
window._RestockRocketConfig.sellingPlans = cachedData.plans;
// Only use disabled_plan_ids when using cached plans
window._RestockRocketConfig.disabledSellingPlanIds = cachedData.disabled_plan_ids || [];
console.debug('[RR] Using selling plans from cachedSellingPlans (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 = gned to introduce unfamiliar riders to Surly’s pavement and gravel line, Preamble highlights Surly’s most essential features: Durable custom steel tubing, a renowned ride feel, and just the right mounts for running racks, fenders, and bottle cages. Available in flat-bar and drop-bar configurations, it’s disc-brake specific and shares a single-position vertical dropout with Surly Bridge Club. For new weekend riders and veteran commuters, Preamble makes it easier than ever to get out of the car and on top of tough and comfortable Chromoly steel.\u003c\/p\u003e\n\u003cp\u003e100% Surly Chromoly steel frame and fork; double-butted main triangle\u003cbr\u003eFive frame sizes to fit nearly every size rider (XS, S, M, L, XL), with a slightly sloped top tube on XS and Small frames for improved standover and comfort\u003cbr\u003eFriendly with 1x and 2x drivetrains\u003cbr\u003eMounts for racks, mudguards, and two bottle cages (located on the seat tube and down tube)\u003cbr\u003eClearance for 650b x 41mm tyres o
valve not only has a dust cover, but self-seals and features a one hand on\/off lever to prevent leaks.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eULTRA DURABLE\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eMade of ultra-durable, abrasion resistant TPU with RF-welded seams for superior strength and elasticity.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eRUGGED GRAB HANDLE\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eNew durable, flexible handle simplifies filling and carrying.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eUNIVERSAL HANGER\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eDesigned to work with clips, hooks, and loops in a wide variety of packs including Osprey, CamelBak, Gregory, Mystery Ranch and 5.11 Tactical.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eHYDRAFUSION TUBE \u0026amp; DUST COVER\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eFlexible343522 : parseInt(""),43936684376290 : parseInt(""),43936684409058 : parseInt(""),43936684441826 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {43936684310754 : null,43936684343522 : null,43936684376290 : null,43936684409058 : null,43936684441826 : null,};
window._RestockRocketConfig.variantsShippingText = {43936684310754 : "",43936684343522 : "",43936684376290 : "",43936684409058 : "",43936684441826 : "",};
window._RestockRocketConfig.variantsShippingTextForMarket = {43936684310754 : null,43936684343522 : null,43936684376290 : null,43936684409058 : null,43936684441826 : null,};
window._RestockRocketConfig.selected_variant_id = 43936684310754;
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-1div\u003ePlug-N-Play® connect system lets you easily disconnect the drink tube from the reservoir for easy filling\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cdiv\u003eMade of ultra-durable, abrasion resistant TPU \u0026amp; RF welded seams for superior durability and elasticity\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cdiv\u003e100% BPA \u0026amp; PVC free, wide working temperature range (can be frozen - max temp 60° C \/ 140° F)\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli\u003eCAPACITY: 3 L \/ 100 fl oz\u003c\/li\u003e\n\u003cli\u003eWEIGHT: 178 g \/ 6.3 oz\u003c\/li\u003e\n\u003cli\u003eDIMENSIONS: 375 mm x 200 mm \/ 14.8 in x 7.9 in\u003c\/li\u003e\n\u003cli\u003eMATERIALS: TPU, ABS, POM, PP, EPDM, Silicone, 304SS, TPU Coated Nylon Fabric\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"tab-pane fade in active\" id=\"description\" role=\"tabpanel\"\u003e\n\u003cdiv class=\"product-description\"\u003e\n\u003cdiv class=\"elementor elementor-325\" dataeatured_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) { return _sqPre.indexOf(Number(v.id)) !== -1; });
} else {
_sqArm = (_sqc.integrations || []).some(function (i) {
return i && i.type === 'featured_product' && i.enabled &&
Arr
LE: Shape-loc baffles create a low reservoir profile \u0026amp;amp; increase stabilization during activities.\u0026lt;\\\/li\u0026gt;\\n\u0026lt;li\u0026gt;REVERSIBLE: Use the internal drying tab to reverse the reservoir for deep cleaning and complete drying.\u0026lt;\\\/li\u0026gt;\\n\u0026lt;li\u0026gt;Included magnet clip attaches to reservoir tube and can be paired with your pack of choice for easy access\u0026lt;\\\/li\u0026gt;\\n\u0026lt;li\u0026gt;Plug-N-Play\\u00ae connect system lets you easily disconnect the drink tube from the reservoir for easy filling\u0026lt;\\\/li\u0026gt;\\n\u0026lt;li\u0026gt;Made of ultra-durable, abrasion resistant TPU \u0026amp;amp; RF welded seams for superior durability and elasticity\u0026lt;\\\/li\u0026gt;\\n\u0026lt;li\u0026gt;100% BPA \u0026amp;amp; PVC free, wide working temperature range (can be frozen - max temp 60\\u00b0 C \\\/ 140\\u00b0 F)\u0026lt;\\\/li\u0026gt;\\n\u0026lt;li\u0026gt;CAPACITY: 3L \\\/ 100 fl oz\u0026lt;\\\/li\u0026gt;\\n\u0026lt;li\u0026gt;DIM<
Capacity\",\"value\":\"3L\",\"id_feature\":\"14\",\"position\":\"9\"}],\"attachments\":[],\"virtual\":0,\"pack\":0,\"packItems\":[],\"nopackprice\":0,\"customization_required\":false,\"rate\":20,\"tax_name\":\"VAT UK 20%\",\"ecotax_rate\":0,\"unit_price\":\"\",\"customizations\":{\"fields\":[]},\"id_customization\":0,\"is_customizable\":false,\"show_quantities\":false,\"quantity_label\":\"Items\",\"quantity_discounts\":[],\"customer_group_discount\":0,\"images\":[{\"bySize\":{\"small_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"cart_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-cart_default\\\/hydrapak-contour-3l.jpg\",\"width\":125,\"height\":125},\"home_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"medium_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-medium_default\\\/hydrapak-contour-3l.jpg\",\"width\":452,\"heigh<r-3l.jpg\",\"width\":259,\"height\":259},\"medium_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15325-medium_default\\\/hydrapak-contour-3l.jpg\",\"width\":452,\"height\":452},\"large_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15325-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800}},\"small\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15325-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"medium\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15325-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"large\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15325-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800},\"legend\":\"\",\"cover\":null,\"id_image\":\"15325\",\"position\":\"2\",\"associatedVariants\":[]},{\"bySize\":{\"small_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15406-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"cart_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15<:\"https:\\\/\\\/lyonb2b.co.uk\\\/15407-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"cart_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15407-cart_default\\\/hydrapak-contour-3l.jpg\",\"width\":125,\"height\":125},\"home_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15407-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"medium_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15407-medium_default\\\/hydrapak-contour-3l.jpg\",\"width\":452,\"height\":452},\"large_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15407-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800}},\"small\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15407-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"medium\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15407-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"large\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15407-large_default\\\/hydrapak-contour-3l.jpgche 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
8-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"large\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15408-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800},\"legend\":\"\",\"cover\":null,\"id_image\":\"15408\",\"position\":\"5\",\"associatedVariants\":[]},{\"bySize\":{\"small_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15409-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"cart_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15409-cart_default\\\/hydrapak-contour-3l.jpg\",\"width\":125,\"height\":125},\"home_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15409-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"medium_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15409-medium_default\\\/hydrapak-contour-3l.jpg\",\"width\":452,\"height\":452},\"large_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15409-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800}},\"small\":{\"u 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
2,\"height\":452},\"large_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15410-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800}},\"small\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15410-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"medium\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15410-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"large\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15410-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800},\"legend\":\"\",\"cover\":null,\"id_image\":\"15410\",\"position\":\"7\",\"associatedVariants\":[]},{\"bySize\":{\"small_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15411-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"cart_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15411-cart_default\\\/hydrapak-contour-3l.jpg\",\"width\":125,\"height\":125},\"home_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15411-home_default\\\/hydrapa= 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 uk\\\/15412-cart_default\\\/hydrapak-contour-3l.jpg\",\"width\":125,\"height\":125},\"home_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15412-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"medium_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15412-medium_default\\\/hydrapak-contour-3l.jpg\",\"width\":452,\"height\":452},\"large_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15412-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800}},\"small\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15412-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"medium\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15412-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"large\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15412-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800},\"legend\":\"\",\"cover\":null,\"id_image\":\"15412\",\"position\":\"9\",\"associatedVariants\":[]},{\"bySize\":{\"small_default\":age = Date.now() - updatedAt.getTime();
if (age r-3l.jpg\",\"width\":800,\"height\":800},\"legend\":\"\",\"cover\":null,\"id_image\":\"15421\",\"position\":\"10\",\"associatedVariants\":[]},{\"bySize\":{\"small_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15422-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"cart_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15422-cart_default\\\/hydrapak-contour-3l.jpg\",\"width\":125,\"height\":125},\"home_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15422-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"medium_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15422-medium_default\\\/hydrapak-contour-3l.jpg\",\"width\":452,\"height\":452},\"large_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15422-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800}},\"small\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15422-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"medium\":{\"url\":\"https:\\\/\\\/lyonb2b.co.u 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:800}},\"small\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"medium\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"large\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800},\"legend\":\"\",\"cover\":\"1\",\"id_image\":\"15324\",\"position\":\"1\",\"associatedVariants\":[]},\"has_discount\":false,\"discount_type\":null,\"discount_percentage\":null,\"discount_percentage_absolute\":null,\"discount_amount\":null,\"discount_amount_to_display\":null,\"price_amount\":19.78999999999999914734871708787977695465087890625,\"unit_price_full\":\"\",\"show_availability\":true,\"availability_date\":null,\"availability_message\":\"In Stock\",\"availability\":\"available\"}' role=\"tabpanel\" style=\"box-sizing: inherit; opacity: 1; transition: opacity 0.15s linear 0s; display: block; margin-bottom: 20px; onStorage.getItem('_stoq_pls') || '0', 10) || 0) + 1;
window.sessionStorage.setItem('_stoq_pls', String(_stoqPageSeq));
} catch (e) { /* sessionStorage unavailable (private mode) — leave 0 */ }
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 || '',
// Buyer's storefront country (localization.country.iso_code). Seeds the
// pixel's extension_details blob so it rides forward onto Shopify's native
// events too — a market can span countries, so this is the finer signal.
country_code: _stoqInitConfig.countryIsoCode || '',
detected_variant_ids: _stoqDetectedVariantIds,
selected_variant_id: _stoqSelectedVariantId || '',
page_load_seq: _stoqPageSeq,
liquid_rendered_at: _stoqInitConfig.liquidRenderedAt || 0,
app_version
livery_out_stock\":\"\",\"id_category_default\":\"77\",\"on_sale\":\"0\",\"online_only\":\"0\",\"ecotax\":0,\"minimal_quantity\":\"1\",\"low_stock_threshold\":null,\"low_stock_alert\":\"0\",\"price\":\"\\u00a319.79\",\"unity\":\"\",\"unit_price_ratio\":\"0.000000\",\"additional_shipping_cost\":\"0.00\",\"customizable\":\"0\",\"text_fields\":\"0\",\"uploadable_files\":\"0\",\"redirect_type\":\"301-category\",\"id_type_redirected\":\"0\",\"available_for_order\":\"1\",\"available_date\":\"0000-00-00\",\"show_condition\":\"0\",\"condition\":\"new\",\"show_price\":\"1\",\"indexed\":\"1\",\"visibility\":\"both\",\"cache_default_attribute\":\"0\",\"advanced_stock_management\":\"0\",\"date_add\":\"2023-03-07 15:41:12\",\"date_upd\":\"2024-07-12 18:42:10\",\"pack_stock_type\":\"3\",\"meta_description\":\"\",\"meta_keywords\":\"\",\"meta_title\":\"\",\"link_rewrite\":\"hydrapak-contour-3l\",\"name\":\"Hydrapak Contour 3L\",\"description\":\"\u0026lt;p\u0026gt;Smart design meets peak performance. We developed our innovarm 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.closest('form');
var vidEl = form && form.querySelector('[name="id"]');
var variantId =
k.marketId || '',
country_code: _sqTrack.countryIsoCode || '',
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 a like-typed compare.
is_preordted Nylon Fabric\u0026lt;\\\/li\u0026gt;\\n\u0026lt;\\\/ul\u0026gt;\",\"description_short\":\"\",\"available_now\":\"In Stock\",\"available_later\":\"Out of Stock - Backorder\",\"id\":6514,\"id_product\":6514,\"out_of_stock\":2,\"new\":0,\"id_product_attribute\":\"0\",\"quantity_wanted\":1,\"extraContent\":[],\"allow_oosp\":1,\"category\":\"reservoirs\",\"category_name\":\"Reservoirs\",\"link\":\"https:\\\/\\\/lyonb2b.co.uk\\\/reservoirs\\\/6514-hydrapak-contour-3l-834456003182.html\",\"attribute_price\":0,\"price_tax_exc\":19.78999999999999914734871708787977695465087890625,\"price_without_reduction\":19.78999999999999914734871708787977695465087890625,\"reduction\":0,\"specific_prices\":[],\"quantity\":237,\"quantity_all_versions\":237,\"id_image\":\"gb-default\",\"features\":[{\"name\":\"Capacity\",\"value\":\"3L\",\"id_feature\":\"14\",\"position\":\"9\"}],\"attachments\":[],\"virtual\":0,\"pack\":0,\"packItems\":[],\"nopackprice\":0,\"customization_required\":false,\"rate\":20,\"tax_name\":\"VAT UK 20%\",\instock_variant: (function () {
var has = function (a) { return Array.isArray(a) && a.indexOf(_sqVidNum) !== -1; };
return has(_sqTrack.inStockVariantIds) ||
has(_sqTrack.cachedInStockVariantIds &&
_sqTrack.cachedInStockVariantIds.in_stock_variant_ids);
})(),
// The enrolled plan's Shopify selling-plan id + inventory_provider (stoq = STOQ tracks
// the OOS count; shopify = in-stock preorder). Tells order-debug what kind of preorder
// the Buy Now bypassed, without a downstream lookup.
enrolled_plan_id: (_sqPlan && (_sqPlan.shopify_selling_plan_id || _sqPlan.shopify_selling_plan_group_id)) || '',
enrolled_plan_provider: (_sqPlan && _sqPlan.inventory_provider) || '',
block_enabled: !!(_sqTrack.cachedSettings && _sqTrack.cachedSettings.block_accelerated_checkout),
gate_armed: !!_sqTrack.acceleratedGateArmed,
gate_activehydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"medium\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"large\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800},\"legend\":\"\",\"cover\":\"1\",\"id_image\":\"15324\",\"position\":\"1\",\"associatedVariants\":[]},{\"bySize\":{\"small_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15325-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"cart_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15325-cart_default\\\/hydrapak-contour-3l.jpg\",\"width\":125,\"height\":125},\"home_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15325-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"medium_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15325-medium_default\\\/hydrapak-contour-3l.jpg\",\"width\":452,\"height\":452},\"large_default\":{\"url\":\"https:\\\/\\\ return settings;
}
console.debug(`STOQ - Applying translations for normalized locale: ${normalizedLocale} (original: ${window._RestockRocketConfig.locale})`);
const translatedFields = translations[normalizedLocale];
if (translatedFields && typeof translatedFields === 'object') {
Object.keys(translatedFields).forEach(function(key) {
const value = translatedFields[key];
if (value !== null && value !== undefined && value !== '') {
settings[key] = value;
}
});
} else {
console.debug('STOQ - No translated fields found for locale:', normalizedLocale);
}
delete settings.translations;
return settings;
} catch (e) {
console.debug('STOQ - error applying translations:', e);
return settings;
}
}
// Setup event listener for cart selling plan updates
// This must be called before any scripts are loaded to avoid race conditions
function setupCartSellingPlanUpdater(settings) {
fault\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15406-medium_default\\\/hydrapak-contour-3l.jpg\",\"width\":452,\"height\":452},\"large_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15406-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800}},\"small\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15406-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"medium\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15406-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"large\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15406-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800},\"legend\":\"\",\"cover\":null,\"id_image\":\"15406\",\"position\":\"3\",\"associatedVariants\":[]},{\"bySize\":{\"small_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15407-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"cart_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15407-cart_default\\\/hydrapak-contour-3l.jpg\",\"widtned `cachedSettings` comes from the app-embed Liquid render, which
// Shopify edge-caches and can serve stale. Reading the same `settings` metafield
// back over the Storefront API is a POST to /api/
t\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"cart_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15408-cart_default\\\/hydrapak-contour-3l.jpg\",\"width\":125,\"height\":125},\"home_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15408-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"medium_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15408-medium_default\\\/hydrapak-contour-3l.jpg\",\"width\":452,\"height\":452},\"large_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15408-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800}},\"small\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15408-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"medium\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15408-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"large\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15408-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800},\"legend\":\"\",\"cversion>/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:
":259,\"height\":259},\"large\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15409-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800},\"legend\":\"\",\"cover\":null,\"id_image\":\"15409\",\"position\":\"6\",\"associatedVariants\":[]},{\"bySize\":{\"small_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15410-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"cart_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15410-cart_default\\\/hydrapak-contour-3l.jpg\",\"width\":125,\"height\":125},\"home_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15410-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"medium_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15410-medium_default\\\/hydrapak-contour-3l.jpg\",\"width\":452,\"height\":452},\"large_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15410-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800}},\"small\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15410-small_derefrontSettings = 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:\\\/\\\/lyonb2b.co.uk\\\/15411-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800}},\"small\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15411-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"medium\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15411-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"large\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15411-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800},\"legend\":\"\",\"cover\":null,\"id_image\":\"15411\",\"position\":\"8\",\"associatedVariants\":[]},{\"bySize\":{\"small_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15412-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"cart_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15412-cart_default\\\/hydrapak-contour-3l.jpg\",\"width\":125,\"height\":125},\"home_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15412-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"mTOQ - 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 ' +",\"width\":125,\"height\":125},\"home_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15421-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"medium_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15421-medium_default\\\/hydrapak-contour-3l.jpg\",\"width\":452,\"height\":452},\"large_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15421-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800}},\"small\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15421-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"medium\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15421-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"large\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15421-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800},\"legend\":\"\",\"cover\":null,\"id_image\":\"15421\",\"position\":\"10\",\"associatedVariants\":[]},{\"bySize\":{\"small_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15422-smaipts. 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 || [];
:\"\",\"cover\":null,\"id_image\":\"15422\",\"position\":\"11\",\"associatedVariants\":[]}],\"cover\":{\"bySize\":{\"small_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"cart_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-cart_default\\\/hydrapak-contour-3l.jpg\",\"width\":125,\"height\":125},\"home_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-home_default\\\/hydrapak-contour-3l.jpg\",\"width\":259,\"height\":259},\"medium_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-medium_default\\\/hydrapak-contour-3l.jpg\",\"width\":452,\"height\":452},\"large_default\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-large_default\\\/hydrapak-contour-3l.jpg\",\"width\":800,\"height\":800}},\"small\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-small_default\\\/hydrapak-contour-3l.jpg\",\"width\":98,\"height\":98},\"medium\":{\"url\":\"https:\\\/\\\/lyonb2b.co.uk\\\/15324-home_default\\\/hydrapak-contn,
// 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
2:10\",\"pack_stock_type\":\"3\",\"meta_description\":\"\",\"meta_keywords\":\"\",\"meta_title\":\"\",\"link_rewrite\":\"hydrapak-contour-3l\",\"name\":\"Hydrapak Contour 3L\",\"description\":\"\u0026lt;p\u0026gt;Smart design meets peak performance. We developed our innovative, new Contour\\u2122 reservoir to be lightweight, low profile and rugged. A 3D bottom, Shape-Loc\\u2122 baffles and side exit port combine to provide superior fit and performance in the widest variety of packs for extended backpacking and hiking adventures.\u0026lt;\\\/p\u0026gt;\\n\u0026lt;ul style=\\\"list-style-type:disc;\\\"\u0026gt;\\n\u0026lt;li\u0026gt;UNIVERSAL HANGER: Compatible with clips, hooks \u0026amp;amp; loops in a wide range of packs.\u0026lt;\\\/li\u0026gt;\\n\u0026lt;li\u0026gt;COMET\\u2122 BITE VALVE: Lightweight, self-sealing valve can be opened \u0026amp;amp; locked with one hand.\u0026lt;\\\/li\u0026gt;\\n\u0026lt;li\u0026gt;GRAB HANDLE: Soft touch flexible handle simplifies filling \u0026amp;amp; carrying.\u0026lt
The Plus Front Bike Light - A super-bright light that can be mounted on your bike or clipped onto your clothing, helmet, backpack etc. Equally impressive as a primary or secondary bike light, Plus is perfect for commuters and road cyclists alike.
Burundi (BIFFr)
Our most versatile bike light ever. Mount to your handlebar, front fork, or remove from the mount and clip it onto just about anything.
Be seen from up to 450 metres away
Latest COB Technology - Efficient Chip on Board (COB) LEDs provide maximum brightness level for up to 90% of the battery burn time.
Integrated USB Connector - Plus plugs directly into USB-A ports & is designed to be exposed to the elements. Just remove from its magnetic mount and you're ready to charge.
Charge Indicators - When Plus is running low on battery, a red ring will light up around the button. This ring will also show when charging, and turn off once fully charged
Cape Verde (CVE$)
Mount It Or Wear It - Mount on the handlebar, head tube, forks‥ anything goes. Or remove from the mount and it now doubles as a wearable running light or versatile camping light.
Specifications:
Bulb Type - Chip On Board (COB) LEDs
Central African Republic (XAFCFA)
Light Output - 40 Lumen
Run Time - Eco-Flash: 40 hrs, Steady: 2 hrs
Charge Time - 2 hrs
Waterproof - Yes, IP67 rating
Chad (XAFCFA)
Light Modes - 5
Fits Handle Bars - 22 - 32mm+ diameter
Rechargable - Yes (integrated USB-A connector)
Dimensions - H: 66 mm x W: 24 mm x L: 14 mm
Comoros (KMFFr)
Weight - 17 grams
Low Battery Indicator - Yes
Straps - Small (22 - 32 mm) & large included (Up to 200 mm)
Operating Temperature - -20 to 50 °C / -4 to 122 °F
Congo - Brazzaville (XAFCFA)
Optimum Charging Temperature -20 to 22 °C / 68 to 72 °F (Room Temperature)
Product Type Front Lights
Output 40 Lumen
Position Front
Congo - Kinshasa (CDFFr)
Power Source Rechargeable Battery