Clothing

20 products

Explore road, city, and mountain bike clothing made for comfort, style, and performance in our collection of bike shorts, cycling jerseys, and more!

Brand

Gender

Composition

Dr. Jackson's rain stain
Dr. Jackson's rain stain

Dr. Jackson's rain stain

$100.00 InStock
2443 In stock • 2-3 days delivery
Performance Liberty City Cycling Cap
Performance Liberty City Cycling Cap

Performance Liberty City Cycling Cap

10098
$14.99 InStock
9998 In stock • 2-3 days delivery
Castelli Logo Bandana
Castelli Logo Bandana

Castelli Logo Bandana

10099
$16.99 InStock
97 In stock • 2-3 days delivery
Pearl Izumi Calien Toes
Pearl Izumi Calien Toes

Pearl Izumi Calien Toes

10162
$15.00 OutOfStock
Out of stock
Shimano SH-R075 Road Shoe
Shimano SH-R075 Road Shoe

Shimano SH-R075 Road Shoe

10079
$59.99 InStock
1960 In stock • 2-3 days delivery
Pearl Izumi X-Alp Seek MTB Shoe
Pearl Izumi X-Alp Seek MTB Shoe

Pearl Izumi X-Alp Seek MTB Shoe

10083
$84.99 InStock
148 In stock • 2-3 days delivery
Shimano SH-M122 MTB Shoe
Shimano SH-M122 MTB Shoe

Shimano SH-M122 MTB Shoe

10084
$79.99 InStock
979 In stock • 2-3 days delivery
Performance Body-Secure Jersey
Performance Body-Secure Jersey

Performance Body-Secure Jersey

10156
$85.00 InStock
10000 In stock • 2-3 days delivery
Performance Classic Sleeveless Jersey
Performance Classic Sleeveless Jersey

Performance Classic Sleeveless Jersey

10148
$10.00 InStock
655 In stock • 2-3 days delivery
Schwinn Evolution IC Sleeveless Jersey
Schwinn Evolution IC Sleeveless Jersey

Schwinn Evolution IC Sleeveless Jersey

10149
$24.99 InStock
3567 In stock • 2-3 days delivery
Performance Elite Short
Performance Elite Short

Performance Elite Short

10150
$55.00 InStock
759 In stock • 2-3 days delivery
Fox Mojave Glove
Fox Mojave Glove

Fox Mojave Glove

10152
$24.99 InStock
433 In stock • 2-3 days delivery
12 out of 20 products
Load more products

Brand

Gender

Composition

