\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"geo_numbers\" data-mce-fragment=\"1\"\u003e4\u003c\/td\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eSTACK\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e558\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e596\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e634\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e671\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\" data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"geo_numbers\" data-mce-fragment=\"1\"\u003e5\u003c\/td\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eSTANDOVER\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e692\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e736\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e782\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e832\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"geo_numbers\" data-mce-fragment=\"1\"\u003e6\u003c\/td\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eHT ANGLE\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e70.0\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e70.0\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e70.0\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e70.0\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\" data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"geo_numbers\" data-mce-fragment=\"1\"\u003e7\u003c\/td\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eHT LENGTH\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e135\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e175\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e215\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e255\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"geo_numbers\" data-mce-fragment=\"1\"\u003e8\u003c\/td\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eST ANGLE\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e75.0\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e74.0\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e73.0\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e72.0\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\" data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"geo_numbers\" data-mce-fragment=\"1\"\u003e9\u003c\/td\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eCS LENGTH\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e460\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e460\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e460\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e460\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"geo_numbers\" data-mce-fragment=\"1\"\u003e10\u003c\/td\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eBB DROP\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e60\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e60\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e60\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e60\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\" data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"geo_numbers\" data-mce-fragment=\"1\"\u003e11\u003c\/td\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eBB HEIGHT\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e282\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e282\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e282\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e282\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"geo_numbers\" data-mce-fragment=\"1\"\u003e12\u003c\/td\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eWHEELBASE\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e1089\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e1127\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e1157\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e1197\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\" data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"geo_numbers\" data-mce-fragment=\"1\"\u003e13\u003c\/td\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eFRONT CENTER\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e635\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e674\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e704\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e743\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"geo_numbers\" data-mce-fragment=\"1\"\u003e14\u003c\/td\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eFORK LENGTH\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e410\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e410\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e410\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e410\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\" data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"geo_numbers\" data-mce-fragment=\"1\"\u003e15\u003c\/td\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eFORK OFFSET\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e50\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e50\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e50\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003e50\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv id=\"geo_diagram\" data-mce-fragment=\"1\"\u003e\u003cimg src=\"https:\/\/www.konaworld.com\/cdn\/shop\/files\/bike_geo_diagram.png?v=3528582685429196360\" alt=\"Bike Geometry\" width=\"406\" height=\"221\" data-mce-fragment=\"1\" data-mce-src=\"https:\/\/www.konaworld.com\/cdn\/shop\/files\/bike_geo_diagram.png?v=3528582685429196360\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c!----\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {45664159203554 : "deny",45664159236322 : "deny",45664159269090 : "deny",45664159301858 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {45664159203554 : parseInt("0"),45664159236322 : parseInt("1"),45664159269090 : parseInt("0"),45664159301858 : parseInt("2"),};
window._RestockRocketConfig.variantsPreorderCount = {45664159203554 : parseInt(""),45664159236322 : parseInt(""),45664159269090 : parseInt(""),45664159301858 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {45664159203554 : null,45664159236322 : null,45664159269090 : null,45664159301858 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {45664159203554 : parseInt(""),45664159236322 : parseInt(""),45664159269090 : parseInt(""),45664159301858 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {45664159203554 : null,45664159236322 : null,45664159269090 : null,45664159301858 : null,};
window._RestockRocketConfig.variantsShippingText = {45664159203554 : "",45664159236322 : "",45664159269090 : "",45664159301858 : "",};
window._RestockRocketConfig.variantsShippingTextForMarket = {45664159203554 : null,45664159236322 : null,45664159269090 : null,45664159301858 : null,};
window._RestockRocketConfig.selected_variant_id = 45664159236322;
window._RestockRocketConfig.selected_variant_available = window._RestockRocketConfig.product.variants.find(function(variant) { return variant.id == window._RestockRocketConfig.selected_variant_id }).available;window._RestockRocketConfig.scriptUrlProduct = 'https://cdn.shopify.com/extensions/019e7c69-ae21-79f9-9d69-1ef307edfd93/restockrocket-1-518/assets/restockrocket-product.js'
window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019e7c69-ae21-79f9-9d69-1ef307edfd93/restockrocket-1-518/assets/restockrocket-collection.js'
window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1)
window._RestockRocketConfig.host = 'https://app.restockrocket.io'
const SETTINGS_CACHE_DURATION = 15 * 60 * 1000; // 15 minutes in milliseconds
const LIQUID_CACHE_MAX_AGE = 15 * 60; // 15 minutes in seconds
// Calculate Liquid cache freshness once at initialization
const liquidRenderedAt = window._RestockRocketConfig.liquidRenderedAt;
// Validate timestamp and calculate cache age
if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) {
console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh');
window._RestockRocketConfig.isLiquidCacheFresh = true;
} else {
const now = Math.floor(Date.now() / 1000); // Current time in seconds
const liquidCacheAge = now - liquidRenderedAt; // Age in seconds
// Handle client clock ahead of server
if (liquidCacheAge < 0) {
console.debug(`STOQ - Client clock appears ahead of server by ${Math.abs(Math.round(liquidCacheAge / 60))} minutes, assuming cache fresh`);
window._RestockRocketConfig.isLiquidCacheFresh = true;
} else if (liquidCacheAge <= 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 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
&& window._RestockRocket.updateCartSellingPlans) {
window._RestockRocket.updateCartSellingPlans()
.then(hasUpdates => {
if (hasUpdates) {
console.debug('STOQ - cart selling plans updated successfully');
} else {
console.debug('STOQ - no cart selling plan updates needed');
}
})
.catch(error => {
console.error('STOQ - error updating cart selling plans:', error);
});
}
});
}
// 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.shop || window.S