CUBE KATHMANDU HYBRID PRO 800 LIZARD/BLACKTristan da Cunha (GBP£)
.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;
}
}
function setupCartSellingPlanUpdater(settings) {
window.addEventListener('stoq:inventory-data-loaded', function(event) {
console.debug('STOQ - Inventory data loaded, updating cart selling plans');
if (window._RestockRocket && window._RestockRocket.updateCartSellingPlans) {
window._RestockRocket.updateCartSellingPlans()
.then(hasUpdates => {
if (hasUpdates) {
console.debug('STOQ - cart selling plans updated successfully');
} else {
console.debu
g('STOQ - no cart selling plan updates needed');
}
})
.catch(error => {
console.error('STOQ - error updating cart selling plans:', error);
});
}
});
}
function storefrontGraphql(query, variables) {
const cfg = window._RestockRocketConfig;
if (!cfg.storefrontAccessToken || cfg.disableStorefrontApi === true) {
return Promise.reject(new Error('Storefront API unavailable'));
}
return fetch(
`https://${cfg.shop}/api/${cfg.storefrontApiVersion}/graphql.json`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Shopify-Storefront-Access-Token': cfg.storefrontAccessToken,
},
body: JSON.stringify({ query: query, variables: variables }),
}
)
.then(function(response) {
if (!response.ok) { throw new Error('Storefront API HTTP ' + response.status); }
return response.json();
})
.then(function(body) {
if (body && body .errors && body.errors.length) {
throw new Error('Storefront API errors: ' + body.errors.map(function(e) { return e && e.message; }).join(', '));
}
return body && body.data;
});
}
function fetchStorefrontShopMetafield(key) {
const cfg = window._RestockRocketConfig;
const query = 'query StoqShopMetafield($namespace: String!, $key: String!) { shop { metafield(namespace: $namespace, key: $key) { value } } }';
return storefrontGraphql(query, { namespace: cfg.metafieldNamespace, key: key })
.then(function(data) {
const value = data && data.shop && data.shop.metafield && data.shop.metafield.value;
if (!value) { throw new Error('Storefront API returned no ' + key + ' metafield value'); }
return JSON.parse(value);
});
}
(function loadStorefrontSettings() {
const cfg = window._RestockRocketConfig;
if (!cfg.storefrontAccessToken || cfg.disableStorefrontApi === true) return;
function run() {
// The live-settings read is one more shop
-level metafield fetch, so it
// shares fetchStorefrontShopMetafield with the integrations/selling_plans
// reads rather than re-issuing the same query + parse.
fetchStorefrontShopMetafield('settings')
.then(function(settings) {
cfg.storefrontSettings = settings;
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);
}
})();
const cachedSettings = window._RestockRocketConfig.cachedSettings;
const validCachedSettings = cachedSettings ? checkSettingsExpiry(cachedSettings) : null;
if (validCachedSettings) {
console.debug('STOQ - using cached settings');
initializeScripts(validCachedSettings);
} else {
consolhShopConfig(source) {
const cfg = window._RestockRocketConfig;
const viaEmbed = function() { return fetchEmbedConfig(source.endpoint, source.apply); };
const flagOn = !!cfg.readFlags && cfg.readFlags[source.flag] === true;
if (!flagOn || source.embedOnly === true) { return viaEmbed(); }
return fetchStorefrontShopMetafield(source.metafieldKey)
.then(function(value) {
if (!source.isValid(value)) { throw new Error(source.metafieldKey + ' metafield is not a valid ' + source.endpoint + ' payload'); }
source.apply(value);
console.debug('STOQ - refreshed ' + source.endpoint + ' from the Storefront API');
})
.catch(function(error) {
console.debug('STOQ - Storefront ' + source.endpoint + ' read failed, using embed:', error.message);
return viaEmbed();
});
}
function refreshIntegrations() {
const cfg = window._RestockRocketConfig;
return refreshShopConfig({
endpoint: 'integrations',
metafieldKey: 'integrations',
flag: 'enable_storefront_integrations_read',
isValid: function(value) { return Array.isArray(value); },
apply: function(data) {
cfg.integrations = data;
}
});
}
function refreshSellingPlans(embedOnly) {
const cfg = window._RestockRocketConfig;
return refreshShopConfig({
embedOnly: embedOnly === true,
endpoint: 'selling_plans',
metafieldKey: 'cachedSellingPlans',
flag: 'enable_storefront_selling_plans_read',
isValid: function(value) { return !!value && Array.isArray(value.plans); },
apply: function(data) {
cfg.sellingPlans = data.plans;
cfg.disabledSellingPlanIds = data.disabled_plan_ids || [];
if (data && data.read_flags && typeof data.read_flags === 'object' && !Array.isArray(data.read_flags)) {
cfg.readFlags = data.read_flags;
}
}
});
}
function initializeScripts(settings) {
settings = applyTranslations(settings);
window._RestockRocketConfig.settings = settings;
console.debug(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`);
const forceEmbedSellingPlans = settings.force_embed_selling_plans === true;
const staleRefresh = !window._RestockRocketConfig.isLiquidCacheFresh && !settings.disable_refresh_on_stale_liquid;
if (forceEmbedSellingPlans || staleRefresh) {
console.debug('STOQ - refreshing selling_plans' + (staleRefresh ? ' + integrations (Liquid cache stale)' : ' (force_embed_selling_plans)'));
const refreshes = [refreshSellingPlans(forceEmbedSellingPlans)];
if
(staleRefresh) { refreshes.push(refreshIntegrations()); }
Promise.race([
Promise.all(refreshes),
new Promise(function(resolve) { setTimeout(resolve, 1000); })
]).then(function() { loadScripts(settings); });
return;
}
loadScripts(settings);
}
function loadScripts(settings) {
setupCartSellingPlanUpdater(settings);
if(settings.enable_app) {
const hijackIntegration = window._RestockRocketConfig.integrations.find(function(integration) {
return integration.type === 'hijack' && integration.enabled && integration.page_types.includes(window._RestockRocketConfig.pageType);
})
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;
co
The Kathmandu Hybrid Pro by CUBE is all about the freedom of two-wheeled exploration, with a handy Bosch power boost. You can't miss the elegant lines of the Integrated Carrier 3.0, which provides a sturdy base for carrying whatever you need. The Bosch CX drive and 800Wh PowerTube battery, meanwhile, are so neatly incorporated into the frame's design, you'll barely notice them until you start turning the pedals. At which point, the wide range and precise shifting of Shimano's XT 1x12 gears are bound to come in handy, as is the smooth strength of the 4-piston Shimano hydraulic disc brakes when you need to slow down. With a full complement of included accessories including a super-comfortable parallelogram seatpost, the only remaining question is where you'll be headed next...html.stoq-buy-now-pending .shopify-payment-button{pointer-events:none!important}
| Frame | Aluminium Superlite, Gravity Casting Technology, Efficient Comfort Geometry, Boost148, UDH™, Fully Integrated Battery, IC 3.0, Advanced Internal Cable Routing, Integrated Seatclamp |
|---|---|
| Fork | SR Suntour NX1-32 LO Air, Tapered, 15x110mm, 100mm |
| Headset | ACROS AZF-1035, ICR (Integrated Cable Routing), Top Zero-Stack 1 1/2" (ZS 56mm), Bottom Zero-Stack 1 1/2" (ZS 56mm), HIC |
| Stem | CUBE Comfort Stem Pro, 31.8mm, Adjustable |
| Handlebar | CUBE Comfort Trail Bar, 700mm |
| Grips | ACID Travel Comfort |
| Rear derailleur | Shimano XT RD-M8100-SGS, ShadowPlus, 12-Speed |
| Shifters | Shimano Deore SL-M6100-IR, Direct Attach |
| Brakes | Shimano BR-MT420, Hydr. Disc Brake (180) |
| Crankset | ACID MTB Hybrid Pro, 40T |
| Crankset chainring sizes | 40T |
| Cassette | Shimano Deore CS-M6100, 10-51T |
| Number of gears | 12 |
| Chain | KMC e12 |
| Wheelset | ACID SLX 25, 32/32 Spokes, 15x110mm/12x148mm, Tubeless Ready |
| Tires (Front & Rear) | Schwalbe Marathon Efficiency, PerfL, 55-622 |
| Pedals | ACID PP Trekking |
| Saddle | ACID Sequence 180 |
| Seatpost | SR Suntour NVX, 31.6mm |
| Seat post = dropper Yes/No | NO |
| Front light | ACID Front Light PRO-E 150 X-Connect, 12V, DC |
| Rear light | ACID Mudguard Rear Light PRO-E, 12V, DC |
| Kickstand | ACID FM Pure Kickstand |
| Mudguard | ACID 65 Integrated Carrier 3.0 |
| Bell | Reich Cycle Bells Ringsound |
| Carrier | ACID Integrated Carrier 3.0, CUBE Adapter Compatible |
| Engine | Bosch Drive Unit Performance Line CX max. 120Nm (BDU38) |
| Engine ready for the Bosch 120 Nm update? | YES |
| Battery | Bosch PowerTube 800 |
| Charger | Bosch 2A |
| Remote | Bosch LED Remote |
| Display | Bosch Kiox 500 |
| Net weight (kg) | 28.2 |
| Gross weight (kg) | 32.6 |
| Max. system weight (kg) | 140 |
| Max. rider weight (kg) | 110 |
| Body size | 1.66m - 1.76m |
| Accessories | 93339,94799,93483,93354,93592 |
Frequently Asked Questions
-
Please get in touch with a member of the team either by phone (01313745324) or email ([email protected]) where on of the team will be more than happy to help.
ProjektRide Bike Shop Edinburgh
-
If the item is showing in stock, we aim to post the product within 24 hours. Please allow 5 working days to receive the item.
Postage is free on orders over £50. Orders under £50, our postage charge is £3.99.
We also have a physical store, if you are local please pop in -
ProjektRide Bike Shop Edinburgh




Grips
12
Bosch Drive Unit Performance Line CX max. 120Nm (BDU38)
North Macedonia (MKDден)













