Skip to content#shopify-section-announcement-bar {
background: #f14d38;
color: #ccbebe;
}
console.log("pr-product-page");
{
"@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
<
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