Fox Transfer dropper post
MX DT Swiss EX1700 custom wheelset
1604 piston brakesMM
ODI Elite Pro grips
FORK TRAVEL
220mm front and 200mm rear rotors
Maxxis Assegai 2.5 and DHR II 2.4 EXO+ tyres
SLS Coil Spring on frame only
14
%
LEVERAGE RATE
FRAME HIGHLIGHTS
29"63.5-degree head tube angle
Compatible with long dropper posts
100% standard sealed Enduro Max bearings
LARGE
Floating collet axle pivot design
Compact-wishbone shock extender
5'10" - 6'3"
Boost spacing
Sizes S -XXL
X-LARGE
Trail Bike? Yes, And...6'1" - 6'7"
This is the mountain bike you reach for when the trail is untamed and unrelenting, in both directions.
Trail Bike
is a term that gets used pretty liberally in the industry, so we designed the SB140 to be even better suited to go deep and find out what's on the other side.
SPECIFICATION
SIZE GUIDETURQ Series carbon fibre frame, threaded bottom bracket, fully enclosed internal cable routing, 148mm x 12mm BOOST dropouts,integrated derailleur hanger and axle.
FORK
SMALL
FOX FACTORY 38 GRIP X2 / 170MM
5'1" - 5'7"
SHOCK
FOX FACTORY DHX2 2 POS LEVER (SM:400 MD:450 LG:500 XL:550 STEEL)
MEDIUM
TYRE (F)
MAXXIS ASSEGAI 2.5 EXO+
5'5" - 5'11"
TYRE (R)
MAXXIS MINION DHR II 2.4 DD
LARGE
ROTOR (F)
5'10" - 6'3"SRAM CENTERLINE 200
ROTOR (R)
X-LARGESRAM CENTERLINE 200
HEADSET
6'1" - 6'7"
CANE CREEK 40 INTEGRATED
XX-LARGEWHEELSET
DT SWISS CUSTOM EX1700 30MM
6'5" - 6'11"BB
SRAM DUB BSA73
GRIPS
ODI ELITE PRO
SPECIFICATION
TURQ Series carbon fibre frame, Switch Infinity suspension technology, threaded bottom bracket, fully enclosed internal cable routing, 148mm x 12mm BOOST dropouts, sealed Enduro Max pivot bearings, integrated derailleur hanger, and axle.BAR
YETI CARBON 35X800MM
FORK
STEM
FOX FACTORY 36 GRIP X2 / 160MM
BURGTEC ENDURO MK3 35X50MM
SHOCK
CRANK
FOX FACTORY FLOAT X
SRAM X0 EAGLE TRANSMISSION 30T 170MM
TYRE (F)
SADDLE
MAXXIS MINION DHF 2.5 EXO
SILVERADO CUSTOM
TYRE (R)
BRAKES
MAXXIS MINION DHR II 2.4 EXO
SRAM CODE RSC
ROTOR (F)
DERAILLEUR
SRAM CENTERLINE 200
SRAM X0 EAGLE AXS TRANSMISSION
ROTOR (R)
CASSETTE
SRAM CENTERLINE 180
SRAM X0 EAGLE TRANSMISSION 10-52
HEADSET
CHAIN
CANE CREEK 40 INTEGRATED
SRAM X0 EAGLE TRANSMISSION FLATTOP
WHEELSET
SHIFTER
DT SWISS XM1700 29†30MM
SRAM AXS POD CONTROLLER
BB
SEATPOST
SRAM DUB BSA 73
FOX TRANSFER 31.6MM / 175MM
GRIPS
625
653
SEATPOST
FOX TRANSFER 31.6MM / 175MM
C
HEAD TUBE ANGLE
63.5
Please note: Specifications are subject to change without notice.
63.5
GEOMETRY63.5
All measurements are shown in millimetres.63.5
D
EFF. SEAT TUBE ANGLE
EFF. TOP TUBE LENGTH1266
5731298
603
624G
652ESTIMATED BB HEIGHT
671345
345
C345
HEAD TUBE ANGLE345
65.0
D
750
EFF. SEATTUBE ANGLE
77.0
I
77.0
HEADTUBE LENGTH
77.0
95
77.0
101
77.0
107
118
E
ACTUAL SEATTUBE ANGLE
J
71.8
FORK (AXLE TO CROWN)
72.2
744
134
{"@context":"http:\/\/schema.org\/","@id":"\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike#product","@type":"ProductGroup","brand":{"@type":"Brand","name":"Yeti"},"category":"Mountain Bikes","description":"\n\nWe said it already knows. And now it knows better. Proven worthy time and again at Rampage, reconfigured to fit the bill as Zero-Hesitation Go-To for whatever your pleasure. Un-rack it for all the park laps, pedal it on character-building epics, push it up spooky steep darksides “nobody” knows about. Whatever the question, unhard your decisions. YOU ASK. IT GIVES..\n\n\n\n165MM\nFRAME TRAVEL\n\n \n\n170MM\nFORK TRAVEL\n\n \n\n29\"\nFRONT WHEEL SIZE\n\n \n\n27.5\"\nREAR WHEEL SIZE\n\n \n\n63.5°\nHEAD TUBE ANGLE\n\n \n\n76.9°\nEFF. SEAT ANGLE\n\n\n\n\nHIGHLIGHTS\n\nFox Factory 38 Grip 2 and Fox Factory DHX2 shock\nFox Transfer dropper post\nMX DT Swiss EX1700 custom wheelset\n4 piston brakes\nODI Elite Pro grips\n220mm front and 200mm rear rotors\nMaxxis Assegai 2.5 and DHR II 2.4 EXO+ tyres\nSLS Coil Spring on frame only\n\n\n\n\n\nFRAME HIGHLIGHTS\n\n63.5-degree head tube angle\n76.9-degree seat tube angle\n165mm rear travel paired with a 170mm fork\nSizes: SM-XL\nThreaded bottom bracket\nHigh-clearance downtube\nDual-density downtube protection\nUniversal Derailleur Hanger (UDH)\nSecure, fully enclosed internal cable management\nCompatible with long dropper posts\n100% standard sealed Enduro Max bearings\nFloating collet axle pivot design\nCompact-wishbone shock extender\nBoost spacing\n\n\n\n\n\nYOU ASK. IT GIVES.\n\n\n\n\nSIZE GUIDE\n\n\n\n\nSMALL\n5'1\" - 5'7\"\n\n\n\n\n\nMEDIUM\n\n5'5\" - 5'11\"\n\n\n\n\nLARGE\n\n\n5'10\" - 6'3\"\n\n\n\nX-LARGE\n\n\n\n6'1\" - 6'7\"\n\n\n\n\n\n\n\n\nSPECIFICATION\nTURQ Series carbon fibre frame, threaded bottom bracket, fully enclosed internal cable routing, 148mm x 12mm BOOST dropouts,integrated derailleur hanger and axle.\n\n\n\nFORK\nFOX FACTORY 38 GRIP X2 \/ 170MM\n\n\nSHOCK\nFOX FACTORY DHX2 2 POS LEVER (SM:400 MD:450 LG:500 XL:550 STEEL)\n\n\nTYRE (F)\nMAXXIS ASSEGAI 2.5 EXO+\n\n\nTYRE (R)\nMAXXIS MINION DHR II 2.4 DD\n\n\nROTOR (F)\nSRAM CENTERLINE 200\n\n\nROTOR (R)\nSRAM CENTERLINE 200\n\n\nHEADSET\nCANE CREEK 40 INTEGRATED\n\n\nWHEELSET\nDT SWISS CUSTOM EX1700 30MM\n\n\nBB\nSRAM DUB BSA73\n\n\nGRIPS\nODI ELITE PRO\n\n\nBAR\nYETI CARBON 35X800MM\n\n\nSTEM\nBURGTEC ENDURO MK3 35X50MM\n\n\nCRANK\nSRAM X0 EAGLE TRANSMISSION 30T 170MM\n\n\nSADDLE\nSILVERADO CUSTOM\n\n\nBRAKES\nSRAM CODE RSC\n\n\nDERAILLEUR\nSRAM X0 EAGLE AXS TRANSMISSION\n\n\nCASSETTE\nSRAM X0 EAGLE TRANSMISSION 10-52\n\n\nCHAIN\nSRAM X0 EAGLE TRANSMISSION FLATTOP\n\n\nSHIFTER\nSRAM AXS POD CONTROLLER\n\n\nSEATPOST\nFOX TRANSFER 31.6MM \/ 175MM\n\n\nBASHGUARD\nMRP AMG SL BASH GUIDE\n\n\n\n\nPlease note: Specifications are subject to change without notice.\n\nGEOMETRY\nAll measurements are shown in millimetres.\n\n\n\n\n\n\n\n180MM FORK\nSM\nMD\nLG\nXL\n\n\nA\nSEAT TUBE LENGTH\n365\n400\n440\n470\n\n\nB\nEFF. TOP TUBE LENGTH\n573\n604\n625\n653\n\n\nC\nHEAD TUBE ANGLE\n63.5\n63.5\n63.5\n63.5\n\n\nD\nEFF. SEAT TUBE ANGLE\n76.8\n76.9\n76.9\n76.9\n\n\nE\nCHAINSTAY LENGTH\n433\n435\n437\n439\n\n\nF\nWHEELBASE\n1207\n1242\n1266\n1298\n\n\nG\nESTIMATED BB HEIGHT\n345\n345\n345\n345\n\n\nH\nSTANDOVER\n730\n738\n744\n750\n\n\nI\nHEADTUBE LENGTH\n95\n101\n107\n118\n\n\nJ\nFORK (AXLE TO CROWN)\n588\n588\n588\n588\n\n\nK\nFORK (OFFSET)\n44\n44\n44\n44\n\n\nL\nSTACK\n620\n625\n630\n640\n\n\nM\nREACH\n430\n460\n480\n505\n\n\nN\nFRONT CENTER\n774\n807\n829\n859\n\n\nO\nVERTICAL FORK TRAVEL\n152\n152\n152\n152\n\n\n\n\n","hasVariant":[{"@id":"\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike?variant=55196412084607#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/ycb25167tspru_1.webp?v=1741953631\u0026width=1920","name":"Yeti Cycles SB165 T-Series T3 29\" \/ 27.5\" Bike - Black \/ Medium","offers":{"@id":"\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike?variant=55196412084607#offer","@type":"Offer","availability":"http:\/\/schema.org\/InStock","price":"8750.00","priceCurrency":"GBP","url":"https:\/\/projektride.co.uk\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike?variant=55196412084607"},"sku":"YCB25167TMDRGGDHTE38700"},{"@id":"\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike?variant=55196412117375#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/ycb25167tspru_1.webp?v=1741953631\u0026width=1920","name":"Yeti Cycles SB165 T-Series T3 29\" \/ 27.5\" Bike - Black \/ Large","offers":{"@id":"\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike?variant=55196412117375#offer","@type":"Offer","availability":"http:\/\/schema.org\/InStock","price":"8750.00","priceCurrency":"GBP","url":"https:\/\/projektride.co.uk\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike?variant=55196412117375"},"sku":"YCB25167TLGRGGDHTE38700"},{"@id":"\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike?variant=55196412150143#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/ycb25167tspru_1.webp?v=1741953631\u0026width=1920","name":"Yeti Cycles SB165 T-Series T3 29\" \/ 27.5\" Bike - Blue \/ Medium","offers":{"@id":"\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike?variant=55196412150143#offer","@type":"Offer","availability":"http:\/\/schema.org\/InStock","price":"8750.00","priceCurrency":"GBP","url":"https:\/\/projektride.co.uk\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike?variant=55196412150143"},"sku":"YCB25167TMDPSUDHTE38700"},{"@id":"\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike?variant=55196412182911#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/ycb25167tspru_1.webp?v=1741953631\u0026width=1920","name":"Yeti Cycles SB165 T-Series T3 29\" \/ 27.5\" Bike - Blue \/ Large","offers":{"@id":"\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike?variant=55196412182911#offer","@type":"Offer","availability":"http:\/\/schema.org\/InStock","price":"8750.00","priceCurrency":"GBP","url":"https:\/\/projektride.co.uk\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike?variant=55196412182911"},"sku":"YCB25167TLGPSUDHTE38700"}],"name":"Yeti Cycles SB165 T-Series T3 29\" \/ 27.5\" Bike","productGroupID":"14979885859199","url":"https:\/\/projektride.co.uk\/products\/yeti-cycles-sb165-t-series-t3-29-27-5-bike"}
I'm looking to find out more information about a product, where can I find this?
575
Terms of Service
Frequently Asked Questions
Refund policy
Service
Please get in touch with a member of the team either by phone (
01313745324
) or email (Servicing[email protected]
) where on of the team will be more than happy to help.
ProjektRide Bike Shop EdinburghBook a Service
Workshop Prices
Cycle to Work
If the item is showing in stock, we aim to post the product within 24 hours. Please allow 5 working days to receive the item.
Postage is free on orders over £50. Orders under £50, our postage charge is £3.99.
We also have a physical store, if you are local please pop in -Delivery & Returns
7602998501759,57602998534527,57602998600063,57602998894975,57602998960511,57602999026047,57602999124351,57602999157119,57602999189887,57602999222655,57603001090431,57603001123199,57603001155967,57603001188735,57603001221503,57603001254271,57603001287039,57603001614719,57603001647487,57603001680255,57603001713023,57603001745791,57603001778559,57603001844095,57603001876863,57603001942399,57603002007935,57603002040703,57603002073471,57603002106239,57603002204543,57603002237311,57603002270079,57603002302847,57603002335615,57603002368383,57603002466687,57603002499455,57603002532223,57603003089279,57603003122047,57603003154815,57603003187583,57603003220351,57603003253119,57603003285887,57603003318655,57603003351423,57603003384191],"updated_at":"2026-06-26T09:11:27Z","market_locations_enabled":false,"market_id":382140642,"preorder_location_filter_enabled":false,"preorder_location_filter_ids":[],"collection_id":null};window._RestockRocketConfig.cachedOutOfStockVariantIds = { out_of_stock_variant_ids: [] };window._Res
tockRocketConfig.cachedVariantPreorderLimits = {"variant_preorder_limits":{},"updated_at":"2026-06-27T18:03:18Z","shopify_market_id":382140642,"market_locations_enabled":false};
window._RestockRocketConfig.cachedVariantPreorderLimitsMarketKey = "variant_preorder_limits_for_market_382140642";window._RestockRocketConfig.cachedVariantShippingTexts = {"variant_shipping_texts":{},"updated_at":"2026-06-27T18:03:18Z","shopify_market_id":382140642,"market_locations_enabled":false};
window._RestockRocketConfig.cachedVariantShippingTextsMarketKey = "variant_shipping_texts_for_market_382140642";window._RestockRocketConfig.sellingPlans = [{"shopify_selling_plan_group_id":98590196095,"shopify_selling_plan_id":713071886719,"enabled":true,"variant_ids":[55569712382335,55569712415103,55569712480639,55570017616255,55570017550719,55569712447871,55570017583487],"product_variants_source":"custom","name":"Preorder","preorder_button_text":"Preorder","preorder_button_description":"Note: This is a preorder. Items will ship b
ased on the estimated delivery date.","preorder_button_description_enabled":true,"preorder_button_description_background_color":"#ebebeb","preorder_button_description_text_color":"#000000","preorder_button_description_border_radius":10,"preorder_button_description_show_quantity_limit":false,"preorder_button_description_quantity_limit_suffix":" units available for preorder","preorder_button_description_shipping_text_prefix":"Shipping: ","delivery_exact_time":null,"delivery_after_n_intervals":null,"delivery_at":"2025-07-26T09:20:18.169Z","delivery_type":"asap","quantity_limit_text":"{{ quantity }} units available for preorder","preorder_button_description_show_shipping":true,"preorder_button_description_icons_enabled":true,"preorder_shipping_text":"Shipping: {{ date }}","shipping_applies_to_all_products":true,"shipping_text":"Estimated to ship within 2 months","payment_type":"full","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","pri
cing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"discount_text":"Save {{ discount }}","billing_title":"Full payment","billing_description":null,"enable_billing_widget":false,"inventory_provider":"stoq","preorder_badge_enabled":false,"preorder_badge_text":"Preorder","preorder_badge_text_color":"#FFFFFF","preorder_badge_background_color":"#000000","preorder_discounted_price_enabled":null,"payment_line_item_property_enabled":false,"shipping_line_item_property_enabled":true,"custom_line_item_property_text":null,"preorder_button_text_color":"#ffffff","preorder_button_background_color":"#565557","preorder_button_colors_enabled":true,"markets_enabled":false,"market_id":13779632354,"shopify_market_ids":[],"use_shopify_selling_plan":true,"use_simplified_shipping_text":false,"translations":{},"payment_options":[{"billing_type":"no_remaining_balance","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","billing_at":"2025-07-26T09:20:38.472Z","billing_after_n_intervals":7,"billing_after_interval_type":"day","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"billing_title":"Full payment","billing_description":null,"discount_text":"Save {{ discount }}","shopify_selling_plan_id":713071886719,"is_default":true,"type":"full","translations":{}}],"require_preorder_acknowledgement":false,"preorder_acknowledgement_text":"I acknowledge and agree to the preorder terms and conditions for this product.","disable_button_until_acknowledged":false,"preorder_min_quantity":null,"preorder_max_quantity":null,"countdown_timer_enabled":false,"countdown_timer_style":"text","countdown_timer_text_color":"#000000","countdown_timer_background_color":"#f5f5f5","countdown_timer_border_radius":8,"countdown_timer_format":"DHMS","countdown_timer_use_schedule_dates":true,"countdown_timer_custom_start_date":null,"countdown_timer_custom_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"schedule_offer":
false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased separately from regular items. Please complete your current order first, or clear your cart to continue.","b2b_enabled":true,"preorder_progress_bar_enabled":false,"preorder_progress_bar_text":"{{ sold }} of {{ total }} claimed","preorder_progress_bar_fill_color":"#000000","preorder_progress_bar_background_color":"#e5e5e5","preorder_progress_bar_text_color":"#FFFFFF","preorder_progress_bar_border_radius":4,"preorder_progress_bar_show_percentage":false}];(function() {
const cachedData = {"plans":[{"shopify_selling_plan_group_id":98590196095,"shopify_selling_plan_id":713071886719,"enabled":true,"variant_ids":[55569712382335,55569712415103,55569712480639,55570017616255,55570017550719,55569712447871,55570017583487],"product_variants_source":"custom","name":"Preorder","preorder_button_text":"Preorder","preorder_button_description":"Note: This is a preorder. Items will ship based on the estimated delivery date.","preorder_button_description_enabled":true,"preorder_button_description_background_color":"#ebebeb","preorder_button_description_text_color":"#000000","preorder_button_description_border_radius":10,"preorder_button_description_show_quantity_limit":false,"preorder_button_description_quantity_limit_suffix":" units available for preorder","preorder_button_description_shipping_text_prefix":"Shipping: ","delivery_exact_time":null,"delivery_after_n_intervals":null,"delivery_at":"2025-07-26T09:20:18.169Z","delivery_type":"asap","quantity_limit_text":"{{ quantity }} units available for preorder","preorder_button_description_show_shipping":true,"preorder_button_description_icons_enabled":true,"preorder_shipping_text":"Shipping: {{ date }}","shipping_applies_to_all_products":true,"shipping_text":"Estimated to ship within 2 months","payment_type":"full","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing
_checkout_charge_percentage":"100.0","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"discount_text":"Save {{ discount }}","billing_title":"Full payment","billing_description":null,"enable_billing_widget":false,"inventory_provider":"stoq","preorder_badge_enabled":false,"preorder_badge_text":"Preorder","preorder_badge_text_color":"#FFFFFF","preorder_badge_background_color":"#000000","preorder_discounted_price_enabled":null,"payment_line_item_property_enabled":false,"shipping_line_item_property_enabled":true,"custom_line_item_property_text":null,"preorder_button_text_color":"#ffffff","preorder_button_background_color":"#565557","preorder_button_colors_enabled":true,"markets_enabled":false,"market_id":13779632354,"shopify_market_ids":[],"use_shopify_selling_plan":true,"use_simplified_shipping_text":false,"translations":{},"payment_options":[{"billing_type":"no_remaining_balance","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_chargecollection","index","search","page","cart","list-collections","article","blog"],"configuration":{"toastDuration":10000,"toastPosition":"bottom-right","enableXHRHijack":true,"enableFetchHijack":true,"quantityLimitDisabled":false},"type":"hijack","css_config":null,"js_config":null,"created_at":"2025-07-26T09:16:04.076Z","updated_at":"2025-07-26T09:16:04.076Z"}];window._RestockRocketConfig.obfuscateInventoryQuantity = false;window._RestockRocketConfig.product = {"id":14979885859199,"title":"Yeti Cycles SB165 T-Series T3 29\" \/ 27.5\" Bike","handle":"yeti-cycles-sb165-t-series-t3-29-27-5-bike","description":"\u003cdiv data-content-type=\"html\" data-appearance=\"default\" data-element=\"main\" data-decoded=\"true\"\u003e\n\u003cdiv class=\"Yeti-Text_Intro-BG\"\u003e\n\u003cdiv class=\"Yeti-Text_Intro-Text\"\u003eWe said it already knows. And now it knows better. Proven worthy time and again at Rampage, reconfigured to fit the bill as Zero-Hesitation Go-To for whatever your pleasure. Un-rack it for all the park l
aps, pedal it on character-building epics, push it up spooky steep darksides “nobody” knows about. Whatever the question, unhard your decisions.\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eYOU ASK. IT GIVES.\u003c\/span\u003e.\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"Yeti-Text_Feature-Box-BG\"\u003e\n\u003cdiv class=\"feature-box\"\u003e\n\u003cp class=\"feature-box_value\"\u003e165\u003cspan\u003eMM\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"feature-box_value-type\"\u003eFRAME TRAVEL\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\n\u003cdiv class=\"feature-box\"\u003e\n\u003cp class=\"feature-box_value\"\u003e170\u003cspan\u003eMM\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"feature-box_value-type\"\u003eFORK TRAVEL\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\n\u003cdiv class=\"feature-box\"\u003e\n\u003cp class=\"feature-box_value\"\u003e29\"\u003cspan\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"feature-box_value-type\"\u003eFRONT WHEEL SIZE\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\n\u003cdiv class=\"feature-box\"\u003e\n\u003cp class=\"feature-box_value\"\u003e27.5\"\u003cspan\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"feature-box_value-type\"\u003eREAR WHEEL SIZE\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\n\u003cdiv class=\"feature-box\"\u003e\n\u003cp class=\"feature-box_value\"\u003e63.5°\u003cspan\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"feature-box_value-type\"\u003eHEAD TUBE ANGLE\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\n\u003cdiv class=\"feature-box\"\u003e\n\u003cp class=\"feature-box_value\"\u003e76.9°\u003cspan\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"feature-box_value-type\"\u003eEFF. SEAT ANGLE\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"Yeti-Text_Highlights-BG_165MX\"\u003e\n\u003cdiv class=\"Yeti-Text_Highlights-Text\"\u003e\n\u003cp
class=\"Yeti-Title\"\u003eHIGHLIGHTS\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eFox Factory 38 Grip 2 and Fox Factory DHX2 shock\u003c\/li\u003e\n\u003cli\u003eFox Transfer dropper post\u003c\/li\u003e\n\u003cli\u003eMX DT Swiss EX1700 custom wheelset\u003c\/li\u003e\n\u003cli\u003e4 piston brakes\u003c\/li\u003e\n\u003cli\u003eODI Elite Pro grips\u003c\/li\u003e\n\u003cli\u003e220mm front and 200mm rear rotors\u003c\/li\u003e\n\u003cli\u003eMaxxis Assegai 2.5 and DHR II 2.4 EXO+ tyres\u003c\/li\u003e\n\u003cli\u003eSLS Coil Spring on frame only\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"Yeti-Text_Frame-Highlights-BG_165MX\"\u003e\n\u003cdiv class=\"Yeti-Text_Frame-Highlights-Text\"\u003e\n\u003cp class=\"Yeti-Title\"\u003eFRAME HIGHLIGHTS\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003e63.5-degree head tube angle\u003c\/li\u003e\n\u003cli\u003e76.9-degree seat tube angle\u003c\/li\u003e\n\u003cli\u003e165mm rear travel paired with a 170mm fork\u003c\/li\u003e\n\u003cli\u003eSizes: SM-XL\u003c\/li\u003e\n\u003cli\u003eThreaded bottom bracket\u003c\/li\u003e\n\u003cli\u003eHigh-clearance downtube\u003c\/li\u003e\n\u003cli\u003eDual-density downtube protection\u003c\/li\u003e\n\u003cli\u003eUniversal Derailleur Hanger (UDH)\u003c\/li\u003e\n\u003cli\u003eSecure, fully enclosed internal cable management\u003c\/li\u003e\n\u003cli\u003eCompatible with long dropper posts\u003c\/li\u003e\n\u003cli\u003e100% standard sealed Enduro Max bearings\u003c\/li\u003e\n\u003cli\u003eFloating collet axle pivot design\u003c\/li\u003e\n\u003cli\u003eCompact-wishbone shock extender\u003c\/li\u003e\n\u003cli\u003eBoost spacing\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"Yeti-Text_Team-BG_165MX\"\u003e\n\u003cdiv class=\"Yeti-Text_Team-Text_165MX\"\u003e\n\u003cp class=\"Yeti-Title\"\u003eYOU ASK. IT GIVES.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"Yeti-Text_Size-Guide-BG\"\u003e\n\u003cdiv class=\"Yeti-Text_Siz
e-Guide-Text\"\u003e\n\u003cp class=\"Yeti-Title\"\u003eSIZE GUIDE\u003c\/p\u003e\n\u003cdiv id=\"sizechart\"\u003e\n\u003ctable id=\"sizechart\"\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd id=\"sizechart\"\u003e\u003cstrong\u003eSMALL\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e5'1\" - 5'7\"\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd id=\"sizechart\"\u003e\u003cstrong\u003eMEDIUM\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e5'5\" - 5'11\"\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd id=\"sizechart\"\u003e\u003cstrong\u003eLARGE\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e5'10\" - 6'3\"\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd id=\"sizechart\"\u003e\u003cstrong\u003eX-LARGE\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e\u003c\/td\u003e\n\u003ctd id=\"sizechart\"\u003e6'1\" - 6'7\"\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv data-content-type=\"html\" data-appearance=\"default\" data-element=\"main\" data-decoded=\"true\"\u003e\n\u003cp class=\"Yeti-Title\"\u003eSPECIFICATION\u003c\/p\u003e\n\u003cp class=\"Yeti-Spec_text\"\u003eTURQ Series carbon fibre frame, threaded bottom bracket, fully enclosed internal cable routing, 148mm x 12mm BOOST dropouts,integrated derailleur hanger and axle.\u003c\/p\u003e\n\u003ctable clas
s=\"YetiSpec\"\u003e\n\u003ctbody\u003e\n\u003ctr class=\"a\"\u003e\n\u003ctd\u003eFORK\u003c\/td\u003e\n\u003ctd\u003eFOX FACTORY 38 GRIP X2 \/ 170MM\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"b\"\u003e\n\u003ctd\u003eSHOCK\u003c\/td\u003e\n\u003ctd\u003eFOX FACTORY DHX2 2 POS LEVER (SM:400 MD:450 LG:500 XL:550 STEEL)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"a\"\u003e\n\u003ctd\u003eTYRE (F)\u003c\/td\u003e\n\u003ctd\u003eMAXXIS ASSEGAI 2.5 EXO+\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"b\"\u003e\n\u003ctd\u003eTYRE (R)\u003c\/td\u003e\n\u003ctd\u003eMAXXIS MINION DHR II 2.4 DD\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"a\"\u003e\n\u003ctd\u003eROTOR (F)\u003c\/td\u003e\n\u003ctd\u003eSRAM CENTERLINE 200\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"b\"\u003e\n\u003ctd\u003eROTOR (R)\u003c\/td\u003e\n\u003ctd\u003eSRAM CENTERLINE 200\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"a\"\u003e\n\u003ctd\u003eHEADSET\u003c\/td\u003e\n\u003ctd\u003eCANE CREEK 40 INTEGRATED\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"b\"\u003e\n\u003ctd\u003eWHEELSET\u003c\/td\u003e\n\u003ctd\u003eDT SWISS CUSTOM EX1700 30MM\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"a\"\u003e\n\u003ctd\u003eBB\u003c\/td\u003e\n\u003ctd\u003eSRAM DUB BSA73\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"b\"\u003e\n\u003ctd\u003eGRIPS\u003c\/td\u003e\n\u003ctd\u003eODI ELITE PRO\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"a\"\u003e\n\u003ctd\u003eBAR\u003c\/td\u003e\n\u003ctd\u003eYETI CARBON 35X800MM\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"b\"\u003e\n\u003ctd\u003eSTEM\u003c\/td\u003e\n\u003ctd\u003eBURGTEC ENDURO MK3 35X50MM\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"a\"\u003e\n\u003ctd\u003eCRANK\u003c\/td\u003e\n\u003ctd\u003eSRAM X0 EAGLE TRANSMISSION 30T 170MM\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"b\"\u003e\n\u003ctd\u003eSADDLE\u003c\/td\u003e\n\u003ctd\u003eSILVERADO CUSTOM\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"a\"\u003
e\n\u003ctd\u003eBRAKES\u003c\/td\u003e\n\u003ctd\u003eSRAM CODE RSC\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"b\"\u003e\n\u003ctd\u003eDERAILLEUR\u003c\/td\u003e\n\u003ctd\u003eSRAM X0 EAGLE AXS TRANSMISSION\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"a\"\u003e\n\u003ctd\u003eCASSETTE\u003c\/td\u003e\n\u003ctd\u003eSRAM X0 EAGLE TRANSMISSION 10-52\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"b\"\u003e\n\u003ctd\u003eCHAIN\u003c\/td\u003e\n\u003ctd\u003eSRAM X0 EAGLE TRANSMISSION FLATTOP\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"a\"\u003e\n\u003ctd\u003eSHIFTER\u003c\/td\u003e\n\u003ctd\u003eSRAM AXS POD CONTROLLER\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"b\"\u003e\n\u003ctd\u003eSEATPOST\u003c\/td\u003e\n\u003ctd\u003eFOX TRANSFER 31.6MM \/ 175MM\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"a\"\u003e\n\u003ctd\u003eBASHGUARD\u003c\/td\u003e\n\u003ctd\u003eMRP AMG SL BASH GUIDE\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cbr\u003e\n\u003cp class=\"Yeti-Spec_text\"\u003e\u003ci\u003ePlease note: Specifications are subject to change without notice.\u003c\/i\u003e\u003c\/p\u003e\n\u003cbr\u003e\u003cbr\u003e\n\u003cp class=\"Yeti-Title\"\u003eGEOMETRY\u003c\/p\u003e\n\u003cp class=\"Yeti-Spec_text\"\u003eAll measurements are shown in millimetres.\u003c\/p\u003e\n\u003cdiv\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv id=\"overflowTable\"\u003e\n\u003ctable class=\"YetiGeo\"\u003e\n\u003ctbody\u003e\n\u003ctr class=\"c\"\u003e\n\u003ctd\u003e\u003c\/td\u003e\n\u003ctd\u003e180MM FORK\u003c\/td\u003e\n\u003ctd\u003eSM\u003c\/td\u003e\n\u003ctd\u003eMD\u003c\/td\u003e\n\u003ctd\u003eLG\u003c\/td\u003e\n\u003ctd\u003eXL\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"b\"\u003e\n\u003ctd\u003eA\u003c\/td\u003e\n\u003ctd\u003eSEAT TUBE LENGTH\u003c\/td\u003e\n\u003ctd\u003e365\u003c\/td\u003e\n\u003ctd\u003e400\u003c\/td\u003e\n\u003ctd\u003e440\u003c\/td\u003e\n\u003ctd\u003e470\u003c\/td\u003e\n\u003c\/tr\u00
td\u003e460\u003c\/td\u003e\n\u003ctd\u003e480\u003c\/td\u003e\n\u003ctd\u003e505\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"a\"\u003e\n\u003ctd\u003eN\u003c\/td\u003e\n\u003ctd\u003eFRONT CENTER\u003c\/td\u003e\n\u003ctd\u003e774\u003c\/td\u003e\n\u003ctd\u003e807\u003c\/td\u003e\n\u003ctd\u003e829\u003c\/td\u003e\n\u003ctd\u003e859\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"b\"\u003e\n\u003ctd\u003eO\u003c\/td\u003e\n\u003ctd\u003eVERTICAL FORK TRAVEL\u003c\/td\u003e\n\u003ctd\u003e152\u003c\/td\u003e\n\u003ctd\u003e152\u003c\/td\u003e\n\u003ctd\u003e152\u003c\/td\u003e\n\u003ctd\u003e152\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e","published_at":"2025-03-14T12:00:27+00:00","created_at":"2025-03-14T12:00:31+00:00","vendor":"Yeti","type":"Bicycles","tags":["SB165"],"price":875000,"price_min":875000,"price_max":875000,"available":true,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_
max":0,"compare_at_price_varies":false,"variants":[{"id":55196412084607,"title":"Black \/ Medium","option1":"Black","option2":"Medium","option3":null,"sku":"YCB25167TMDRGGDHTE38700","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Yeti Cycles SB165 T-Series T3 29\" \/ 27.5\" Bike - Black \/ Medium","public_title":"Black \/ Medium","options":["Black","Medium"],"price":875000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":55196412117375,"title":"Black \/ Large","option1":"Black","option2":"Large","option3":null,"sku":"YCB25167TLGRGGDHTE38700","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Yeti Cycles SB165 T-Series T3 29\" \/ 27.5\" Bike - Black \/ Large","public_title":"Black \/ Large","options":["Black","Large"],"price":875000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":55196412150143,"title":"Blue \/ Medium","option1":"Blue","option2":"Medium","option3":null,"sku":"YCB25167TMDPSUDHTE38700","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Yeti Cycles SB165 T-Series T3 29\" \/ 27.5\" Bike - Blue \/ Medium","public_title":"Blue \/ Medium","options":["Blue","Medium"],"price":875000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":55196412182911,"title":"Blue \/ Large","option1":"Blue","option2":"Large","option3":null,"sku":"YCB25167TLGPSUDHTE38700","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Yeti Cycles SB165 T-Series T3 29\" \/ 27.5\" Bike - Blue \/ Large","public_title":"Blue \/ Large","options":["Blue","Large
"],"price":875000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}}],"images":["\/\/projektride.co.uk\/cdn\/shop\/files\/ycb25167tspru_1.webp?v=1741953631","\/\/projektride.co.uk\/cdn\/shop\/files\/ycb25167trawg_1.webp?v=1741953631"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/ycb25167tspru_1.webp?v=1741953631","options":["Colour","Size"],"media":[{"alt":null,"id":64739635954047,"position":1,"preview_image":{"aspect_ratio":0.837,"height":833,"width":697,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/ycb25167tspru_1.webp?v=1741953631"},"aspect_ratio":0.837,"height":833,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/ycb25167tspru_1.webp?v=1741953631","width":697},{"alt":null,"id":64739635986815,"position":2,"preview_image":{"aspect_ratio":0.837,"height":833,"width":697,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/ycb25167trawg_1.w
ebp?v=1741953631"},"aspect_ratio":0.837,"height":833,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/ycb25167trawg_1.webp?v=1741953631","width":697}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cdiv data-content-type=\"html\" data-appearance=\"default\" data-element=\"main\" data-decoded=\"true\"\u003e\n\u003cdiv class=\"Yeti-Text_Intro-BG\"\u003e\n\u003cdiv class=\"Yeti-Text_Intro-Text\"\u003eWe said it already knows. And now it knows better. Proven worthy time and again at Rampage, reconfigured to fit the bill as Zero-Hesitation Go-To for whatever your pleasure. Un-rack it for all the park laps, pedal it on character-building epics, push it up spooky steep darksides “nobody” knows about. Whatever the question, unhard your decisions.\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eYOU ASK. IT GIVES.\u003c\/span\u003e.\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"Yeti-Text_Feature-Box-BG\"\u003e\n\u003cdiv class=\"feature-box\"\u003e\n\u003cp cl
ass=\"feature-box_value\"\u003e165\u003cspan\u003eMM\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"feature-box_value-type\"\u003eFRAME TRAVEL\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\n\u003cdiv class=\"feature-box\"\u003e\n\u003cp class=\"feature-box_value\"\u003e170\u003cspan\u003eMM\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"feature-box_value-type\"\u003eFORK TRAVEL\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\n\u003cdiv class=\"feature-box\"\u003e\n\u003cp class=\"feature-box_value\"\u003e29\"\u003cspan\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"feature-box_value-type\"\u003eFRONT WHEEL SIZE\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\n\u003cdiv class=\"feature-box\"\u003e\n\u003cp class=\"feature-box_value\"\u003e27.5\"\u003cspan\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"feature-box_value-type\"\u003eREAR WHEEL SIZE\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u0
03e\n\u003cdiv class=\"feature-box\"\u003e\n\u003cp class=\"feature-box_value\"\u003e63.5°\u003cspan\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"feature-box_value-type\"\u003eHEAD TUBE ANGLE\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cspan\u003e \u003c\/span\u003e\n\u003cdiv class=\"feature-box\"\u003e\n\u003cp class=\"feature-box_value\"\u003e76.9°\u003cspan\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"feature-box_value-type\"\u003eEFF. SEAT ANGLE\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"Yeti-Text_Highlights-BG_165MX\"\u003e\n\u003cdiv class=\"Yeti-Text_Highlights-Text\"\u003e\n\u003cp class=\"Yeti-Title\"\u003eHIGHLIGHTS\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eFox Factory 38 Grip 2 and Fox Factory DHX2 shock\u003c\/li\u003e\n\u003cli\u003eFox Transfer dropper post\u003c\/li\u003e\n\u003cli\u003eMX DT Swiss EX1700 custom wheelset\u003c\/li\u003e\n\u003cli\u003e4 piston brakes\u003c\/li\u003e\n\u003cli\u003eODI Elite Pro grips\u003c\/li\u003e\n\u003c
li\u003e220mm front and 200mm rear rotors\u003c\/li\u003e\n\u003cli\u003eMaxxis Assegai 2.5 and DHR II 2.4 EXO+ tyres\u003c\/li\u003e\n\u003cli\u003eSLS Coil Spring on frame only\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"Yeti-Text_Frame-Highlights-BG_165MX\"\u003e\n\u003cdiv class=\"Yeti-Text_Frame-Highlights-Text\"\u003e\n\u003cp class=\"Yeti-Title\"\u003eFRAME HIGHLIGHTS\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003e63.5-degree head tube angle\u003c\/li\u003e\n\u003cli\u003e76.9-degree seat tube angle\u003c\/li\u003e\n\u003cli\u003e165mm rear travel paired with a 170mm fork\u003c\/li\u003e\n\u003cli\u003eSizes: SM-XL\u003c\/li\u003e\n\u003cli\u003eThreaded bottom bracket\u003c\/li\u003e\n\u003cli\u003eHigh-clearance downtube\u003c\/li\u003e\n\u003cli\u003eDual-density downtube protection\u003c\/li\u003e\n\u003cli\u003eUniversal Derailleur Hanger (UDH)\u003c\/li\u003e\n\u003cli\u003eSecure, fully enclosed internal cable management\u003c\/li\u003e\n\u003cli\u00
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')
// Fire stoq_initialized once per page load so the funnel pipeline has a definitive
// "our code ran on this page" signal independent of any cus
tomer interaction.
// Detected variants: the variants present in this page's Liquid context (product page has them;
// collection/index/etc. don't expose variants from Liquid). Used to disambiguate "embed didn't
// load" vs "embed loaded but the variant wasn't a preorder/BIS candidate" in order debug.
try {
const _stoqInitConfig = window._RestockRocketConfig;
const _stoqDetectedVariantIds = (_stoqInitConfig.product && Array.isArray(_stoqInitConfig.product.variants))
? _stoqInitConfig.product.variants.map(function(v) { return v.id })
: [];
const _stoqSelectedVariantId = _stoqInitConfig.selected_variant_id;
Shopify?.analytics?.publish?.('stoq_initialized', {
cart_token: _stoqInitConfig.cartToken || '',
page_url: window.location.href,
page_type: _stoqInitConfig.pageType || '',
shop_domain: _stoqInitConfig.shop || '',
market_id: _stoqInitConfig.marketId || '',
detected_variant_ids: _stoqDetectedVariantIds,
selected_variant_id: _stoqSele
ctedVariantId || '',
liquid_rendered_at: _stoqInitConfig.liquidRenderedAt || 0,
app_version: _stoqInitConfig.appVersion || '',
liquid_cache_age: _stoqInitConfig.liquidCacheAge,
// Selected variant's stock posture as our app saw it at render — explains
// whether we *should* have treated it as a preorder candidate.
inventory_policy: (_stoqInitConfig.variantsInventoryPolicy || {})[_stoqSelectedVariantId] || '',
inventory_quantity: (_stoqInitConfig.variantsInventoryQuantity || {})[_stoqSelectedVariantId],
});
} catch (e) {
console.debug('STOQ - stoq_initialized publish failed:', e);
}
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 n
ormalizedLocale = 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:', normalizedL
ocale);
}
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 update
d successfully');
} else {
console.debug('STOQ - no cart selling plan updates needed');
}
})
.catch(error => {
console.error('STOQ - error updating cart selling plans:', error);
});
}
});
}
// ---- Live settings via the Storefront API (additive, does not gate init) ----
// The inlined `cachedSettings` comes from the app-embed Liquid render, which
// Shopify edge-caches and can serve stale. Reading the same `settings` metafield
// back over the Storefront API is a POST to /api/
<
version>/graphql.json — never
// CDN-cached — so it returns the live value on every page load. We fetch it
// best-effort and stash it on `window._RestockRocketConfig.storefrontSettings`
// so individual behaviours can migrate onto the fresh value over time. This is
// PURELY ADDITIVE: it does NOT change the resolution flow below, never blocks
// init, and silently no-ops on any failure / missing token.
(function loadStorefrontSettings() {
const cfg = window._RestockRocketConfig;
if (!cfg.storefrontAccessToken || cfg.disableStorefrontApi === true) return;
// Deferred to browser idle so this best-effort read runs strictly AFTER the
// critical init flow and never competes with it for a connection — the call
// is a live, uncached Storefront round-trip and can be slow (multi-second
// TTFB observed). Nothing on the critical path waits for it.
function run() {
const query = 'query StoqSettings($namespace: String!) { shop { metafield(namespace: $namespace, key: "settings") { value } } }';
fetch(
`https://${cfg.shop}/api/2025-07/graphql.json`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Shopify-Storefront-Access-Token': cfg.storefrontAccessToken,
},
body: JSON.stringify({ query: query, variables: { namespace: cfg.metafieldNamespace } }),
}
)
.then(function(response) {
if (!response.ok) { throw new Error('Storefront API HTTP ' + response.status); }
return response.json();
})
.then(function(body) {
if (body && body.errors && body.errors.length) {
throw new Error('Storefront API errors: ' + body.errors.map(function(e) { return e && e.message; }).join(', '));
}
const value = body && body.data && body.data.shop && body.data.shop.metafield && body.data.shop.metafield.value;
if (!value) { throw new Error('Storefront API returned no settings metafield value'); }
cfg.sto
refrontSettings = JSON.parse(value);
console.debug('STOQ - stored live settings from Storefront API on config.storefrontSettings');
})
.catch(function(e) {
console.debug('STOQ - Storefront settings fetch failed (non-fatal):', e && e.message);
});
}
if (typeof window.requestIdleCallback === 'function') {
window.requestIdleCallback(run, { timeout: 5000 });
} else {
setTimeout(run, 0);
}
})();
// 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.Shopify.shop,
'ngrok-skip-browser-warning': 'skip'
};
if (window.Shopify?.theme?.role === 'main') {
headers['X-Shopify-Theme-Schema-Name'] = window.Shopify.theme.schema_name;
headers['X-Shopify-Theme-Schema-Version'] = window.Shopify.theme.schema_version;
headers['X-Shopify-Theme-Store-Id'] = window.Shopify.theme.theme_store_id;
}
fetch(
`${window._RestockRocketConfig.host}/api/v1/setting.json?translation_locale=${window._RestockRocketConfig.normalizedLocale}`,
{ headers }
)
.then(function(response) {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(function(settings) {
initializeScripts(settings);
})
.catch(function(error) {
// If request failed and we have cached settings (even if expired), use them as fallback
if (cachedSettings) {
console.debug('STOQ - using expired cached settings as fallback');
initializeScripts(cachedSettings);
} else {
console.error('S
TOQ - failed to load settings:', error);
}
})
.catch(function(e) {
console.error(e)
})
}
function fetchEmbedConfig(endpoint, apply) {
return fetch(
`${window._RestockRocketConfig.host}/api/v1/embed/${endpoint}.json`,
{
headers: {
'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.Shopify.shop,
'ngrok-skip-browser-warning': 'skip'
}
}
)
.then(function(response) {
if (!response.ok) throw new Error(`Failed to fetch ${endpoint}`);
return response.json();
})
.then(function(data) {
try {
apply(data);
} catch (applyError) {
// Apply failures are programming bugs (e.g. response shape changed
// server-side and the assignment threw). Surface them as console.error
// so they're visible in browser logs, then re-throw to fall through
// to the same Liquid-cached fallback as a fetch failure.
console.error('STOQ - apply failed for ' + endpoint + ':', applyError);
throw applyError;
}
})
.catch(function(error) {
console.debug(`STOQ - using cached ${endpoint}:`, error.message);
});
}
function initializeScripts(settings) {
settings = applyTranslations(settings);
window._RestockRocketConfig.settings = settings;
console.debug(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`);
// Stale-Liquid resilience (default-on, per-shop opt-out via the
// `disable_refresh_on_stale_liquid` Toggle, surfaced as the negative
// `disable_refresh_on_stale_liquid` flag in settings.json so that
// `undefined` -- in CDN-cached metafield payloads that predate this
// key -- reads as `!undefined === true` and gets default-on behavior
// immediately, no metafield rewrite required).
// When the Liquid CDN cache is older than LIQUID_CACHE_MAX_AGE the in-page
// selling_plans / integrations metafields can be wrong; refresh both from
// the API before launching scr
ipts. Race against a 1000ms timeout so a slow
// API can't block init indefinitely. If the timeout wins, the in-flight
// fetches still complete and update window._RestockRocketConfig — the
// bundle re-reads sellingPlans/integrations on every interaction, so the
// late-arriving values benefit subsequent renders even though the first
// paint may use the Liquid-cached values. On any failure the existing
// Liquid-loaded values stay in place via fetchEmbedConfig's catch.
if (!window._RestockRocketConfig.isLiquidCacheFresh && !settings.disable_refresh_on_stale_liquid) {
console.debug('STOQ - Liquid cache stale, refreshing selling_plans + integrations');
Promise.race([
Promise.all([
fetchEmbedConfig('selling_plans', function(data) {
if (data && Array.isArray(data.plans)) {
window._RestockRocketConfig.sellingPlans = data.plans;
window._RestockRocketConfig.disabledSellingPlanIds = data.disabled_plan_ids || [];
}
}),
fetchEmbedConfig('integrations', function(data) {
if (Array.isArray(data)) {
window._RestockRocketConfig.integrations = data;
}
})
]),
new Promise(function(resolve) { setTimeout(resolve, 1000); })
]).then(function() { loadScripts(settings); });
return;
}
loadScripts(settings);
}
function loadScripts(settings) {
// Setup cart selling plan updater BEFORE loading any scripts to avoid race conditions
setupCartSellingPlanUpdater(settings);
if(settings.enable_app) {
const hijackIntegration = window._RestockRocketConfig.integrations.find(function(integration) {
return integration.type === 'hijack' && integration.enabled && integration.page_types.includes(window._RestockRocketConfig.pageType);
})
// STOQ-1520: serve the lean back-in-stock-only build (no preorder/hijack code)
// only to shops with NO preorder plans. Use the full build if preorder is o
n,
// an enabled offer exists, or a disabled-but-kept plan id remains (cart sweep
// must still strip those). Rationale in the PR.
const hasEnabledOffer = Array.isArray(window._RestockRocketConfig.sellingPlans)
&& window._RestockRocketConfig.sellingPlans.some(function(plan) { return plan && plan.enabled; });
const hasDisabledPlanIds = Array.isArray(window._RestockRocketConfig.disabledSellingPlanIds)
&& window._RestockRocketConfig.disabledSellingPlanIds.length > 0;
const usePreorderBuild = settings.preorder_enabled || hasEnabledOffer || hasDisabledPlanIds;
const collectionScriptUrl = usePreorderBuild
? window._RestockRocketConfig.scriptUrlCollection
: window._RestockRocketConfig.scriptUrlCollectionBis;
const productScriptUrl = usePreorderBuild
? window._RestockRocketConfig.scriptUrlProduct
: window._RestockRocketConfig.scriptUrlProductBis;
const pageType = window._RestockRocketConfig.pageType;
const collectionPageTypes = ['collection', 'index', 'search', 'page'];
if(collectionPageTypes.indexOf(pageType) !== -1 && (settings[`show_button_on_${pageType}`] || settings[`preorder_${pageType}_enabled`])) {
createRestockRocketScript(collectionScriptUrl);
} else if(pageType === 'product') {
createRestockRocketScript(productScriptUrl);
} else if(hijackIntegration) {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else if(usePreorderBuild) {
// cart/article/blog/list-collections: full build so the cart sweep runs.
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else {
console.debug(`STOQ - no scripts enabled for ${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._RestockR
ocketConfig.pageType,
enabled: settings.enable_app,
settings: settings,
preorderEnabled: settings.preorder_enabled
}
});
console.debug('STOQ - dispatching app loaded event');
window.dispatchEvent(appLoadedEvent);
}
}