• Vegan
  • Para los profesionales de la belleza
  • Pedido antes de las 12h00, entregado el siguiente día laborable
  • Pago seguro
Pronails Profit
Head Educator Sandrine Roelants

Head Educator Sandrine Roelants

11 septiembre 2023 en Consejos para salones de belleza

5 min tiempo de lectura

BIAB nails: discover the trend

What Are BIAB Nails?

BIAB, which stands for "Builder In A Bottle," is an nail system that combines the benefits of gel polish and builder gel. It is a versatile product suitable for natural nail reinforcement. BIAB treatment is widely praised for its durability and strength, making it a popular choice for both nail technicians and clients looking for long-lasting, perfectly manicured nails. But what are the differences between the gels on the market? Which technique do you prefer to use? And get to know the Bmani! 

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_e978d6b48e4b419c971198ec165f9967.<>c__DisplayClass11_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 624
   at CompiledRazorTemplates.Dynamic.RazorEngine_e978d6b48e4b419c971198ec165f9967.Execute() in D:\dynamicweb.net\Solutions\Bluedesk\pronails.cloud.dynamicweb-cms.com\files\Templates\Designs\ProNails_generated\Paragraph\Carousel.cshtml:line 526
   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 Bluedesk.DynamicWeb.ItemTypes; 5 @using Bluedesk.DynamicWeb.ItemTypes.Pages; 6 @using Bluedesk.Tools.DynamicWeb.ExtensionMethods; 7 @using Bluedesk.Tools.Generic.ExtensionMethods 8 @using System.Linq; 9 @using Dynamicweb.Content; 10 11 <!-- FIX NEEDED: behaviour when all the items are full height images (for instance logo slider)?? --> 12 13 @{ 14 Carousel _data = ItemManager.Storage.GetById<Carousel>(Pageview.CurrentParagraph.ItemId ?? "0"); 15 16 var paragraphID = Pageview.CurrentParagraph.ID; 17 int amountColumns = _data.CarouselItems.Count; // Amount of the columns in backend, filled by user 18 var classFullWidth = !_data.Fullwidth ? "container" : "w-full"; // If slider or multicolumn has to be in container or full width of the page 19 } 20 21 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 22 @using Dynamicweb; 23 @using Dynamicweb.Content.Items; 24 @using Bluedesk.DynamicWeb.ItemTypes; 25 26 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 27 @using Dynamicweb; 28 @using Dynamicweb.Content.Items; 29 @using Bluedesk.DynamicWeb.ItemTypes; 30 31 @functions { 32 33 Dictionary<string, string> GetFontConfiguration(string TextColor, FontConfigurationItemTab FontConfiguration) 34 { 35 var colorService = new ColorSwatchService(); 36 TextColor = !string.IsNullOrWhiteSpace(TextColor) ? TextColor : "" ; 37 TextColor = !TextColor.Contains("#") ? colorService.GetHexColor(Pageview.AreaID, TextColor) : TextColor; 38 Dictionary<string, string> FontConfig = new Dictionary<string, string>() { 39 { "textColor" , TextColor }, 40 { "fontSize" , FontConfiguration.FontSize }, 41 { "lineHeight", FontConfiguration.LineHeight}, 42 { "fontFamily" , FontConfiguration.FontConfiguration.FontFamily }, 43 { "fontWeight" , FontConfiguration.FontWeight }, 44 { "fontStyle" , FontConfiguration.FontStyle } 45 }; 46 return FontConfig; 47 } 48 49 public string GenerateButtonConfigVariables(ButtonConfiguration BC, MasterConfig mc, int areaId) 50 { 51 string ButtonLabelAlignment = BC.ButtonLabelAlignment; 52 switch (ButtonLabelAlignment) 53 { 54 case "align-left": 55 ButtonLabelAlignment = "flex-start"; 56 break; 57 case "align-center": 58 ButtonLabelAlignment = "center"; 59 break; 60 case "align-right": 61 ButtonLabelAlignment = "flex-end"; 62 break; 63 case "align-full": 64 ButtonLabelAlignment = "space-between"; 65 break; 66 default: 67 ButtonLabelAlignment = "flex-start"; 68 break; 69 } 70 71 var btnStyleBlock = new System.Text.StringBuilder(); 72 73 // General Config 74 btnStyleBlock.Append(GenerateCssVar("btn-min-height", $"{mc.GeneralConfiguration.ButtonHeight}px")); 75 btnStyleBlock.Append(GenerateCssVar("btn-border-radius", $"{mc.GeneralConfiguration.RoundedCornerValue}px")); 76 77 // Button Config 78 btnStyleBlock.Append(GenerateCssVar("btn-border-width", $"{BC.BorderSize.ToString()}px")); 79 btnStyleBlock.Append(GenerateCssVar("btn-label-alignment", ButtonLabelAlignment)); 80 81 // Button Config Tab 82 btnStyleBlock.Append(GenerateCssVar("btn-bg-color", BC.ButtonColorConfiguration.BackgroundColor.GetColorCode(areaId))); 83 btnStyleBlock.Append(GenerateCssVar("btn-font-color", BC.ButtonColorConfiguration.FontColor.GetColorCode(areaId))); 84 btnStyleBlock.Append(GenerateCssVar("btn-border-color", BC.ButtonColorConfiguration.BorderColor.GetColorCode(areaId))); 85 86 // Button Config Hover tab 87 btnStyleBlock.Append(GenerateCssVar("btn-bg-color-hover", BC.ButtonHoverColorConfiguration.BackgroundColor.GetColorCode(areaId))); 88 btnStyleBlock.Append(GenerateCssVar("btn-font-color-hover", BC.ButtonHoverColorConfiguration.FontColor.GetColorCode(areaId))); 89 btnStyleBlock.Append(GenerateCssVar("btn-border-color-hover", BC.ButtonHoverColorConfiguration.BorderColor.GetColorCode(areaId))); 90 91 // Button Config Font Config 92 btnStyleBlock.Append(GenerateCssVar("btn-font-size", BC.FontConfiguration.FontSize)); 93 btnStyleBlock.Append(GenerateCssVar("btn-font-config-color", BC.FontConfiguration.Color.GetColorCode(areaId))); 94 btnStyleBlock.Append(GenerateCssVar("btn-font-line-height", BC.FontConfiguration.LineHeight)); 95 btnStyleBlock.Append(GenerateCssVar("btn-font-family", BC.FontConfiguration.FontConfiguration.FontFamily)); 96 btnStyleBlock.Append(GenerateCssVar("btn-font-weight", BC.FontConfiguration.FontWeight)); 97 btnStyleBlock.Append(GenerateCssVar("btn-font-transform", BC.FontConfiguration.FontStyle)); 98 99 return btnStyleBlock.ToString(); 100 } 101 102 public string GenerateCssVar(string name, string value) 103 { 104 if (!string.IsNullOrWhiteSpace(value)) { 105 return $"--{name}: {value};"; 106 } else { 107 return ""; 108 } 109 } 110 } 111 112 113 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 114 @using Dynamicweb; 115 @using Dynamicweb.Content.Items; 116 @using Bluedesk.DynamicWeb.ItemTypes; 117 @using Bluedesk.DynamicWeb.ItemTypes.Configuration; 118 119 120 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 121 @using Dynamicweb; 122 @using Dynamicweb.Content.Items; 123 @using Bluedesk.DynamicWeb.ItemTypes; 124 @using Bluedesk.DynamicWeb.ItemTypes.Extensions; 125 @using Bluedesk.DynamicWeb.ItemTypes.Configuration; 126 @using Bluedesk.DynamicWeb.ItemTypes.Settings.Configuration; 127 128 @helper RenderButton(ButtonConfiguration ButtonConfiguration, string btnLink, string btnClass, string btnText, string ariaLabel = "", bool newWindow = false, string btnIcon = "", string btnExtraClass = "", string btnTextClass = "", string btnIconClass = "") 129 { 130 string buttonID = ButtonConfiguration.Id; 131 var master_configuration = Services.Pages.GetPageByNavigationTag(Pageview.AreaID, "MasterConfiguration"); 132 MasterConfig mc = master_configuration.Item.ToCodeFirstItem<MasterConfig>(); 133 134 string FontAwesomeLibrary = mc.GeneralConfiguration.fontawesomeStyle; 135 bool HideIcon = ButtonConfiguration.HideIcon; 136 string CustomIconClass = !string.IsNullOrWhiteSpace(ButtonConfiguration.CustomIcon) ? ButtonConfiguration.CustomIcon : !string.IsNullOrWhiteSpace(btnIcon) ? btnIcon : "fa-chevron-right"; 137 string IconPositionClass = HideIcon ? "default-btn--no-icon" : mc.GeneralConfiguration.IconPosition == "left" ? "default-btn--icon-left" : ""; 138 139 string target = newWindow ? "_blank" : "_self"; 140 string ariaText = !string.IsNullOrWhiteSpace(ariaLabel) ? "aria-label='" + ariaLabel + "'" : ""; 141 142 string styleBlock = GenerateButtonConfigVariables(ButtonConfiguration, mc, Pageview.AreaID); 143 144 if (!string.IsNullOrWhiteSpace(btnLink) && !string.IsNullOrWhiteSpace(btnText)) 145 { 146 <a href="@btnLink" class="btn default-btn default-btn--@buttonID @IconPositionClass @btnClass @btnExtraClass" target="@target" @ariaText style="@styleBlock"> 147 <span class="btn__text @btnTextClass">@btnText</span> 148 @if (!HideIcon) 149 { 150 <i class="btn__icon @FontAwesomeLibrary @CustomIconClass @btnIconClass"></i> 151 } 152 </a> 153 } 154 } 155 156 @helper RenderFontConfig(Dictionary<string, string> FontConfig) 157 { 158 <text>color: @FontConfig["textColor"] !important;</text> 159 160 if (!string.IsNullOrWhiteSpace(FontConfig["textColor"])) 161 { 162 <text> 163 color: @FontConfig["textColor"] !important; 164 </text> 165 } 166 167 if (!string.IsNullOrWhiteSpace(FontConfig["fontSize"])) 168 { 169 <text>font-size: @FontConfig["fontSize"] !important;</text> 170 } 171 if (!string.IsNullOrWhiteSpace(FontConfig["lineHeight"])) 172 { 173 <text>line-height: @FontConfig["lineHeight"] !important;</text> 174 } 175 if (!string.IsNullOrWhiteSpace(FontConfig["fontFamily"])) 176 { 177 <text>font-family: @FontConfig["fontFamily"] !important;</text> 178 } 179 if (!string.IsNullOrWhiteSpace(FontConfig["fontWeight"])) 180 { 181 <text>font-weight: @FontConfig["fontWeight"] !important;</text> 182 } 183 if (!string.IsNullOrWhiteSpace(FontConfig["fontStyle"])) 184 { 185 if (FontConfig["fontStyle"] != "none") 186 { 187 <text>text-transform: @FontConfig["fontStyle"] !important;</text> 188 } 189 } 190 } 191 192 193 @{ 194 195 var colorService = new ColorSwatchService(); 196 197 string fullWidthContainerClass = _data.Fullwidth ? "" : "container"; 198 199 string backgroundClass = !string.IsNullOrWhiteSpace(_data.BackgroundConfiguration.BackgroundClass) ? string.Format("bg-{0}", _data.BackgroundConfiguration.BackgroundClass) : ""; 200 string backgroundStyle = !string.IsNullOrWhiteSpace(_data.BackgroundConfiguration.BackgroundColor) ? $"background-color: {_data.BackgroundConfiguration.BackgroundColor}; " : ""; 201 backgroundStyle += !string.IsNullOrWhiteSpace(_data.BackgroundConfiguration.BackgroundImage) ? $"background-image: url({_data.BackgroundConfiguration.BackgroundImage}); " : ""; 202 } 203 204 205 @functions { 206 string getbackgroundclass(string backgroundClass) 207 { 208 return !string.IsNullOrWhiteSpace(backgroundClass) ? string.Format("bg-{0}", backgroundClass) : ""; 209 } 210 } 211 212 @helper CTAParagraphImage( 213 ParagraphImageResizable Image, 214 bool hasContent, 215 bool ImageAsBackground, 216 string ImagePosition, 217 bool ParallaxImage, 218 bool Fullwidth, 219 string imagesHeight, 220 int paragraphHeight, 221 double ColumnWidthSize, 222 int AnimationDuration = 300, 223 bool AnimateHalfBlock = false 224 ) 225 { 226 if (!string.IsNullOrWhiteSpace(Image.Image)) 227 { 228 229 string image = !string.IsNullOrWhiteSpace(Image.Image) ? Image.Image : null; 230 imagesHeight = hasContent ? imagesHeight : "100%"; 231 imagesHeight = !string.IsNullOrWhiteSpace(imagesHeight) ? "height: " + imagesHeight + ";" : ""; 232 233 string imageParrallax = ParallaxImage ? "rellax" : ""; 234 string imageAsBackground = ImageAsBackground ? "cta-paragraph__image--is-background" : ""; 235 double imageWidth = 2000; 236 237 imageWidth = Fullwidth ? imageWidth : 1200; 238 imageWidth = !ImageAsBackground ? imageWidth * ColumnWidthSize : imageWidth; 239 240 string strImageWidth = imageWidth + "px"; 241 string strImageWidthSize = imageWidth + "w"; 242 243 string ImageUrl; 244 if (image.EndsWith(".gif")) 245 { 246 ImageUrl = image; 247 } 248 else 249 { 250 ImageUrl = "/Admin/Public/GetImage.ashx?Image=" + image + "&Crop=7&Format=webp&Quality=90&Compression=80"; 251 ImageUrl = ImageUrl.Replace("?x", "&x"); 252 } 253 254 string animationDirection = AnimateHalfBlock ? ImagePosition.Equals("right") ? "fade-left" : "fade-right" : ""; 255 256 if (!string.IsNullOrWhiteSpace(Image.Image)) 257 { 258 259 <figure class="cta-paragraph__image-container @imageAsBackground @Image.PositionY @Image.PositionX" style="@imagesHeight" data-aos="@animationDirection" data-aos-duration="@AnimationDuration"> 260 261 <picture class="cta-paragraph__image @Image.BackgroundSize @imageParrallax"> 262 @if (ImageUrl.EndsWith(".gif")) 263 { 264 <source media="(max-width: 400px)" srcset="@ImageUrl&Width=400"> 265 <source media="(max-width: 994px)" srcset="@ImageUrl&Width=994"> 266 <img src="@ImageUrl" loading="lazy" alt="@Image.ImageAlt" class="cta-paragraph__image @Image.BackgroundSize @imageParrallax" width="1980" height="500"> 267 } 268 else 269 { 270 <source media="(max-width: 400px)" srcset="@ImageUrl&Width=400"> 271 <source media="(max-width: 994px)" srcset="@ImageUrl&Width=994"> 272 <img src="@ImageUrl&Width=@imageWidth" loading="lazy" alt="@Image.ImageAlt" class="cta-paragraph__image @Image.BackgroundSize @imageParrallax" width="1980" height="500"> 273 } 274 </picture> 275 276 </figure> 277 } 278 } 279 } 280 281 @helper CTAParagraphContent( 282 int paragraphID, 283 string contentElementAlign, 284 ParagraphHeader Header, 285 ParagraphHeader SubHeader, 286 ParagraphContent Content, 287 CTAButton Button, 288 CTAButton ExtraButton, 289 ParagraphImage Image, 290 bool strCenterVertical, 291 Dictionary<string, string> subheaderFontConfig, 292 Dictionary<string, string> headerFontConfig, 293 Dictionary<string, string> contentFontConfig, 294 string ImagePosition = "", 295 int AnimationDuration = 300, 296 bool AnimateHalfBlock = false 297 ) 298 { 299 300 bool hasImage = !string.IsNullOrWhiteSpace(Image.Image) ? true : false; 301 string noImageClass = hasImage ? "" : "no-image"; 302 303 string centerTextClass = strCenterVertical ? "text-center" : ""; 304 string centerContent = !string.IsNullOrWhiteSpace(Image.Image) ? "" : "cta-paragraph__content--center"; 305 306 string paragraphInstanceClass = "cta-paragraph__content--" + paragraphID; 307 308 string animationDirection = (AnimateHalfBlock && hasImage) ? ImagePosition.Equals("right") ? "fade-right" : "fade-left" : ""; 309 310 //string button__fontfamily = !string.IsNullOrWhiteSpace(Button.Configuration.FontConfiguration.FontConfiguration.FontFamily) Button.Configuration.FontConfiguration.FontConfiguration.FontFamily ? : null; 311 312 if (!string.IsNullOrWhiteSpace(Button.ButtonText) || !string.IsNullOrWhiteSpace(Content.Text) || !string.IsNullOrWhiteSpace(Header.HeaderFormatted("cta-paragraph__header"))) 313 { 314 315 <style> 316 317 .multicolumn--@paragraphID .cta-paragraph .cta-paragraph__subheader, 318 .cta-paragraph--@paragraphID .cta-paragraph__subheader { 319 @RenderFontConfig(subheaderFontConfig) 320 } 321 322 .@paragraphInstanceClass .cta-paragraph__header { 323 @RenderFontConfig(headerFontConfig) 324 } 325 326 .@paragraphInstanceClass .cta-paragraph__text p, 327 .@paragraphInstanceClass .cta-paragraph__text li { 328 @RenderFontConfig(contentFontConfig) 329 } 330 331 </style> 332 333 <section class="cta-paragraph__content @paragraphInstanceClass @centerContent @noImageClass" data-aos="@animationDirection" data-aos-duration="@AnimationDuration"> 334 335 <article class="cta-paragraph__content-container @noImageClass"> 336 337 @if (!string.IsNullOrWhiteSpace(Header.HeaderFormatted("cta-paragraph__header"))) 338 { 339 <header class="cta-paragraph__header @centerTextClass"> 340 @if (SubHeader != null) 341 { 342 @SubHeader.HeaderFormatted("cta-paragraph__subheader") 343 } 344 @Header.HeaderFormatted("cta-paragraph__header") 345 </header> 346 } 347 348 @if (!string.IsNullOrWhiteSpace(Content.Text)) 349 { 350 <div class="cta-paragraph__text @centerTextClass">@Content.Text</div> 351 } 352 353 @if (!string.IsNullOrWhiteSpace(Button.GetLink(Pageview)) && !string.IsNullOrWhiteSpace(Button.ButtonText)) 354 { 355 <nav class="cta-paragraph__btn-navigation @centerTextClass"> 356 @RenderButton(Button.Configuration, Button.GetLink(Pageview), Button.Configuration.ButtonClass, Button.ButtonText, Button.ButtonAriaLabel, Button.NewWindow, "", "cta-paragraph__btn cta-paragraph__btn--first", "cta-paragraph__btn-label", "cta-paragraph__btn-icon") 357 @RenderButton(ExtraButton.Configuration, ExtraButton.GetLink(Pageview), ExtraButton.Configuration.ButtonClass, ExtraButton.ButtonText, ExtraButton.ButtonAriaLabel, ExtraButton.NewWindow, "", "cta-paragraph__btn cta-paragraph__btn--extra", "cta-paragraph__btn-label", "cta-paragraph__btn-icon") 358 </nav> 359 } 360 361 </article> 362 </section> 363 364 } 365 366 } 367 368 @helper CTAParagraphVideo(ParagraphVideo Video, string imagesHeight) 369 { 370 if (!string.IsNullOrWhiteSpace(Video.YoutubeLink) || !string.IsNullOrWhiteSpace(Video.VimeoLink)) 371 { 372 string YoutubeID = Video.YoutubeId; 373 string YoutubeLink = Video.YoutubeLink; 374 375 string VimeoID = Video.VimeoId; 376 string VimeoLink = Video.VimeoLink; 377 378 int CleanVideo = Video.Clean ? 1 : 0; 379 int ShowControls = Video.ShowControls ? 1 : 0; 380 int AutoPlay = Video.AutoPlay ? 1 : 0; 381 int LoopVideo = Video.LoopVideo ? 1 : 0; 382 int MuteAudio = Video.MuteAudio ? 1 : 0; 383 string hideControlsClass = Video.ShowControls ? "video-player-wrapper--hidecontrols" : ""; 384 string origin = Dynamicweb.Environment.Helpers.LinkHelper.GetHttpDomain(); 385 imagesHeight = !string.IsNullOrWhiteSpace(imagesHeight) ? "height: " + imagesHeight + ";" : ""; 386 387 if (!string.IsNullOrWhiteSpace(YoutubeLink)) 388 { 389 if(AutoPlay == 1) 390 { 391 <section class="cta-paragraph__video-container" style="@imagesHeight"> 392 <div class=""> 393 <div class="video-player-wrapper @hideControlsClass"> 394 <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=1"></iframe> 395 </div> 396 </div> 397 </section> 398 } 399 else 400 { 401 <lite-youtube videoid="@YoutubeID" params="controls=@ShowControls&loop=@LoopVideo&playlist=@YoutubeID&playsinline=1&modestbranding=@CleanVideo&mute=@MuteAudio&rel=0&enablejsapi=1&origin=@origin&disablekb=1"></lite-youtube> 402 } 403 } 404 if (!string.IsNullOrWhiteSpace(VimeoLink)) 405 { 406 <section class="cta-paragraph__video-container" style="@imagesHeight"> 407 <div class=""> 408 <div class="video-player-wrapper"> 409 <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> 410 </div> 411 </div> 412 </section> 413 } 414 } 415 } 416 417 @helper CTAParagraphIcon(ParagraphIcon Icon, bool strCenterVertical) 418 { 419 if (!string.IsNullOrWhiteSpace(Icon.FaIcon)) 420 { 421 string centerIconClass = strCenterVertical ? "justify-center" : "justify-start"; 422 string iconSizeClass = string.Format("cta-paragraph__icon--{0}", Icon.FaIconSize); 423 424 <div class="cta-paragraph__icon-container"> 425 <div class="cta-paragraph__icon-inner-container @centerIconClass"> 426 <span class="cta-paragraph__icon @iconSizeClass">@Icon.FaIcon</span> 427 </div> 428 </div> 429 } 430 } 431 432 @helper RenderContentAlignment(BackgroundConfiguration data) 433 { 434 435 switch (data.ContentElementAlign) 436 { 437 case "align-left": 438 <text> 439 align-items: flex-start; 440 text-align: left; 441 </text> 442 break; 443 case "align-center": 444 <text> 445 align-items: center; 446 text-align: center; 447 </text> 448 break; 449 case "align-right": 450 <text> 451 align-items: flex-end; 452 text-align: right; 453 </text> 454 break; 455 case "align-full": 456 <text> 457 align-items: flex-start; 458 text-align: justify; 459 </text> 460 break; 461 } 462 463 } 464 465 466 @{ 467 468 string backgroundImageRepeatClass = _data.BackgroundConfiguration.BackgroundImageRepeat; 469 string backgroundImageSizeClass = ""; 470 471 string BackgroundImagePositionX = _data.BackgroundConfiguration.BackgroundImagePositionX; 472 string BackgroundImagePositionY = _data.BackgroundConfiguration.BackgroundImagePositionY; 473 474 string BackgroundImagePositionClass = ""; 475 476 if (backgroundImageRepeatClass == "no-repeat") 477 { 478 BackgroundImagePositionClass = BackgroundImagePositionY + "-" + BackgroundImagePositionX; 479 backgroundImageSizeClass = _data.BackgroundConfiguration.BackgroundImageSize; 480 } 481 482 string ctaBackgroundColor = _data.BackgroundConfiguration.BackgroundColor; 483 string contentBorderColor = _data.BackgroundConfiguration.contentBorderColor; 484 485 string contentBorderSize = _data.BackgroundConfiguration.contentBorderSize + "px"; 486 487 ctaBackgroundColor = colorService.GetHexColor(Pageview.AreaID, ctaBackgroundColor); 488 contentBorderColor = colorService.GetHexColor(Pageview.AreaID, contentBorderColor); 489 490 string contentBackgroundColor = _data.BackgroundConfiguration.contentBackgroundColor; 491 492 string contentGutterClass = _data.BackgroundConfiguration.contentGutter; 493 string BackgroundPadding = _data.BackgroundConfiguration.backgroundPadding; 494 495 contentBackgroundColor = colorService.GetHexColor(Pageview.AreaID, contentBackgroundColor); 496 497 } 498 499 <style> 500 501 @@media screen and (min-width: 991px) { 502 .multicolumn--@paragraphID { 503 background-color: @ctaBackgroundColor; 504 } 505 506 .multicolumn--@paragraphID .cta-paragraph { 507 background-color: @contentBackgroundColor; 508 border: @contentBorderSize @contentBorderColor solid; 509 } 510 } 511 512 .flickity-viewport{ 513 width: 100%; 514 } 515 516 .header__cta{ 517 display: flex; 518 align-items: center; 519 } 520 521 </style> 522 523 @if (amountColumns > 0) 524 { 525 <div class="multicolumn overflow-hidden multicolumn--@paragraphID @backgroundClass @_data.CssClass @backgroundImageRepeatClass @BackgroundImagePositionClass @backgroundImageSizeClass @contentGutterClass @BackgroundPadding" data-paragraphid="@paragraphID" id="@paragraphID" style="@backgroundStyle"> 526 <div class="@classFullWidth">@RenderContentArea(_data, paragraphID)</div> 527 </div> 528 } 529 530 @helper RenderContentArea(Carousel _data, int paragraphID) 531 { 532 533 var subheaderFontConfig = GetFontConfiguration(_data.BackgroundConfiguration.CTASubheaderTextColor, _data.BackgroundConfiguration.FontConfigurationSubheader); 534 var headerFontConfig = GetFontConfiguration(_data.BackgroundConfiguration.CTAHeaderTextColor, _data.BackgroundConfiguration.FontConfigurationHeader); 535 var contentFontConfig = GetFontConfiguration(_data.BackgroundConfiguration.CTAContentTextColor, _data.BackgroundConfiguration.FontConfigurationContent); 536 537 var colorService = new ColorSwatchService(); 538 539 int amountColumns = _data.CarouselItems.Count; // Amount of the columns in backend, filled by user 540 541 string centerTextClass = _data.CenterText ? "items-center text-center" : "items-start text-left"; 542 543 /* Specific for Carousel */ 544 545 int colDisplay = _data.ColumnsDisplay; // Amount of displayed column within one screen 546 547 bool fullWidth = _data.Fullwidth; // If slider or multicolumn has to be in container or full widthof the page 548 bool infiniteLoop = _data.Infinite; 549 bool autoPlay = _data.AutoPlay; 550 bool controls = _data.AddControls; 551 bool duration = _data.Duration; 552 bool showDots = _data.ShowDots; // If slider or multicolumn has to be in container or full widthof the page 553 int colAmount = 1; 554 555 bool imagesOnlyBool = checkOnlyImages(_data); // Check if this carousel contains only images (logo slider) 556 557 subheaderFontConfig["textColor"] = colorService.GetHexColor(Pageview.AreaID, subheaderFontConfig["textColor"]); 558 headerFontConfig["textColor"] = colorService.GetHexColor(Pageview.AreaID, headerFontConfig["textColor"]); 559 contentFontConfig["textColor"] = colorService.GetHexColor(Pageview.AreaID, contentFontConfig["textColor"]); 560 561 bool Shadow = _data.BackgroundConfiguration.contentShadow; 562 string shadowClass = Shadow ? "contentShadow" : ""; 563 564 if (!string.IsNullOrWhiteSpace(@_data.Header.HeaderFormatted())) 565 { 566 <header class="multicolumn__header-wrapper"> 567 @_data.Header.HeaderFormatted("multicolumn__header") 568 </header> 569 } 570 571 string carouselHeight = "auto"; 572 573 if (imagesOnlyBool && _data.ImageHeight != 0) 574 { 575 carouselHeight = _data.ImageHeight.ToString() + "px"; 576 } 577 578 if ((colDisplay <= amountColumns) && (colDisplay != 0)) 579 { 580 string flexBasis = 100 / @colDisplay + "%"; 581 582 <section class="carousel multicolumn" 583 data-columns="@colAmount" 584 data-dots="@showDots" 585 data-loop="@infiniteLoop" 586 data-autoplay="@autoPlay" 587 data-controls="@controls" 588 data-duration="@duration" 589 style="height: @carouselHeight;"> 590 591 @foreach (var column in _data.CarouselItems) 592 { 593 594 bool hasContent = !string.IsNullOrWhiteSpace(column.Button.ButtonText) || !string.IsNullOrWhiteSpace(column.Content.Text) || !string.IsNullOrWhiteSpace(column.Header.HeaderFormatted()); 595 596 string image = column.Image.Image; 597 string imagesHeight = _data.ImageHeight == 0 ? "auto" : _data.ImageHeight.ToString() + "px"; 598 string ImageContainerFixed = hasContent ? "cta-paragraph__image-container--fixed" : ""; 599 string ImageAsBackground = (column.BackgroundConfiguration.ConfigurationName == "Image as Background") ? "cta-paragraph__image--is-background" : ""; 600 601 string coverImage = ""; 602 603 string figureHeight = !hasContent ? "flex-grow:1" : "height:" + imagesHeight; 604 string TempClass = imagesOnlyBool ? "imageOnly" : "hasContent"; 605 string ImageOnlyImageHeight = imagesOnlyBool ? "height:" + imagesHeight + ";" : "height:auto;"; 606 607 if (!imagesOnlyBool) 608 { 609 imagesHeight = hasContent ? imagesHeight : imagesHeight = "100%"; 610 } 611 612 /*This is work around created by Alla to enable cover mode for stand alone pictures*/ 613 if (!hasContent && column.Image.BackgroundSize == "bg-cover") 614 { 615 coverImage = "height:100%;"; 616 } 617 618 <div class="multicolumn__item carousel-cell-wrap" style="display: flex; min-height:100%; @ImageOnlyImageHeight width: @flexBasis; @coverImage"> 619 620 <section class="cta-paragraph carousel-cell" style="min-height: @imagesHeight; @ImageOnlyImageHeight"> 621 @{ 622 string newWindow = column.Button.NewWindow ? "target='_blank'" : ""; 623 string ariaLabel = !string.IsNullOrWhiteSpace(column.Button.ButtonAriaLabel) ? "aria-label='" + column.Button.ButtonAriaLabel + "'" : ""; 624 bool clickableBlock = !string.IsNullOrWhiteSpace(column.Button.GetLink(Pageview)) && _data.Clickable; 625 string clickableClass = clickableBlock ? "cta-paragraph__container--clickable" : ""; 626 627 double ColumnAmount = colDisplay; 628 double ColumnWidthSize = 1 / ColumnAmount; 629 } 630 631 @CTAParagraphImage( 632 column.Image, 633 hasContent, 634 false, 635 null, 636 false, 637 _data.Fullwidth, 638 imagesHeight, 639 0, 640 ColumnWidthSize 641 ) 642 @CTAParagraphContent( 643 paragraphID, 644 "align-left", 645 column.Header, 646 column.Subheader, 647 column.Content, 648 column.Button, 649 column.ExtraButton, 650 column.Image, 651 false, 652 subheaderFontConfig, 653 headerFontConfig, 654 contentFontConfig 655 ) 656 657 @if (clickableBlock) 658 { 659 <a href="@column.Button.GetLink(Pageview)" class="cta-paragraph__clickable" @newWindow @ariaLabel></a> 660 } 661 </section> 662 663 </div> 664 } 665 </section> 666 } 667 else if (colDisplay > amountColumns) 668 { 669 <div>Error: you cant display columns more than you filled in the backend</div> 670 } 671 } 672 673 @functions{ 674 // Check if this carousel contains only images (logo slider) 675 bool checkOnlyImages(Carousel _data) 676 { 677 678 int amountColumns = _data.CarouselItems.Count; // Amount of the columns in backend, filled by user 679 int emptyColumn = 0; 680 681 // Loop through all the columns 682 foreach (var column in _data.CarouselItems) 683 { 684 // If button is empty AND content is empty AND header is empty => this is img only 685 if (string.IsNullOrWhiteSpace(column.Button.ButtonText) && string.IsNullOrWhiteSpace(column.Content.Text) && string.IsNullOrWhiteSpace(column.Header.HeaderFormatted())) 686 { 687 emptyColumn++; 688 } 689 } 690 691 bool emptyColumnResult = emptyColumn == amountColumns ? true : false; 692 693 return emptyColumnResult; 694 695 } 696 } 697

Difference between Builder Gel, Semi Permanent, and Acrylic

The main differences between builder gel, semi permanent, and acrylic lie in their applications and properties:

  • Semi Permanent: a gel product for strengthening and coloring natural nails, offering a glossy finish that outlasts traditional nail polish. However, extension isn't feasible with semi-permanent.
  • Builder Gel: primarily for nail extension and creating a solid foundation. Thicker than BIAB, builder gel requires multiple layers and lacks BIAB's flexibility.
  • Acrylic: acrylic nails are created by mixing a liquid and powder, causing a chemical reaction that hardens the nail. While creating strong gel nails, improper application or removal can damage natural nails, often accompanied by an unpleasant smell.

Longevity of BIAB Nails

BIAB treatment exhibits remarkable resilience, maintaining its quality for up to 4 weeks without any chipping or fading. Offering a natural look akin to semi-permanent, BIAB manicure combines the longevity and robustness of builder gel, making it an ideal choice for those aiming for a perfect appearance amid busy schedules.

Strength and Nail Extension with BIAB

BIAB nails are renowned for unparalleled strength, even on natural nails. It offers exceptional protection against splitting, breaking, or cracking. Additionally, with new innovations all-in-one gels can be suitable for nail extension. Make sure to read about ProNails B System in which we provide a fast and cost-efficient way of working that is beneficial for you and your clients. 

Ideal for Nail Biters

It is not recent that an all-in-one gel builder presents an excellent solution for nail biters. Its robustness promotes natural nail growth while preventing nail biting. Enhancing nail strength and minimizing vulnerability to damage helps in reducing clients with nail-biting tendencies. 

BIAB Nails Also Known As Structured Manicure

In Anglo-Saxon countries, BIAB nails are dubbed structured gel manicure. Several brands have introduced BIAB-like products or systems. Understanding these differences and the varied benefits for both professionals and salon clients is crucial.

ProNails’ B System

ProNails' B System merges the swiftness and efficiency desired by nail professionals with the advantages for salon clients. Enhanced by a vegan, acid-free formula ensuring hyper-natural nail results, the B System accelerates nail professionals' pace, enabling trendy services and higher earnings—a double win!

The B System Comprises BFLEX, BSTRONG, and BCOLOUR Gels

  • BFLEX, a 4-in-one flexible gel, boasts high elasticity, ideal for clients desiring slight flexibility to prevent breakage on impact.
  • BSTRONG, a 5-in-one gel that suits clients needing extra strength, supporting weak nails and enabling extensions without compromising flexibility.
  • BCOLOUR is the opaquest one-layer gel, compatible with BFLEX and BSTRONG. 

Unlock the acid-free, vegan gel nail system on the market, featuring the fastest and simplest approach for the most natural outcome. ProNails' B System is more than a 'money-making machine' for beauty professionals—it's a cherished choice among salon clients.

Head Educator Sandrine Roelants

Sobre el autor

Head Educator Sandrine Roelants

Sandrine is a valued member of our Product Development Team and is Head of Training in our ProNails Academy, which she does with a lot of passion.

Etiquetas

  • Salon
Subir
Cookies

This website uses cookies to track your behavior and to improve your experience on the site.