- Voor Beauty Professionals
- Besteld voor 12u00, volgende dag geleverd
- Gratis levering boven 200 euro
- Veilig betalen
Perfecte pedicure
Onderuitzakken in een pedicurestoel is de ultieme verwennerij. Wanneer jouw klanten regelmatig last hebben van voetproblemen zoals likdoorns, eelt en gebarsten hielen, kan een regelmatige pedicure in jouw salon en een verdere behandeling thuis deze problemen voorkomen. Ontdek onze tips voor een perfecte cosmetische pedicure, waarna je klant op wolkjes jouw salon zal buiten stappen.
Stap 1
Schone voeten
Ten eerste reinigen we de voeten grondig. Een desinfecterende zeep is de juiste hygiënische start voor elke pedicure. Het desinfecteert de voeten en maakt ze vrij van ziektekiemen. Hiervoor is het Enzym Foot Soak ideaal. Dit natuurlijke voetbad reinigt de voeten, verzacht eelt en scrubt zacht dankzij natuurlijke enzymen en salicylzuur. Het zorgt voor een verfrissend gevoel en is geschikt voor alle huidtypes.
Stap 2
Verzorg de nagelriemen
Nu de nagels zacht zijn geworden door het water, is het tijd om de teennagels in model te brengen. Besteed eerst speciale aandacht aan de nagelriemen van elke teen. Met een effectieve nagelriemverwijderaar zien de nagelriemen er schoon en mooi uit en kun je uitgedroogde, ruwe en overwoekerde nagelriemen terugduwen. Het zal een enorm verschil maken in de glans, gezondheid en algehele sterkte van je nagels.
Terwijl het product zijn werk doet, gebruik je de Nail Clipper Matt Black om je nagels in te korten en vijl je ze vervolgens in model. Nu kun je de nagelriemen terugduwen met een bokkenpootje of de nagelmachine gebruiken om de nagelwanden snel en gemakkelijk terug te duwen en te reinigen.
Stap 3
Bye Bye Eelt
Nu werken we de eelt weg. Eelt op de voet kan pijnlijk worden als je er druk op zet tijdens het lopen in schoenen of op hoge hakken. En ja, natuurlijk houden we van een pijnloze "Carrie Bradshaw" wandeling in die mooie hakken die je net hebt gekocht.
Het verwijderen van eelt doe je met de Urea Callus Eraser. Deze krachtige eeltverzachtende spray dient om eelt gemakkelijk te verwijderen en de huid glad, zacht en eeltvrij te maken. De spray bevat 15% ureum, glycerine, melkzuur en suikerriet-extract. Na het sprayen laat je het 2 minuten inwerken en verwijder je de verweekte eelt met een ProNails voetvijl. Spoel af met water indien nodig.
Stap 4
Tijd om te relaxen
Tijd om te ontspannen. Het meest plezierige deel van de salon pedicure is de massage. Een massage bevordert de bloedsomloop en helpt de spanning in de kuiten en voeten te verlichten.
Begin met de Jojoba Foot Scrub. Deze 100% natuurlijke scrub bevat Belgische, Tiense suikerkristallen die dode huidcellen zachtjes maar effectief verwijderen. De voeten voelen onweerstaanbaar glad en fris aan. Roer de scrub met een spatel om de suiker met de olie te mengen voor optimaal resultaat.
Daarna is het tijd om te masseren met het Avocado Foot Mask. Dit diep hydraterende masker met eucalyptusolie herstelt de huidelasticiteit, kalmeert de huid en zorgt voor langdurige hydratatie. Masseer de voeten met vochtige handen totdat het masker smelt in een melkachtige crème.
Tip: Welke massagetechniek je ook gebruikt, werk altijd naar de richting van het hart toe, voor een optimale drainage.
Stap 5
De Finishing Touch
Sluit de behandeling af met de Eucalyptus Foot Cream.. Deze verfrissende, hydraterende crème bevat eucalyptus & menthol, vitamine E, ureum en aloë vera. Het zorgt ervoor dat de voeten niet plakken en zorgt voor een verkoelend effect.
Wil de klant een finishing touch met een kleurtje? Dan kun je een Longwear Nail Polish voorstellen , een semi-permanente Sopolish gel -applicatie die tot wel 3 weken blijft zitten, of BFLEX , onze nieuwste gel-applicatie voor een natuurlijke look die 4 weken blijft zitten.
Uw cliënt kan straks pijnloos en met een ontspannen gevoel op lucht lopen!
"Waar u ook bent, een pedicure herinnert u eraan dat u precies bent waar u hoort te zijn."
Professionele voetverzorging voor thuis
Laat je klanten nog langer genieten van jouw pedicurebehandeling, door hen kwalitatieve Foot Care producten voor thuis aan te bieden. Zo blijven hun voeten langer verzorgd tot aan de volgende afspraak. Presenteer ze in deze mooie houten display, met recto verso displaykaart en boost de verkoop in jouw salon!
Error executing template "Designs/ProNails_generated/Paragraph/Carousel.cshtml" System.NullReferenceException: Object reference not set to an instance of an object. at Bluedesk.DynamicWeb.ItemTypes.CTAButton.GetLink(PageView pv, String navigationtag) at CompiledRazorTemplates.Dynamic.RazorEngine_53374b40233e419e951848434401f044.<>c__DisplayClass9_0.<RenderContentArea>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Bluedesk\pronails.cloud.dynamicweb-cms.com\files\Templates\Designs\ProNails_generated\Paragraph\Carousel.cshtml:line 545 at CompiledRazorTemplates.Dynamic.RazorEngine_53374b40233e419e951848434401f044.Execute() in D:\dynamicweb.net\Solutions\Bluedesk\pronails.cloud.dynamicweb-cms.com\files\Templates\Designs\ProNails_generated\Paragraph\Carousel.cshtml:line 447 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.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2 3 @using Dynamicweb; 4 @using Bluedesk.DynamicWeb.ItemTypes; 5 6 <!-- FIX NEEDED: behaviour when all the items are full height images (for instance logo slider)?? --> 7 @{ 8 Carousel _data = Dynamicweb.Services.Items.GetItem("Carousel", Pageview.CurrentParagraph.ItemId).ToCodeFirstItem<Carousel>() ?? new Carousel(); 9 10 var paragraphID = Pageview.CurrentParagraph.ID; 11 int amountColumns = _data.CarouselItems.Count; // Amount of the columns in backend, filled by user 12 var classFullWidth = !_data.Fullwidth ? "container" : "w-full"; // If slider or multicolumn has to be in container or full width of the page 13 } 14 15 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 16 @using Dynamicweb; 17 @using Dynamicweb.Content.Items; 18 @using Bluedesk.DynamicWeb.ItemTypes; 19 20 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 21 @using Dynamicweb; 22 @using Dynamicweb.Content.Items; 23 @using Bluedesk.DynamicWeb.ItemTypes; 24 25 @functions { 26 27 Dictionary<string, string> GetFontConfiguration(string TextColor, FontConfigurationItemTab FontConfiguration) 28 { 29 var colorService = new ColorSwatchService(); 30 TextColor = !string.IsNullOrWhiteSpace(TextColor) ? TextColor : "" ; 31 TextColor = !TextColor.Contains("#") ? colorService.GetHexColor(Pageview.AreaID, TextColor) : TextColor; 32 Dictionary<string, string> FontConfig = new Dictionary<string, string>() { 33 { "textColor" , TextColor }, 34 { "fontSize" , FontConfiguration.FontSize }, 35 { "lineHeight", FontConfiguration.LineHeight}, 36 { "fontFamily" , FontConfiguration.FontConfiguration.FontFamily }, 37 { "fontWeight" , FontConfiguration.FontWeight }, 38 { "fontStyle" , FontConfiguration.FontStyle } 39 }; 40 return FontConfig; 41 } 42 43 public string GenerateButtonConfigVariables(ButtonConfiguration BC, MasterConfig mc, int areaId) 44 { 45 string ButtonLabelAlignment = BC.ButtonLabelAlignment; 46 switch (ButtonLabelAlignment) 47 { 48 case "align-left": 49 ButtonLabelAlignment = "flex-start"; 50 break; 51 case "align-center": 52 ButtonLabelAlignment = "center"; 53 break; 54 case "align-right": 55 ButtonLabelAlignment = "flex-end"; 56 break; 57 case "align-full": 58 ButtonLabelAlignment = "space-between"; 59 break; 60 default: 61 ButtonLabelAlignment = "flex-start"; 62 break; 63 } 64 65 var btnStyleBlock = new System.Text.StringBuilder(); 66 67 // General Config 68 btnStyleBlock.Append(GenerateCssVar("btn-min-height", $"{mc.GeneralConfiguration.ButtonHeight}px")); 69 btnStyleBlock.Append(GenerateCssVar("btn-border-radius", $"{mc.GeneralConfiguration.RoundedCornerValue}px")); 70 71 // Button Config 72 btnStyleBlock.Append(GenerateCssVar("btn-border-width", $"{BC.BorderSize.ToString()}px")); 73 btnStyleBlock.Append(GenerateCssVar("btn-label-alignment", ButtonLabelAlignment)); 74 75 // Button Config Tab 76 btnStyleBlock.Append(GenerateCssVar("btn-bg-color", BC.ButtonColorConfiguration.BackgroundColor.GetColorCode(areaId))); 77 btnStyleBlock.Append(GenerateCssVar("btn-font-color", BC.ButtonColorConfiguration.FontColor.GetColorCode(areaId))); 78 btnStyleBlock.Append(GenerateCssVar("btn-border-color", BC.ButtonColorConfiguration.BorderColor.GetColorCode(areaId))); 79 80 // Button Config Hover tab 81 btnStyleBlock.Append(GenerateCssVar("btn-bg-color-hover", BC.ButtonHoverColorConfiguration.BackgroundColor.GetColorCode(areaId))); 82 btnStyleBlock.Append(GenerateCssVar("btn-font-color-hover", BC.ButtonHoverColorConfiguration.FontColor.GetColorCode(areaId))); 83 btnStyleBlock.Append(GenerateCssVar("btn-border-color-hover", BC.ButtonHoverColorConfiguration.BorderColor.GetColorCode(areaId))); 84 85 // Button Config Font Config 86 btnStyleBlock.Append(GenerateCssVar("btn-font-size", BC.FontConfiguration.FontSize)); 87 btnStyleBlock.Append(GenerateCssVar("btn-font-config-color", BC.FontConfiguration.Color.GetColorCode(areaId))); 88 btnStyleBlock.Append(GenerateCssVar("btn-font-line-height", BC.FontConfiguration.LineHeight)); 89 btnStyleBlock.Append(GenerateCssVar("btn-font-family", BC.FontConfiguration.FontConfiguration.FontFamily)); 90 btnStyleBlock.Append(GenerateCssVar("btn-font-weight", BC.FontConfiguration.FontWeight)); 91 btnStyleBlock.Append(GenerateCssVar("btn-font-transform", BC.FontConfiguration.FontStyle)); 92 93 return btnStyleBlock.ToString(); 94 } 95 96 public string GenerateCssVar(string name, string value) 97 { 98 if (!string.IsNullOrWhiteSpace(value)) { 99 return $"--{name}: {value};"; 100 } else { 101 return ""; 102 } 103 } 104 } 105 106 107 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 108 @using Dynamicweb; 109 @using Dynamicweb.Content.Items; 110 @using Bluedesk.DynamicWeb.ItemTypes; 111 @using Bluedesk.DynamicWeb.ItemTypes.Configuration; 112 113 114 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 115 @using Dynamicweb; 116 @using Dynamicweb.Content.Items; 117 @using Bluedesk.DynamicWeb.ItemTypes; 118 @using Bluedesk.DynamicWeb.ItemTypes.Extensions; 119 @using Bluedesk.DynamicWeb.ItemTypes.Configuration; 120 @using Bluedesk.DynamicWeb.ItemTypes.Settings.Configuration; 121 @using Dynamicweb; 122 @using Dynamicweb.Frontend 123 @using Bluedesk.DynamicWeb.ItemTypes.BaseSolution; 124 125 @helper RenderButton(CTAButton button, PageView Pageview) 126 { 127 128 if (!string.IsNullOrWhiteSpace(button.GetLink(Pageview))) 129 { 130 string Template = button.GetButtonTemplate().Replace("{{ ButtonLink }}", button.GetLink(Pageview)); 131 @Template; 132 } 133 } 134 135 136 @{ 137 138 var colorService = new ColorSwatchService(); 139 140 string fullWidthContainerClass = _data.Fullwidth ? "" : "container"; 141 142 string backgroundClass = !string.IsNullOrWhiteSpace(_data.BackgroundConfiguration.BackgroundClass) ? string.Format("bg-{0}", _data.BackgroundConfiguration.BackgroundClass) : ""; 143 string backgroundStyle = !string.IsNullOrWhiteSpace(_data.BackgroundConfiguration.BackgroundColor) ? $"background-color: {_data.BackgroundConfiguration.BackgroundColor}; " : ""; 144 backgroundStyle += !string.IsNullOrWhiteSpace(_data.BackgroundConfiguration.BackgroundImage) ? $"background-image: url({_data.BackgroundConfiguration.BackgroundImage}); " : ""; 145 146 // string backgroundClass = "null"; 147 // string backgroundStyle = ""; 148 } 149 150 151 @functions { 152 //string getbackgroundclass(string backgroundClass) 153 //{ 154 // return !string.IsNullOrWhiteSpace(backgroundClass) ? string.Format("bg-{0}", backgroundClass) : ""; 155 //} 156 } 157 158 @helper CTAParagraphImage( 159 ParagraphImageResizable Image, 160 bool hasContent, 161 bool ImageAsBackground, 162 string ImagePosition, 163 bool ParallaxImage, 164 bool Fullwidth, 165 string imagesHeight, 166 double ColumnWidthSize, 167 int AnimationDuration = 300, 168 bool AnimateHalfBlock = false 169 ) 170 { 171 if (!string.IsNullOrWhiteSpace(Image.Image)) 172 { 173 174 string image = !string.IsNullOrWhiteSpace(Image.Image) ? Image.Image : null; 175 imagesHeight = hasContent ? imagesHeight : "100%"; 176 imagesHeight = !string.IsNullOrWhiteSpace(imagesHeight) ? "height: " + imagesHeight + ";" : ""; 177 178 string imageParrallax = ParallaxImage ? "rellax" : ""; 179 string imageAsBackground = ImageAsBackground ? "cta-paragraph__image--is-background" : ""; 180 double imageWidth = 2000; 181 182 imageWidth = Fullwidth ? imageWidth : 1200; 183 imageWidth = !ImageAsBackground ? imageWidth * ColumnWidthSize : imageWidth; 184 185 string strImageWidth = imageWidth + "px"; 186 string strImageWidthSize = imageWidth + "w"; 187 188 string ImageUrl; 189 if (image.EndsWith(".gif")) 190 { 191 ImageUrl = image; 192 } 193 else 194 { 195 ImageUrl = "/Admin/Public/GetImage.ashx?Image=" + image + "&Crop=7&Format=webp&Quality=90&Compression=80"; 196 ImageUrl = ImageUrl.Replace("?x", "&x"); 197 } 198 199 string animationDirection = AnimateHalfBlock ? ImagePosition.Equals("right") ? "fade-left" : "fade-right" : ""; 200 201 if (!string.IsNullOrWhiteSpace(Image.Image)) 202 { 203 204 <figure class="cta-paragraph__image-container @imageAsBackground @Image.PositionY @Image.PositionX" style="@imagesHeight" data-aos="@animationDirection" data-aos-duration="@AnimationDuration"> 205 206 <picture class="cta-paragraph__image @Image.BackgroundSize @imageParrallax"> 207 @if (ImageUrl.EndsWith(".gif")) 208 { 209 <source media="(max-width: 400px)" srcset="@ImageUrl&Width=400"> 210 <source media="(max-width: 994px)" srcset="@ImageUrl&Width=994"> 211 <img src="@ImageUrl" loading="lazy" alt="@Image.ImageAlt" class="cta-paragraph__image @Image.BackgroundSize @imageParrallax" width="1980" height="500"> 212 } 213 else 214 { 215 <source media="(max-width: 400px)" srcset="@ImageUrl&Width=400"> 216 <source media="(max-width: 994px)" srcset="@ImageUrl&Width=994"> 217 <img src="@ImageUrl&Width=@imageWidth" loading="lazy" alt="@Image.ImageAlt" class="cta-paragraph__image @Image.BackgroundSize @imageParrallax" width="1980" height="500"> 218 } 219 </picture> 220 221 </figure> 222 } 223 } 224 } 225 226 @helper CTAParagraphContent( 227 int paragraphID, 228 ParagraphHeader Header, 229 ParagraphHeader SubHeader, 230 ParagraphContent Content, 231 CTAButton Button, 232 CTAButton ExtraButton, 233 ParagraphImage Image, 234 bool strCenterVertical, 235 string ImagePosition = "", 236 int AnimationDuration = 300, 237 bool AnimateHalfBlock = false 238 ) 239 { 240 241 bool hasImage = !string.IsNullOrWhiteSpace(Image.Image) ? true : false; 242 string noImageClass = hasImage ? "" : "no-image"; 243 244 string centerTextClass = strCenterVertical ? "text-center" : ""; 245 string centerContent = !string.IsNullOrWhiteSpace(Image.Image) ? "" : "cta-paragraph__content--center"; 246 247 string paragraphInstanceClass = "cta-paragraph__content--" + paragraphID; 248 249 string animationDirection = (AnimateHalfBlock && hasImage) ? ImagePosition.Equals("right") ? "fade-right" : "fade-left" : ""; 250 251 if (!string.IsNullOrWhiteSpace(Button.ButtonText) || !string.IsNullOrWhiteSpace(Content.Text) || !string.IsNullOrWhiteSpace(Header.HeaderFormatted("cta-paragraph__header"))) 252 { 253 254 <section class="cta-paragraph__content @paragraphInstanceClass @centerContent @noImageClass" data-aos="@animationDirection" data-aos-duration="@AnimationDuration"> 255 256 <article class="cta-paragraph__content-container @noImageClass"> 257 258 @if (!string.IsNullOrWhiteSpace(Header.HeaderFormatted("cta-paragraph__header"))) 259 { 260 <header class="cta-paragraph__header @centerTextClass"> 261 @if (SubHeader != null) 262 { 263 @SubHeader.HeaderFormatted("cta-paragraph__subheader") 264 } 265 @Header.HeaderFormatted("cta-paragraph__header") 266 </header> 267 } 268 269 @if (!string.IsNullOrWhiteSpace(Content.Text)) 270 { 271 <div class="cta-paragraph__text @centerTextClass">@Content.Text</div> 272 } 273 274 @if (!string.IsNullOrWhiteSpace(Button.GetLink(Pageview)) && !string.IsNullOrWhiteSpace(Button.ButtonText)) 275 { 276 <nav class="cta-paragraph__btn-navigation @centerTextClass"> 277 @RenderButton(Button, Pageview) 278 @RenderButton(ExtraButton, Pageview) 279 </nav> 280 } 281 282 </article> 283 </section> 284 285 } 286 287 } 288 289 @helper CTAParagraphVideo(ParagraphVideo Video, string imagesHeight) 290 { 291 if (!string.IsNullOrWhiteSpace(Video.YoutubeLink) || !string.IsNullOrWhiteSpace(Video.VimeoLink)) 292 { 293 string YoutubeID = Video.YoutubeId; 294 string YoutubeLink = Video.YoutubeLink; 295 296 string VimeoID = Video.VimeoId; 297 string VimeoLink = Video.VimeoLink; 298 299 int CleanVideo = Video.Clean ? 1 : 0; 300 int ShowControls = Video.ShowControls ? 1 : 0; 301 int AutoPlay = Video.AutoPlay ? 1 : 0; 302 int LoopVideo = Video.LoopVideo ? 1 : 0; 303 int MuteAudio = Video.MuteAudio ? 1 : 0; 304 string hideControlsClass = Video.ShowControls ? "video-player-wrapper--hidecontrols" : ""; 305 string origin = Dynamicweb.Environment.Helpers.LinkHelper.GetHttpDomain(); 306 imagesHeight = !string.IsNullOrWhiteSpace(imagesHeight) ? "height: " + imagesHeight + ";" : ""; 307 308 if (!string.IsNullOrWhiteSpace(YoutubeLink)) 309 { 310 if(AutoPlay == 1) 311 { 312 <section class="cta-paragraph__video-container" style="@imagesHeight"> 313 <div class=""> 314 <div class="video-player-wrapper @hideControlsClass"> 315 <iframe class="video-player" loading="lazy" data-video="@YoutubeID" frameborder="0" allowfullscreen allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" title="YouTube video player" src="https://www.youtube-nocookie.com/embed/@YoutubeID?autoplay=@AutoPlay&controls=@ShowControls&loop=@LoopVideo&playlist=@YoutubeID&playsinline=1&modestbranding=@CleanVideo&mute=@MuteAudio&rel=0&enablejsapi=1&origin=@origin&disablekb=0"></iframe> 316 </div> 317 </div> 318 </section> 319 } 320 else 321 { 322 <lite-youtube videoid="@YoutubeID" params="controls=@ShowControls&loop=@LoopVideo&playlist=@YoutubeID&playsinline=1&modestbranding=@CleanVideo&mute=@MuteAudio&rel=0&enablejsapi=1&origin=@origin&disablekb=0"></lite-youtube> 323 } 324 } 325 if (!string.IsNullOrWhiteSpace(VimeoLink)) 326 { 327 <section class="cta-paragraph__video-container" style="@imagesHeight"> 328 <div class=""> 329 <div class="video-player-wrapper"> 330 <iframe class="video-player" loading="lazy" data-video="@VimeoID" frameborder="0" allowfullscreen allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" title="Vimeo video player" src="https://player.vimeo.com/video/@VimeoID?title=0&byline=0&portrait=0&autoplay=@AutoPlay&controls=@ShowControls&loop=@LoopVideo&muted=@MuteAudio"></iframe> 331 </div> 332 </div> 333 </section> 334 } 335 } 336 } 337 338 @helper CTAParagraphIcon(ParagraphIcon Icon, bool strCenterVertical) 339 { 340 if (!string.IsNullOrWhiteSpace(Icon.FaIcon)) 341 { 342 string centerIconClass = strCenterVertical ? "justify-center" : "justify-start"; 343 string iconSizeClass = string.Format("cta-paragraph__icon--{0}", Icon.FaIconSize); 344 345 <div class="cta-paragraph__icon-container"> 346 <div class="cta-paragraph__icon-inner-container @centerIconClass"> 347 <span class="cta-paragraph__icon @iconSizeClass">@Icon.FaIcon</span> 348 </div> 349 </div> 350 } 351 } 352 353 @helper RenderContentAlignment(BackgroundConfiguration data) 354 { 355 356 switch (data.ContentElementAlign) 357 { 358 case "align-left": 359 <text> 360 align-items: flex-start; 361 text-align: left; 362 </text> 363 break; 364 case "align-center": 365 <text> 366 align-items: center; 367 text-align: center; 368 </text> 369 break; 370 case "align-right": 371 <text> 372 align-items: flex-end; 373 text-align: right; 374 </text> 375 break; 376 case "align-full": 377 <text> 378 align-items: flex-start; 379 text-align: justify; 380 </text> 381 break; 382 } 383 384 } 385 386 387 @{ 388 389 string backgroundImageRepeatClass = _data.BackgroundConfiguration.BackgroundImageRepeat; 390 string backgroundImageSizeClass = ""; 391 392 string BackgroundImagePositionX = _data.BackgroundConfiguration.BackgroundImagePositionX; 393 string BackgroundImagePositionY = _data.BackgroundConfiguration.BackgroundImagePositionY; 394 395 string BackgroundImagePositionClass = ""; 396 397 if (backgroundImageRepeatClass == "no-repeat") 398 { 399 BackgroundImagePositionClass = BackgroundImagePositionY + "-" + BackgroundImagePositionX; 400 backgroundImageSizeClass = _data.BackgroundConfiguration.BackgroundImageSize; 401 } 402 403 string ctaBackgroundColor = _data.BackgroundConfiguration.BackgroundColor; 404 string contentBorderColor = _data.BackgroundConfiguration.contentBorderColor; 405 406 string contentBorderSize = _data.BackgroundConfiguration.contentBorderSize + "px"; 407 408 ctaBackgroundColor = colorService.GetHexColor(Pageview.AreaID, ctaBackgroundColor); 409 contentBorderColor = colorService.GetHexColor(Pageview.AreaID, contentBorderColor); 410 411 string contentBackgroundColor = _data.BackgroundConfiguration.contentBackgroundColor; 412 413 string contentGutterClass = _data.BackgroundConfiguration.contentGutter; 414 string BackgroundPadding = _data.BackgroundConfiguration.backgroundPadding; 415 416 contentBackgroundColor = colorService.GetHexColor(Pageview.AreaID, contentBackgroundColor); 417 418 } 419 420 <style> 421 422 @@media screen and (min-width: 991px) { 423 .multicolumn--@paragraphID { 424 background-color: @ctaBackgroundColor; 425 } 426 427 .multicolumn--@paragraphID .cta-paragraph { 428 background-color: @contentBackgroundColor; 429 border: @contentBorderSize @contentBorderColor solid; 430 } 431 } 432 433 .flickity-viewport{ 434 width: 100%; 435 } 436 437 .header__cta{ 438 display: flex; 439 align-items: center; 440 } 441 442 </style> 443 444 @if (amountColumns > 0) 445 { 446 <div class="multicolumn overflow-hidden multicolumn--@paragraphID @backgroundClass @_data.CssClass @backgroundImageRepeatClass @BackgroundImagePositionClass @backgroundImageSizeClass @contentGutterClass @BackgroundPadding" data-paragraphid="@paragraphID" id="@paragraphID" style="@backgroundStyle"> 447 <div class="@classFullWidth">@RenderContentArea(_data, paragraphID)</div> 448 </div> 449 } 450 451 @helper RenderContentArea(Carousel _data, int paragraphID) 452 { 453 454 //var subheaderFontConfig = GetFontConfiguration(_data.BackgroundConfiguration.CTASubheaderTextColor, _data.BackgroundConfiguration.FontConfigurationSubheader); 455 //var headerFontConfig = GetFontConfiguration(_data.BackgroundConfiguration.CTAHeaderTextColor, _data.BackgroundConfiguration.FontConfigurationHeader); 456 //var contentFontConfig = GetFontConfiguration(_data.BackgroundConfiguration.CTAContentTextColor, _data.BackgroundConfiguration.FontConfigurationContent); 457 458 //var colorService = new ColorSwatchService(); 459 460 int amountColumns = _data.CarouselItems.Count; // Amount of the columns in backend, filled by user 461 462 string centerTextClass = _data.CenterText ? "items-center text-center" : "items-start text-left"; 463 464 /* Specific for Carousel */ 465 466 int colDisplay = _data.ColumnsDisplay; // Amount of displayed column within one screen 467 468 bool fullWidth = _data.Fullwidth; // If slider or multicolumn has to be in container or full widthof the page 469 bool infiniteLoop = _data.Infinite; 470 bool autoPlay = _data.AutoPlay; 471 bool controls = _data.AddControls; 472 int duration = _data.Duration; 473 bool showDots = _data.ShowDots; // If slider or multicolumn has to be in container or full widthof the page 474 int colAmount = 1; 475 476 bool imagesOnlyBool = checkOnlyImages(_data); // Check if this carousel contains only images (logo slider) 477 478 //subheaderFontConfig["textColor"] = colorService.GetHexColor(Pageview.AreaID, subheaderFontConfig["textColor"]); 479 //headerFontConfig["textColor"] = colorService.GetHexColor(Pageview.AreaID, headerFontConfig["textColor"]); 480 //contentFontConfig["textColor"] = colorService.GetHexColor(Pageview.AreaID, contentFontConfig["textColor"]); 481 482 bool Shadow = _data.BackgroundConfiguration.contentShadow; 483 string shadowClass = Shadow ? "contentShadow" : ""; 484 485 if (!string.IsNullOrWhiteSpace(@_data.Header.HeaderFormatted())) 486 { 487 <header class="multicolumn__header-wrapper"> 488 @_data.Header.HeaderFormatted("multicolumn__header") 489 </header> 490 } 491 492 string carouselHeight = "auto"; 493 494 if (imagesOnlyBool && _data.ImageHeight != 0) 495 { 496 carouselHeight = _data.ImageHeight.ToString() + "px"; 497 } 498 499 if ((colDisplay <= amountColumns) && (colDisplay != 0)) 500 { 501 string flexBasis = 100 / @colDisplay + "%"; 502 503 <section class="carousel multicolumn" 504 data-columns="@colAmount" 505 data-dots="@showDots" 506 data-loop="@infiniteLoop" 507 data-autoplay="@autoPlay" 508 data-controls="@controls" 509 data-duration="@duration" 510 style="height: @carouselHeight;"> 511 512 @foreach (var column in _data.CarouselItems) 513 { 514 515 bool hasContent = !string.IsNullOrWhiteSpace(column.Button.ButtonText) || !string.IsNullOrWhiteSpace(column.Content.Text) || !string.IsNullOrWhiteSpace(column.Header.HeaderFormatted()); 516 517 string image = column.Image.Image; 518 string imagesHeight = _data.ImageHeight == 0 ? "auto" : _data.ImageHeight.ToString() + "px"; 519 string ImageContainerFixed = hasContent ? "cta-paragraph__image-container--fixed" : ""; 520 string ImageAsBackground = (column.BackgroundConfiguration.ConfigurationName == "Image as Background") ? "cta-paragraph__image--is-background" : ""; 521 522 string coverImage = ""; 523 524 string figureHeight = !hasContent ? "flex-grow:1" : "height:" + imagesHeight; 525 string TempClass = imagesOnlyBool ? "imageOnly" : "hasContent"; 526 string ImageOnlyImageHeight = imagesOnlyBool ? "height:" + imagesHeight + ";" : "height:auto;"; 527 528 if (!imagesOnlyBool) 529 { 530 imagesHeight = hasContent ? imagesHeight : imagesHeight = "100%"; 531 } 532 533 /*This is work around created by Alla to enable cover mode for stand alone pictures*/ 534 if (!hasContent && column.Image.BackgroundSize == "bg-cover") 535 { 536 coverImage = "height:100%;"; 537 } 538 539 <div class="multicolumn__item carousel-cell-wrap" style="display: flex; min-height:100%; @ImageOnlyImageHeight width: @flexBasis; @coverImage"> 540 541 <section class="cta-paragraph carousel-cell" style="min-height: @imagesHeight; @ImageOnlyImageHeight"> 542 @{ 543 string newWindow = column.Button.NewWindow ? "target='_blank'" : ""; 544 string ariaLabel = !string.IsNullOrWhiteSpace(column.Button.ButtonAriaLabel) ? "aria-label='" + column.Button.ButtonAriaLabel + "'" : ""; 545 bool clickableBlock = !string.IsNullOrWhiteSpace(column.Button.GetLink(Pageview)) && _data.Clickable; 546 string clickableClass = clickableBlock ? "cta-paragraph__container--clickable" : ""; 547 548 double ColumnAmount = colDisplay; 549 double ColumnWidthSize = 1 / ColumnAmount; 550 } 551 552 @CTAParagraphImage( 553 column.Image, 554 hasContent, 555 false, 556 null, 557 false, 558 _data.Fullwidth, 559 imagesHeight, 560 ColumnWidthSize 561 ) 562 563 @CTAParagraphContent( 564 paragraphID, 565 column.Header, 566 column.Subheader, 567 column.Content, 568 column.Button, 569 column.ExtraButton, 570 column.Image, 571 false 572 ) 573 574 @if (clickableBlock) 575 { 576 <a href="@column.Button.GetLink(Pageview)" class="cta-paragraph__clickable" @newWindow @ariaLabel></a> 577 } 578 </section> 579 580 </div> 581 } 582 </section> 583 } 584 else if (colDisplay > amountColumns) 585 { 586 <div>Error: you cant display columns more than you filled in the backend</div> 587 } 588 } 589 590 @functions{ 591 // Check if this carousel contains only images (logo slider) 592 bool checkOnlyImages(Carousel _data) 593 { 594 595 int amountColumns = _data.CarouselItems.Count; // Amount of the columns in backend, filled by user 596 int emptyColumn = 0; 597 598 // Loop through all the columns 599 foreach (var column in _data.CarouselItems) 600 { 601 // If button is empty AND content is empty AND header is empty => this is img only 602 if (string.IsNullOrWhiteSpace(column.Button.ButtonText) && string.IsNullOrWhiteSpace(column.Content.Text) && string.IsNullOrWhiteSpace(column.Header.HeaderFormatted())) 603 { 604 emptyColumn++; 605 } 606 } 607 608 bool emptyColumnResult = emptyColumn == amountColumns ? true : false; 609 610 return emptyColumnResult; 611 612 } 613 } 614
Centella Foot Mask Socks
Deze herstellende Foot Mask Socks hydrateren, kalmeren en verzachten droge of vermoeide voeten in slechts één behandeling. De vegan formule met Centella Asiatica, Portulaca en Niacinamide helpt irritatie te verminderen, de huidbarrière te versterken en de huid intens te voeden voor zichtbaar gladdere en gezondere voeten.
Gebruik de verpakking als stijlvolle foot care display op je toonbank en zet je voetverzorging extra in de kijker.
Gun je klanten 20 minuten pure ontspanning voor zachte, frisse en happy feet. In deze video tonen we hoe je de Centella Foot Mask Socks gebruikt.
Error executing template "Designs/ProNails_generated/Paragraph/MultiColumnParagraph.cshtml" System.NullReferenceException: Object reference not set to an instance of an object. at Bluedesk.DynamicWeb.ItemTypes.CTAButton.GetLink(PageView pv, String navigationtag) at CompiledRazorTemplates.Dynamic.RazorEngine_beab5930c6154e33a13576f5d4b0788f.<>c__DisplayClass9_0.<RenderContentArea>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Bluedesk\pronails.cloud.dynamicweb-cms.com\files\Templates\Designs\ProNails_generated\Paragraph\MultiColumnParagraph.cshtml:line 709 at CompiledRazorTemplates.Dynamic.RazorEngine_beab5930c6154e33a13576f5d4b0788f.Execute() in D:\dynamicweb.net\Solutions\Bluedesk\pronails.cloud.dynamicweb-cms.com\files\Templates\Designs\ProNails_generated\Paragraph\MultiColumnParagraph.cshtml:line 635 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.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2 @using Dynamicweb; 3 @using Dynamicweb.Content.Items; 4 @using System.Web; 5 @using Bluedesk.Tools.DynamicWeb.ExtensionMethods; 6 @using Bluedesk.DynamicWeb.ItemTypes; 7 8 9 @{ 10 11 var paragraphID = Pageview.CurrentParagraph.ID; 12 13 MultiColumnParagraph _data = Dynamicweb.Services.Items.GetItem("MultiColumnParagraph", Pageview.CurrentParagraph.ItemId).ToCodeFirstItem<MultiColumnParagraph>() ?? new MultiColumnParagraph(); 14 15 List<string> BackgroundConfigIdList = ((List<string>)Dynamicweb.Context.Current.Items["BackgroundConfigIdList"]) ?? new List<string>(); 16 BackgroundConfigIdList.Add(_data.BackgroundConfigurationID); 17 Dynamicweb.Context.Current.Items["BackgroundConfigIdList"] = BackgroundConfigIdList; 18 19 string ParagraphHeight = _data.Height == 0 ? "auto" : _data.Height + "px"; 20 string MobileParagraphHeight = _data.MobileHeight == 0 ? "auto" : _data.MobileHeight + "px"; 21 22 } 23 24 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 25 @using Dynamicweb; 26 @using Dynamicweb.Content.Items; 27 @using Bluedesk.DynamicWeb.ItemTypes; 28 29 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 30 @using Dynamicweb; 31 @using Dynamicweb.Content.Items; 32 @using Bluedesk.DynamicWeb.ItemTypes; 33 34 @functions { 35 36 Dictionary<string, string> GetFontConfiguration(string TextColor, FontConfigurationItemTab FontConfiguration) 37 { 38 var colorService = new ColorSwatchService(); 39 TextColor = !string.IsNullOrWhiteSpace(TextColor) ? TextColor : "" ; 40 TextColor = !TextColor.Contains("#") ? colorService.GetHexColor(Pageview.AreaID, TextColor) : TextColor; 41 Dictionary<string, string> FontConfig = new Dictionary<string, string>() { 42 { "textColor" , TextColor }, 43 { "fontSize" , FontConfiguration.FontSize }, 44 { "lineHeight", FontConfiguration.LineHeight}, 45 { "fontFamily" , FontConfiguration.FontConfiguration.FontFamily }, 46 { "fontWeight" , FontConfiguration.FontWeight }, 47 { "fontStyle" , FontConfiguration.FontStyle } 48 }; 49 return FontConfig; 50 } 51 52 public string GenerateButtonConfigVariables(ButtonConfiguration BC, MasterConfig mc, int areaId) 53 { 54 string ButtonLabelAlignment = BC.ButtonLabelAlignment; 55 switch (ButtonLabelAlignment) 56 { 57 case "align-left": 58 ButtonLabelAlignment = "flex-start"; 59 break; 60 case "align-center": 61 ButtonLabelAlignment = "center"; 62 break; 63 case "align-right": 64 ButtonLabelAlignment = "flex-end"; 65 break; 66 case "align-full": 67 ButtonLabelAlignment = "space-between"; 68 break; 69 default: 70 ButtonLabelAlignment = "flex-start"; 71 break; 72 } 73 74 var btnStyleBlock = new System.Text.StringBuilder(); 75 76 // General Config 77 btnStyleBlock.Append(GenerateCssVar("btn-min-height", $"{mc.GeneralConfiguration.ButtonHeight}px")); 78 btnStyleBlock.Append(GenerateCssVar("btn-border-radius", $"{mc.GeneralConfiguration.RoundedCornerValue}px")); 79 80 // Button Config 81 btnStyleBlock.Append(GenerateCssVar("btn-border-width", $"{BC.BorderSize.ToString()}px")); 82 btnStyleBlock.Append(GenerateCssVar("btn-label-alignment", ButtonLabelAlignment)); 83 84 // Button Config Tab 85 btnStyleBlock.Append(GenerateCssVar("btn-bg-color", BC.ButtonColorConfiguration.BackgroundColor.GetColorCode(areaId))); 86 btnStyleBlock.Append(GenerateCssVar("btn-font-color", BC.ButtonColorConfiguration.FontColor.GetColorCode(areaId))); 87 btnStyleBlock.Append(GenerateCssVar("btn-border-color", BC.ButtonColorConfiguration.BorderColor.GetColorCode(areaId))); 88 89 // Button Config Hover tab 90 btnStyleBlock.Append(GenerateCssVar("btn-bg-color-hover", BC.ButtonHoverColorConfiguration.BackgroundColor.GetColorCode(areaId))); 91 btnStyleBlock.Append(GenerateCssVar("btn-font-color-hover", BC.ButtonHoverColorConfiguration.FontColor.GetColorCode(areaId))); 92 btnStyleBlock.Append(GenerateCssVar("btn-border-color-hover", BC.ButtonHoverColorConfiguration.BorderColor.GetColorCode(areaId))); 93 94 // Button Config Font Config 95 btnStyleBlock.Append(GenerateCssVar("btn-font-size", BC.FontConfiguration.FontSize)); 96 btnStyleBlock.Append(GenerateCssVar("btn-font-config-color", BC.FontConfiguration.Color.GetColorCode(areaId))); 97 btnStyleBlock.Append(GenerateCssVar("btn-font-line-height", BC.FontConfiguration.LineHeight)); 98 btnStyleBlock.Append(GenerateCssVar("btn-font-family", BC.FontConfiguration.FontConfiguration.FontFamily)); 99 btnStyleBlock.Append(GenerateCssVar("btn-font-weight", BC.FontConfiguration.FontWeight)); 100 btnStyleBlock.Append(GenerateCssVar("btn-font-transform", BC.FontConfiguration.FontStyle)); 101 102 return btnStyleBlock.ToString(); 103 } 104 105 public string GenerateCssVar(string name, string value) 106 { 107 if (!string.IsNullOrWhiteSpace(value)) { 108 return $"--{name}: {value};"; 109 } else { 110 return ""; 111 } 112 } 113 } 114 115 116 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 117 @using Dynamicweb; 118 @using Dynamicweb.Content.Items; 119 @using Bluedesk.DynamicWeb.ItemTypes; 120 @using Bluedesk.DynamicWeb.ItemTypes.Configuration; 121 122 123 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 124 @using Dynamicweb; 125 @using Dynamicweb.Content.Items; 126 @using Bluedesk.DynamicWeb.ItemTypes; 127 @using Bluedesk.DynamicWeb.ItemTypes.Extensions; 128 @using Bluedesk.DynamicWeb.ItemTypes.Configuration; 129 @using Bluedesk.DynamicWeb.ItemTypes.Settings.Configuration; 130 @using Dynamicweb; 131 @using Dynamicweb.Frontend 132 @using Bluedesk.DynamicWeb.ItemTypes.BaseSolution; 133 134 @helper RenderButton(CTAButton button, PageView Pageview) 135 { 136 137 if (!string.IsNullOrWhiteSpace(button.GetLink(Pageview))) 138 { 139 string Template = button.GetButtonTemplate().Replace("{{ ButtonLink }}", button.GetLink(Pageview)); 140 @Template; 141 } 142 } 143 144 145 @{ 146 147 var colorService = new ColorSwatchService(); 148 149 string fullWidthContainerClass = _data.Fullwidth ? "" : "container"; 150 151 string backgroundClass = !string.IsNullOrWhiteSpace(_data.BackgroundConfiguration.BackgroundClass) ? string.Format("bg-{0}", _data.BackgroundConfiguration.BackgroundClass) : ""; 152 string backgroundStyle = !string.IsNullOrWhiteSpace(_data.BackgroundConfiguration.BackgroundColor) ? $"background-color: {_data.BackgroundConfiguration.BackgroundColor}; " : ""; 153 backgroundStyle += !string.IsNullOrWhiteSpace(_data.BackgroundConfiguration.BackgroundImage) ? $"background-image: url({_data.BackgroundConfiguration.BackgroundImage}); " : ""; 154 155 // string backgroundClass = "null"; 156 // string backgroundStyle = ""; 157 } 158 159 160 @functions { 161 //string getbackgroundclass(string backgroundClass) 162 //{ 163 // return !string.IsNullOrWhiteSpace(backgroundClass) ? string.Format("bg-{0}", backgroundClass) : ""; 164 //} 165 } 166 167 @helper CTAParagraphImage( 168 ParagraphImageResizable Image, 169 bool hasContent, 170 bool ImageAsBackground, 171 string ImagePosition, 172 bool ParallaxImage, 173 bool Fullwidth, 174 string imagesHeight, 175 double ColumnWidthSize, 176 int AnimationDuration = 300, 177 bool AnimateHalfBlock = false 178 ) 179 { 180 if (!string.IsNullOrWhiteSpace(Image.Image)) 181 { 182 183 string image = !string.IsNullOrWhiteSpace(Image.Image) ? Image.Image : null; 184 imagesHeight = hasContent ? imagesHeight : "100%"; 185 imagesHeight = !string.IsNullOrWhiteSpace(imagesHeight) ? "height: " + imagesHeight + ";" : ""; 186 187 string imageParrallax = ParallaxImage ? "rellax" : ""; 188 string imageAsBackground = ImageAsBackground ? "cta-paragraph__image--is-background" : ""; 189 double imageWidth = 2000; 190 191 imageWidth = Fullwidth ? imageWidth : 1200; 192 imageWidth = !ImageAsBackground ? imageWidth * ColumnWidthSize : imageWidth; 193 194 string strImageWidth = imageWidth + "px"; 195 string strImageWidthSize = imageWidth + "w"; 196 197 string ImageUrl; 198 if (image.EndsWith(".gif")) 199 { 200 ImageUrl = image; 201 } 202 else 203 { 204 ImageUrl = "/Admin/Public/GetImage.ashx?Image=" + image + "&Crop=7&Format=webp&Quality=90&Compression=80"; 205 ImageUrl = ImageUrl.Replace("?x", "&x"); 206 } 207 208 string animationDirection = AnimateHalfBlock ? ImagePosition.Equals("right") ? "fade-left" : "fade-right" : ""; 209 210 if (!string.IsNullOrWhiteSpace(Image.Image)) 211 { 212 213 <figure class="cta-paragraph__image-container @imageAsBackground @Image.PositionY @Image.PositionX" style="@imagesHeight" data-aos="@animationDirection" data-aos-duration="@AnimationDuration"> 214 215 <picture class="cta-paragraph__image @Image.BackgroundSize @imageParrallax"> 216 @if (ImageUrl.EndsWith(".gif")) 217 { 218 <source media="(max-width: 400px)" srcset="@ImageUrl&Width=400"> 219 <source media="(max-width: 994px)" srcset="@ImageUrl&Width=994"> 220 <img src="@ImageUrl" loading="lazy" alt="@Image.ImageAlt" class="cta-paragraph__image @Image.BackgroundSize @imageParrallax" width="1980" height="500"> 221 } 222 else 223 { 224 <source media="(max-width: 400px)" srcset="@ImageUrl&Width=400"> 225 <source media="(max-width: 994px)" srcset="@ImageUrl&Width=994"> 226 <img src="@ImageUrl&Width=@imageWidth" loading="lazy" alt="@Image.ImageAlt" class="cta-paragraph__image @Image.BackgroundSize @imageParrallax" width="1980" height="500"> 227 } 228 </picture> 229 230 </figure> 231 } 232 } 233 } 234 235 @helper CTAParagraphContent( 236 int paragraphID, 237 ParagraphHeader Header, 238 ParagraphHeader SubHeader, 239 ParagraphContent Content, 240 CTAButton Button, 241 CTAButton ExtraButton, 242 ParagraphImage Image, 243 bool strCenterVertical, 244 string ImagePosition = "", 245 int AnimationDuration = 300, 246 bool AnimateHalfBlock = false 247 ) 248 { 249 250 bool hasImage = !string.IsNullOrWhiteSpace(Image.Image) ? true : false; 251 string noImageClass = hasImage ? "" : "no-image"; 252 253 string centerTextClass = strCenterVertical ? "text-center" : ""; 254 string centerContent = !string.IsNullOrWhiteSpace(Image.Image) ? "" : "cta-paragraph__content--center"; 255 256 string paragraphInstanceClass = "cta-paragraph__content--" + paragraphID; 257 258 string animationDirection = (AnimateHalfBlock && hasImage) ? ImagePosition.Equals("right") ? "fade-right" : "fade-left" : ""; 259 260 if (!string.IsNullOrWhiteSpace(Button.ButtonText) || !string.IsNullOrWhiteSpace(Content.Text) || !string.IsNullOrWhiteSpace(Header.HeaderFormatted("cta-paragraph__header"))) 261 { 262 263 <section class="cta-paragraph__content @paragraphInstanceClass @centerContent @noImageClass" data-aos="@animationDirection" data-aos-duration="@AnimationDuration"> 264 265 <article class="cta-paragraph__content-container @noImageClass"> 266 267 @if (!string.IsNullOrWhiteSpace(Header.HeaderFormatted("cta-paragraph__header"))) 268 { 269 <header class="cta-paragraph__header @centerTextClass"> 270 @if (SubHeader != null) 271 { 272 @SubHeader.HeaderFormatted("cta-paragraph__subheader") 273 } 274 @Header.HeaderFormatted("cta-paragraph__header") 275 </header> 276 } 277 278 @if (!string.IsNullOrWhiteSpace(Content.Text)) 279 { 280 <div class="cta-paragraph__text @centerTextClass">@Content.Text</div> 281 } 282 283 @if (!string.IsNullOrWhiteSpace(Button.GetLink(Pageview)) && !string.IsNullOrWhiteSpace(Button.ButtonText)) 284 { 285 <nav class="cta-paragraph__btn-navigation @centerTextClass"> 286 @RenderButton(Button, Pageview) 287 @RenderButton(ExtraButton, Pageview) 288 </nav> 289 } 290 291 </article> 292 </section> 293 294 } 295 296 } 297 298 @helper CTAParagraphVideo(ParagraphVideo Video, string imagesHeight) 299 { 300 if (!string.IsNullOrWhiteSpace(Video.YoutubeLink) || !string.IsNullOrWhiteSpace(Video.VimeoLink)) 301 { 302 string YoutubeID = Video.YoutubeId; 303 string YoutubeLink = Video.YoutubeLink; 304 305 string VimeoID = Video.VimeoId; 306 string VimeoLink = Video.VimeoLink; 307 308 int CleanVideo = Video.Clean ? 1 : 0; 309 int ShowControls = Video.ShowControls ? 1 : 0; 310 int AutoPlay = Video.AutoPlay ? 1 : 0; 311 int LoopVideo = Video.LoopVideo ? 1 : 0; 312 int MuteAudio = Video.MuteAudio ? 1 : 0; 313 string hideControlsClass = Video.ShowControls ? "video-player-wrapper--hidecontrols" : ""; 314 string origin = Dynamicweb.Environment.Helpers.LinkHelper.GetHttpDomain(); 315 imagesHeight = !string.IsNullOrWhiteSpace(imagesHeight) ? "height: " + imagesHeight + ";" : ""; 316 317 if (!string.IsNullOrWhiteSpace(YoutubeLink)) 318 { 319 if(AutoPlay == 1) 320 { 321 <section class="cta-paragraph__video-container" style="@imagesHeight"> 322 <div class=""> 323 <div class="video-player-wrapper @hideControlsClass"> 324 <iframe class="video-player" loading="lazy" data-video="@YoutubeID" frameborder="0" allowfullscreen allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" title="YouTube video player" src="https://www.youtube-nocookie.com/embed/@YoutubeID?autoplay=@AutoPlay&controls=@ShowControls&loop=@LoopVideo&playlist=@YoutubeID&playsinline=1&modestbranding=@CleanVideo&mute=@MuteAudio&rel=0&enablejsapi=1&origin=@origin&disablekb=0"></iframe> 325 </div> 326 </div> 327 </section> 328 } 329 else 330 { 331 <lite-youtube videoid="@YoutubeID" params="controls=@ShowControls&loop=@LoopVideo&playlist=@YoutubeID&playsinline=1&modestbranding=@CleanVideo&mute=@MuteAudio&rel=0&enablejsapi=1&origin=@origin&disablekb=0"></lite-youtube> 332 } 333 } 334 if (!string.IsNullOrWhiteSpace(VimeoLink)) 335 { 336 <section class="cta-paragraph__video-container" style="@imagesHeight"> 337 <div class=""> 338 <div class="video-player-wrapper"> 339 <iframe class="video-player" loading="lazy" data-video="@VimeoID" frameborder="0" allowfullscreen allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" title="Vimeo video player" src="https://player.vimeo.com/video/@VimeoID?title=0&byline=0&portrait=0&autoplay=@AutoPlay&controls=@ShowControls&loop=@LoopVideo&muted=@MuteAudio"></iframe> 340 </div> 341 </div> 342 </section> 343 } 344 } 345 } 346 347 @helper CTAParagraphIcon(ParagraphIcon Icon, bool strCenterVertical) 348 { 349 if (!string.IsNullOrWhiteSpace(Icon.FaIcon)) 350 { 351 string centerIconClass = strCenterVertical ? "justify-center" : "justify-start"; 352 string iconSizeClass = string.Format("cta-paragraph__icon--{0}", Icon.FaIconSize); 353 354 <div class="cta-paragraph__icon-container"> 355 <div class="cta-paragraph__icon-inner-container @centerIconClass"> 356 <span class="cta-paragraph__icon @iconSizeClass">@Icon.FaIcon</span> 357 </div> 358 </div> 359 } 360 } 361 362 @helper RenderContentAlignment(BackgroundConfiguration data) 363 { 364 365 switch (data.ContentElementAlign) 366 { 367 case "align-left": 368 <text> 369 align-items: flex-start; 370 text-align: left; 371 </text> 372 break; 373 case "align-center": 374 <text> 375 align-items: center; 376 text-align: center; 377 </text> 378 break; 379 case "align-right": 380 <text> 381 align-items: flex-end; 382 text-align: right; 383 </text> 384 break; 385 case "align-full": 386 <text> 387 align-items: flex-start; 388 text-align: justify; 389 </text> 390 break; 391 } 392 393 } 394 395 396 @{ 397 398 string backgroundImageRepeatClass = _data.BackgroundConfiguration.BackgroundImageRepeat; 399 string backgroundImageSizeClass = ""; 400 401 string BackgroundImagePositionX = _data.BackgroundConfiguration.BackgroundImagePositionX; 402 string BackgroundImagePositionY = _data.BackgroundConfiguration.BackgroundImagePositionY; 403 404 string BackgroundImagePositionClass = ""; 405 406 if (backgroundImageRepeatClass == "no-repeat") 407 { 408 BackgroundImagePositionClass = BackgroundImagePositionY + "-" + BackgroundImagePositionX; 409 backgroundImageSizeClass = _data.BackgroundConfiguration.BackgroundImageSize; 410 } 411 412 string ctaBackgroundColor = _data.BackgroundConfiguration.BackgroundColor; 413 414 ctaBackgroundColor = colorService.GetHexColor(Pageview.AreaID, ctaBackgroundColor); 415 416 string BackgroundGradient = _data.BackgroundConfiguration.BackgroundGradient; 417 418 string contentBackgroundColor = _data.BackgroundConfiguration.contentBackgroundColor; 419 string contentBorderColor = _data.BackgroundConfiguration.contentBorderColor; 420 421 string contentBorderSize = _data.BackgroundConfiguration.contentBorderSize + "px"; 422 423 string contentGutterClass = _data.BackgroundConfiguration.contentGutter; 424 string BackgroundPadding = _data.BackgroundConfiguration.backgroundPadding; 425 426 bool Containerfit = _data.BackgroundConfiguration.ContainerFit == "Fit" ? true : false; 427 428 contentBackgroundColor = colorService.GetHexColor(Pageview.AreaID, contentBackgroundColor); 429 contentBorderColor = colorService.GetHexColor(Pageview.AreaID, contentBorderColor); 430 431 string AnimateDirection = !string.IsNullOrWhiteSpace(_data.AnimateDirection) ? _data.AnimateDirection : ""; 432 int AnimationDuration = _data.AnimateDuration; 433 string DataAosValue = ""; 434 435 switch (AnimateDirection) 436 { 437 case "left": 438 DataAosValue = "fade-left"; 439 break; 440 441 case "right": 442 DataAosValue = "fade-right"; 443 break; 444 445 case "up": 446 DataAosValue = "fade-up"; 447 break; 448 449 case "down": 450 DataAosValue = "fade-down"; 451 break; 452 453 case "": 454 case "none": 455 // No action 456 break; 457 } 458 459 } 460 461 <style> 462 @_data.BackgroundConfiguration.Stylesheet 463 </style> 464 465 <style> 466 467 @@media screen and (max-width: 991px) { 468 .multicolumn--@paragraphID .multicolumn__item { 469 height: @MobileParagraphHeight !important; 470 } 471 } 472 473 @@media screen and (min-width: 991px) { 474 .multicolumn--@paragraphID .multicolumn__item { 475 height: @ParagraphHeight !important; 476 } 477 } 478 479 .multicolumn--@paragraphID { 480 background-color: @ctaBackgroundColor; 481 @if (!string.IsNullOrWhiteSpace(BackgroundGradient)) 482 { 483 @BackgroundGradient 484 } 485 } 486 487 .multicolumn--@paragraphID .cta-paragraph { 488 background-color: @contentBackgroundColor; 489 border: @contentBorderSize @contentBorderColor solid; 490 } 491 492 .multicolumn--@paragraphID .cta-paragraph__content-container 493 { 494 @RenderContentAlignment(_data.BackgroundConfiguration) 495 } 496 497 .multicolumn--@paragraphID .cta-paragraph__content { 498 @if (Containerfit) 499 { 500 <text> 501 flex-grow: 0; 502 </text> 503 } 504 } 505 506 .multicolumn--@paragraphID .cta-paragraph__image-container { 507 @if (Containerfit) 508 { 509 <text> 510 position: absolute; 511 top: 0; 512 left: 0; 513 right: 0; 514 bottom: 0; 515 </text> 516 } 517 } 518 519 .cta-paragraph--@paragraphID .cta-paragraph__btn-navigation { 520 @if (Containerfit) 521 { 522 523 switch (_data.BackgroundConfiguration.ContainerFitContentAlignment) 524 { 525 526 case "TopLeft": 527 case "MiddleLeft": 528 case "BottomLeft": 529 <text> 530 justify-content: flex-start; 531 </text> 532 break; 533 534 case "TopRight": 535 case "MiddleRight": 536 case "BottomRight": 537 <text> 538 justify-content: flex-end; 539 </text> 540 break; 541 542 543 case "TopCenter": 544 case "MiddleCenter": 545 case "BottomCenter": 546 <text> 547 justify-content: center; 548 </text> 549 break; 550 551 } 552 } 553 554 } 555 556 .multicolumn--@paragraphID .cta-paragraph { 557 @if (Containerfit) 558 { 559 560 switch (_data.BackgroundConfiguration.ContainerFitContentAlignment) { 561 case "TopLeft": 562 <text> 563 justify-content: flex-start; 564 align-items: flex-start; 565 </text> 566 break; 567 case "TopCenter": 568 <text> 569 justify-content: flex-start; 570 align-items: center; 571 </text> 572 break; 573 case "TopRight": 574 <text> 575 justify-content: flex-start; 576 align-items: flex-end; 577 </text> 578 break; 579 case "MiddleLeft": 580 <text> 581 justify-content: center; 582 align-items: flex-start; 583 </text> 584 break; 585 case "MiddleCenter": 586 <text> 587 justify-content: center; 588 align-items: center; 589 </text> 590 break; 591 case "MiddleRight": 592 <text> 593 justify-content: center; 594 align-items: flex-end; 595 </text> 596 break; 597 case "BottomLeft": 598 <text> 599 justify-content: flex-end; 600 align-items: flex-start; 601 </text> 602 break; 603 case "BottomCenter": 604 <text> 605 justify-content: flex-end; 606 align-items: center; 607 </text> 608 break; 609 case "BottomRight": 610 <text> 611 justify-content: flex-end; 612 align-items: flex-end; 613 </text> 614 break; 615 616 } 617 618 619 } 620 621 } 622 623 </style> 624 625 @if (_data != null) 626 { 627 <div class="multicolumn multicolumn--@paragraphID @backgroundClass @backgroundImageRepeatClass @BackgroundImagePositionClass @backgroundImageSizeClass @contentGutterClass @BackgroundPadding @_data.CssClass" data-paragraphid="@paragraphID" id="@paragraphID" style="@backgroundStyle" data-aos="@DataAosValue" data-aos-duration="@AnimationDuration"> 628 629 <div class="multicolumn__container @fullWidthContainerClass"> 630 @if (!string.IsNullOrWhiteSpace(_data.Header.HeaderFormatted())) 631 { 632 <header class="multicolumn__header-wrapper">@_data.Header.HeaderFormatted("cta-paragraph__header")</header> 633 } 634 635 @RenderContentArea(_data, paragraphID) 636 </div> 637 638 </div> 639 } 640 641 @helper RenderContentArea(MultiColumnParagraph _data, int paragraphID) 642 { 643 644 if (_data.Paragraphs().Count > 0) 645 { 646 647 // string contentElementAlign = _data.BackgroundConfiguration.ContentElementAlign; 648 649 int colIndex = 0; 650 var colorService = new ColorSwatchService(); 651 652 string centerTextClass = _data.CenterText ? "items-center text-center" : "items-start text-left"; 653 string WarpElementsClass = !string.IsNullOrWhiteSpace(_data.WrapElements) ? _data.WrapElements : ""; 654 double ColumnWidthSize = 1; 655 656 bool Shadow = _data.BackgroundConfiguration.contentShadow; 657 string shadowClass = Shadow ? "contentShadow" : ""; 658 659 bool enableColumnAnimation = _data.AnimateDelayColumns; 660 string AnimateDirection = !string.IsNullOrWhiteSpace(_data.AnimateDirection) ? _data.AnimateDirection : ""; 661 int AnimationDuration = 0; 662 string DataAosValue = ""; 663 664 if (enableColumnAnimation) 665 { 666 AnimationDuration = _data.AnimateDuration; 667 switch (AnimateDirection) 668 { 669 case "left": 670 DataAosValue = "fade-left"; 671 break; 672 673 case "right": 674 DataAosValue = "fade-right"; 675 break; 676 677 case "up": 678 DataAosValue = "fade-up"; 679 break; 680 681 case "down": 682 DataAosValue = "fade-down"; 683 break; 684 685 case "": 686 case "none": 687 // No action 688 break; 689 } 690 } 691 692 <div class="grid-container @WarpElementsClass"> 693 694 @foreach (ParagraphColumn p in _data.Paragraphs()) 695 { 696 697 bool hasContent = !string.IsNullOrWhiteSpace(p.Button().ButtonText) || !string.IsNullOrWhiteSpace(p.Content().Text) || !string.IsNullOrWhiteSpace(p.Header().HeaderFormatted()); 698 string ImageContainerFixed = hasContent ? "cta-paragraph__image-container--fixed" : ""; 699 string imagesHeight = hasContent ? _data.ImageHeight.ToString() + "px" : "100%"; 700 imagesHeight = imagesHeight == "0px" ? "auto" : imagesHeight; 701 702 if (_data.BackgroundConfiguration.ContainerFit == "Fit") 703 { 704 imagesHeight = "auto"; 705 } 706 707 string newWindow = p.Button().NewWindow ? "target='_blank'" : ""; 708 string ariaLabel = !string.IsNullOrWhiteSpace(p.Button().ButtonAriaLabel) ? "aria-label='" + p.Button().ButtonAriaLabel + "'" : ""; 709 bool clickableBlock = !string.IsNullOrWhiteSpace(p.Button().GetLink(Pageview)) && _data.Clickable; 710 string clickableClass = clickableBlock ? "cta-paragraph__container--clickable" : ""; 711 712 ColumnWidthSize = GetColumnsize(p.LargeDevices); 713 714 var animationDelay = enableColumnAnimation ? colIndex * 100 : 0; 715 colIndex++; 716 717 <div class="multicolumn__item grid-@p.SmallDevices md-grid-@p.MediumDevices lg-grid-@p.LargeDevices" data-aos="@DataAosValue" data-aos-duration="@AnimationDuration" data-aos-delay="@animationDelay"> 718 719 <section class="cta-paragraph config--@_data.BackgroundConfigurationID @clickableClass @shadowClass"> 720 721 @CTAParagraphImage( 722 p.Image(), 723 hasContent, 724 false, 725 null, 726 false, 727 _data.Fullwidth, 728 imagesHeight, 729 ColumnWidthSize 730 ) 731 732 @CTAParagraphVideo( 733 p.Video(), 734 imagesHeight 735 ) 736 737 @CTAParagraphIcon( 738 p.Icon(), 739 _data.CenterText 740 ) 741 742 @CTAParagraphContent( 743 paragraphID, 744 p.Header(), 745 p.Subheader(), 746 p.Content(), 747 p.Button(), 748 p.ExtraButton(), 749 p.Image(), 750 _data.CenterText 751 ) 752 753 @if (clickableBlock) 754 { 755 <a href="@p.Button().GetLink(Pageview)" class="cta-paragraph__clickable" @newWindow @ariaLabel></a> 756 } 757 758 </section> 759 </div> 760 } 761 </div> 762 } 763 764 } 765 766 767 @functions{ 768 769 double GetColumnsize(string DesktopColumnSize) 770 { 771 772 double ColumnWidthSize = 1; 773 774 switch (DesktopColumnSize) 775 { 776 case "auto": 777 ColumnWidthSize = 1; 778 break; 779 780 case "25p": 781 ColumnWidthSize = 0.25; 782 break; 783 784 case "33p": 785 ColumnWidthSize = 0.33; 786 break; 787 788 case "50p": 789 ColumnWidthSize = 0.5; 790 break; 791 792 case "66p": 793 ColumnWidthSize = 0.66; 794 break; 795 796 case "75p": 797 ColumnWidthSize = 0.75; 798 break; 799 800 case "full": 801 ColumnWidthSize = 1; 802 break; 803 } 804 805 return ColumnWidthSize; 806 807 } 808 809 810 // Check if this carousel contains only images (logo slider) 811 bool checkOnlyImages(Carousel _data) 812 { 813 814 int amountColumns = _data.CarouselItems.Count; // Amount of the columns in backend, filled by user 815 int emptyColumn = 0; 816 817 // Loop through all the columns 818 foreach (var column in _data.CarouselItems) 819 { 820 // If button is empty AND content is empty AND header is empty => this is img only 821 if (string.IsNullOrWhiteSpace(column.Button.ButtonText) && string.IsNullOrWhiteSpace(column.Content.Text) && string.IsNullOrWhiteSpace(column.Header.HeaderFormatted())) 822 { 823 emptyColumn++; 824 } 825 } 826 827 bool emptyColumnResult = emptyColumn == amountColumns ? true : false; 828 829 return emptyColumnResult; 830 831 } 832 } 833 834
Bekijk ook onze manicuretools
Walk Into Wellness – Ontdek de nieuwe ProNails Manicure Tools collectie: ergonomisch, professioneel en hygiënisch. Ontworpen voor efficiënte handverzorging met duurzame materialen en een stijlvol design – een must-have voor elke salon of beautyexpert.
Shop al onze nieuwe manicure- en pedicuretools
Ontdek de nieuwste collectie ProNails manicure- en pedicuretools, ontworpen voor professionele nagelverzorging. Met ergonomische designs, duurzame materialen en milieuvriendelijke verpakkingen zijn deze tools een echte must-have voor elke beautyexpert.
Workshop Foot Care
Wil je alles weten hoe je de juiste voetverzorging toepast en jouw inkomen kan boosten? Schrijf je dan in voor onze workshop.
Starten met ProNails Foot Care?
Bied je nog geen pedicurebehandelingen aan in je salon? Wil je hiermee starten? Ontdek dan zeker ons starterspakket!
Zo heb je meteen alles in huis voor deze behandeling én om je verkoop van Foot Care producten te boosten.