- For Beauty Professionals
- Vegan

THE BEST SALON QUALITY IN SEMI-PERMANENT
What is gel polish?
How long can you leave gel nail polish on?
Sopolish lasts up to 21 days on hands and feet. Longer than regular nail polish, which many salon clients see as an advantage. Gel Polish is therefore also ideal for pedicures.
What products do you need for gel polish nails?
-
Nail file - to file nails into shape and lightly roughen them.
-
Cuticle pusher - to push back cuticles.
-
Degreaser - Sopolish Cleanse : This degreases the nail and ensures better adhesion of the gel polish nails.
-
Base Coat - protects the nails and ensures a long-lasting result : 3 application methods possible which are explained below: Sopolish Easy Peel - Sopolish Easy Soak - Sopolish Structure Base
-
Led Lamp - Smart Light to harden the gel polish.
-
Gel polish Colour - Choose your favourite gel polish colour
-
Top Coat - Protects the gel polish nails from damage.
How to apply gel polish?
1. Mini Manicure
You always start with a mini manicure. Begin by sanitising the hands, then file the nails into the desired shape and push back the cuticles. You can also perform a more extensive manicure before starting the application process.
2. Base Coats
Sopolish Cleanse is the first step in the Sopolish application process. It is used to efficiently remove any oily residue from the nail plate before applying Sopolish Easy Peel, Easy Soak, or Structure Base.
How to choose the right gel polish base? We offer three types of bases:
- Does your client return regularly to your salon? Then the best option is Sopolish Easy Soak. It is also suitable for use on toenails and can be removed by soaking off.
- Is your client visiting just once? Then suggest Sopolish Easy Peel, which allows them to remove the polish themselves after two weeks by peeling it off.
- Does your client have challenging nails (e.g., spoon-shaped, brittle nails, or nails with deep ridges)? Choose Sopolish Structure Base. This base provides structure and even allows for small extensions of up to 2mm.

Gel Polish Easy Peel
This Sopolish salon service offers the unique advantage of quick and easy peel-off removal, at home or in the salon, without damaging the natural nail. No soaking in solvents required. The Sopolish peel-off service is performed with an easy brush-on application using the Sopolish Start Easy Peel. This treatment is suitable for hands and can be used on all nail types. However, it is not suitable for toenails.
The difference lies in the fact that this base coat does not need to be cured under a LED lamp and can be impressively easy to remove thanks to the peel-off system!

Gel Polish Easy Soak
This efficient salon treatment is suitable for all nail types and can be used on both hands and feet. The convenient brush-on applicator and ultra-fast LED curing make this a quick and easy salon service. Removal is done professionally in the salon using a soak-off system that takes just 5 minutes and is gentle and non-damaging to the nails.

Ge Polish Structure Base - Versteviging
Not every client is lucky enough to have beautiful, strong natural nails. Some clients have brittle, ridged, or weak nails, making it challenging to achieve a long-lasting semi-permanent polish with a smooth and even finish. With the Sopolish Structure Base, you can help these clients enjoy a beautiful Sopolish colour on a smooth, well-shaped nail. You can remove the Sopolish by soaking it off, just as you would with Sopolish Start Easy Soak as the base. While it may take a bit longer than with Easy Soak, the result is a manicure that lasts longer and provides added durability!
3. Choosing a Colour
Now comes the most enjoyable step of the application: letting your client choose their favourite colour. Sopolish gel polish is as easy to use as regular nail polish, cures under LED light, and lasts for approximately 21 days without damaging the natural nail. It delivers stunning results thanks to its superior colour formula. Available in over 150 shades, ranging from timeless classics to the latest trends.
4. Finishing with Your Favourite Top Coat
Of course, you want the perfect shine on your nails. Achieve this by finishing with the Sopolish Gloss, which protects the colour and ensures beautifully shiny nails until your next manicure. We offer a variety of gloss options, including matte, natural, and even glitter finishes, so there's something for everyone. Each semi-permanent top coat is cured under the Smart Light.
How do you remove gel polish?
The removal method for this semi-permanent gel system depends on the base you use.
1. Easy Peel Base
Your client can remove it themselves by peeling off the gel polish once nail regrowth is visible. You can use the Polish Corrector Pen to help lift the edges more easily.
2. Easy Soak Base
Removal in 5 minutes in the salon using Sopolish Remove, Cotton Pads, and the Reusable Soak Off Clips.
3. Structure Base
This base provides structure to the nail, making it ideal for clients with deeply ridged, bitten, or very brittle nails. It smooths the nail plate and even allows for small extensions of up to 2 mm. Removal is done through a combination of soaking off and filing with your e-file device.
10 reasons why successful salons work with Sopolish
- Brilliant shine: Naturally thin with a stunning gloss, comparable to gel nails
- Lasts up to 21 days on hands and feet with a 100% safe formula for nails and skin, compliant with strict European regulations
- Easy application: simple to apply, curing under a LED lamp in just 30 seconds
- Three Gel Polish application and removal methods: tailored to your client's needs
- Beautiful colours: Over 150 shades with a Superior Colour Formula, providing full coverage and easy application in two thin layers
- New trends: 12 new trend colours introduced every season
- Wide variety of semi-permanent finishes: various looks with top coats (glitter, matte, or glossy)
- Structural support: Structure Base provides extra reinforcement for nails with imperfections, such as deep ridges, spoon-shaped nails, and bitten nails
Highlight your Sopolish products and let your customers choose their favourite colour
Please show in your salon that you offer this nail service. Your clients will be more likely to ask about it when they come for a deluxe manicure or pedicure, for example!
Tips & Facts
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_99ed4e413578438b9402f6acfee8b216.<>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_99ed4e413578438b9402f6acfee8b216.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