SKU: BPP632FDPSAC3BK
BBC (TALL DECK) FRONT ACCESSORY DRIVE - DUAL-BELT QUICK SERPENTINE W/ ALT - PS - WP - AC - BRACKETS - BOLTS
$1,899.95
Secure Payments
Financing available at checkout with Affirm
Error executing template "Designs/Swift/Paragraph/BluePrint_EngineDetailsTabs.cshtml"
System.Collections.Generic.KeyNotFoundException: The given key 'engines' was not present in the dictionary.
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at CompiledRazorTemplates.Dynamic.RazorEngine_15b67e37e45b42a59f5ed1e8830ff7e8.ExecuteAsync()
   at RazorEngine.Templating.TemplateBase.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.DynamicWrapperService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass23_0.<Run>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> @using Dynamicweb.Frontend @using Dynamicweb.Core.Encoders @using Dynamicweb.Content @using System.Globalization @using Dynamicweb.Ecommerce.ProductCatalog @using Dynamicweb.Ecommerce.Products @{ ProductViewModel product = null; if (Dynamicweb.Context.Current.Items.Contains("ProductDetails")) { product = (ProductViewModel)Dynamicweb.Context.Current.Items["ProductDetails"]; } else if (Pageview.Page.Item["DummyProduct"] != null && Pageview.IsVisualEditorMode) { var pageViewModel = Dynamicweb.Frontend.ContentViewModelFactory.CreatePageInfoViewModel(Pageview.Page); ProductListViewModel productList = pageViewModel.Item.GetValue("DummyProduct") != null ? pageViewModel.Item.GetValue("DummyProduct") as ProductListViewModel : new ProductListViewModel(); if (productList?.Products is object) { product = productList.Products[0]; } } var partsCalloutText = Model.Item.GetRawValueString("partsCalloutText"); var midSectionText = Model.Item.GetRawValueString("midSectionText"); var warrantyTextLeft = Model.Item.GetRawValueString("warrantyTextLeft"); var warrantyTextRight = Model.Item.GetRawValueString("warrantyTextRight"); var warrantyCtaText = Model.Item.GetString("warrantyCtaText"); var warrantyCtaLink = Model.Item.GetString("warrantyCtaLink"); CategoryFieldViewModel engineSpecs = product.ProductCategories["engines"]; var installationNotes = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Installation_Notes").Value; var installationGuide = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Installation_Guide").Value; var compatibleEngines = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Compatible_Engines").Value; // ENGINE SPECS SECTION var blocks = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Blocks").Value; var cylinderHeads = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Cylinder_Heads").Value; var ignitionTiming = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Ignition_Timing").Value; var sparkPlug = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Spark_Plug_Gap").Value; var firingOrder = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Firing_Order").Value; var rotatingAssembly = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Rotating_Assembly").Value; var camSpecs = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Cam_Specs").Value; var stallConverter = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Stall_Converter").Value; var alsoIncludes = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Also_Includes").Value; var notes = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Notes").Value; bool noEngineSpecs = (blocks == null || blocks.Value == null || (string)blocks.Value == "") && (cylinderHeads == null || cylinderHeads.Value == null || (string)cylinderHeads.Value == "") && (ignitionTiming == null || ignitionTiming.Value == null || (string)ignitionTiming.Value == "") && (sparkPlug == null || sparkPlug.Value == null || (string)sparkPlug.Value == "") && (firingOrder == null || firingOrder.Value == null || (string)firingOrder.Value == "") && (rotatingAssembly == null || rotatingAssembly.Value == null || (string)rotatingAssembly.Value == "") && (camSpecs == null || camSpecs.Value == null || (string)camSpecs.Value == "") && (stallConverter == null || stallConverter.Value == null || (string)stallConverter.Value == "") && (alsoIncludes == null || alsoIncludes.Value == null || (string)alsoIncludes.Value == "") && (notes == null || notes.Value == null || (string)notes.Value == ""); @* CategoryFieldViewModel partsAccessories = product.ProductCategories["Engine_Parts_and_Accessories"]; *@ // PARTS & ACCESSORIES SECTION var intakeManifold = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Intake_Manifold").Value; var intakeManifoldIncluded = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Intake_Manifold_Included").Value; var sparkPlugPart = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Spark_Plug").Value; var sparkPlugIncluded = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Spark_Plug_Included").Value; var fuelDeliveryType = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Fuel_Delivery_Type").Value; var fuelDeliveryTypeIncluded = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Fuel_Delivery_Type_Included").Value; var harmonicBalancer = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Harmonic_Balancer").Value; var harmonicBalancerIncluded = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Harmonic_Balancer_Included").Value; var flexPlateFlywheel = engineSpecs.Fields.FirstOrDefault(x => x.Key == "FlexplateFlywheel").Value; var flexPlateFlywheelIncluded = engineSpecs.Fields.FirstOrDefault(x => x.Key == "FlexplateFlywheel_Included").Value; var fuelRecommendation = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Fuel_Recommendation").Value; var recommendedBreakInOil = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Recommended_Break_In_Oil").Value; var recommendedServiceOil = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Recommended_Service_Oil").Value; var recommendedOilFilter = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Recommended_Oil_Filter").Value; var totalOilCapacity = engineSpecs.Fields.FirstOrDefault(x => x.Key == "Total_Oil_Capacity_with_Production_Oil_Pan").Value; bool noPartsAccessories = (intakeManifold == null || intakeManifold.Value == null || (string)intakeManifold.Value == "") && (sparkPlugPart == null || sparkPlugPart.Value == null || (string)sparkPlugPart.Value == "") && (fuelDeliveryType == null || fuelDeliveryType.Value == null || (string)fuelDeliveryType.Value == "") && (harmonicBalancer == null || harmonicBalancer.Value == null || (string)harmonicBalancer.Value == "") && (flexPlateFlywheel == null || flexPlateFlywheel.Value == null || (string)flexPlateFlywheel.Value == "") && (fuelRecommendation == null || fuelRecommendation.Value == null || (string)fuelRecommendation.Value == "") && (recommendedBreakInOil == null || recommendedBreakInOil.Value == null || (string)recommendedBreakInOil.Value == "") && (recommendedServiceOil == null || recommendedServiceOil.Value == null || (string)recommendedServiceOil.Value == "") && (recommendedOilFilter == null || recommendedOilFilter.Value == null || (string)recommendedOilFilter.Value == "") && (totalOilCapacity == null || totalOilCapacity.Value == null || (string)totalOilCapacity.Value == ""); @* RELATED PRODUCTS *@ var relatedProductsGroup = product.RelatedGroups.Where(x => x.Name == "Compatible Parts"); IList<(Group?, Product)> allRelatedProducts = new List<(Group?, Product)>(); IList<(Group?, IList<Product>)> groupedRelatedProducts = new List<(Group?, IList<Product>)>(); if (relatedProductsGroup.Count() > 0) { IList<string> relatedProducts = relatedProductsGroup.FirstOrDefault()?.Products.Select(x => x.ProductId).ToList() ?? new List<string>(); if (relatedProducts.Count > 0) { var relatedProductsList = relatedProducts.Select(x => Dynamicweb.Ecommerce.Services.Products.GetProductById(x, "", "")).ToList(); // get the PrimaryGroupId from each product. If no PrimaryGroupId, get the first Id from the Groups Array on each product foreach (var relatedProduct in relatedProductsList) { string primaryGroupId = relatedProduct.GetPrimaryGroupId(); if (string.IsNullOrWhiteSpace(primaryGroupId)) { var nextBestGroup = relatedProduct.Groups.FirstOrDefault(); if (nextBestGroup != null) { primaryGroupId = nextBestGroup.Id; } } if (primaryGroupId != null) { // get the group by Id --- this says it is obsolete but the referenced method returns null so we use the obsolete method var foundGroup = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(primaryGroupId); if (foundGroup != null) { allRelatedProducts.Add((foundGroup, relatedProduct)); } } } // Group the groups by Name to use as headers in the accordion groupedRelatedProducts = allRelatedProducts .GroupBy(x => x.Item1) .Select(g => (g.Key, (IList<Product>)g.Select(x => x.Item2).ToList())) .ToList(); } } } <style> .bpe-product-tabs{ background:var(--section-bg-4, #F8F8F8); padding:28px 0 40px 0; /* Top tabs — full width, equal spread, centered, underline spans tab */ .tablist{ display:flex; border-bottom: 1px solid var(--card-card-border, #CFCFCF); margin:0 0 18px; padding:0; } .tablist-select { background: none; outline: none; border: none; border-bottom: 2px solid var(--button-primary, #151A41); display: flex; justify-content: space-between; padding: 0 0 16px 0; color: var(--button-primary, #151A41); font-family: var(--buttonText-base-font-family, "Noto Sans"); font-size: var(--buttonText-base-font-size, 18px); font-style: normal; font-weight: 700; width: 100%; line-height: 125%; /* 22.5px */ letter-spacing: var(--buttonText-base-letter-spacing, 0); text-transform: uppercase; } .tab{ position:relative; list-style:none; padding:14px 10px; margin:0; flex:1 1 0; /* even spread */ text-align:center; /* centered label */ cursor:pointer; outline:none; color: var(--text-link, #3474A4); /* buttonText/base */ font-family: var(--buttonText-base-font-family, "Noto Sans"); font-size: var(--buttonText-base-font-size, 18px); font-style: normal; font-weight: 700; line-height: 125%; /* 22.5px */ letter-spacing: var(--buttonText-base-letter-spacing, 0); text-transform: uppercase; } .tabpanel { margin-top: var(--spacing-xl, 32px); } .tab[aria-selected="true"]{color:var(--button-primary, #151A41); } .tab::after{ content:""; position:absolute; left:0; right:0; bottom:-1px; height:3px; background:var(--button-primary, #151A41); transform:scaleX(0); transform-origin:left; transition:transform .25s ease; } .tab[aria-selected="true"]::after{ transform:scaleX(1); } /* DESCRIPTION tab */ .content{ display:grid; grid-template-columns:1.2fr .9fr; gap: var(--spacing-2xl, 48px); color: var(--text-headline, #363337); h1,h2,h3,h4,h5,h6 { font-family: var(--headline-h5-font-family, Roboto); font-size: var(--headline-h5-font-size, 22px); font-style: normal; font-weight: 700; line-height: 120%; /* 26.4px */ letter-spacing: var(--headline-h5-letter-spacing, 2.75px); text-transform: uppercase; } p { color: var(--text-paragraph, #5A565C); font-family: var(--body-base-font-family, "Noto Sans"); font-size: var(--body-base-font-size, 18px); font-style: normal; font-weight: 400; line-height: 140%; /* 25.2px */ letter-spacing: var(--body-base-letter-spacing, 0); } .left { .ca-p65-warning { border: 1px solid var(--form-warning, #DD8C00); background: var(--form-warning-light, #FFF8EC); display: flex; padding: var(--spacing-md, 16px); align-items: center; justify-content: space-between; gap: 12px; align-self: stretch; color: var(--text-paragraph, #5A565C); font-family: var(--body-base-font-family, "Noto Sans"); font-size: var(--body-base-font-size, 18px); font-style: normal; font-weight: 400; line-height: 140%; /* 25.2px */ letter-spacing: var(--body-base-letter-spacing, 0); div { display: flex; align-items: center; svg { margin-right: 12px; } } a { color: var(--text-link-tertiary, #151A41); font-family: var(--buttonText-base-link-font-family, "Noto Sans"); font-size: var(--buttonText-base-link-font-size, 18px); font-style: normal; font-weight: 700; line-height: 125%; /* 22.5px */ letter-spacing: var(--buttonText-base-link-letter-spacing, 0); } } } .right{ background:var(--brand-tertiary-lt, #E9E9E9); padding:18px; border: 1px solid var(--card-card-border, #CFCFCF); height: fit-content; h4 { color: var(--text-headline, #363337); font-family: var(--headline-h6-font-family, Roboto); font-size: var(--headline-h6-font-size, 20px); font-style: normal; font-weight: 700; line-height: 120%; /* 24px */ letter-spacing: var(--headline-h6-letter-spacing, 2.5px); text-transform: uppercase; } ul { padding-left: 20px; margin: 0 0 1rem; li { margin: .5rem 0; color: var(--text-paragraph, #5A565C); font-family: var(--body-base-font-family, "Noto Sans"); font-size: var(--body-base-font-size, 18px); font-style: normal; font-weight: 400; line-height: 140%; /* 25.2px */ letter-spacing: var(--body-base-letter-spacing, 0); } } } a.bpe-download-btn { display: flex; padding: var(--spacing-md, 16px) var(--spacing-lg, 24px); align-items: center; gap: var(--spacing-sm, 16px); border-radius: var(--radius-none, 0); border: 1px solid var(--card-card-border, #CFCFCF); background: var(--white, #FFF); color: var(--text-link, #3474A4); font-family: var(--body-lg-font-family, "Noto Sans"); font-size: var(--body-lg-font-size, 20px); font-style: normal; font-weight: 400; margin-top: 2rem; line-height: 140%; /* 28px */ letter-spacing: var(--body-lg-letter-spacing, 0); box-shadow: 0 1px 3px 0 rgba(43, 48, 64, 0.10), 0 1px 2px 0 rgba(43, 48, 64, 0.06); width: fit-content; svg { margin-left: 100px; width:18px; height:18px; } } } /* ENGINE SPECS */ @* .specs-grid{display:grid;grid-template-columns:1fr 1fr;gap:48px;margin-top:8px} *@ .specs-col { column-count: 2; div { break-inside: avoid; } h5 { color: var(--text-headline, #363337); font-family: var(--headline-h5-font-family, Roboto); font-size: var(--headline-h5-font-size, 22px); font-style: normal; font-weight: 700; line-height: 120%; /* 26.4px */ letter-spacing: var(--headline-h5-letter-spacing, 2.75px); text-transform: uppercase; margin-top: 2rem; } ul { margin: 0 0 12px; padding: left; li { margin: .45rem 0; color: var(--text-paragraph, #5A565C); font-family: var(--body-base-font-family, "Noto Sans"); font-size: var(--body-base-font-size, 18px); font-style: normal; font-weight: 400; line-height: 140%; /* 25.2px */ letter-spacing: var(--body-base-letter-spacing, 0); a { color: var(--text-paragraph, #5A565C); font-family: var(--body-base-font-family, "Noto Sans"); font-size: var(--body-base-font-size, 18px); font-style: normal; font-weight: 400; line-height: 140%; letter-spacing: var(--body-base-letter-spacing, 0); text-decoration-line: underline; text-decoration-style: solid; text-decoration-skip-ink: none; text-decoration-thickness: auto; text-underline-offset: auto; text-underline-position: from-font; } } } } /* PARTS & ACCESSORIES */ #panel-parts { .callout{ display: flex; padding: var(--spacing-md, 16px); align-items: flex-start; gap: 12px; align-self: stretch; border: 1px solid var(--form-info, #224B69); background: var(--form-info-light, #D9EFFF); color: var(--text-paragraph, #5A565C); /* body/base */ font-family: var(--body-base-font-family, "Noto Sans"); font-size: var(--body-base-font-size, 18px); font-style: normal; font-weight: 400; line-height: 140%; /* 25.2px */ letter-spacing: var(--body-base-letter-spacing, 0); svg{ min-width:18px; height:18px; margin-top:2px; } } .section-lead { color: var(--text-headline, #363337); font-family: var(--headline-h5-font-family, Roboto); font-size: var(--headline-h5-font-size, 22px); font-style: normal; font-weight: 700; margin-top: 2rem; line-height: 120%; /* 26.4px */ letter-spacing: var(--headline-h5-letter-spacing, 2.75px); text-transform: uppercase; } .spec-table { margin-top: 1rem; width: 100%; border-collapse: collapse; tr { &:nth-child(odd) { background: var(--brand-tertiary-lt, #E9E9E9); } &:nth-child(even) { background: var(--white, #FFF); } th { padding: var(--spacing-sm, 8px); color: var(--text-paragraph, #5A565C); font-family: var(--body-base-font-family, "Noto Sans"); font-size: var(--body-base-font-size, 18px); font-style: normal; font-weight: 400; line-height: 140%; /* 25.2px */ letter-spacing: var(--body-base-letter-spacing, 0); } td { padding: var(--spacing-sm, 8px); color: var(--text-paragraph, #5A565C); text-align: right; font-family: var(--body-base-font-family, "Noto Sans"); font-size: var(--body-base-font-size, 18px); font-style: normal; font-weight: 400; line-height: 140%; /* 25.2px */ letter-spacing: var(--body-base-letter-spacing, 0); p { margin: 0; } } } } .mid-section-text { margin-top: 2rem; h1,h2,h3,h4,h5,h6 { color: var(--text-headline, #363337); font-family: var(--headline-h5-font-family, Roboto); font-size: var(--headline-h5-font-size, 22px); font-style: normal; font-weight: 700; line-height: 120%; /* 26.4px */ letter-spacing: var(--headline-h5-letter-spacing, 2.75px); text-transform: uppercase; } p, ul { color: var(--text-paragraph, #5A565C); font-family: var(--body-base-font-family, "Noto Sans"); font-size: var(--body-base-font-size, 18px); font-style: normal; font-weight: 400; line-height: 140%; letter-spacing: var(--body-base-letter-spacing, 0); a { color: var(--text-link, #3474A4); text-decoration-line: underline; text-decoration-style: solid; text-decoration-skip-ink: auto; text-decoration-thickness: auto; text-underline-offset: auto; text-underline-position: from-font; } } } .accordion { margin-top: 1rem; .acc-item { border-top: 1px solid var(--divider, rgba(0,0,0,0.12)); padding: var(--spacing-lg, 24px) 0; .acc-header { color: var(--text-headline, #363337); font-family: var(--headline-h6-font-family, Roboto); font-size: var(--headline-h6-font-size, 20px); font-style: normal; font-weight: 700; line-height: 120%; /* 24px */ letter-spacing: var(--headline-h6-letter-spacing, 2.5px); text-transform: uppercase; width:100%; border:0; background:transparent; padding: 0; font-weight:700; letter-spacing:.12em; text-transform:uppercase; display:flex; justify-content:space-between; align-items:center; cursor:pointer; .icon.plus { display: inline; } .icon.minus { display: none; } } .acc-panel { display: none; .product-grid{ display:grid; grid-template-columns:repeat(4,1fr); gap:18px; margin-top:10px; } .description { color: var(--text-paragraph, #5A565C); font-family: var(--body-sm-font-family, "Noto Sans"); font-size: var(--body-sm-font-size, 16px); font-style: normal; font-weight: 400; line-height: 140%; /* 22.4px */ letter-spacing: var(--body-sm-letter-spacing, 0); } } &.open { .acc-header { .icon.plus { display: none; } .icon.minus { display: inline; } } .acc-panel { display: block; } } } } } #panel-warranty { .w-split { display:grid; grid-template-columns:1.2fr .9fr; gap:32px; margin-top: 2rem; div.left, div.right { h1,h2,h3,h4,h5,h6 { color: var(--text-headline, #363337); font-family: var(--headline-h5-font-family, Roboto); font-size: var(--headline-h5-font-size, 22px); font-style: normal; font-weight: 700; line-height: 120%; /* 26.4px */ letter-spacing: var(--headline-h5-letter-spacing, 2.75px); text-transform: uppercase; } color: var(--text-paragraph, #5A565C); font-family: var(--body-base-font-family, "Noto Sans"); font-size: var(--body-base-font-size, 18px); font-style: normal; font-weight: 400; line-height: 140%; /* 25.2px */ letter-spacing: var(--body-base-letter-spacing, 0); a { color: var(--button-primary-text, #FFF); font-family: var(--buttonText-base-font-family, "Noto Sans"); font-size: var(--buttonText-base-font-size, 18px); font-style: normal; font-weight: 700; line-height: 125%; /* 22.5px */ letter-spacing: var(--buttonText-base-letter-spacing, 0); text-transform: uppercase; display: flex; min-height: 48px; padding: var(--button-spacing-base-y, 14px) var(--button-spacing-base-x, 32px); justify-content: center; align-items: center; gap: 8px; background: var(--button-primary, #151A41); width: fit-content; box-shadow: 0 1px 2px 0 rgba(43, 48, 64, 0.05); } } } } } /* Responsive */ @@media (max-width: 1020px){ .bpe-product-tabs { #panel-parts { .accordion { .acc-item { .acc-panel { .product-grid{ grid-template-columns:repeat(3,1fr); } } } } } } } @@media (max-width: 900px){ .bpe-product-tabs { #panel-desc { .content { grid-template-columns:1fr; } } .specs-col { column-count: 1; } } .w-split { grid-template-columns:1fr; } } @@media (max-width: 740px) { .bpe-product-tabs { #panel-parts { .accordion { .acc-item { .acc-panel { .product-grid{ grid-template-columns:repeat(2,1fr); } } } } } } } @@media (max-width: 480px) { .bpe-product-tabs { #panel-parts { .accordion { .acc-item { .acc-panel { .product-grid{ grid-template-columns:1fr; } } } } } } } </style> <section class="bpe-product-tabs" aria-label="Product details"> <div class="container-xl"> <ul class="tablist" role="tablist" id="tablist"> <li class="tab" role="tab" id="tab-desc" aria-selected="true" aria-controls="panel-desc" tabindex="0">Description</li> @if (!noEngineSpecs) { <li class="tab" role="tab" id="tab-specs" aria-selected="false" aria-controls="panel-specs" tabindex="-1">Engine Specs</li> } @if (!noPartsAccessories) { <li class="tab" role="tab" id="tab-parts" aria-selected="false" aria-controls="panel-parts" tabindex="-1">Parts &amp; Accessories</li> } <li class="tab" role="tab" id="tab-warranty" aria-selected="false" aria-controls="panel-warranty" tabindex="-1">Warranty</li> </ul> <select class="tablist-select" id="tablist-select" style="display:none; margin-bottom:18px;"> <option value="panel-desc"> Description <svg xmlns="http://www.w3.org/2000/svg" width="24" height="25" viewBox="0 0 24 25" fill="none"> <path d="M19 9.5L12 16.5L5 9.5" stroke="#151A41" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </option> @if (!noEngineSpecs) { <option value="panel-specs"> Engine Specs <svg xmlns="http://www.w3.org/2000/svg" width="24" height="25" viewBox="0 0 24 25" fill="none"> <path d="M19 9.5L12 16.5L5 9.5" stroke="#151A41" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </option> } @if (!noPartsAccessories) { <option value="panel-parts"> Parts &amp; Accessories <svg xmlns="http://www.w3.org/2000/svg" width="24" height="25" viewBox="0 0 24 25" fill="none"> <path d="M19 9.5L12 16.5L5 9.5" stroke="#151A41" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </option> } <option value="panel-warranty"> Warranty <svg xmlns="http://www.w3.org/2000/svg" width="24" height="25" viewBox="0 0 24 25" fill="none"> <path d="M19 9.5L12 16.5L5 9.5" stroke="#151A41" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </option> </select> <!-- DESCRIPTION --> <div class="tabpanel" id="panel-desc" role="tabpanel" aria-labelledby="tab-desc"> <div class="content"> <div class="left"> @product.LongDescription <div class="ca-p65-warning"> <div> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="18" viewBox="0 0 20 18" fill="none"> <path d="M9.99955 7V9M9.99955 13H10.0095M3.07134 17H16.9277C18.4673 17 19.4296 15.3333 18.6598 14L11.7316 2C10.9618 0.666667 9.0373 0.666667 8.2675 2L1.33929 14C0.569492 15.3333 1.53174 17 3.07134 17Z" stroke="#DD8C00" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> WARNING: Cancer and Reproductive Harm </div> <div> <a href="https://www.p65warnings.ca.gov/" target="_blank" rel="noopener noreferrer"> @Translate("Learn More") <svg xmlns="http://www.w3.org/2000/svg" width="20" height="21" viewBox="0 0 20 21" fill="none"> <path fill-rule="evenodd" clip-rule="evenodd" d="M7.29289 15.2071C6.90237 14.8166 6.90237 14.1834 7.29289 13.7929L10.5858 10.5L7.29289 7.20711C6.90237 6.81658 6.90237 6.18342 7.29289 5.79289C7.68342 5.40237 8.31658 5.40237 8.70711 5.79289L12.7071 9.79289C13.0976 10.1834 13.0976 10.8166 12.7071 11.2071L8.70711 15.2071C8.31658 15.5976 7.68342 15.5976 7.29289 15.2071Z" fill="#151A41"/> </svg> </a> </div> </div> </div> @if(installationNotes.Value != null && (string)installationNotes.Value != "") { <aside class="right"> <h4>@Translate("Installation Notes")</h4> @installationNotes.Value @if(installationGuide.Value != null && (string)installationGuide.Value != "") { <a class="bpe-download-btn" href="@installationGuide" target="_blank" rel="noopener noreferrer"> @Translate("Installation Manual") <svg xmlns="http://www.w3.org/2000/svg" width="16" height="19" viewBox="0 0 16 19" fill="none"> <path d="M15 17.25L1 17.25M12 9.25L8 13.25M8 13.25L4 9.25M8 13.25L8 1.25" stroke="#3474A4" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </a> } @if(compatibleEngines.Value != null && (string)compatibleEngines.Value != "") { <a class="bpe-download-btn" href="@compatibleEngines" target="_blank" rel="noopener noreferrer"> @Translate("Engine Compatibility") <svg xmlns="http://www.w3.org/2000/svg" width="16" height="19" viewBox="0 0 16 19" fill="none"> <path d="M15 17.25L1 17.25M12 9.25L8 13.25M8 13.25L4 9.25M8 13.25L8 1.25" stroke="#3474A4" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </a> } </aside> } </div> </div> <!-- ENGINE SPECS --> @if (!noEngineSpecs) { <div class="tabpanel" id="panel-specs" role="tabpanel" aria-labelledby="tab-specs" hidden> <div class="specs-grid"> <div class="specs-col"> @if(blocks != null && blocks.Value != null && (string)blocks.Value != "") { <div> <h5>@Translate("Blocks")</h5> @blocks.Value </div> } @if(cylinderHeads != null && cylinderHeads.Value != null && (string)cylinderHeads.Value != "") { <div> <h5>@Translate("Cylinder Heads")</h5> @cylinderHeads.Value </div> } @if(ignitionTiming != null && ignitionTiming.Value != null && (string)ignitionTiming.Value != "") { <div> <h5>@Translate("Ignition Timing")</h5> @ignitionTiming.Value </div> } @if(sparkPlug != null && sparkPlug.Value != null && (string)sparkPlug.Value != "") { <div> <h5>@Translate("Spark Plug")</h5> @sparkPlug.Value </div> } @if(firingOrder != null && firingOrder.Value != null && (string)firingOrder.Value != "") { <div> <h5>@Translate("Firing Order")</h5> @firingOrder.Value </div> } @if(rotatingAssembly != null && rotatingAssembly.Value != null && (string)rotatingAssembly.Value != "") { <div> <h5>@Translate("Rotating Assembly")</h5> @rotatingAssembly.Value </div> } @if(camSpecs != null && camSpecs.Value != null && (string)camSpecs.Value != "") { <div> <h5>@Translate("Cam Specs")</h5> @camSpecs.Value </div> } @if(stallConverter != null && stallConverter.Value != null && (string)stallConverter.Value != "") { <div> <h5>@Translate("Stall Converter")</h5> @stallConverter.Value </div> } @if(alsoIncludes != null && alsoIncludes.Value != null && (string)alsoIncludes.Value != "") { <div> <h5>@Translate("Also Includes")</h5> @alsoIncludes.Value </div> } @if(notes != null && notes.Value != null && (string)notes.Value != "") { <div> <h5>@Translate("Notes")</h5> @notes.Value </div> } </div> </div> </div> } <!-- PARTS & ACCESSORIES --> @if (!noPartsAccessories) { <div class="tabpanel" id="panel-parts" role="tabpanel" aria-labelledby="tab-parts" hidden> <div class="callout" role="note" aria-label="Dyno note"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor"><circle cx="12" cy="12" r="10" stroke-width="1.6"/><path d="M12 7v6m0 4h.01" stroke-width="1.6"/></svg> <div>@partsCalloutText</div> </div> <h4 class="section-lead">@Translate("Parts & Accessories Specs")</h4> <table class="spec-table" aria-label="Parts & Accessories Specs"> <tbody> @if(intakeManifold != null && intakeManifold.Value != null && (string)intakeManifold.Value != "") { <tr><th>@Translate("Intake Manifold") @( (bool)intakeManifoldIncluded.Value == false ? "(Not Included)" : "" )</th><td>@intakeManifold.Value</td></tr> } @if(sparkPlugPart != null && sparkPlugPart.Value != null && (string)sparkPlugPart.Value != "") { <tr><th>@Translate("Spark Plug") @( (bool)sparkPlugIncluded.Value == false ? "(Not Included)" : "" )</th><td>@sparkPlugPart.Value</td></tr> } @if(fuelDeliveryType != null && fuelDeliveryType.Value != null && (string)fuelDeliveryType.Value != "") { <tr><th>@Translate("Fuel Delivery Type") @( (bool)fuelDeliveryTypeIncluded.Value == false ? "(Not Included)" : "" )</th><td>@fuelDeliveryType.Value</td></tr> } @if(harmonicBalancer != null && harmonicBalancer.Value != null && (string)harmonicBalancer.Value != "") { <tr><th>@Translate("Harmonic Balancer") @( (bool)harmonicBalancerIncluded.Value == false ? "(Not Included)" : "" )</th><td>@harmonicBalancer.Value</td></tr> } @if(flexPlateFlywheel != null && flexPlateFlywheel.Value != null && (string)flexPlateFlywheel.Value != "") { <tr><th>@Translate("Flexplate/Flywheel") @( (bool)flexPlateFlywheelIncluded.Value == false ? "(Not Included)" : "" )</th><td>@flexPlateFlywheel.Value</td></tr> } @if(fuelRecommendation != null && fuelRecommendation.Value != null && (string)fuelRecommendation.Value != "") { <tr><th>@Translate("Fuel Recommendation")</th><td>@fuelRecommendation.Value</td></tr> } @if(recommendedBreakInOil != null && recommendedBreakInOil.Value != null && (string)recommendedBreakInOil.Value != "") { <tr><th>@Translate("Recommended Break-in Oil")</th><td>@recommendedBreakInOil.Value</td></tr> } @if(recommendedServiceOil != null && recommendedServiceOil.Value != null && (string)recommendedServiceOil.Value != "") { <tr><th>@Translate("Recommended Service Oil")</th><td>@recommendedServiceOil.Value</td></tr> } @if(recommendedOilFilter != null && recommendedOilFilter.Value != null && (string)recommendedOilFilter.Value != "") { <tr><th>@Translate("Recommended Oil Filter")</th><td>@recommendedOilFilter.Value</td></tr> } @if(totalOilCapacity != null && totalOilCapacity.Value != null && (string)totalOilCapacity.Value != "") { <tr><th>@Translate("Total Oil Capacity with Production Oil Pan, and Correct Filter")</th><td>@totalOilCapacity.Value</td></tr> } </tbody> </table> <div class="mid-section-text"> @midSectionText </div> @* COMPATIBLE PARTS & ACCESSORIES *@ @{ if (groupedRelatedProducts.Count > 0) { <div class="section-lead">@Translate("Compatible Parts & Accessories")</div> <div class="accordion" id="compat-acc"> @{ var counter = 0; foreach (var grouped in groupedRelatedProducts) { (Group? group, IList<Product> products) = grouped; string className = counter == 0 ? "acc-item open" : "acc-item"; <div class="@className"> <button class="acc-header" type="button" aria-expanded="true"> <span>@group?.Name</span><span class="icon plus">+</span><span class="icon minus">-</span> </button> <div class="acc-panel"> <div class="description">@group?.Description</div> <div class="product-grid"> @foreach(var groupedProduct in products) { var cardParams = new Dictionary<string, object>(); cardParams.Add("ProductId", @groupedProduct.Id); @RenderPartial("/Designs/Swift/Components/Custom/ProductCardAddToCart.cshtml", new Dynamicweb.Frontend.ParagraphViewModel(), cardParams) } </div> </div> </div> counter++; } } </div> } } </div> } <!-- WARRANTY --> <div class="tabpanel" id="panel-warranty" role="tabpanel" aria-labelledby="tab-warranty" hidden> <div class="w-split"> <div class="left"> @warrantyTextLeft </div> <div class="right"> @warrantyTextRight <a href="@warrantyCtaLink" class="cta-dark">@warrantyCtaText</a> </div> </div> </div> </div> </section> <script> /* Tabs */ const tabs = Array.from(document.querySelectorAll('.tablist .tab')); const panels = Array.from(document.querySelectorAll('.tabpanel')); function activateTab(tab){ tabs.forEach(t => { const selected = t === tab; t.setAttribute('aria-selected', selected); t.tabIndex = selected ? 0 : -1; }); panels.forEach(p => { p.hidden = (p.id !== tab.getAttribute('aria-controls')); }); tab.focus(); } tabs.forEach(t => { t.addEventListener('click', () => activateTab(t)); t.addEventListener('keydown', (e) => { const i = tabs.indexOf(t); if(e.key === 'ArrowRight'){ e.preventDefault(); activateTab(tabs[(i+1)%tabs.length]); } if(e.key === 'ArrowLeft'){ e.preventDefault(); activateTab(tabs[(i-1+tabs.length)%tabs.length]); } if(e.key === 'Home'){ e.preventDefault(); activateTab(tabs[0]); } if(e.key === 'End'){ e.preventDefault(); activateTab(tabs[tabs.length-1]); } }); }); /* Accordion */ document.querySelectorAll('.acc-header').forEach(btn=>{ btn.addEventListener('click', ()=>{ const item = btn.closest('.acc-item'); const open = item.classList.toggle('open'); btn.setAttribute('aria-expanded', open); }); }); (function(){ const tablist = document.getElementById('tablist'); const select = document.getElementById('tablist-select'); const tabs = Array.from(tablist.querySelectorAll('.tab')); const panels = Array.from(document.querySelectorAll('.tabpanel')); function showSelectIfMobile(){ if(window.innerWidth <= 740){ tablist.style.display = 'none'; select.style.display = ''; }else{ tablist.style.display = ''; select.style.display = 'none'; } } window.addEventListener('resize', showSelectIfMobile); showSelectIfMobile(); select.addEventListener('change', function(){ const selectedPanel = select.value; tabs.forEach((tab,i) => { tab.setAttribute('aria-selected', tab.getAttribute('aria-controls') === selectedPanel ? 'true' : 'false'); panels[i].hidden = tab.getAttribute('aria-controls') !== selectedPanel; }); }); // Also keep tab click in sync with select tabs.forEach((tab,i) => { tab.addEventListener('click', function(){ select.value = tab.getAttribute('aria-controls'); tabs.forEach((t,j) => { t.setAttribute('aria-selected', i === j ? 'true' : 'false'); panels[j].hidden = i !== j; }); }); }); })(); </script>
Bragging Rights Included.

EVERY BLUEPRINT ENGINE ACES THE DYNO TEST

We make sure we hit our target horsepower and proper torque with every crate engine. We use an advanced computerized balancer in our in-house dyno testing rooms to get our rotating assemblies within two grams, ensuring silky smooth power over the entire RPM range. That’s precisely why our engines sound and run better than our competitors.

All specs, zero speculation: A comprehensive, dyno-generated printout showing your critical engine specs will accompany your delivered engine — every time. No more guessing or wondering what your installed engine’s real-world peak horsepower and torque ratings actually are. Any doubters in the crowd? Simply flash ‘em your exact engine’s dyno results.

We're Here to Help!

Our team of experts is standing by ready to help you.

Contact Us
Contact Us
Contact Us
By clicking 'Accept All' you consent that we may collect information about you for various purposes, including: Statistics and Marketing