Equipped with a 1X11 Speed GRX Drivetrain, Hope 20Five wheels and a range of other nice parts! Get in touch to buy your next bike through ProjektRide ☎️
Share
Adventure Cycling Scotland
{
"@context": "http://schema.org",
"@type": "Article",
"articleBody": "This custom build Singular Peregrine\nEquipped with a 1X11 Speed GRX Drivetrain, Hope 20Five wheels and a range of other nice parts! Get in touch to buy your next bike through ProjektRide ☎️\n \n",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https:\/\/projektride.co.uk"
},
"headline": "Custom Build - Singular Peregrine",
"image": [
"https:\/\/projektride.co.uk\/cdn\/shop\/articles\/DSC01544_1024x.jpg?v=1708806264"
],
"datePublished": "2024-02-24T20:24:23Z",
"dateCreated": "2024-02-24T20:24:24Z",
"author": {
"@type": "Person",
"name": "andy graham"
},
"publisher": {
"@type": "Organization",
"name": "ProjektRide"
}
}
845c/restockrocket-1-553/assets/restockrocket-collection-bis.js'
window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1)
// Canary override (STOQ-1287): prefer the Render host emitted into the
// metafield-cached settings (api_host) when present, mirroring the same
// override in assets/js/api.js. cachedSettings is populated above. Falls
// back to the build-baked host for shops without the use_render_api_host
// toggle (or environments where THEME_EXTENSION_API_HOST is unset), so the
// setting.json + fetchEmbedConfig calls below route to the same host as the
// rest of the extension's API traffic instead of staying on the baked host.
window._RestockRocketConfig.host = (window._RestockRocketConfig.cachedSettings && window._RestockRocketConfig.cachedSettings.api_host) || 'https://app.restockrocket.io'
// Deployed extension build number, read from the CDN asset host Shopify generat
es:
// https://cdn.shopify.com/extensions//<
handle>-che age
if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) {
console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh');
window._RestockRocketConfig.isLiquidCacheFresh = true;
window._RestockRocketConfig.liquidCacheAge = null;
} else {
const now = Math.floor(Date.now() / 1000); // Current time in seconds
const liquidCacheAge = now - liquidRenderedAt; // Age in seconds
// Surfaced into funnel events: a stale cache means the app rendered with
// outdated inventory/selling-plan data — a real "had the opportunity but
// failed" cause. Negative (client clock ahead) clamps to 0.
window._RestockRocketConfig.liquidCacheAge = Math.max(0, liquidCacheAge);
// Handle client clock ahead of server
if (liquidCacheAge
<