span class="visually-hidden">Trek Speed Concept SLR Frame Set
>
Trek Speed Concept SLR Frame Set
£5,825.00
Trek Madone SLR Gen 8 Frame Set
<a class="product__media product__media--featured"
href="/collections/mountain-bikes-1/products/trek-madone-slr-gen-8-frame-set-1"
title="Trek Madone SLR Gen 8 Frame Set"
aria-label="Trek Madone SLR Gen 8 Frame Set"
style="background-image: url(//projektride.co.uk/cdn/shop/files/MadoneSLRDiscFrameset-25-46775-B-Primary_1_600x.webp?v=1736608593)">
£<span class="visually-hidden">Trek Madone SLR Gen 8 Frame Set
>
<
div class="product__media-hover-img product__media" style="background-image: url(//projektr
ide.co.uk/cdn/shop/files/MadoneSLRDiscFrameset-25-46775-A-Primary_1_600x.webp?v=1736608602)">
Trek Madone SLR Gen 8 Frame Set
£4,575.00
Multi Colour
Black
<
a class="product__media product__media--featured"
href="/collections/mountain-bikes-1/products/trek-speed-concept-rim-frame-set"
title="Trek Speed Concept Rim Frame Set"
aria-label="Trek Speed Concept Rim Frame Set"
style="background-image: url(//projektride.co.uk/cdn/shop/files/1485100_2018_A_1_Speed_Concept_7_FS_600x.webp?v=1736604700)">
<
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/SpeedConceptFS_22055_A_Alt1_600x.webp?v=1736604707)">
<
span class="visually-hidden">Trek Madone SLR Gen 8 Frame Set
>
Burgtec
<
a class="product__media product__media--featured"
href="/collections/mountain-bikes-1/products/trek-madone-slr-gen-6-frame-set"
title="Trek Madone SLR Gen 6 Frame Set"
aria-label="Trek Madone SLR Gen 6 Frame Set"
style="background-image: url(//projektride.co.uk/cdn/shop/files/MadoneSLRDiscFrameset_22_33044_B_Primary_600x.webp?v=1736603745)">
<
>
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/MadoneSLRDiscFrameset_21_33044_A_Primary_600x.webp?v=1736603754)">
<
span class="visually-hidden">Trek Madone SLR Gen 6 BB90 Rim Frame Set
>
Knog
<
a class="product__media product__media--featured"
href="/collections/mountain-bikes-1/products/trek-madone-sl-gen-8-frame-set"
title="Trek Madone SL Gen 8 Frame Set"
aria-label="Trek Madone SL Gen 8 Frame Set"
style="background-image: url(//projektride.co.uk/cdn/shop/files/MadoneSLDiscFrameset-25-46766-B-Primary_600x.webp?v=1736600669)">
<
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/MadoneSLDiscFrameset-25-46766-C-Primary_600x.webp?v=1736600671)">
<
span class="visually-hidden">Trek Madone SL Disc Gen 6 Frame Set
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/EmondaALR5Disc_21_24166_B_Alt2_600x.webp?v=1728747094)">
<
span class="visually-hidden">Trek Émonda ALR 6
>
NEW
<
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/EmondaALR6_23_36957_A_Alt2_600x.webp?v=1728746813)">
<
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/EmondaSL6Disc_21_32561_B_Alt2_600x.webp?v=1728738977)">
<
span class="visually-hidden">Trek Émonda SL 6 Disc Pro
Trek Émonda SL 6 Disc Pro
From £3,510.00
Black
Red
Trek Émonda SL 6 Pro Di2
<
a class="product__media product__media--featured"
href="/collections/mountain-bikes-1/products/trek-emonda-sl-6-pro-di2"
title="Trek Émonda SL 6 Pro Di2"
aria-label="Trek Émonda SL 6 Pro Di2"
style="background-image: url(//projektride.co.uk/cdn/shop/files/EmondaSL6Pro_23_36977_B_Primary_600x.webp?v=1728737553)">
<
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/EmondaSL6_23_36958_A_Primary_600x.webp?v=1728737486)">
Working Hours
ProjektRide
Juan Borges Designs
led":false,"push_allowed":false,"storefront_form_push_label":"Push","storefront_form_push_description":"Click 'Allow' to be notified via push notification","storefront_form_push_error":"Permission rejected! Please review notification settings and try again","storefront_font_family":"OpenSans","insert_button_after_selector_collection_type":"afterend","show_channel_selector":false,"storefront_form_empty_error":"Please fill in one or more of the options above","storefront_form_push_input":"Send notification to your browser","insert_button_after_selector_page":null,"show_button_on_page":false,"insert_button_after_selector_search":null,"show_button_on_search":false,"app_proxy_path_prefix":"/apps/restockrocket-production","collection_link_selector":"","index_link_selector":"","page_link_selector":"","search_link_selector":"","collection_check_link_visibility":true,"collection_buttons_container":null,"index_buttons_container":null,"page_buttons_container":null,"search_buttons_container":null,"extension_enable_url_va
riant_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_page_form_selector":"form[action*=\"/cart/add\"]","preorder_page_add_to_cart_button_selector":
iption_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","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_descripti
on":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","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":nu
IndexOf('/') + 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) {
if (!settings.translations) {
// Translations enabled but no 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 ob
ject 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
!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
];
if (value !== null && value !== undefined && value !== '') {
settings[key] = value;
}
});
} else {
console.debug('STOQ - No translated fields found for