{ "@context": "http://schema.org", "@type": "Organization", "name": "ProjektRide","sameAs": [ null, null, null, null, null, null, null ], "url": "https:\/\/projektride.co.uk" }
console.log("pr-product-page");
Header Image

{ "@context": "http://schema.org", "@type": "Article", "articleBody": "Genesis Equilibrium — Lightweight All-Rounder\nThe standard Genesis Equilibrium model offers similar versatility to the Disc variant but with rim brakes, making it lighter and ideal for riders prioritizing efficiency and simplicity. Perfect for long-distance road, light gravel, or commuting.\nThe Tech: Efficient Aluminium Frame\n\n\nLightweight aluminium frame with endurance geometry\n\n\nCarbon fork for smooth ride quality\n\n\nRim brakes for reduced weight and simplicity\n\n\nShimano drivetrain optimized for consistent, reliable shifts\n\n\nThe Benefit: Smooth, fatigue-free rides across various surfaces, with a responsive and predictable feel.\nThe \"Sag\": Aluminium frame flex and tyre compliance smooth out bumps and vibrations, preserving comfort over long distances.\nWhy It’s Different\n\n\nLightweight Design: Prioritizes efficiency for longer rides\n\n\nEndurance Geometry: Maintains rider comfort across multiple hours\n\n\nVersatile Use: Road or light gravel riding without compromise\n\n\nIs It Right For You?\n\n\nGravel and road riders seeking lightweight efficiency\n\n\nLong-distance cyclists\n\n\nRiders who want comfort and predictable handling\n\n\nAvailable at ProjektRide Bike Shop in Edinburgh.", "mainEntityOfPage": { "@type": "WebPage", "@id": "https:\/\/projektride.co.uk" }, "headline": "Genesis Equilibrium — Lightweight All-Rounder", "datePublished": "2026-01-16T16:00:23Z", "dateCreated": "2026-01-16T16:00:37Z", "author": { "@type": "Person", "name": "andy graham" }, "publisher": { "@type": "OrgaNewer Post → nization", "name": "ProjektRide" } }

Newsletter

Subscribe for updates

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 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; } } // Setup event listener for cart selling plan updates // This must be called before any scripts are loaded to avoid race conditions function setupCartSellingPlanUpdater(settings) { // Setup listener regardless - updateCartSellingPlans has its own guards // This ensures cleanup happens even when preorders are disabled globally // Listen for stoq:inventory-data-loaded event dispatched by api.js window.addEventListener('stoq:inventory-data-loaded', function(event) { console.debug('STOQ - Inventory data loaded, updating cart selling plans'); if (window._RestockRocket