Header Image

  • Yeti SB165 T-Series 29" / 27.5" Frame £4,699.00
  • Yeti SB165 T-Series 29" / 27.5" Frame - color variant: Teal
#SiteFooter { --PT: 100px; --PB: 10px; --bg-lighten-darken-shimmer-bg: #0d0d0d; --bg-lighten-darken-shimmer-effect: #121212; --text: #ffffff; --text-alpha-15: rgba(255, 255, 255, 0.15); --text-alpha-50: rgba(255, 255, 255, 0.6); --text-alpha-85: rgba(255, 255, 255, 0.85);--border: #ffffff;} #SiteFooter .footer-bottom { --grid-columns: 3; }
#SiteFooter .footer-block--logo { min-width: calc(160px + calc(var(--gutter) / 2)); } #SiteFooter .footer-block__logo-image { width: 160px; }
Quick Links
  • About Us
  • Blog
  • Building Your Bike From the Box
  • Privacy Policy
    • Terms of Service
    • Book a Service
    • Cycle to Work
    • Information
    • Sat: 9:00 - 16:00
    • 0131 374 5324
    • Edinburgh
    • [email protected]
    • Country
    • Botswana (BWPP)
    • British Indian Ocean Territory (USD$)
    • Bulgaria (EUR€)
    • Burkina Faso (XOFFr)
    • Burundi (BIFFr)
    • Cameroon (XAFCFA)
    • Cape Verde (CVE$)
    • Central African Republic (XAFCFA)
    • Chad (XAFCFA)
    • Comoros (KMFFr)
    • Congo - Brazzaville (XAFCFA)
    • Congo - Kinshasa (CDFFr)
    Croatia (EUR€)
Cyprus (EUR€)
  • Denmark (DKKkr.)
  • Djibouti (DJFFdj)
  • Egypt (EGPج.م)
  • Equatorial Guinea (XAFCFA)
  • Eritrea (GBP£)
  • Estonia (EUR€)
    • Eswatini (GBP£)
    • Ethiopia (ETBBr)
    • Faroe Islands (DKKkr.)
    • Finland (EUR€)
    • France (EUR€)
    • French Southern Territories (EUR€)
    • Gabon (XOFFr)
    • Gambia (GMDD)
    • Georgia (GBP£)
    • Germany (EUR€)
    • Ghana (GBP£)
    • Gibraltar (GBP£)
    • Greece (EUR€)
    • Guinea-Bissau (XOFFr)
    • Hungary (HUFFt)
    • Iceland (ISKkr)
    • Ireland (EUR€)
    • Isle of Man (GBP£)
    • Italy (EUR€)
    • Jersey (GBP£)
    • Kenya (KESKSh)
    • Kosovo (EUR€)
    • Latvia (EUR€)
    • Lesotho (GBP£)
    • Liberia (GBP£)
    • Libya (GBP£)
    • Liechtenstein (CHFCHF)
    • Lithuania (EUR€)
    • Luxembourg (EUR€)
    • Madagascar (GBP£)
    • Malawi (MWKMK)
    • Mali (XOFFr)
    • Malta (EUR€)
    • Mauritania (GBP£)
    Morocco (MADد.م.)
Namibia (GBP£)
Niger (XOFFr)
Portugal (EUR€)
  • Serbia (RSDРСД)
    • Uganda (UGXUSh)
    • Ukraine (UAH₴)
    • United Kingdom (GBP£)
    • United States (GBP£)
    • Vatican City (EUR€)
    • Western Sahara (MADد.م.)
    • Zambia (GBP£)
    • Zimbabwe (USD$)
    • © 2026,
    • .
    • Powered by
    • .
    • American Express
    • Diners Club
    • Discover
    • Google Pay
    • Union Pay
    • Visa
  • = LIQUID_CACHE_MAX_AGE) { console.debug(`STOQ - Liquid cache is fresh (${Math.round(liquidCacheAge / 60)} minutes old)`); window._RestockRocketConfig.isLiquidCacheFresh = true; } else { console.debug(`STOQ - Liquid cache is stale (${Math.round(liquidCacheAge / 60)} minutes old, max ${Math.round(LIQUID_CACHE_MAX_AGE / 60)} minutes)`); window._RestockRocketConfig.isLiquidCacheFresh = false; } } function checkSettingsExpiry(settings) { try { if (!settings || !settings.updated_at) { console.debug('STOQ - Invalid settings data structure'); return null; } if (!settings.cache) { console.debug('STOQ - settings caching disabled'); return null; } // Check if translations are enabled but missing from cache // This handles the backfill period where DB has translations but metafield doesn't if (settings.multi_language_enabled) { if (!settings.translations) { // 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 settings'); return null; } const
  • fig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'index' && (settings.show_button_on_index || settings.preorder_index_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'search' && (settings.show_button_on_search || settings.preorder_search_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'page' && (settings.show_button_on_page || settings.preorder_page_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'product') { createRestockRocketScript(window._RestockRocketConfig.scriptUrlProduct); } else if(hijackIntegration) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else { console.debug(`STOQ - no scripts enab led for ${window._RestockRocketConfig.pageType}`); } // Dispatch custom event when app is loaded // Cart selling plan updates will be triggered by stoq:inventory-data-loaded event const appLoadedEvent = new CustomEvent('stoq:loaded', { detail: { pageType: window._RestockRocketConfig.pageType, enabled: settings.enable_app, settings: settings, preorderEnabled: settings.preorder_enabled } }); console.debug('STOQ - dispatching app loaded event'); window.dispatchEvent(appLoadedEvent); } }