£Create account
Search

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

From★★★★★
great shop. Traded in my bike for a second hand road bike. Great service, good prices. Would definitely recommend.
Edinburgh
  • EH9 1QN
    >
    Sell Your Bike
  • Sell Your Bike Projektride's Student bike bundle!Contact Us
  • Contact Us£499.00
  • My Account
    a class="pr
    Cart<
    Open cart

    hop\/products\/Screenshot2021-12-17at13.29.10.png?v=1639747915"},"aspect_ratio":1.0,"height":1178,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2021-12-17at13.29.10.png?v=1639747915","width":1178}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cmeta charset=\"utf-8\"\u003e\n\u003cul class=\"description-overview\" data-mce-fragment=\"1\"\u003e\n\u003cli data-mce-fragment=\"1\"\u003eSuper narrow lightweight 11-speed HG-EV symmetrical design chain for smooth shifts and maximum durability\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eOuter plate design has been developed to reduce the chance of chain suck\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eSil-Tec surface treatment technology (PTFE plating) on inner and outer links that is smooth running and increases durability\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eZinc-Alloy plated outer links\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eThe inner plate has been developed for better contact with gears providing smoother shifting under high load, giving efficient pedalling, increased rigidity and near silent running\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003e5.62 mm chain width, optimised for 11-speed Super Narrow HG-EV drivetrains\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eComes complete with Quick Link which enables fast tool free chain assembly\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eAverage weight 257 grams\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cul class=\"attributesSpecification\" data-mce-fragment=\"1\"\u003e\n\u003cli data-mce-fragment=\"1\"\u003e\n\u003cdiv class=\"label\" data-mce-fragment=\"1\"\u003eSpeed\u003c\/div\u003e\n\u003cdiv class=\"value\" data-mce-fragment=\"1\"\u003e11 Speed\u003c\/div\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e"}; window._RestockRocketConfig.variantsInventoryPolicy = {42170967982306 : "deny",}; window._RestockRocketConfig.variantsInventoryQuantity = {42170967982306 : parseInt("1"),};lations) { // 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 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 se ttings'); return null; } const age = Date.now() - updatedAt.getTime(); if (age
    < 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 || !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 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.s