A world-class design business
With more than 280 design awards, Eva Solo’s products are virtually swimming in accolades. The design tradition behind this success is founded on an enduring aesthetic and functionality, and a formula dating back to 1949.
At Eva Solo we believe that good design solves real-life problems. This is what makes a product usable, intuitive and ultimately brings contentment to everyday life. We are therefore honoured to be able to call ourselves one of Denmark’s most award-winning design businesses.
Since the Eva Solo brand was launched in 1997, we have received more than 200 internationally recognised design awards from the likes of iF Product Design Award, Good Design Award, Red Dot Design Award and Designpreis.
Design awards such as these are conferred by leading experts assembled in jury panels to recognise and reward design excellence. Our continuing popularity, as evidenced by these prestigious awards, is a source of great pride for us.
Good design is core to everything we do. It is our pledge to ourselves, our customers and our wider world. Together with our designers, our mission remains to make life on the home front even more pleasurable.
So how do we do that?
At Eva Solo, we’ve had a formula for good design since 1949. It all started with a gravy shaker where the lid doubled as a citrus press. The dual-purpose design was unprecedented and a huge success. The product was launched with the tagline “Yes, but...”.
Yes, it’s a gravy shaker, but it’s also a citrus press.
To this day, we are dedicated to ensuring that our products conform to our original formula. Good design does more. It may be the special properties of our drip-free carafes, or our folding cutting boards, but might just as well be an indefinable je ne sais quoi.
Eva Solo’s products are developed with aesthetics, functionality and choice materials in mind. There can be no design excellence without careful consideration and attention to detail. This is why we only collaborate with designers who are the best in their field.
Tools Design
The Tools design duo has played a decisive role in the development of our Eva Solo products for more than 25 years. Tools consists of Claus Jensen and Henrik Holbæk, who have designed every single product. Claus has this to say about the Eva Solo products: “Individually, they each represent a unique combination of form and function. But they are all informed by Eva Solo’s long-standing experience, which we have simply given a contemporary look”. The design duo has reaped more than 350 awards, making them the most celebrated Danish designers of all time.
Ole Palsby
The late Ole Palsby wrote design history towards the end of the 1970s when he designed the products for our Eva Trio brand. Together with the then owner of Eva Solo, Erik Mangor, Ole Palsby was on a mission to create the ultimate range of pots and pans. The result was the Eva Trio brand, which was launched back in 1977, at which time it consisted of three different ranges; hence the name ‘Trio’. Everything about the Eva Trio products was trail-blazing; their distinctive design, the option of combining the brand’s different ranges; copper, cast iron and aluminium, as well as the professional quality, and something as simple as the pots’ stackability.
Thomas Pedersen
Since graduating from Aarhus School of Architecture in 2002, Thomas Pedersen has led SPARK by Thomas Pedersen. His practice strives for product and furniture design combining ergonomics with aesthetics and sustainability. This is expressed in design that unites the Danish love of clean lines and durable materials with a contemporary look in which nothing is left to chance. The primary inspiration is from nature and the proportions of the human body. This results in distinctly organic lines informed by Scandinavian design heritage but with a visionary perspective.
Over the years, Pedersen has won a number of awards for his designs. He is best known for his Stingray chair, which he designed as an undergraduate.
ARDE Design Studio
ARDE Design Studio is one of Scandinavia’s leading furniture design experts. They take a unique, holistic approach to the furniture industry, with a background spanning from design and manufacturing to the retail trade.
In their design process, ARDE consider the entire value chain behind a product. They create design that works from concept to prototype and through to the final product.
To live up to their ambition of creating sublime furniture design, ARDE works to a ‘hands-on’ approach. Their unique workshop facilities allow ARDE to build and enhance prototypes in-house with high efficiency and rapidity.
Why do we need good design?
Did you know that people have a ‘reward’ system in their brain that is activated when they see something visually appealing or useful? Brain scan studies reveal that beautiful design can activate parts of the motor network in the cerebellum, which controls the movements of our hands. We reach out instinctively for beautiful objects; beauty moves us, literally.
Beauty is favoured because we are ‘wired’ to be attracted to symmetry in the interests of our survival. Through evolution, humans have learned to identify and appreciate objects that are visually and functionally appealing, as this has helped us to survive and thrive in our surroundings. For our ancestors, symmetry was perhaps found in the most idyllic cave or the most fruit-laden tree.
Today, we allow good design to shape our surroundings because we know that it enhances our state of mind. Perhaps you have personally experienced that mood boost of visiting a beautiful home or wandering around in a well-tended garden? And you may have noticed that you hold your head higher when dressed in a well-tailored suit, or that your voice is hushed when visiting a minimalist, exquisitely appointed art gallery?
Aside from the more subtle and underlying effects of good design, there are also the move obvious ones.
Good design makes things more efficient and easier to use. It saves us time and effort.
People also use good design for expressing their identity. We want to surround ourselves with objects that reflect our personality and values, and good design helps to meet that need.
There is obviously no formula for good design. The experience is subjective and informed by personal attitudes and expectations. Your neighbour may adore the houseplant you can’t stand the sight of.
But at Eva Solo we venture to claim that we know what good design is. At any rate, we have the certificates, medals and trophies to back that claim.
As a matter of fact - you can click here and get an overview of all our design awards.
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