Maxxis | Forekaster Trail Tire | Dismount Toronto (2024)

`; } } else { console.log("failed to remove"); } } else { let isAdded = addToList(myIcon.dataset.handle); if (isAdded) { savedList = readWishList(); [itemCount, itemCountFloating].forEach(item=>item.innerHTML = savedList.length); myIcon.dataset.status = "true"; myIcon.classList.add("added"); } else { console.log("failed to add") } } updateAllIcon(); }) return myIcon; } function updateAllIcon() { document.querySelectorAll(".wishlist_btn").forEach(button=>{ if (button.hasAttribute("data-handle")) { let isPresent = findItem(button.dataset.handle); if (isPresent) { button.classList.add("added"); button.dataset.status = "true"; } else { button.classList.remove("added"); button.dataset.status = "false"; } } }) } // ========================================================================================= Objective utility functions // =============================================== On-page organizing wishlist item list wishlistControls.forEach(control=>{ control.addEventListener("click", ()=>{ ["col3", "col4", "col5"].forEach(thisClass=>wishlistContainer.classList.remove(thisClass)); wishlistControls.forEach(btn=>btn.classList.remove("active")); control.classList.add("active"); wishlistContainer.classList.add(control.dataset.row); }) }) // =========================================================================== Generating products on the wishlist page function printProduct(thisProduct) { let variant_id = thisProduct.variants[0].id; let cardImageContainer = null; cardImageContainer = createElement("div"); let cardImage = createElement("img", ["product_card_img"]); if (thisProduct.image && thisProduct.image.src) { cardImage.src = thisProduct.image.src; } else { cardImage.src = "https://cdn.shopify.com/s/files/1/0533/2089/files/placeholder-images-image_large.png?format=webp&v=1530129081"; } cardImageContainer.appendChild(cardImage); let cardTitle = null; cardTitle = createElement("p", ["product_card_title"], [], thisProduct.title); let cardPrice = createElement("p", ["product_card_price"], [], `${"${{amount}}".trim().split("{")[0] + thisProduct.variants[0].price}`); let cardComparePrice = createElement("p", ["product_card_compare_price"], [], `${thisProduct.variants[0].compare_at_price.length > 0 ? "${{amount}}".trim().split("{")[0] + thisProduct.variants[0].compare_at_price : ""}`); let priceContainer = createElement("div", ["product_card_price_container"], [cardComparePrice, cardPrice]) let variantContainer = createElement("div", ["product_card_variant_container"]); let cardDetailButton = null; cardDetailButton = createElement("a", ["product_card_button", "inline"], [], "Details"); cardDetailButton.href = `${window.Shopify.routes.root + 'products/' + thisProduct.handle}`; let cardForm = createElement("form", ["product_form_custom_wishlist"]); cardForm.method = "post"; cardForm.action = `/cart/add/${variant_id}`; cardForm.acceptCharset = "UTF-8"; cardForm.enctype = "multipart/form-data"; cardForm.novalidate = "novalidate"; let cardInputProduct = createElement("input"); cardInputProduct.type = "hidden"; cardInputProduct.name = "form_type"; cardInputProduct.value = "product"; let cardInputChar = createElement("input"); cardInputChar.type = "hidden"; cardInputChar.name = "utf8"; cardInputChar.value = "✓"; let cardInputVariant = createElement("input"); cardInputVariant.type = "hidden"; cardInputVariant.name = "id"; cardInputVariant.value = variant_id; cardInputVariant.disabled = "disabled"; let cardSubmit = createElement("button", ["product_card_button"], [], "Add to cart"); cardSubmit.type = "submit"; cardSubmit.name = "add"; cardSubmit.value = variant_id; let cardInputProductId = createElement("input"); cardInputProductId.type = "hidden"; cardInputProductId.name = "product-id"; cardInputProductId.value = variant_id; [cardInputProduct, cardInputChar, cardInputVariant, cardSubmit, cardInputProductId].forEach(item=>cardForm.appendChild(item)); let cardButtonContainer = createElement("div", ["product_card_button_list"], [cardDetailButton, cardForm]); if (thisProduct.options[0].values[0] != "Default Title") { for (option in thisProduct.options) { let cardOptionName = createElement("p", ["product_card_option_name"], [], thisProduct.options[option].name); let cardVariantSelect = createElement("select", ["product_card_option_set"]); for (value in thisProduct.options[option].values) { let cardVariantOption = createElement("option", [], [], thisProduct.options[option].values[value]); cardVariantOption.value = thisProduct.options[option].values[value]; cardVariantSelect.appendChild(cardVariantOption); } let optionData = []; for (variant in thisProduct.variants) { let variantData = [ thisProduct.variants[variant].title, thisProduct.variants[variant].id, thisProduct.variants[variant].image_id != null ? thisProduct.images.find(img=>img.id == thisProduct.variants[variant].image_id).src : null, [ "${{amount}}".trim().split("{")[0] + thisProduct.variants[variant].price, thisProduct.variants[variant].compare_at_price.length > 0 ? "${{amount}}".trim().split("{")[0] + thisProduct.variants[variant].compare_at_price : "" ] ]; optionData.push(variantData); } cardVariantSelect.addEventListener("change", ()=>{ variantUpdate(optionData); }) let cardOption = createElement("div", ["product_card_option"], [cardOptionName, cardVariantSelect]); variantContainer.appendChild(cardOption) } } let cardContainer = createElement("div", ["product_card", "product"], [cardImageContainer, cardTitle, priceContainer, variantContainer, cardButtonContainer]); function variantUpdate(optionData) { let selectedDataSet = Array.from(cardContainer.querySelectorAll(".product_card_option_set"), item => item.value); let selectedVariant = null; optionData.forEach(option=>{ if (selectedVariant == null) { selectedVariant = option; selectedDataSet.forEach(item=>{ if (!option[0].includes(item)) { selectedVariant = null; } }) } }) cardPrice.innerHTML = selectedVariant[3][0]; cardComparePrice.innerHTML = selectedVariant[3][1]; selectedVariant[2] != "null" ? cardImage.src = selectedVariant[2] : null; if (cardForm.tagName == "FORM") { cardForm.action = `/cart/add/${selectedVariant[1]}`; cardInputVariant.value = selectedVariant[1]; cardSubmit.value = selectedVariant[1]; cardInputProductId.value = selectedVariant[1]; } else if (cardForm.tagName == "BUTTON") { cardForm.dataset.variant = selectedVariant[1]; } } if (!cardContainer.classList.contains("icon_holder")) { let icon = generateIcon(thisProduct.handle); appendIcon(cardContainer, icon); icon.addEventListener("click", ()=>{ cardContainer.classList.add("hiding"); setTimeout(()=>{ cardContainer.style.display = "none"; }, 300) }) } wishlistContainer.appendChild(cardContainer); } // =============================================== Fetching product data from Shopify function appendIcon(target, icon) { target.classList.add("icon_holder"); target.appendChild(icon); } // =============================================== Fetching product data from Shopify function fetchProduct(item) { jQuery.getJSON(window.Shopify.routes.root + 'products/' + item, function(thisProduct) { printProduct(thisProduct.product); responseCount += 1; }).fail(function(response) { if (response.status == 404) { responseCount += 1; failedProducts.push(item); } }); } function updateList () { setTimeout(()=>{ if (responseCount == savedList.length) { let newList = []; savedList.forEach(save=>{ if (!failedProducts.includes(save.toLowerCase())) { newList.push(save); } }) saveWishList(newList); let updatedList = readWishList(); itemCount.innerHTML = updatedList.length; itemCountFloating.innerHTML = updatedList.length; responseCount = 0; failedProducts = []; loadingSpinner.classList.remove("active"); wishlistContainer.classList.add("active"); } else { updateList() } }, 100) } // =============================================== Manipulating wishlist window wishlistClose.addEventListener("click", ()=>{ isWishlistOpen = false; pageBody.classList.remove("no_scroll"); Array.from(wishlistSection.parentElement.children).forEach(sibling=>sibling.classList.remove("functionally_hidden")); // wishlistSection.classList.add("functionally_hidden"); wishlistContainer.classList.remove("active"); wishlistUtility.classList.remove("active"); wishlistTrigger.classList.add("active"); loadingSpinner.classList.add("active"); updateAllIcon(); }) wishlistTrigger.addEventListener("click", ()=>{ isWishlistOpen = open; pageBody.classList.add("no_scroll"); Array.from(wishlistSection.parentElement.children).forEach(sibling=>sibling.classList.add("functionally_hidden")); wishlistSection.classList.remove("functionally_hidden"); wishlistContainer.classList.add("active"); wishlistUtility.classList.add("active"); wishlistTrigger.classList.remove("active"); savedList = readWishList(); itemCount.innerHTML = savedList.length; wishlistContainer.innerHTML = ""; if (savedList.length > 0) { savedList.forEach(item=>{ let thisProduct = fetchProduct(item); }) } else { wishlistContainer.innerHTML = `

