An awesome descent, with some high speed ripping at the top, some root drops in the middle, and some great bank turns at the bottom.
If you continue, the trail ends at one of the lakes and continues lakeside until reaching the point where you began the trail The lake-side bit is fairly technical and very fun. This trail begins with a small pump section with two smaller jumps and a third larger hip jump. I've master huck to flat though! Some wettness, but new sections are well drained and very good. Trail is now covered in snow and you can only ride the packed areas from where sledders and shredders have packed out a trail.
Well built jump line with wooden lips built into each jump. Also you exit onto a trail where hikers frequent, so keep it under control here. Continue pedaling up through the dark forest around small bands of shale-laden cliffs. Few sniper rocks on the trail. Or with only moderate climbing involved these trails can keep almost anyone interested for hours. Trail contains a rope-suspended ladder bridge, elevated bridges and a long-straight skinny.
From here the trail narrows and skirts a rocky hillside. Unfortunately, the lake-side trail has a hike-a-bike section in the middle. Amazing views of Castle valley are afforded after 50 meters of riding. 6 mile thrill ride through the dense pine forest of the park. This created a reroute of the single track. The turns are all smooth berms and easy to ride and not wash out. Freeze-thaw cycle isn't awful, but does make this trail rather slick. A full suspension bike with 3+ inches of travel will greatly enhance your experience! Stay straight when the trail intersects with a doubletrack and then bear left at an intersection with the winter/horse route.
You can find everyone out here having fun from people in body armor and downhill bikes to families testing their kids limits to xc racer types riding intervals. Counterclockwise the descent is shorter but steeper in spots. This trail can be sandy during dry summer months and is best after rain, in the spring or fall.
Two wheel drifting is likely if you have speed but are not riding the top few inches of the berms. Continue pedaling up through the dark forest around small bands of shale-laden cliffs.
It is steep. It has a number of blind LH corners so whistle or use a bell so you can alert anyone coming the opposite way. This trail begins with a small pump section with two smaller jumps and a third larger hip jump. Use some caution in the corners here. The lower half features two rock drops including reef drop which is the largest rock drop and Highland and.
After a few bends in the trail you'll get through this section and then start hear the waterfalls in another giant valley that you'll ride above. This trail is the cherry on top when riding Porcupine rim! Big downed tree near the end of Lower Black. Technical singletrack in the Southside Hills above Kilbride. You can find everyone out here having fun from people in body armor and downhill bikes to families testing their kids limits to xc racer types riding intervals.
Trail contains a rope-suspended ladder bridge, elevated bridges and a long-straight skinny. Plenty of kick ups, jumps, drops, and huge berms. More branches down and seems they are often in bad spots, i.e. landings. Removable by hand saw. It's mostly a hike-a-bike up and then has an advanced all-mountain feel coming down.
Error executing template "Designs/Swift/Paragraph/Swift_ArticleList.cshtml" System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object. at Dynamicweb.Content.Items.Queries.Repository.IsPageAllowed(Page page) at Dynamicweb.Content.Items.Queries.Repository.GetPagesByIds(IEnumerable`1 parentIds, Boolean includeChildItems, Boolean checkPermissions, List`1& childPages) at Dynamicweb.Content.Items.Queries.Repository.SelectByParentPageIds(IEnumerable`1 parentIds, Query query, Boolean includeParagraphs, Boolean includeChildItems, Boolean checkPermissions, Boolean includeInheritedItems) at Dynamicweb.ItemPublisher.Frontend.GetItems() at Dynamicweb.ItemPublisher.Frontend.List() at Dynamicweb.ItemPublisher.Frontend.GetContent() at Dynamicweb.ItemPublisher.Frontend.GetContentBySettings(String settings) --- End of inner exception stack trace --- at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at Dynamicweb.Extensibility.AddIns.AddInManager.InvokeFunction(Object instance, String functionName, Object[] arguments) at Dynamicweb.Rendering.TemplateBase`1.RenderItemList(Object settings) at CompiledRazorTemplates.Dynamic.RazorEngine_a030ba0ff5464cfabf9a65a2b1bd03c8.<>c__DisplayClass0_0.<RenderArticleList>b__0(TextWriter __razor_helper_writer) at CompiledRazorTemplates.Dynamic.RazorEngine_a030ba0ff5464cfabf9a65a2b1bd03c8.Execute() at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer) at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter) 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> @{ string listSource = Model.Item.GetRawValueString("ListSource", Model.PageID.ToString()); string listBehaviour = Model.Item.GetRawValueString("ListBehaviour", "articles"); string articleListSortOrder = Model.Item.GetRawValueString("ArticleListSortOrder", "Descending"); string articleListLayout = Model.Item.GetRawValueString("ArticleListLayout", "grid"); string columnTheme = Model.Item.GetRawValueString("ColumnTheme", string.Empty); string columnThemeClass = columnTheme != string.Empty ? " theme " + columnTheme + " p-3" + (articleListLayout == "carousel" ? " px-lg-4" : string.Empty) : string.Empty; int maxItemsInList = !string.IsNullOrEmpty(Model.Item.GetInt32("MaxItemsInList").ToString()) ? Model.Item.GetInt32("MaxItemsInList") : 10; <div class="h-100@(columnThemeClass) item_@Model.Item.SystemName.ToLower()"> <a id="@Model.ID" class="user-select-none" style="scroll-margin-top:var(--header-height,150px)"></a> @switch (articleListLayout) { case "grid": { if (listBehaviour == "articles") {@RenderArticleList("Swift_Article", listSource, maxItemsInList, articleListSortOrder) } if (listBehaviour == "lists") { @RenderArticleList("Swift_ArticleListPage", listSource, maxItemsInList, articleListSortOrder) } } break; case "carousel": var carouselSettings = Model.Item.GetRawValueString("CarouselSettings", "4"); string slidesPerPage = $"slider-item-show{carouselSettings}"; string navigationStyle = $"{Model.Item.GetRawValueString("NavigationStyle", "slider-nav-round")}"; string navigationPlacement = $"{Model.Item.GetRawValueString("NavigationPlacement", "slider-nav-on-slides")}"; string indicatorStyle = $"{Model.Item.GetRawValueString("IndicatorStyle", string.Empty)}"; string revealSlides = Model.Item.GetRawValueString("RevealSlides", "reveal") == "reveal" ? "slider-item-reveal" : string.Empty; string sliderItemsGap = Model.Item.GetRawValueString("SliderItemsGap", "slider-item-gap") == "slider-item-nogap" ? "slider-item-nogap" : string.Empty; string navigationAlwaysVisible = (Model.Item.GetBoolean("NavigationAlwaysVisible")) ? "slider-nav-visible" : string.Empty; string navigationVisibleOnTouch = (Model.Item.GetBoolean("NavigationVisibleOnTouch")) ? "slider-nav-touch" : string.Empty; string navigationShowScrollbar = (Model.Item.GetBoolean("NavigationShowScrollbar")) ? "slider-nav-scrollbar" : string.Empty; string scrollBarForceMobile = (Model.Item.GetBoolean("NavigationShowScrollbar")) ? "--swiffy-slider-track-height:0.5rem !important;" : string.Empty; string navigationSmall = (Model.Item.GetBoolean("NavigationSmall")) ? "slider-nav-sm" : string.Empty; string navigationInvertColors = (Model.Item.GetBoolean("NavigationInvertColors")) ? "slider-nav-dark" : string.Empty; string navigationSlideEntirePage = (Model.Item.GetBoolean("NavigationSlideEntirePage")) ? "slider-nav-page" : string.Empty; string navigationNoLoop = (Model.Item.GetBoolean("NavigationNoLoop")) ? "slider-nav-noloop" : string.Empty; string indicatorsOutsideSlider = (Model.Item.GetBoolean("IndicatorsOutsideSlider") && indicatorStyle != string.Empty) ? "slider-indicators-outside" : string.Empty; string indicatorsHighlightActive = (Model.Item.GetBoolean("IndicatorsHighlightActive")) ? "slider-indicators-highlight" : string.Empty; string indicatorsInvertColors = (Model.Item.GetBoolean("IndicatorsInvertedColors")) ? "slider-indicators-dark" : string.Empty; string indicatorsVisibleOnSmallDevices = (Model.Item.GetBoolean("IndicatorsVisibleOnSmallDevices")) ? "slider-indicators-sm" : string.Empty; string animation = Model.Item.GetRawValueString("Animation", string.Empty) != string.Empty ? $"slider-nav-animation {Model.Item.GetRawValueString("Animation")}" : string.Empty; string autoplay = (Model.Item.GetBoolean("Autoplay")) ? "slider-nav-autoplay" : string.Empty; string autoplayInterval = Model.Item.GetRawValueString("AutoplayInterval", string.Empty); bool hideSliderNavigation = false; if (navigationStyle == "slider-nav-none") { hideSliderNavigation = true; } <div id="Slider_@Model.ID" class="swiffy-slider @(slidesPerPage) @(navigationStyle) @(revealSlides) @(navigationPlacement) @(navigationAlwaysVisible) @(navigationVisibleOnTouch) @(sliderItemsGap) @(indicatorStyle) @(navigationShowScrollbar) @(navigationSmall) @(navigationInvertColors) @(indicatorsOutsideSlider) @(navigationNoLoop) @(indicatorsHighlightActive) @(indicatorsInvertColors) @(indicatorsVisibleOnSmallDevices) @(navigationSlideEntirePage) @(animation) @(autoplay) item_@Model.Item.SystemName.ToLower()" style="--swiffy-slider-nav-light:var(--swift-foreground-color);--swiffy-slider-nav-dark:var(--swift-background-color);visibility:hidden;opacity:0;@(scrollBarForceMobile)" data-slider-nav-autoplay-interval="@(autoplayInterval)"> <div class="slider-container pb-3 py-lg-3 px-lg-3 mt-lg-n3 mx-lg-n3"> @{ if (listBehaviour == "articles") { @RenderArticleList("Swift_Article", listSource, maxItemsInList, articleListSortOrder) } if (listBehaviour == "lists") { @RenderArticleList("Swift_ArticleListPage", listSource, maxItemsInList, articleListSortOrder) } } </div> @if (!hideSliderNavigation) { <button type="button" title="@Translate("Previous slide")" class="slider-nav" style="z-index:1;"> <span class="visually-hidden">@Translate("Previous slide")</span> </button> <button type="button" title="@Translate("Next slide")" class="slider-nav slider-nav-next" style="z-index:1;"> <span class="visually-hidden">@Translate("Next slide")</span> </button> } @if (indicatorStyle != "slider-indicators-hidden") { <div class="slider-indicators" style="z-index:1;"></div> } <script type="module" src="/Files/Templates/Designs/Swift/Assets/js/swiffy-slider.js"></script> <script type="module"> const slider = document.querySelector('#Slider_@Model.ID'); swift.AssetLoader.Load('/Files/Templates/Designs/Swift/Assets/css/swiffy-slider.min.css', 'css'); document.addEventListener('load.swift.assetloader', () => { swiffyslider.initSlider(slider); slider.style.opacity = 1; slider.style.visibility = "visible"; }); </script> @if (indicatorStyle != "slider-indicators-hidden") { <script type="module"> const slider = document.querySelector('#Slider_@Model.ID'); const sliderContainer = slider.querySelector('.slider-container'); let slides = sliderContainer.querySelectorAll('article'); const sliderIndicators = slider.querySelector('.slider-indicators'); slides.forEach((slide,index) => { const indicator = document.createElement('template'); indicator.innerHTML = ` <button type="button" class="${index == 0 ? "active" : ""}" title='@Translate("Go to slide") ${index + 1}'> <span class="visually-hidden">@Translate("Go to slide") ${index + 1}</span> </button> `; sliderIndicators.appendChild(indicator.content); }); </script> } </div> break; } </div> } @helper RenderArticleList(string itemType, string listSource, int maxItemsInList, string articleListSortOrder) { var parent = Dynamicweb.Context.Current.Request.QueryString.Get("list"); var query = string.IsNullOrEmpty(parent) ? listSource : parent; var includeAllChildren = Model.Item.GetRawValueString("ListDepth", "all") == "all" ? true : false; var listContext = Model.Item?.GetRawValueString("ListContext", string.Empty).Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); var filterString = string.Join(" or ", listContext.Select(item => $"Tags == \"{item}\" or Tags ends with \",{item}\" or Tags starts with \"{item},\" or Tags contains \",{item},\"")); @RenderItemList(new { ItemType = itemType, ListTemplate = "ItemPublisher/List/List.cshtml", ItemFieldsList = "*", ListSourceType = "Page", ListSourcePage = query, ListPageSize = maxItemsInList, IncludeParagraphItems = true, ListOrderBy = "PublishedDate", ListSecondOrderBy = "Updated", ListOrderByDirection = articleListSortOrder, IncludeAllChildItems = includeAllChildren, Filter = itemType == "Swift_Article" ? filterString : null // Filter only if "articles only" }) }