Nail Table Organizers

Nail Table Organizers

Error executing template "Designs/ProNails_generated/Paragraph/CTAParagraph.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_ec5d95b299f1474c80c60044f6aca9a4.Execute() in D:\dynamicweb.net\Solutions\Bluedesk\pronails.cloud.dynamicweb-cms.com\files\Templates\Designs\ProNails_generated\Paragraph\CTAParagraph.cshtml:line 58
   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.Frontend; 4 @using Dynamicweb.Content.Items; 5 @using Bluedesk.DynamicWeb.ItemTypes; 6 @using Bluedesk.Tools.DynamicWeb.DataAccess; 7 8 @using System.Runtime.Caching; 9 10 11 @{ 12 /* var paragraphID = Pageview.CurrentParagraph.ID; 13 CTAParagraph _data = Dynamicweb.Services.Items.GetItem("CTAParagraph", Pageview.CurrentParagraph.ItemId).ToCodeFirstItem<CTAParagraph>() ?? new CTAParagraph(); */ 14 15 /* Hack */ 16 17 var paragraphID = Pageview.CurrentParagraph.ID; 18 CTAParagraph _data = new CTAParagraph(); 19 20 int CacheTime = 5; 21 MemoryCache memCache = MemoryCache.Default; 22 string cacheKey = $"CTAParagraph_{paragraphID}-{Pageview.AreaID}"; 23 24 if (Pageview.IsVisualEditorMode) 25 { 26 var cache = MemoryCache.Default; 27 memCache.Remove($"CTAParagraph_{paragraphID}-{Pageview.AreaID}"); 28 } 29 30 if (memCache.Contains(cacheKey)) 31 { 32 _data = memCache.Get(cacheKey) as CTAParagraph; 33 34 if (_data == null) 35 { 36 _data = Dynamicweb.Content.Services.Items.GetItem("CTAParagraph", Pageview.CurrentParagraph.ItemId).ToCodeFirstItem<CTAParagraph>() ?? new CTAParagraph(); 37 memCache.Set(cacheKey, _data, DateTimeOffset.UtcNow.AddMinutes(CacheTime)); 38 39 } 40 41 } 42 else 43 { 44 _data = Dynamicweb.Content.Services.Items.GetItem("CTAParagraph", Pageview.CurrentParagraph.ItemId).ToCodeFirstItem<CTAParagraph>() ?? new CTAParagraph(); 45 memCache.Set(cacheKey, _data, DateTimeOffset.UtcNow.AddMinutes(CacheTime)); 46 } 47 48 /* End Hack */ 49 50 List<string> BackgroundConfigIdList = ((List<string>)Dynamicweb.Context.Current.Items["BackgroundConfigIdList"]) ?? new List<string>(); 51 BackgroundConfigIdList.Add(_data.BackgroundConfigurationID); 52 Dynamicweb.Context.Current.Items["BackgroundConfigIdList"] = BackgroundConfigIdList; 53 54 string contentRightClass = _data.ImagePosition.Equals("right") ? "image-right" : "image-left"; 55 56 string newWindow = _data.Button.NewWindow ? "target='_blank'" : ""; 57 string ariaLabel = !string.IsNullOrWhiteSpace(_data.Button.ButtonAriaLabel) ? "aria-label='" + _data.Button.ButtonAriaLabel + "'" : ""; 58 bool clickableBlock = !string.IsNullOrWhiteSpace(_data.Button.GetLink(Pageview)) && _data.Clickable; 59 string clickableClass = clickableBlock ? "cta-paragraph__container--clickable" : ""; 60 string ctaHasBackgroundImageClass = _data.ImageAsBackground ? "cta-paragraph--hasbackgroundimg" : ""; 61 62 bool hasContent = !string.IsNullOrWhiteSpace(_data.Button.ButtonText) || !string.IsNullOrWhiteSpace(_data.Content.Text) || !string.IsNullOrWhiteSpace(_data.Header.HeaderFormatted()); 63 double ColumnWidthSize = hasContent ? 0.5 : 1; 64 65 // string backgroundClass = getbackgroundclass(_data.BackgroundConfiguration.BackgroundClass); 66 67 string AnimateDirection = !string.IsNullOrWhiteSpace(_data.AnimateDirection) ? _data.AnimateDirection : ""; 68 bool AnimateHalfBlock = false; 69 int AnimationDuration = _data.AnimateDuration; 70 string DataAosValue = ""; 71 72 switch (AnimateDirection) 73 { 74 case "left": 75 DataAosValue = "fade-left"; 76 break; 77 78 case "right": 79 DataAosValue = "fade-right"; 80 break; 81 82 case "up": 83 DataAosValue = "fade-up"; 84 break; 85 86 case "down": 87 DataAosValue = "fade-down"; 88 break; 89 90 case "center": 91 AnimateHalfBlock = true; 92 break; 93 94 case "": 95 case "none": 96 // No action 97 break; 98 } 99 100 string ParagraphHeight = _data.Height == 0 ? "auto" : _data.Height + "px"; 101 102 } 103 104 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 105 @using Dynamicweb; 106 @using Dynamicweb.Content.Items; 107 @using Bluedesk.DynamicWeb.ItemTypes; 108 109 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 110 @using Dynamicweb; 111 @using Dynamicweb.Content.Items; 112 @using Bluedesk.DynamicWeb.ItemTypes; 113 114 @functions { 115 116 Dictionary<string, string> GetFontConfiguration(string TextColor, FontConfigurationItemTab FontConfiguration) 117 { 118 var colorService = new ColorSwatchService(); 119 TextColor = !string.IsNullOrWhiteSpace(TextColor) ? TextColor : "" ; 120 TextColor = !TextColor.Contains("#") ? colorService.GetHexColor(Pageview.AreaID, TextColor) : TextColor; 121 Dictionary<string, string> FontConfig = new Dictionary<string, string>() { 122 { "textColor" , TextColor }, 123 { "fontSize" , FontConfiguration.FontSize }, 124 { "lineHeight", FontConfiguration.LineHeight}, 125 { "fontFamily" , FontConfiguration.FontConfiguration.FontFamily }, 126 { "fontWeight" , FontConfiguration.FontWeight }, 127 { "fontStyle" , FontConfiguration.FontStyle } 128 }; 129 return FontConfig; 130 } 131 132 public string GenerateButtonConfigVariables(ButtonConfiguration BC, MasterConfig mc, int areaId) 133 { 134 string ButtonLabelAlignment = BC.ButtonLabelAlignment; 135 switch (ButtonLabelAlignment) 136 { 137 case "align-left": 138 ButtonLabelAlignment = "flex-start"; 139 break; 140 case "align-center": 141 ButtonLabelAlignment = "center"; 142 break; 143 case "align-right": 144 ButtonLabelAlignment = "flex-end"; 145 break; 146 case "align-full": 147 ButtonLabelAlignment = "space-between"; 148 break; 149 default: 150 ButtonLabelAlignment = "flex-start"; 151 break; 152 } 153 154 var btnStyleBlock = new System.Text.StringBuilder(); 155 156 // General Config 157 btnStyleBlock.Append(GenerateCssVar("btn-min-height", $"{mc.GeneralConfiguration.ButtonHeight}px")); 158 btnStyleBlock.Append(GenerateCssVar("btn-border-radius", $"{mc.GeneralConfiguration.RoundedCornerValue}px")); 159 160 // Button Config 161 btnStyleBlock.Append(GenerateCssVar("btn-border-width", $"{BC.BorderSize.ToString()}px")); 162 btnStyleBlock.Append(GenerateCssVar("btn-label-alignment", ButtonLabelAlignment)); 163 164 // Button Config Tab 165 btnStyleBlock.Append(GenerateCssVar("btn-bg-color", BC.ButtonColorConfiguration.BackgroundColor.GetColorCode(areaId))); 166 btnStyleBlock.Append(GenerateCssVar("btn-font-color", BC.ButtonColorConfiguration.FontColor.GetColorCode(areaId))); 167 btnStyleBlock.Append(GenerateCssVar("btn-border-color", BC.ButtonColorConfiguration.BorderColor.GetColorCode(areaId))); 168 169 // Button Config Hover tab 170 btnStyleBlock.Append(GenerateCssVar("btn-bg-color-hover", BC.ButtonHoverColorConfiguration.BackgroundColor.GetColorCode(areaId))); 171 btnStyleBlock.Append(GenerateCssVar("btn-font-color-hover", BC.ButtonHoverColorConfiguration.FontColor.GetColorCode(areaId))); 172 btnStyleBlock.Append(GenerateCssVar("btn-border-color-hover", BC.ButtonHoverColorConfiguration.BorderColor.GetColorCode(areaId))); 173 174 // Button Config Font Config 175 btnStyleBlock.Append(GenerateCssVar("btn-font-size", BC.FontConfiguration.FontSize)); 176 btnStyleBlock.Append(GenerateCssVar("btn-font-config-color", BC.FontConfiguration.Color.GetColorCode(areaId))); 177 btnStyleBlock.Append(GenerateCssVar("btn-font-line-height", BC.FontConfiguration.LineHeight)); 178 btnStyleBlock.Append(GenerateCssVar("btn-font-family", BC.FontConfiguration.FontConfiguration.FontFamily)); 179 btnStyleBlock.Append(GenerateCssVar("btn-font-weight", BC.FontConfiguration.FontWeight)); 180 btnStyleBlock.Append(GenerateCssVar("btn-font-transform", BC.FontConfiguration.FontStyle)); 181 182 return btnStyleBlock.ToString(); 183 } 184 185 public string GenerateCssVar(string name, string value) 186 { 187 if (!string.IsNullOrWhiteSpace(value)) { 188 return $"--{name}: {value};"; 189 } else { 190 return ""; 191 } 192 } 193 } 194 195 196 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 197 @using Dynamicweb; 198 @using Dynamicweb.Content.Items; 199 @using Bluedesk.DynamicWeb.ItemTypes; 200 @using Bluedesk.DynamicWeb.ItemTypes.Configuration; 201 202 203 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 204 @using Dynamicweb; 205 @using Dynamicweb.Content.Items; 206 @using Bluedesk.DynamicWeb.ItemTypes; 207 @using Bluedesk.DynamicWeb.ItemTypes.Extensions; 208 @using Bluedesk.DynamicWeb.ItemTypes.Configuration; 209 @using Bluedesk.DynamicWeb.ItemTypes.Settings.Configuration; 210 @using Dynamicweb; 211 @using Dynamicweb.Frontend 212 @using Bluedesk.DynamicWeb.ItemTypes.BaseSolution; 213 214 @helper RenderButton(CTAButton button, PageView Pageview) 215 { 216 217 if (!string.IsNullOrWhiteSpace(button.GetLink(Pageview))) 218 { 219 string Template = button.GetButtonTemplate().Replace("{{ ButtonLink }}", button.GetLink(Pageview)); 220 @Template; 221 } 222 } 223 224 225 @{ 226 227 var colorService = new ColorSwatchService(); 228 229 string fullWidthContainerClass = _data.Fullwidth ? "" : "container"; 230 231 string backgroundClass = !string.IsNullOrWhiteSpace(_data.BackgroundConfiguration.BackgroundClass) ? string.Format("bg-{0}", _data.BackgroundConfiguration.BackgroundClass) : ""; 232 string backgroundStyle = !string.IsNullOrWhiteSpace(_data.BackgroundConfiguration.BackgroundColor) ? $"background-color: {_data.BackgroundConfiguration.BackgroundColor}; " : ""; 233 backgroundStyle += !string.IsNullOrWhiteSpace(_data.BackgroundConfiguration.BackgroundImage) ? $"background-image: url({_data.BackgroundConfiguration.BackgroundImage}); " : ""; 234 235 // string backgroundClass = "null"; 236 // string backgroundStyle = ""; 237 } 238 239 240 @functions { 241 //string getbackgroundclass(string backgroundClass) 242 //{ 243 // return !string.IsNullOrWhiteSpace(backgroundClass) ? string.Format("bg-{0}", backgroundClass) : ""; 244 //} 245 } 246 247 @helper CTAParagraphImage( 248 ParagraphImageResizable Image, 249 bool hasContent, 250 bool ImageAsBackground, 251 string ImagePosition, 252 bool ParallaxImage, 253 bool Fullwidth, 254 string imagesHeight, 255 double ColumnWidthSize, 256 int AnimationDuration = 300, 257 bool AnimateHalfBlock = false 258 ) 259 { 260 if (!string.IsNullOrWhiteSpace(Image.Image)) 261 { 262 263 string image = !string.IsNullOrWhiteSpace(Image.Image) ? Image.Image : null; 264 imagesHeight = hasContent ? imagesHeight : "100%"; 265 imagesHeight = !string.IsNullOrWhiteSpace(imagesHeight) ? "height: " + imagesHeight + ";" : ""; 266 267 string imageParrallax = ParallaxImage ? "rellax" : ""; 268 string imageAsBackground = ImageAsBackground ? "cta-paragraph__image--is-background" : ""; 269 double imageWidth = 2000; 270 271 imageWidth = Fullwidth ? imageWidth : 1200; 272 imageWidth = !ImageAsBackground ? imageWidth * ColumnWidthSize : imageWidth; 273 274 string strImageWidth = imageWidth + "px"; 275 string strImageWidthSize = imageWidth + "w"; 276 277 string ImageUrl; 278 if (image.EndsWith(".gif")) 279 { 280 ImageUrl = image; 281 } 282 else 283 { 284 ImageUrl = "/Admin/Public/GetImage.ashx?Image=" + image + "&Crop=7&Format=webp&Quality=90&Compression=80"; 285 ImageUrl = ImageUrl.Replace("?x", "&x"); 286 } 287 288 string animationDirection = AnimateHalfBlock ? ImagePosition.Equals("right") ? "fade-left" : "fade-right" : ""; 289 290 if (!string.IsNullOrWhiteSpace(Image.Image)) 291 { 292 293 <figure class="cta-paragraph__image-container @imageAsBackground @Image.PositionY @Image.PositionX" style="@imagesHeight" data-aos="@animationDirection" data-aos-duration="@AnimationDuration"> 294 295 <picture class="cta-paragraph__image @Image.BackgroundSize @imageParrallax"> 296 @if (ImageUrl.EndsWith(".gif")) 297 { 298 <source media="(max-width: 400px)" srcset="@ImageUrl&Width=400"> 299 <source media="(max-width: 994px)" srcset="@ImageUrl&Width=994"> 300 <img src="@ImageUrl" loading="lazy" alt="@Image.ImageAlt" class="cta-paragraph__image @Image.BackgroundSize @imageParrallax" width="1980" height="500"> 301 } 302 else 303 { 304 <source media="(max-width: 400px)" srcset="@ImageUrl&Width=400"> 305 <source media="(max-width: 994px)" srcset="@ImageUrl&Width=994"> 306 <img src="@ImageUrl&Width=@imageWidth" loading="lazy" alt="@Image.ImageAlt" class="cta-paragraph__image @Image.BackgroundSize @imageParrallax" width="1980" height="500"> 307 } 308 </picture> 309 310 </figure> 311 } 312 } 313 } 314 315 @helper CTAParagraphContent( 316 int paragraphID, 317 ParagraphHeader Header, 318 ParagraphHeader SubHeader, 319 ParagraphContent Content, 320 CTAButton Button, 321 CTAButton ExtraButton, 322 ParagraphImage Image, 323 bool strCenterVertical, 324 string ImagePosition = "", 325 int AnimationDuration = 300, 326 bool AnimateHalfBlock = false 327 ) 328 { 329 330 bool hasImage = !string.IsNullOrWhiteSpace(Image.Image) ? true : false; 331 string noImageClass = hasImage ? "" : "no-image"; 332 333 string centerTextClass = strCenterVertical ? "text-center" : ""; 334 string centerContent = !string.IsNullOrWhiteSpace(Image.Image) ? "" : "cta-paragraph__content--center"; 335 336 string paragraphInstanceClass = "cta-paragraph__content--" + paragraphID; 337 338 string animationDirection = (AnimateHalfBlock && hasImage) ? ImagePosition.Equals("right") ? "fade-right" : "fade-left" : ""; 339 340 if (!string.IsNullOrWhiteSpace(Button.ButtonText) || !string.IsNullOrWhiteSpace(Content.Text) || !string.IsNullOrWhiteSpace(Header.HeaderFormatted("cta-paragraph__header"))) 341 { 342 343 <section class="cta-paragraph__content @paragraphInstanceClass @centerContent @noImageClass" data-aos="@animationDirection" data-aos-duration="@AnimationDuration"> 344 345 <article class="cta-paragraph__content-container @noImageClass"> 346 347 @if (!string.IsNullOrWhiteSpace(Header.HeaderFormatted("cta-paragraph__header"))) 348 { 349 <header class="cta-paragraph__header @centerTextClass"> 350 @if (SubHeader != null) 351 { 352 @SubHeader.HeaderFormatted("cta-paragraph__subheader") 353 } 354 @Header.HeaderFormatted("cta-paragraph__header") 355 </header> 356 } 357 358 @if (!string.IsNullOrWhiteSpace(Content.Text)) 359 { 360 <div class="cta-paragraph__text @centerTextClass">@Content.Text</div> 361 } 362 363 @if (!string.IsNullOrWhiteSpace(Button.GetLink(Pageview)) && !string.IsNullOrWhiteSpace(Button.ButtonText)) 364 { 365 <nav class="cta-paragraph__btn-navigation @centerTextClass"> 366 @RenderButton(Button, Pageview) 367 @RenderButton(ExtraButton, Pageview) 368 </nav> 369 } 370 371 </article> 372 </section> 373 374 } 375 376 } 377 378 @helper CTAParagraphVideo(ParagraphVideo Video, string imagesHeight) 379 { 380 if (!string.IsNullOrWhiteSpace(Video.YoutubeLink) || !string.IsNullOrWhiteSpace(Video.VimeoLink)) 381 { 382 string YoutubeID = Video.YoutubeId; 383 string YoutubeLink = Video.YoutubeLink; 384 385 string VimeoID = Video.VimeoId; 386 string VimeoLink = Video.VimeoLink; 387 388 int CleanVideo = Video.Clean ? 1 : 0; 389 int ShowControls = Video.ShowControls ? 1 : 0; 390 int AutoPlay = Video.AutoPlay ? 1 : 0; 391 int LoopVideo = Video.LoopVideo ? 1 : 0; 392 int MuteAudio = Video.MuteAudio ? 1 : 0; 393 string hideControlsClass = Video.ShowControls ? "video-player-wrapper--hidecontrols" : ""; 394 string origin = Dynamicweb.Environment.Helpers.LinkHelper.GetHttpDomain(); 395 imagesHeight = !string.IsNullOrWhiteSpace(imagesHeight) ? "height: " + imagesHeight + ";" : ""; 396 397 if (!string.IsNullOrWhiteSpace(YoutubeLink)) 398 { 399 if(AutoPlay == 1) 400 { 401 <section class="cta-paragraph__video-container" style="@imagesHeight"> 402 <div class=""> 403 <div class="video-player-wrapper @hideControlsClass"> 404 <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> 405 </div> 406 </div> 407 </section> 408 } 409 else 410 { 411 <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> 412 } 413 } 414 if (!string.IsNullOrWhiteSpace(VimeoLink)) 415 { 416 <section class="cta-paragraph__video-container" style="@imagesHeight"> 417 <div class=""> 418 <div class="video-player-wrapper"> 419 <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> 420 </div> 421 </div> 422 </section> 423 } 424 } 425 } 426 427 @helper CTAParagraphIcon(ParagraphIcon Icon, bool strCenterVertical) 428 { 429 if (!string.IsNullOrWhiteSpace(Icon.FaIcon)) 430 { 431 string centerIconClass = strCenterVertical ? "justify-center" : "justify-start"; 432 string iconSizeClass = string.Format("cta-paragraph__icon--{0}", Icon.FaIconSize); 433 434 <div class="cta-paragraph__icon-container"> 435 <div class="cta-paragraph__icon-inner-container @centerIconClass"> 436 <span class="cta-paragraph__icon @iconSizeClass">@Icon.FaIcon</span> 437 </div> 438 </div> 439 } 440 } 441 442 @helper RenderContentAlignment(BackgroundConfiguration data) 443 { 444 445 switch (data.ContentElementAlign) 446 { 447 case "align-left": 448 <text> 449 align-items: flex-start; 450 text-align: left; 451 </text> 452 break; 453 case "align-center": 454 <text> 455 align-items: center; 456 text-align: center; 457 </text> 458 break; 459 case "align-right": 460 <text> 461 align-items: flex-end; 462 text-align: right; 463 </text> 464 break; 465 case "align-full": 466 <text> 467 align-items: flex-start; 468 text-align: justify; 469 </text> 470 break; 471 } 472 473 } 474 475 476 <style> 477 478 @@media screen and (min-width: 991px) { 479 .cta-paragraph__container--@paragraphID { 480 height: @ParagraphHeight !important; 481 } 482 } 483 484 </style> 485 486 @if (_data != null) 487 { 488 489 string BackgroundPadding = _data.BackgroundConfiguration.backgroundPadding; 490 491 bool Containerfit = _data.BackgroundConfiguration.ContainerFit == "Fit" ? true : false; 492 if (!string.IsNullOrWhiteSpace(contentRightClass)) 493 { 494 contentRightClass = Containerfit ? "" : contentRightClass; 495 } 496 497 string backgroundImageRepeatClass = _data.BackgroundConfiguration.BackgroundImageRepeat; 498 string backgroundImageSizeClass = ""; 499 500 string BackgroundImagePositionX = _data.BackgroundConfiguration.BackgroundImagePositionX; 501 string BackgroundImagePositionY = _data.BackgroundConfiguration.BackgroundImagePositionY; 502 503 504 string BackgroundImagePositionClass = ""; 505 506 if (backgroundImageRepeatClass == "no-repeat") 507 { 508 BackgroundImagePositionClass = BackgroundImagePositionY + "-" + BackgroundImagePositionX; 509 backgroundImageSizeClass = _data.BackgroundConfiguration.BackgroundImageSize; 510 } 511 512 string shadowClass = _data.BackgroundConfiguration.contentShadow ? "contentShadow" : ""; 513 514 <section class="cta-paragraph cta-paragraph--@paragraphID config--@_data.BackgroundConfigurationID @backgroundClass @_data.CssClass @backgroundImageRepeatClass @BackgroundImagePositionClass @backgroundImageSizeClass @BackgroundPadding @ctaHasBackgroundImageClass" style="@backgroundStyle" data-paragraphid="@paragraphID" id="@paragraphID" data-aos="@DataAosValue" data-aos-duration="@AnimationDuration"> 515 516 <div class="cta-paragraph__container cta-paragraph__container--@paragraphID @fullWidthContainerClass @clickableClass @contentRightClass @shadowClass"> 517 518 <style> 519 520 .cta-paragraph--@paragraphID .cta-paragraph__content { 521 @if (Containerfit) 522 { 523 <text> 524 flex-grow: 0; 525 </text> 526 } 527 } 528 529 .cta-paragraph--@paragraphID .cta-paragraph__image-container { 530 @if (Containerfit) 531 { 532 <text> 533 position: absolute; 534 top: 0; 535 left: 0; 536 right: 0; 537 bottom: 0; 538 </text> 539 } 540 } 541 542 </style> 543 544 @CTAParagraphImage( 545 _data.Image, 546 true, 547 _data.ImageAsBackground, 548 _data.ImagePosition, 549 _data.ParallaxImage, 550 _data.Fullwidth, 551 "", 552 ColumnWidthSize, 553 AnimationDuration, 554 AnimateHalfBlock 555 ) 556 @CTAParagraphContent( 557 paragraphID, 558 _data.Header, 559 _data.SubHeader, 560 _data.Content, 561 _data.Button, 562 _data.ExtraButton, 563 _data.Image, 564 _data.CenterVertical, 565 _data.ImagePosition, 566 AnimationDuration, 567 AnimateHalfBlock 568 ) 569 570 @if (clickableBlock) 571 { 572 <a href="@_data.Button.GetLink(Pageview)" class="cta-paragraph__clickable" @newWindow @ariaLabel></a> 573 } 574 575 </div> 576 577 </section> 578 } 579

Elevate your salon experience with our salon tools

Tissue Box Cover 

  • Stylish design 
  • Hides ugly packaging 
  • Heavy weight: easy to take tissues out with 1 hand 
  • Ideal for tissues & ProNails gloves 
  • Suitable for different brands 
  • Made from responsibly harvested FSC, sustainable and high-quality wood

Brush Box

  • Stylish design
  •  For files and brushes 
  • All tools easily organized  
  • Made from responsibly harvested FSC, sustainable and high-quality wood

Wipe Box

  • Stylish design 
  • For nail wipes / cosmetic pads 
  • Suitable for 250 pieces 
  • Handy to take wipes off in 1 smooth movement 
  • Ideal to refill thanks to removable lid 
  • Protects the wipes from dust 
  • Made from responsibly harvested FSC, sustainable and high-quality wood 

Hand Cushion

  • Made of vegan leather & responsibly harvested FSC, sustainable and high-quality wood
  • Extra wide cushion (longer than the previous model) 
  • Optimal comfort for client and stylist 
  • Height and width ideal under Luna Light: ideal workspace 
  • Height adjustable to 2 heights 

Stylist benefits: 

  • 2 Smart Lights fit underneath at the highest setting: 
  • All buttons remain easily accessible 
  • You save space on the nail table 
  • Customer's hand does not touch the table, allowing more freedom of movement all around 
  • Better posture: you are no longer hunched over 

Customer benefits: 

  • Better posture  
  • Relaxed position of arm and hand 
  • Comfortable, soft cushion  

 

Tags

  • Salon

Related articles

To Top