The ENVE M9 Mountain Handlebar is a race-proven DH bar built to win on the world's toughest tracks thanks to a downhill-tuned flex profile that sets the standard for others to follow.
At 810mm wide the M9 is the widest in the M Series range to give maximum control. If you prefer things a little narrower, ENVE has provided trim marks that allow you to cut the bar down to 780mm without compromising that all-important ride feel or strength.<
null,"page_buttons_container":null,"search_buttons_container":null,"extension_enable_url_variant_detection":true,"extension_enable_value_variant_detection":true,"extension_value_variant_selector":"[name='id']","resubscribe_text":"This product is out of stock. Get notified when it's restocked again by entering your details below!","preorder_enabled":true,"preorder_buy_button_selector":null,"preorder_add_to_cart_button_selector":"","preorder_badge_selector":"","preorder_button_out_of_stock_text":"Out of stock","preorder_button_add_to_cart_text":"Add to cart","preorder_form_selector":"form[action*=\"/cart/add\"]","preorder_collection_enabled":false,"preorder_collection_form_selector":"form[action*=\"/cart/add\"]","preorder_collection_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_index_enabled":false,"preorder_index_form_selector":"form[action*=\"/cart/add\"]","preorder_index_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_page_enabled":false,"preorder_pag
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,"shipping_text":"Estimated to ship within 2 months","pay
","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_timer_use_schedule_dates":true,"countdown_timer
569712447871,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,"shipping_text":"Estimated to ship within 2 months","payme
own to just 136 x 39 x 25 cm for easy storage when not in use\u003c\/li\u003e\n\u003cli\u003eCompatible with Add-On Accessories – Use with Road Bike Adapter Disc, Road Bike Aluminium Stand, or Bike Stand for extra support and secure fit (sold separately)\u003c\/li\u003e\n\u003cli\u003eLarge Capacity – Supports bikes with wheelbases up to 126 cm\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003eThe Evoc Bike Travel Bag is ideal for cyclists and bikepackers flying with their bikes, road and triathlon racers traveling internationally, mountain bikers transporting full-suspension or 29” bikes, as well as gravel riders and endurance cyclists needing a reliable, collapsible bike case.\u003c\/p\u003e\n\u003cp\u003eProtect your ride wherever you go with the Evoc Bike Travel Bag, the trusted, lightweight, and durable solution for safe bike transportation across all disciplines.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e","published_at":"2025-11-14T10:25:45+00:00","created_at":"2025-11-14T10:25:43+00:00",
e"],"media":[{"alt":null,"id":68676818338175,"position":1,"preview_image":{"aspect_ratio":1.0,"height":1946,"width":1946,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/EVTVLBAG_51325.jpg?v=1763115823"},"aspect_ratio":1.0,"height":1946,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/EVTVLBAG_51325.jpg?v=1763115823","width":1946},{"alt":null,"id":68676824465791,"position":2,"preview_image":{"aspect_ratio":1.0,"height":2000,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/camev726265_3_aug24.jpg?v=1763115855"},"aspect_ratio":1.0,"height":2000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/camev726265_3_aug24.jpg?v=1763115855","width":2000}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003ch2 class=\"col-1 product-section-header productName\"\u003eEvoc Bike Travel Bag - Black\u003c\/h2\u003e\n\u003cdiv id=\"ModularLongDescription\" class=\"col-1 longDesc\"\u003e\n\u003cdiv id=\"longDescription\" class=\"col-1 removeStyles\"\u003e\n\u00
– Offers the impact resistance of a hard case with the lightweight flexibility of a soft bag\u003c\/li\u003e\n\u003cli\u003eIncludes New Polycarbonate Bike Block – Enhances bike frame fixation and stability during transport\u003c\/li\u003e\n\u003cli\u003eCompact \u0026amp; Collapsible Design – Folds down to just 136 x 39 x 25 cm for easy storage when not in use\u003c\/li\u003e\n\u003cli\u003eCompatible with Add-On Accessories – Use with Road Bike Adapter Disc, Road Bike Aluminium Stand, or Bike Stand for extra support and secure fit (sold separately)\u003c\/li\u003e\n\u003cli\u003eLarge Capacity – Supports bikes with wheelbases up to 126 cm\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003eThe Evoc Bike Travel Bag is ideal for cyclists and bikepackers flying with their bikes, road and triathlon racers traveling internationally, mountain bikers transporting full-suspension or 29” bikes, as well as gravel riders and endurance cyclists needing a reliable, collapsible bike case.\u003c\/p\u003e\n\u003cp\indow._RestockRocketConfig.selected_variant_available = window._RestockRocketConfig.product.variants.find(function(variant) { return variant.id == window._RestockRocketConfig.selected_variant_id }).available;window._RestockRocketConfig.scriptUrlProduct = 'https://cdn.shopify.com/extensions/019cd40b-736e-74a5-adbe-431365bfd910/restockrocket-1-465/assets/restockrocket-product.js'
window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019cd40b-736e-74a5-adbe-431365bfd910/restockrocket-1-465/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
const LIQUID_CACHE_MAX_AGE = 2 * 60 * 60; // 2 hours in seconds
// Calculate Liquid cache freshness once at initialization
const liquidRenSee More<
<
translation data in metafield
// Metafield hasn't been backfilled yet - force refresh
console.debug('STOQ - multi-language enabled but no translation data in cache, fetching fresh');
return null;
}
// Translations object exists in metafield - cache is valid
// If current locale isn't translated, applyTranslations will gracefully use default locale from base fields
if (window._RestockRocketConfig.normalizedLocale &&
!Object.prototype.hasOwnProperty.call(settings.translations, window._RestockRocketConfig.normalizedLocale)) {
console.debug('STOQ - locale not explicitly translated, will use default language from cache');
}
// Don't return null - continue using cache even for untranslated locales
}
const updatedAt = new Date(settings.updated_at);
if (isNaN(updatedAt.getTime())) {
console.debug('STOQ - Invalid updated_at date format in settings');
return null;
}
const
<
Hope!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
&& window._RestockRocket.updateCartSellingPlans) {
window._RestockRocket.updateCartSellingPlans()
.then(hasUpdates => {
if (hasUpdates) {
console.debug('STOQ - cart selling plans updated successfully');
} else {
console.debug('STOQ - no cart selling plan updates needed');
}
})
.catch(error => {
console.error('STOQ - error updating cart selling plans:', error);
});
}
});
}
// 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.S