This site has limited support for your browser. We recommend switching to Edge, Chrome, Safari, or Firefox.

li class="result"> sisa href="{{ it.product.url }}" class="result__image-link" aria-label='{{ it.product.title }}'>
div class="result__image-img product__media lazyload fade-in" data-bgset="{{ it.product.image.thumb }}" data-aspectratio="{{ it.product.image.aspectRatio }}" data-sizes="auto"> {{@if(it.product.badgeText)}} Singular
div class="product__tag{{ it.product.badgeClasses }}">
>Enigma
> {{/if}} >
> FrogHeader Image>
p class="result__tit <<
  • console.log("pr-product-page");<8.jpg?v=1727450169" alt="Restrap Full Frame Bag - Medium" class="mfp-zoom-in-cur" id="34729052242146">
    Custom Builds
    Cycle To Work Schemes it.product.url }}">{{ it.product.title }} > £129.99
    Increase quantity
    label for="quantity--template--15326745395426__main">Quantity
    >
    Stems input type="number" name="quantity" id="quantity--template--15326745395426__main" value="1" min="1">

    <

    zoom-in-cur" id="34763085283554"> Grips & Bar-TapeBUY
      Add to cart
    • SELLNotify me when this product is available: Headsets RIDE CONFIDENT
    • img src="//projektride.co.uk/cdn/shop/files/FXSport5Carbon-25-47263-A-Alt4_2048x2048.webp?v=1728051061" alt="Trek FX Sport 5" class="mfp-zoom-in-cur" id="34763085578466">

    • Brakes
    • Complete Brakes#ProductTemplate--template--15326745395426__main { background: #ffffff; } .shop-pay-terms { --payment-terms-background-color: #ffffff }Submit

    /eep the bag sitting securely and free of movement while riding.spension Weight - 266g / 320g / 365g (small/medium/large)
    £109.99Capacity - 6L / 7.5L / 9L (small/medium/large)Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable
    <

    <

    >
    • ProjektRidel","option1":"Small","option2":null,"option3":null,"sku":"5324011","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Trek FX Sport 5 - Small","public_title":"Small","options":["Small"],"price":215000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"selling_plan_allocations":[]},{"id":46025418572002,"title":"Medium","option1":"Medium","option2":null,"option3":null,"sku":"5324012","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Trek FX Sport 5 - Medium","public_title":"Medium","options":["Medium"],"price":215000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"selling_plan_allocations":[]},{"id":46025418604770,"title":"Large","option1":"Large","option2":null,"option3":null,"sku":"5324013","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek FX Sport 5 - Large","public_t<
    • block_8gNReH', topPadding: '0', bottomPadding: '0', }); }
    I'm looking to buy this product, when will it arrive and how much does postage cost?
    You're ready to log big miles, and you prefer the feel of a flat handlebar to the drop bars that come stock on most road bikes. You prioritise comfort and performance equally, and expect your bike to grow with you as you advance in speed and distance.
    Cycle to Work.
    Delivery & Returns Hire Lazer Compact Helmet ","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.","preorder_min_quantity":null,"preorder_max_quantity":null,"countdown_timer_enabled":false,"countdown_timer_insert_selector":null,"countdown_timer_insert_selector_type":"afterend","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_timerhe non-drive-side of the bag contains a document pocket, useful for storing smaller items.\u003cbr\u003e\u003cbr\u003eThe bag is made from durable, textured nylon outer and VX21 fabrics, with a wipeable lower section that means the bag is easy to keep clean when riding off-road or in adverse weather. Rubberised strapping provides extra grip to the frame and webbing straps, with easy-to-use cam locking buckles, keep the bag sitting securely and free of movement while riding.\u003cbr\u003e\u003cbr\u003eHand made in our Yorkshire workshop, all bags are finished with the classic Restrap label, made from vegan-friendly PU.\u003cbr\u003e\u003cbr\u003eSKU - RS_FFB_LRG_BLK\u003cbr\u003e\u003cbr\u003eWeight - 266g \/ 320g \/ 365g (small\/medium\/large)\u003cbr\u003eCapacity - 6L \/ 7.5L \/ 9L (small\/medium\/large)\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\u003c\/p\u003e"}; window._RestockRocketConfig.variantsInventoryPolicy = {46007605723362 : "deny",}; window._RestockRocketConfig.variantsInventoryQuantity = 0131 374 5324ame Bag allows you to easily increase the load out you carry for comfortable bikepacking and touring. The bags come in three sizes, designed to fit most standard frames and geometries.\u003c\/span\u003e\u003cbr\u003e\u003cbr\u003e\u003cspan\u003eTwo Aquaguard YKK zips on the drive side of the bag allow easy access to the top and bottom sections of the bag, with internal velcro dividers to separate the compartments. These dividers aid the structure of the bag when fully packed, but also fold away to allow use of the full internal space of the bag if needed. The non-drive-side of the bag contains a document pocket, useful for storing smaller items.\u003c\/span\u003e\u003cbr\u003e\u003cbr\u003e\u003cspan\u003eThe bag is made from durable, textured nylon outer and VX21 fabrics, with a wipeable lower section that means the bag is easy to keep clean when riding off-road or in adverse weather. Rubberised strapping provides extra grip to the frame and webbing straps, with easy-to-use cam locking buckles, keep the bagjs' window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019af0d1-c518-7a22-bdbf-9ceff49063ad/restockrocket-1-402/assets/restockrocket-collection.js' window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1) window._RestockRocketConfig.host = 'https://app.restockrocket.io' const SETTINGS_CACHE_DURATION = 15 * 60 * 1000; // 15 minutes in milliseconds 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) { 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') function applyTranslations(settings) { try { // Skip translation logic entirely if multi-language is not enabled if (!settings || lans after scripts are loaded if (settings.preorder_enabled) { updateCartSellingPlans(); } // Dispatch custom event when app is loaded const appLoadedEvent = new CustomEvent('stoq:loaded', { detail: { pageType: window._RestockRocketConfig.pageType, enabled: settings.enable_app, settings: settings } }); console.debug('STOQ - dispatching app loaded event'); window.dispatchEvent(appLoadedEvent); } } function updateCartSellingPlans() { // Wait for the API to be available with retries const maxRetries = 10; const retryDelay = 500; function attemptCartCheck(attempt = 1) { if (window._RestockRocket && window._RestockRocket.updateCartSellingPlans) { window._RestockRocket.updateCartSellingPlans() .then(hasUpdates => { if (hasUpdates) { console.debug('STOQ - cart selling plans updated successfully'); } else { console.debug(
    !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 || {})); delete settings.translations; 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'STOQ - no cart selling plan updates needed'); } }) .catch(error => { console.error('STOQ - error updating cart selling plans:', error); }); } else if (attempt > 82 Newington Road]; 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; } } // First try to get settings from metafields with expiry check const cachedSettings = window._RestockRocketConfig.cachedSettings; const validCachedSettings = cachedSettings ? checkSettingsExpiry(cachedSettings) : null; if (validCachedSettings) { console.debug('STOQ - using cached settings'); initializeScripts(validCachedSettings); } else { console.debug('STOQ - fetching fresh settings'); const headers = { 'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.Shopify.shop, 'ngrok-skip-browser-warning': 'skip' }; if (window.Shopify?.them<