Error executing template "Designs/Swift/Paragraph/Swift_ProductListGridView.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_b262e1189db04a2f8c0559295171e510.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.Ecommerce.ProductCatalog @using Dynamicweb.Ecommerce.CustomerExperienceCenter.Favorites @using System.Linq @using Dynamicweb.Core @functions { bool isLazyLoadingForProductInfoEnabled = Dynamicweb.Core.Converter.ToBoolean(Dynamicweb.Context.Current.Items["IsLazyLoadingForProductInfoEnabled"]); string liveInfoClass = string.Empty; string productInfoFeed = string.Empty; string showPricesWithVat = string.Empty; bool neverShowVat = false; bool isDetailPage = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("ProductID")); ProductListViewModel productList = new ProductListViewModel(); } @{ if (Dynamicweb.Context.Current.Items.Contains("ProductList")) { productList = (ProductListViewModel)Dynamicweb.Context.Current.Items["ProductList"]; } showPricesWithVat = Pageview.Area.EcomPricesWithVat.ToLower(); neverShowVat = string.IsNullOrEmpty(showPricesWithVat); if (isLazyLoadingForProductInfoEnabled) { if (Dynamicweb.Context.Current.Items.Contains("ProductInfoFeed")) { productInfoFeed = Dynamicweb.Context.Current.Items["ProductInfoFeed"]?.ToString(); if (!string.IsNullOrEmpty(productInfoFeed)) { productInfoFeed = $"data-product-info-feed=\"{productInfoFeed}\""; } } liveInfoClass = "js-live-info"; } string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : string.Empty; string themePadding = theme != string.Empty ? "p-3" : string.Empty; string anonymousUsersLimitations = Pageview.AreaSettings.GetRawValueString("AnonymousUsers", string.Empty); bool anonymousUser = Pageview.User == null; bool hidePrice = anonymousUsersLimitations.Contains("price") && anonymousUser || Pageview.AreaSettings.GetBoolean("ErpDownHidePrices") && !Dynamicweb.Core.Converter.ToBoolean(Dynamicweb.Context.Current.Items["IsWebServiceConnectionAvailable"]); string productTheme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("ProductTheme")) ? " theme " + Model.Item.GetRawValueString("ProductTheme").Replace(" ", string.Empty).Trim().ToLower() : string.Empty; string productThemePadding = productTheme != string.Empty ? "p-3" : string.Empty; string url = Dynamicweb.Context.Current.Request.RawUrl; bool hideFavoritesSelector = !string.IsNullOrEmpty(Model.Item.GetString("HideFavoritesSelector")) ? Model.Item.GetBoolean("HideFavoritesSelector") : false; string staticVariantsLayout = Model.Item.GetRawValueString("StaticVariantsLayout", "hide"); string groupId = productList?.Group?.Id != null ? productList.Group.Id : string.Empty; var badgeParms = new Dictionary<string, object>(); badgeParms.Add("saleBadgeType", Model.Item.GetRawValue("SaleBadgeType")); badgeParms.Add("saleBadgeCssClassName", Model.Item.GetRawValue("SaleBadgeDesign")); badgeParms.Add("newBadgeCssClassName", Model.Item.GetRawValue("NewBadgeDesign")); badgeParms.Add("newPublicationDays", Model.Item.GetInt32("NewPublicationDays")); badgeParms.Add("campaignBadgesValues", Model.Item.GetList("CampaignBadges")?.GetRawValue().OfType<string>().ToList()); bool saleBadgeEnabled = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("SaleBadgeDesign")) && Model.Item.GetRawValueString("SaleBadgeDesign") != "none" ? true : false; bool newBadgeEnabled = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("NewBadgeDesign")) && Model.Item.GetRawValueString("NewBadgeDesign") != "none" ? true : false; var favoriteParameters = new Dictionary<string, object>(); if (!anonymousUser && !hideFavoritesSelector) { int defaultFavoriteListId = 0; IEnumerable<FavoriteList> favoreiteLists = Pageview.User.GetFavoriteLists(); if (favoreiteLists.Count() == 1) { foreach (FavoriteList list in favoreiteLists) { defaultFavoriteListId = list.ListId; } } favoriteParameters.Add("ListId", defaultFavoriteListId); } } @if (!isDetailPage) { <div class="h-100@(theme) @themePadding item_@Model.Item.SystemName.ToLower()" @productInfoFeed> @if (productList.TotalProductsCount > 0) { int pageSizeSetting = Converter.ToInt32(Dynamicweb.Context.Current.Request.QueryString.Get("OriginalPageSize")) > 0 ? Converter.ToInt32(Dynamicweb.Context.Current.Request.QueryString.Get("OriginalPageSize")) : productList.PageSize; int pageSize = productList.PageSize; pageSize += pageSizeSetting; int loadedProducts = productList.PageSize > productList.TotalProductsCount ? productList.TotalProductsCount : productList.PageSize; <div class="grid grid-2 grid-lg-3"> <script> gtag("event", "view_item_list", { item_list_id: "product_list_gridview", item_list_name: "Product list (Gridview)", items: [ @foreach (ProductViewModel product in productList.Products) { <text>{ item_id: "@product.Number", item_name: "@Dynamicweb.Core.Encoders.HtmlEncoder.JavaScriptStringEncode(product.Name)", currency: "@product.Price.CurrencyCode", price: @PriceViewModelExtensions.ToStringInvariant(product.Price) },</text> } ] }); </script> @foreach (ProductViewModel product in productList.Products) { string link = product.GetProductLink(GetPageIdByNavigationTag("Shop"), false); string imagePath = product?.DefaultImage?.Value ?? string.Empty; imagePath = Dynamicweb.Context.Current.Server.UrlEncode(imagePath); string ratio = Model.Item.GetRawValueString("ImageAspectRatio", string.Empty); ratio = ratio != "0" ? ratio : string.Empty; string ratioCssClass = ratio != string.Empty ? " ratio" : string.Empty; string ratioVariable = ratio != string.Empty ? "--bs-aspect-ratio: " + ratio : string.Empty; string imagePathXs = "/Admin/Public/GetImage.ashx?width=" + 480 + "&image=" + imagePath + "&format=webp"; string imagePathS = "/Admin/Public/GetImage.ashx?width=" + 640 + "&image=" + imagePath + "&format=webp"; string imagePathFallBack = "/Admin/Public/GetImage.ashx?width=" + 640 + "&image=" + imagePath + "&format=webp"; string imageTheme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("ImageTheme")) ? " theme " + Model.Item.GetRawValueString("ImageTheme").Replace(" ", string.Empty).Trim().ToLower() : string.Empty; string imageThemePadding = imageTheme != string.Empty ? "p-3" : string.Empty; string imageOutlineStyle = imageTheme == string.Empty ? "style=\"border: 1px solid transparent\"" : string.Empty; string imageId = "ProductImage_" + product.Id + product.VariantId.Replace(".", "_"); string priceId = "ProductPrice_" + product.Id + product.VariantId.Replace(".", "_"); @* Alternative image *@ var supportedImageFormats = new string[] { ".jpg", ".webp", ".png", ".gif" }; string defaultImage = product.DefaultImage != null ? product.DefaultImage.Value : string.Empty; var selectedAssetCategories = Model.Item.GetRawValueString("AlternativeImageAssets"); IEnumerable<MediaViewModel> alternativeImagesList = product.AssetCategories.Where(x => selectedAssetCategories.Contains(x.SystemName)).SelectMany(x => x.Assets); if (alternativeImagesList.FirstOrDefault() != null) { alternativeImagesList = alternativeImagesList.OrderByDescending(x => x.Value.Equals(defaultImage)); if (alternativeImagesList.First().Value == defaultImage) { alternativeImagesList = alternativeImagesList.Skip(1); } } string alternativeImage = alternativeImagesList.FirstOrDefault() != null ? alternativeImagesList.FirstOrDefault().Value : string.Empty; alternativeImage = !string.IsNullOrEmpty(alternativeImage) ? "/Admin/Public/GetImage.ashx?width=" + 640 + "&image=" + alternativeImage + "&format=webp" : string.Empty; @* Badges *@ DateTime createdDate = product.Created.Value; bool showBadges = saleBadgeEnabled && product.Discount.Price != 0 ? true : false; showBadges = (newBadgeEnabled && Model.Item.GetInt32("NewPublicationDays") == 0) || (newBadgeEnabled && (createdDate.AddDays(Model.Item.GetInt32("NewPublicationDays")) > DateTime.Now)) ? true : showBadges; showBadges = !string.IsNullOrEmpty(Model.Item.GetRawValueString("CampaignBadges")) ? true : showBadges; @* Main features *@ IEnumerable<string> selectedDisplayGroups = Model.Item.GetList("MainFeatures")?.GetRawValue().OfType<string>().ToList(); List<CategoryFieldViewModel> mainFeatures = new List<CategoryFieldViewModel>(); foreach (var selection in selectedDisplayGroups) { foreach (CategoryFieldViewModel group in product.FieldDisplayGroups.Values) { if (selection == group.Id) { mainFeatures.Add(group); } } } <article class="position-relative@(productTheme) product-list-item js-product @liveInfoClass" data-product-id="@product.Id" data-variant-id="@product.VariantId" itemscope itemtype="https://schema.org/Product"> @if (!anonymousUser) { if (!hideFavoritesSelector) { <div class="position-absolute top-0 end-0 my-3" style="z-index: 2"> @RenderPartial("Components/ToggleFavorite.cshtml", product, favoriteParameters) </div> } } @if (showBadges) { <div class="position-absolute top-0 left-0 p-1 p-lg-2 ps-0 ps-lg-0" style="z-index: 2"> @RenderPartial("Components/EcommerceBadge.cshtml", product, badgeParms) </div> } <div class="d-flex flex-column d-block h-100"> @{ string clickProductLink = "onclick=\"return clickProductLink('" + @product.Id + "', '" + @Dynamicweb.Core.Encoders.HtmlEncoder.JavaScriptStringEncode(product.Name) + "', '" + @Dynamicweb.Core.Encoders.HtmlEncoder.JavaScriptStringEncode(product.VariantName) + "', '" + @product.Price.CurrencyCode + "', '" + @PriceViewModelExtensions.ToStringInvariant(product.Price) + "')\""; } <a href="@link" class="text-decoration-none d-flex flex-column" @clickProductLink> <script> function clickProductLink(productId, productName, productVariant, productCurrency, productPrice) { if (typeof gtag !== "undefined") { gtag("event", "select_item", { item_list_id: "product_list_gridview", item_list_name: "Product list (Gridview)", items: [ { item_id: productId, item_name: productName, currency: productCurrency, item_list_id: "product_list_gridview", item_list_name: "Product list (Gridview)", item_variant: productVariant, price: productPrice } ] }); } } </script> <div class="@productThemePadding order-2"> <div class="flex-grow-1"> <h3 class="h6 mb-0 text-break"> @product.Name @if (!string.IsNullOrEmpty(product.VariantName)) {<text>(@product.VariantName)</text>} </h3> @if (!Model.Item.GetBoolean("HideProductNumber")) { <p class="fs-7 opacity-85 mb-2">@product.Number</p> } @if (mainFeatures.Count > 0) { <ul class="p-0 lh-sm opacity-75" style="list-style-position: inside"> @foreach (CategoryFieldViewModel mainFeatureGroup in mainFeatures) { foreach (var field in mainFeatureGroup.Fields) { string fieldValue = field.Value.Value != null ? field.Value.Value.ToString() : string.Empty; if (fieldValue != string.Empty) { fieldValue = fieldValue == "False" ? Translate("No") : fieldValue; fieldValue = fieldValue == "True" ? Translate("Yes") : fieldValue; if (field.Value.Value.GetType() == typeof(System.Collections.Generic.List<FieldOptionValueViewModel>)) { fieldValue = string.Empty; List<string> options = new List<string>(); foreach (FieldOptionValueViewModel option in field.Value.Value as System.Collections.Generic.List<FieldOptionValueViewModel>) { if (!string.IsNullOrWhiteSpace(option.Value)) { if (option.Value.ToString().Contains("#") || option.Value.StartsWith("/Files/", StringComparison.OrdinalIgnoreCase) && (Translate(field.Value.Name) == Translate("Color") || Translate(field.Value.Name) == Translate("Colour"))) { string colorSpan = "<span class=\"colorbox-sm border\" style=\"background-color: " + option.Value + "\"></span>"; if (option.Value.StartsWith("/Files/", StringComparison.OrdinalIgnoreCase)) { colorSpan = $"<img src=\"/Admin/Public/GetImage.ashx?width=16&height=16&image={option.Value}\">"; } options.Add(colorSpan); } else { options.Add(option.Name); } } } string optionsString = (string.Join(", ", options.Select(x => x.ToString()).ToArray())); if ((Translate(field.Value.Name) == Translate("Color") || Translate(field.Value.Name) == Translate("Colour"))) { optionsString = (string.Join(" ", options.Select(x => x.ToString()).ToArray())); } fieldValue = optionsString; } if (!string.IsNullOrEmpty(fieldValue)) { <li>@(field.Value.Name): @fieldValue</li> } } } } </ul> } </div> @if (!hidePrice) { string priceMin = string.Empty; string priceMax = string.Empty; <div> <div> <span itemprop="priceCurrency" content="@product.Price.CurrencyCode" class="d-none"></span> @if (showPricesWithVat == "false" && !neverShowVat) { if (isLazyLoadingForProductInfoEnabled) { <span itemprop="price" content="" class="d-none"></span> <span class="text-decoration-line-through js-text-decoration-line-through opacity-75 me-3 text-price js-text-price d-none" data-show-if="LiveProductInfo.product.Price.Price != LiveProductInfo.product.PriceBeforeDiscount.Price"></span> } else { string beforePrice = product.PriceBeforeDiscount.PriceWithoutVatFormatted; <span itemprop="price" content="@product.Price.PriceWithoutVat" class="d-none"></span> if (product.Price.Price != product.PriceBeforeDiscount.Price) { <span class="text-decoration-line-through opacity-75 me-3 text-price">@beforePrice</span> } } } else { if (isLazyLoadingForProductInfoEnabled) { <span itemprop="price" content="" class="d-none"></span> <span class="text-decoration-line-through js-text-decoration-line-through opacity-75 me-3 text-price js-text-price d-none" data-show-if="LiveProductInfo.product.Price.Price != LiveProductInfo.product.PriceBeforeDiscount.Price"></span> } else { string beforePrice = product.PriceBeforeDiscount.PriceFormatted; <span itemprop="price" content="@product.Price.Price" class="d-none"></span> if (product.Price.Price != product.PriceBeforeDiscount.Price) { <span class="text-decoration-line-through opacity-75 me-3 text-price">@beforePrice</span> } } } @if (showPricesWithVat == "false" && !neverShowVat) { if (isLazyLoadingForProductInfoEnabled) { <span class="text-price js-text-price"><span class="spinner-border" role="status"></span></span> } else { string price = product.Price.PriceWithoutVatFormatted; if (product?.VariantInfo?.VariantInfo != null) { priceMin = product?.VariantInfo?.PriceMin?.PriceWithoutVatFormatted != null ? product.VariantInfo.PriceMin.PriceWithoutVatFormatted : ""; priceMax = product?.VariantInfo?.PriceMax?.PriceWithoutVatFormatted != null ? product.VariantInfo.PriceMax.PriceWithoutVatFormatted : ""; } if (priceMin != priceMax) { price = priceMin + " - " + priceMax; } <span class="text-price">@price</span> } } else { if (isLazyLoadingForProductInfoEnabled) { <span class="text-price js-text-price"><span class="spinner-border" role="status"></span></span> } else { string price = product.Price.PriceFormatted; if (product?.VariantInfo?.VariantInfo != null) { priceMin = product?.VariantInfo?.PriceMin?.PriceFormatted != null ? product.VariantInfo.PriceMin.PriceFormatted : ""; priceMax = product?.VariantInfo?.PriceMax?.PriceFormatted != null ? product.VariantInfo.PriceMax.PriceFormatted : ""; } if (priceMin != priceMax) { price = priceMin + " - " + priceMax; } <span class="text-price">@price</span> } } </div> @if (showPricesWithVat == "false" && !neverShowVat) { if (isLazyLoadingForProductInfoEnabled) { <div class="fs-7 opacity-85 text-price js-text-price-with-vat d-none" data-suffix="@Translate("Incl. VAT")"></div> } else { string price = product.Price.PriceWithVatFormatted; if (product?.VariantInfo?.VariantInfo != null) { priceMin = product?.VariantInfo?.PriceMin?.PriceWithVatFormatted != null ? product.VariantInfo.PriceMin.PriceWithVatFormatted : ""; priceMax = product?.VariantInfo?.PriceMax?.PriceWithVatFormatted != null ? product.VariantInfo.PriceMax.PriceWithVatFormatted : ""; } if (priceMin != priceMax) { price = priceMin + " - " + priceMax; } <div class="fs-7 opacity-85 text-price">@price @Translate("Incl. VAT")</div> } } </div> } @if (product.VariantInfo.VariantInfo != null && staticVariantsLayout == "swatches") { var optionCount = product.VariantInfo.VariantInfo.Count(); var showMaxVariants = 5; <div class="d-flex flex-row gap-1 align-items-center"> @foreach (VariantInfoViewModel variant in product.VariantInfo.VariantInfo.Take(showMaxVariants)) { <span class="colorbox colorbox-sm border rounded-circle border me-1" style="background-color: @variant.OptionColor"></span> } @if (optionCount > showMaxVariants) { int left = optionCount - showMaxVariants; <span class="ms-2">+@left</span> } </div> } </div> <div class="overflow-hidden order-1 @(imageTheme)" @imageOutlineStyle> <div class="ratio" style="@(ratioVariable)"> <div class="d-flex justify-content-center align-items-center"> @if (string.IsNullOrEmpty(alternativeImage)) { <img id="@imageId" srcset=" @imagePathXs 480w, @imagePathS 640w" sizes="(min-width: 992px) 33vw, 50vw" src="@imagePathFallBack" loading="lazy" decoding="async" class="mw-100 mh-100 @imageThemePadding" alt="@product.Name"> } else { <img id="@imageId" src="@imagePathFallBack" loading="lazy" decoding="async" class="mw-100 mh-100 @imageThemePadding" alt="@product.Name" onmouseover="this.src='@alternativeImage'" onmouseout="this.src='@imagePathFallBack'"> } </div> </div> @if (product.VariantInfo.VariantInfo != null && staticVariantsLayout == "images") { int variantGroupCount = 0; int showMaxVariantGroups = 2; int showMaxVariants = 3; var productVariantTheme = productTheme != string.Empty ? productTheme : "bg-white"; <div class="position-relative"> <div id="StaticVariants_@product.Id" class="static-variants w-100 d-none d-lg-block position-absolute left-0 bottom-0 @productTheme" style="pointer-events: none;"> @foreach (var variantGroup in product.VariantGroups()) { int variantsCount = 0; <div class="d-flex gap-2 mb-2"> @foreach (var variant in variantGroup.Options) { if (variantGroupCount < showMaxVariantGroups) { var optionsCount = variantGroup.Options.Count(); if (variantsCount < showMaxVariants) { string optionWidth = !string.IsNullOrEmpty(variant.Color) ? "w-25" : string.Empty; <article class="static-variants-option @optionWidth @(productVariantTheme)" title="@product.Name @variant.Name" style="pointer-events: initial;"> @if (!string.IsNullOrEmpty(variant.Color)) { string defaultProductImage = Dynamicweb.Context.Current.Server.UrlEncode(product.DefaultImage.Value); string variantImage = Dynamicweb.Context.Current.Server.UrlEncode(variant.Image.Value); string defaultPrice = !hidePrice ? product.Price.PriceFormatted : "0"; string variantPrice = !hidePrice ? product.Price.PriceFormatted : "0"; if (isLazyLoadingForProductInfoEnabled) { <figure class="w-100 d-block m-0" data-price-formatted="" onmouseover="swift.StaticVariants.SwitchProduct(event, '@product.Id', this.getAttribute('data-price-formatted'), '@variantImage')" onmouseout="swift.StaticVariants.SwitchProduct(event, '@product.Id', this.getAttribute('data-price-formatted'), '@defaultProductImage')"> <div class="d-flex align-items-center justify-content-center"> <img src="/admin/public/GetImage.ashx?image=@variantImage&width=75&height=75&crop=5&FillCanvas=true&format=webp" height="75" width="75" class="p-1 text-small" loading="lazy" decoding="async" alt="@product.Name, @variant.Name"> </div> </figure> } else { <figure class="w-100 d-block m-0" onmouseover="swift.StaticVariants.SwitchProduct(event, '@product.Id', '@defaultPrice', '@variantImage')" onmouseout="swift.StaticVariants.SwitchProduct(event, '@product.Id', '@variantPrice', '@defaultProductImage')"> <div class="d-flex align-items-center justify-content-center"> <img src="/admin/public/GetImage.ashx?image=@variantImage&width=75&height=75&crop=5&FillCanvas=true&format=webp" height="75" width="75" class="p-1 text-small" loading="lazy" decoding="async" alt="@product.Name, @variant.Name"> </div> </figure> } } else { <div class="d-flex align-items-center justify-content-center"> @variant.Name </div> } <div class="visually-hidden"> <h4>@product.Name, @variant.Name</h4> @if (!hidePrice) { if (isLazyLoadingForProductInfoEnabled) { <span class="text-price js-text-price"></span> } else { <span class="text-price">@product.Price.PriceFormatted</span> } } </div> </article> } variantsCount++; if (variantsCount == showMaxVariants && optionsCount != showMaxVariants) { int left = optionsCount - showMaxVariants; <div class="variant-option ms-1 d-flex justify-content-center align-items-center"> <span>+@left</span> </div> } } } </div> variantGroupCount++; } </div> </div> } </div> </a> </div> </article> } </div> <div class="my-3" id="LoadMoreButton"> <div class="text-center d-flex flex-column gap-3"> <div class="opacity-85">@loadedProducts @Translate("out of") @productList.TotalProductsCount @Translate("products")</div> @if (productList.PageCount != 1) { string sortBySelection = Dynamicweb.Context.Current.Request?.Form["SortBy"] ?? string.Empty; sortBySelection = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("SortBy")) ? Dynamicweb.Context.Current.Request.QueryString.Get("SortBy") : sortBySelection; string mainProductId = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("MainProductID")) ? Dynamicweb.Context.Current.Request.QueryString.Get("MainProductID") : string.Empty; string searchQuery = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("q")) ? Dynamicweb.Context.Current.Request.QueryString.Get("q") : string.Empty; searchQuery = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("q")) ? Dynamicweb.Context.Current.Request.Form.Get("q") : searchQuery; string searchLayout = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("SearchLayout")) ? Dynamicweb.Context.Current.Request.QueryString.Get("SearchLayout") : string.Empty; <form method="get" action="@url" data-response-target-element="content" class="w-100"> @foreach (FacetGroupViewModel facetGroup in productList.FacetGroups) { foreach (FacetViewModel facetItem in facetGroup.Facets) { foreach (FacetOptionViewModel facetOption in facetItem.Options) { if (facetOption.Selected) { <input type="hidden" name="@facetItem.QueryParameter" value="[@facetOption.Value]"> } } } } <input type="hidden" name="OriginalPageSize" value="@pageSizeSetting"> <input type="hidden" name="PageSize" value="@pageSize"> <input type="hidden" name="SortBy" value="@sortBySelection"> <input type="hidden" name="RequestType" value="UpdateList"> @if (!string.IsNullOrEmpty(searchQuery)) { <input type="hidden" name="q" value="@searchQuery"> <input type="hidden" name="SearchLayout" value="@searchLayout"> } @if (!string.IsNullOrEmpty(mainProductId)) { <input type="hidden" name="MainProductID" value="@mainProductId"> } @{ string nextPageLink = "/Default.aspx?ID=" + Pageview.Page.ID + "&PageSize=" + pageSize + "&SortBy=" + sortBySelection; foreach (FacetGroupViewModel facetGroup in productList.FacetGroups) { foreach (FacetViewModel facetItem in facetGroup.Facets) { foreach (FacetOptionViewModel facetOption in facetItem.Options) { if (facetOption.Selected) { nextPageLink += "&" + facetItem.QueryParameter + "=[" + facetOption.Value + "]"; } } } } nextPageLink += !string.IsNullOrEmpty(searchQuery) ? "&q=" + searchQuery : string.Empty; string disableLoadMore = isLazyLoadingForProductInfoEnabled ? "d-none" : string.Empty; } <a href="@nextPageLink" class="btn btn-primary swift_load_more_button @disableLoadMore" onclick="swift.ProductList.Update(event)" id="LoadMoreButton_@Model.ID">@Translate("Load more products")</a> </form> } </div> </div> } else { if (!Pageview.IsVisualEditorMode) { <div class="alert alert-dark m-0"> @Translate("We did not find anything matching your search result") </div> } else { <div class="alert alert-dark m-0" role="alert"> <span>@Translate("Product list: The list will be shown here, if any")</span> </div> } } </div> }
By clicking 'Accept All' you consent that we may collect information about you for various purposes, including: Statistics and Marketing