!

`; } updateList() }) // =============================================== Manipulating Savelist function removeFromList(value) { let newList = []; savedList.forEach(item=>{ if (value.toLowerCase() != item.toLowerCase()) { newList.push(item); } }) return saveWishList(newList); } function addToList(value) { let newList = []; if (!savedList.includes(value)) { newList = [...savedList, value]; } else { newList = savedList; } return saveWishList(newList); } function saveWishList(value) { let isSaveLocal = saveLocal(value); let isSaveCloud = true; if (isSaveLocal && isSaveCloud) { return true; } } function readWishList() { let myLocal = readLocal(); // let myCloud = readCloud(); return myLocal; } // =============================================== Manipulating local storage function saveLocal(value) { try { const jsonString = JSON.stringify(value); localStorage.setItem("wishlist", jsonString); return true; } catch (error) { return false; } } function readLocal() { try { const storedValue = localStorage.getItem("wishlist"); if (storedValue !== null) { return JSON.parse(storedValue); } else { return []; } } catch (error) { return []; } } // =============================================== Manipulating Customer Metafield function readCloud() { } async function saveCloud(value) { } }) })()

Maxxis

Forekaster

Regular price $136.00 CAD

Regular price $136.00 CAD Sale price $136.00 CAD

Unit price / per

Sale Sold out

Shipping calculated at checkout.

Product

Description |

The new version of the Maxxis Forekaster is aimed squarely at modern short travel (100mm-130mm) trail bikes – aka the “downcountry” segment. Intended to be a “Goldilocks” tire, the new Forekaster (released July 2022) rolls faster than a Minion or even the Dissector but provides more predictable cornering, climbing, and braking traction than the Aspen or Rekon.

Features |

  • Rubber:
    • Dual compound (best for dry, hard conditions)
    • 3C MaxxTerra (best for mixed conditions)
  • Casings:
    • 60 TPI + EXO (general trail use)
    • EXO+ (heavy duty trail use)
  • Wide Trail (WT) sizes are optimized for 30-35mm inner width rims
  • Tubeless Ready

Compounds|

3C MT
An intermediate compound configuration used in select mountain tires. 3C MaxxTerra is softer and offers more traction than 3C MaxxSpeed, yet provides better treadwear and less rolling resistance than MaxxGrip.

3C MG
3C MaxxGrip uses the softest rubber compounds to offer the ultimate in grip and slow rebound properties for unparalleled traction in downhill applications.

EXO
EXO is a cut- and abrasion-resistant material added to the sidewalls of many Maxxis mountain bike and gravel tires. This densely woven fabric is lightweight and highly flexible, ensuring that the performance of the tire remains unaffected. Choose EXO Protection for enhanced durability for gravel, XC, and light-duty trail riding.

EXO+
The EXO+ construction combines two ofthe best puncture protection materials: SilkShield and EXO. The SilkShield layer runs from bead-to-bead with a layer of EXO along the sidewalls. Combined, these two materials create EXO+ which improves tread puncture protection by 27%; sidewall durability by 51%; and resistance to pinch flats by 28%.

DD
DoubleDown isthe casing solution for enduro racing and e-bike use. Two layers of lightweight 120 TPI casing material are combined with a butyl sidewall insert to create a highly durable tire with more trail feedback than a Downhill casing tire. DoubleDown tires are marginally lighter than their Downhill counterparts, but it’s really the difference in “trail feel” that sets the two apart. Some riders may prefer the highly damped ride provided by a Downhill casing tire.

WT
Wide Trail construction optimizes the tire’s tread layout and profile on today’s modern, wider rims. Traditional tires are designed around older, narrower rims and can create an overly square tire profile, leading to less than optimal performance. WT tires are optimized for a 35mm inner rim width but are proven to work over a range from 30-35mm inner rim widths, depending on the rider’s preference.

DH
As the name implies, Maxxis’ Downhill casing tires are designed for extreme use in all gravity applications from downhill racing to bike park riding to free riding to long travel e-bikes. A Maxxis Downhill tire is made with two layers of our durable 60 TPI casing material along with a large butyl rubber insert that extends from each bead into the sidewall. The butyl insert helps prevent pinch flats, protects the rim from impacts, and provides additional sidewall stability.

Specs |

Wheel Size27.5", 29"
Tubeless Ready
Yes
Thread Per Inch 60 TPI
Ideal ForAll Conditions
Intended UseXC, Trail
View full details

Maxxis | Forekaster Trail Tire | Dismount Toronto (3)Maxxis | Forekaster Trail Tire | Dismount Toronto (4)

Maxxis | Forekaster Trail Tire | Dismount Toronto (2024)
Top Articles
Latest Posts
Article information

Author: Mr. See Jast

Last Updated:

Views: 5735

Rating: 4.4 / 5 (55 voted)

Reviews: 94% of readers found this page helpful

Author information

Name: Mr. See Jast

Birthday: 1999-07-30

Address: 8409 Megan Mountain, New Mathew, MT 44997-8193

Phone: +5023589614038

Job: Chief Executive

Hobby: Leather crafting, Flag Football, Candle making, Flying, Poi, Gunsmithing, Swimming

Introduction: My name is Mr. See Jast, I am a open, jolly, gorgeous, courageous, inexpensive, friendly, homely person who loves writing and wants to share my knowledge and understanding with you.