How to make your outdoor space more inviting
Looking forward to spending time outside, enjoying the spring sunshine and summer breezes? Then you’ll want to make the most of your patio or back yard. This is the perfect spot for appreciating the outdoor flora and fauna, great food and good company. You can also soak up some sun, read a bestseller or fill a paddling pool for the little ones. The main thing is to make your outdoor living space cosy and inviting – because then you’ll want to spend more time there. Look no further for lots of inspiration on how to make your patio, porch or back yard space more inviting. Feel free to grab these ideas or be inspired to dream up your own.
Inspiration for a cosy outdoor living space
Giving your patio or back yard a makeover to make it your best-ever hangout doesn’t have to be complicated or cost a fortune.
One popular solution is to create a lounging area. With a comfy sofa and soft cushions, you’ll be ready for some R’n R with a glass of wine. And how about a little side table for your favourite long drink and a book? If your outdoor space is already furnished, you can concentrate on items that add that “extra” touch.
Find a patio heater for those cool days
Enjoying that early spring sunshine in the morning may be on the chilly side. And if you sit out late in summertime, you may well be reaching for blankets.
For those cooler times, consider installing a patio heater in an appealing design to give you many more cosy hours outside. An electric patio heater takes up very little space, can be wall-mounted and may be a more environment-friendly option than a gas-powered heater.
Shop for solar lamps for your outdoor space in different variants
Use solar lamps to create a cosy atmosphere after dark. Sun-powered lighting is an easy way of lighting up your outdoor space without having to think about power outlets, extension cables, or whether that nice indoor lamp will survive outdoors.
The unique solar lamps are available in a range of designs and sizes. So, it’s all up to you if you prefer to have your solar light decorate the table, staked in the ground or wall-mounted. Simply choose the best solution for your outdoor living space.
Gather loved ones around a cosy fireside
A fire pit is the perfect gathering place for all the family, or for your garden party guests. Enjoy hours of fun get-togethers and cosy conversation as you gaze into the flickering flames. Later, as the night goes on, toast marshmallows over the glowing embers if you fancy a fireside treat.
A fire pit is a great way to add a rustic, aesthetic touch to a neat patio, and serves several practical purposes. Because by buying a grill rack for your fire pit, you can instantly transform it into a barbecue.
Enjoy more birdlife with glass bird feeders
One of the best things about outdoor living is enjoying the flora and fauna. If you’d like to attract more feathered friends, then invest in glass bird feeders or a bird bath. Then you can be sure the birdies will pay a visit. All you have to do is fill the feeder or bath with seeded treats or water and then wait a while.
Latest blog posts
Error executing template "Designs/Swift/Paragraph/Swift_ArticleList_Custom.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_c0607b58bde547a49bbe813c31f1a74f.<>c__DisplayClass0_0.<RenderArticleList>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\twodayco3\evasolo.cloud.dynamicweb-cms.com\Files\Templates\Designs\Swift\Paragraph\Swift_ArticleList_Custom.cshtml:line 128 at CompiledRazorTemplates.Dynamic.RazorEngine_c0607b58bde547a49bbe813c31f1a74f.Execute() in D:\dynamicweb.net\Solutions\twodayco3\evasolo.cloud.dynamicweb-cms.com\Files\Templates\Designs\Swift\Paragraph\Swift_ArticleList_Custom.cshtml:line 67 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> 2 @using System.Web 3 @using Dynamicweb 4 @using Dynamicweb.Core 5 @using Dynamicweb.Frontend 6 @using Dynamicweb.Environment 7 8 @* TODO: REFACTURE/UPGRADE TO SWIFT (v1.25.0) *@ 9 10 @{ 11 var relationType = Model.Item.GetRawValueString("RelationType", "article"); 12 string listSource = !string.IsNullOrEmpty(Model.Item.GetString("ListSource")) ? Model.Item.GetString("ListSource") : Model.PageID.ToString(); // STANDARD ARTICLES 13 var listBehaviour = Model.Item.GetRawValueString("ListBehaviour", "articles"); // STANDARD ARTICLES 14 string articleListSortOrder = !string.IsNullOrEmpty(Model.Item.GetString("ArticleListSortOrder")) ? Model.Item.GetString("ArticleListSortOrder") : "Descending"; 15 int maxItemsInList = !string.IsNullOrEmpty(Model.Item.GetInt32("MaxItemsInList").ToString()) ? Model.Item.GetInt32("MaxItemsInList") : 10; 16 string articleListLayout = !string.IsNullOrEmpty(Model.Item.GetString("ArticleListLayout")) ? Model.Item.GetString("ArticleListLayout") : "grid"; 17 string columnTheme = !string.IsNullOrEmpty(Model.Item.GetString("ColumnTheme")) ? Model.Item.GetString("ColumnTheme") : string.Empty; 18 string columnThemeClass = columnTheme != string.Empty ? " theme " + columnTheme + " p-3" + (articleListLayout == "carousel" ? " px-lg-4" : string.Empty) : string.Empty; 19 20 <div class="h-100@(columnThemeClass) item_@Model.Item.SystemName.ToLower()"> 21 @switch (articleListLayout) 22 { 23 case "grid": 24 if (relationType == "article") 25 { 26 if (listBehaviour == "articles") 27 {@RenderArticleList("Swift_Article", listSource, maxItemsInList, articleListSortOrder) } 28 if (listBehaviour == "lists") 29 { @RenderArticleList("Swift_ArticleListPage", listSource, maxItemsInList, articleListSortOrder) } 30 } 31 else if (relationType == "clerk") 32 { 33 @RenderArticleListClerk("Swift_Article", maxItemsInList, articleListSortOrder) 34 } 35 break; 36 37 case "carousel": 38 var carouselSettings = Model.Item.GetRawValueString("CarouselSettings", "4"); 39 string slidesPerPage = $"slider-item-show{carouselSettings}"; 40 string navigationStyle = $"{Model.Item.GetRawValueString("NavigationStyle", "slider-nav-round")}"; 41 string navigationPlacement = $"{Model.Item.GetRawValueString("NavigationPlacement", "slider-nav-on-slides")}"; 42 string indicatorStyle = $"{Model.Item.GetRawValueString("IndicatorStyle", string.Empty)}"; 43 string revealSlides = Model.Item.GetRawValueString("RevealSlides", "reveal") == "reveal" ? "slider-item-reveal" : string.Empty; 44 string sliderItemsGap = Model.Item.GetRawValueString("SliderItemsGap", "slider-item-gap") == "slider-item-nogap" ? "slider-item-nogap" : string.Empty; 45 string navigationAlwaysVisible = (Model.Item.GetBoolean("NavigationAlwaysVisible")) ? "slider-nav-visible" : string.Empty; 46 string navigationVisibleOnTouch = (Model.Item.GetBoolean("NavigationVisibleOnTouch")) ? "slider-nav-touch" : string.Empty; 47 string navigationShowScrollbar = (Model.Item.GetBoolean("NavigationShowScrollbar")) ? "slider-nav-scrollbar" : string.Empty; 48 string scrollBarForceMobile = (Model.Item.GetBoolean("NavigationShowScrollbar")) ? "--swiffy-slider-track-height:0.5rem !important;" : string.Empty; 49 string navigationSmall = (Model.Item.GetBoolean("NavigationSmall")) ? "slider-nav-sm" : string.Empty; 50 string navigationInvertColors = (Model.Item.GetBoolean("NavigationInvertColors")) ? "slider-nav-dark" : string.Empty; 51 string navigationSlideEntirePage = (Model.Item.GetBoolean("NavigationSlideEntirePage")) ? "slider-nav-page" : string.Empty; 52 string navigationNoLoop = (Model.Item.GetBoolean("NavigationNoLoop")) ? "slider-nav-noloop" : string.Empty; 53 string indicatorsOutsideSlider = (Model.Item.GetBoolean("IndicatorsOutsideSlider") && indicatorStyle != string.Empty) ? "slider-indicators-outside" : string.Empty; 54 string indicatorsHighlightActive = (Model.Item.GetBoolean("IndicatorsHighlightActive")) ? "slider-indicators-highlight" : string.Empty; 55 string indicatorsInvertColors = (Model.Item.GetBoolean("IndicatorsInvertedColors")) ? "slider-indicators-dark" : string.Empty; 56 string indicatorsVisibleOnSmallDevices = (Model.Item.GetBoolean("IndicatorsVisibleOnSmallDevices")) ? "slider-indicators-sm" : string.Empty; 57 string animation = Model.Item.GetRawValueString("Animation", string.Empty) != string.Empty ? $"slider-nav-animation {Model.Item.GetRawValueString("Animation")}" : string.Empty; 58 string autoplay = (Model.Item.GetBoolean("Autoplay")) ? "slider-nav-autoplay" : string.Empty; 59 string autoplayInterval = Model.Item.GetRawValueString("AutoplayInterval", string.Empty); 60 bool hideSliderNavigation = (navigationStyle == "slider-nav-none"); 61 62 <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)"> 63 <div class="slider-container pb-3 py-lg-3 mt-lg-n3"> 64 @if (relationType == "article") 65 { 66 if (listBehaviour == "articles") 67 {@RenderArticleList("Swift_Article", listSource, maxItemsInList, articleListSortOrder) } 68 if (listBehaviour == "lists") 69 { @RenderArticleList("Swift_ArticleListPage", listSource, maxItemsInList, articleListSortOrder) } 70 } 71 else if (relationType == "clerk") 72 { 73 @RenderArticleListClerk("Swift_Article", maxItemsInList, articleListSortOrder) 74 } 75 </div> 76 77 @if (!hideSliderNavigation) 78 { 79 <button type="button" title="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(Translate("Previous slide"))" class="slider-nav" style="z-index:1;"> 80 <span class="visually-hidden">@Translate("Previous slide")</span> 81 </button> 82 <button type="button" title="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(Translate("Next slide"))" class="slider-nav slider-nav-next" style="z-index:1;"> 83 <span class="visually-hidden">@Translate("Next slide")</span> 84 </button> 85 } 86 @if (indicatorStyle != "slider-indicators-hidden") 87 { 88 string isActive = "active"; 89 int slideCount = 1; 90 91 <div class="slider-indicators" style="z-index:1;"> 92 @for (int i = 0; i < maxItemsInList; i++) 93 { 94 <button class="@isActive" type="button" title='@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(Translate("Go to slide")) @slideCount'> 95 <span class="visually-hidden">@Translate("Go to slide") @slideCount</span> 96 </button> 97 98 slideCount++; 99 isActive = null; 100 } 101 </div> 102 } 103 104 <script type="module" src="/Files/Templates/Designs/Swift/Assets/js/swiffy-slider.js"></script> 105 <script type="module"> 106 swift.AssetLoader.Load('/Files/Templates/Designs/Swift/Assets/css/swiffy-slider.min.css', 'css'); 107 document.addEventListener('load.swift.assetloader', () => { 108 swiffyslider.initSlider(document.querySelector('#Slider_@Model.ID')); 109 document.querySelector('#Slider_@Model.ID').style.opacity = 1; 110 document.querySelector('#Slider_@Model.ID').style.visibility = "visible"; 111 }); 112 </script> 113 </div> 114 115 break; 116 } 117 </div> 118 } 119 120 @helper RenderArticleList(string itemType, string listSource, int maxItemsInList, string articleListSortOrder) 121 { 122 var parent = Dynamicweb.Context.Current.Request.QueryString.Get("list"); 123 var query = string.IsNullOrEmpty(parent) ? listSource : parent; 124 var includeAllChildren = Model.Item.GetRawValueString("ListDepth", "all") == "all" ? true : false; // STANDARD ARTICLES 125 var listContext = Model.Item?.GetRawValueString("ListContext", string.Empty).Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); // STANDARD ARTICLES 126 var filterString = string.Join(" or ", listContext.Select(item => $"Tags == \"{item}\" or Tags ends with \",{item}\" or Tags starts with \"{item},\" or Tags contains \",{item},\"")); 127 128 @RenderItemList(new 129 { 130 ItemType = itemType, 131 ListTemplate = "ItemPublisher/List/List_Custom.cshtml", 132 ItemFieldsList = "*", 133 ListSourceType = "Page", 134 ListSourcePage = query, 135 ListPageSize = maxItemsInList, 136 IncludeParagraphItems = true, 137 ListOrderBy = "PublishedDate", 138 ListSecondOrderBy = "Updated", 139 ListOrderByDirection = articleListSortOrder, 140 IncludeAllChildItems = includeAllChildren, 141 Filter = itemType == "Swift_Article" ? filterString : null // Filter only if "articles only" 142 }) 143 } 144 145 @helper RenderArticleListClerk(string itemType, int maxItemsInList, string articleListSortOrder) 146 { 147 // Doc.: https://docs.clerk.io/reference/recommendationspagesubstituting 148 // - recommendations/page/substituting - Pages that are similar to any given page 149 // - recommendations/page/product - Pages that are related to any given product - NOTE: ProductID param is required 150 // - recommendations/page/category - Pages that are related to any given category - NOTE: GroupID param is required 151 152 var isProductDetail = (Pageview.Page.NavigationTag.ToLower() == "shop" && Dynamicweb.Context.Current.Request.HasRequest("ProductID")); 153 var renderClerk = (!isProductDetail || GetPageIdByNavigationTag("ProductDetailPage") == PageView.Current().CurrentParagraph.Page.ID); 154 155 var clerkEndPoint = Model.Item.GetString("ClerkEndpoint"); 156 var clerkQuery = new List<string>(); 157 158 switch (clerkEndPoint) 159 { 160 case "recommendations/page/substituting": 161 clerkQuery.Add("page=" + Model.PageID); 162 break; 163 164 case "recommendations/page/product": 165 if (Context.Current.Request.HasRequest("ProductID")) 166 { 167 clerkQuery.Add("product=" + Context.Current.Request.GetString("ProductID")); 168 } 169 else 170 { 171 renderClerk = false; 172 } 173 break; 174 175 case "recommendations/page/category": 176 if (Context.Current.Request.HasRequest("GroupID")) 177 { 178 clerkQuery.Add("category=" + Context.Current.Request.GetString("GroupID")); 179 } 180 else 181 { 182 renderClerk = false; 183 } 184 break; 185 } 186 187 if (renderClerk) 188 { 189 var response = Smartpage.EvaSolo.Clerk.Services.ClerkApi.Request(clerkEndPoint, string.Join("&", clerkQuery), null, Model.Item.GetString("ClerkLabels"), maxItemsInList); 190 if (response != null && response.Any()) 191 { 192 var itemEntries = Dynamicweb.Content.Services.Pages.GetPages(response.Select(i => Convert.ToInt32(i)).ToArray()).Where(i => i != null).Select(i => i.ItemId).ToArray(); 193 if (itemEntries.Any()) 194 { 195 Dynamicweb.Context.Current.Items["Custom_ClerkSortOrder"] = itemEntries; // NOTE: Ordered by ItemId. Used to sort in List_Custom.cshtml 196 197 @RenderItemList(new 198 { 199 ItemType = itemType, 200 ListTemplate = "ItemPublisher/List/List_Custom.cshtml", 201 ItemFieldsList = "*", 202 ListSourceType = "ItemEntries", 203 ListPageSize = itemEntries.Count(), 204 SourceItemEntries = string.Join(",", itemEntries), 205 IncludeParagraphItems = true, 206 ListOrderByDirection = articleListSortOrder 207 }) 208 } 209 } 210 } 211 else if (Pageview.IsVisualEditorMode) 212 { 213 switch (clerkEndPoint) 214 { 215 case "recommendations/page/product": 216 <div class="alert alert-dark m-0" role="alert"> 217 <span>@Translate("Articlelist: The articlelist will be shown here, if a product is used")</span> 218 </div> 219 break; 220 221 case "recommendations/page/category": 222 <div class="alert alert-dark m-0" role="alert"> 223 <span>@Translate("Articlelist: The articlelist will be shown here, if a product group is used")</span> 224 </div> 225 break; 226 } 227 } 228 } 229