Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

David Whaley
Mega Sage

Hello Community Members!

 

A couple of years ago I was asked by fellow collegues if it was possible to add seasonal elements to our service portal.  One specific request was that it would be cool if snow could fall on the portal homepage.  It was more of a discussion rather than any official request, but I took it as a chance to learn how to do something new.  When I took the time to work on this, I found out it was pretty easy to do and most of the work was already done using css found here CSSnowflakes 

 

Creating and adding a service portal widget with this css added to the home page will display falling snowflakes.

 

  • 1.  As an admin create a new widget.  Under Service Portal Configuration click WidgetsDavidWhaley_0-1671032469471.png
  • 2.  Click New at the top of the list.
  • 3.  Give your new widget name.

DavidWhaley_2-1671032631918.png

 

  • 4.  Using the CSS found here CSSnowflakes paste this in the Body HTML template field

 

 

<style>
/* customizable snowflake styling */
.snowflake {
  color: #fff;
  font-size: 1em;
  font-family: Arial, sans-serif;
  text-shadow: 0 0 5px #000;
}

@-webkit-keyframes snowflakes-fall{0%{top:-10%}100%{top:100%}}@-webkit-keyframes snowflakes-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(80px);transform:translateX(80px)}}@keyframes snowflakes-fall{0%{top:-10%}100%{top:100%}}@keyframes snowflakes-shake{0%,100%{transform:translateX(0)}50%{transform:translateX(80px)}}.snowflake{position:fixed;top:-10%;z-index:9999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;-webkit-animation-name:snowflakes-fall,snowflakes-shake;-webkit-animation-duration:10s,3s;-webkit-animation-timing-function:linear,ease-in-out;-webkit-animation-iteration-count:infinite,infinite;-webkit-animation-play-state:running,running;animation-name:snowflakes-fall,snowflakes-shake;animation-duration:10s,3s;animation-timing-function:linear,ease-in-out;animation-iteration-count:infinite,infinite;animation-play-state:running,running}.snowflake:nth-of-type(0){left:1%;-webkit-animation-delay:0s,0s;animation-delay:0s,0s}.snowflake:nth-of-type(1){left:10%;-webkit-animation-delay:1s,1s;animation-delay:1s,1s}.snowflake:nth-of-type(2){left:20%;-webkit-animation-delay:6s,.5s;animation-delay:6s,.5s}.snowflake:nth-of-type(3){left:30%;-webkit-animation-delay:4s,2s;animation-delay:4s,2s}.snowflake:nth-of-type(4){left:40%;-webkit-animation-delay:2s,2s;animation-delay:2s,2s}.snowflake:nth-of-type(5){left:50%;-webkit-animation-delay:8s,3s;animation-delay:8s,3s}.snowflake:nth-of-type(6){left:60%;-webkit-animation-delay:6s,2s;animation-delay:6s,2s}.snowflake:nth-of-type(7){left:70%;-webkit-animation-delay:2.5s,1s;animation-delay:2.5s,1s}.snowflake:nth-of-type(8){left:80%;-webkit-animation-delay:1s,0s;animation-delay:1s,0s}.snowflake:nth-of-type(9){left:90%;-webkit-animation-delay:3s,1.5s;animation-delay:3s,1.5s}.snowflake:nth-of-type(10){left:25%;-webkit-animation-delay:2s,0s;animation-delay:2s,0s}.snowflake:nth-of-type(11){left:65%;-webkit-animation-delay:4s,2.5s;animation-delay:4s,2.5s}
</style>
<div class="snowflakes" aria-hidden="true">
  <div class="snowflake">
  ❅
  </div>
  <div class="snowflake">
  ❆
  </div>
  <div class="snowflake">
  ❅
  </div>
  <div class="snowflake">
  ❆
  </div>
  <div class="snowflake">
  ❅
  </div>
  <div class="snowflake">
  ❆
  </div>
  <div class="snowflake">
    ❅
  </div>
  <div class="snowflake">
    ❆
  </div>
  <div class="snowflake">
    ❅
  </div>
  <div class="snowflake">
    ❆
  </div>
  <div class="snowflake">
    ❅
  </div>
  <div class="snowflake">
    ❆
  </div>
</div>

 

 

 

  • 5.  Save your new widget.
  • 6.  In the Service Portal designer open you service portal homepage.  You should see your new widget in the list.
  • 7.  Add this widget to a container on your home page.  I added it to the bottom of my page.

DavidWhaley_3-1671032747503.png

 

Preview or open your portal home page and enjoy the snow.  You can change to hearts for Valentines day, Clovers for St. Patricks.  Experiment with other css like fireworks for the Fourth of July!

 

I hope you enjoyed this article.  Please let me know if you have any questions and thanks for reading.

 

Thank You,

David Whaley

Comments
hayleyrussell
Tera Contributor

This is great! Makes the Service Portal so fun and festive. 

AnkitK95
Tera Explorer

Hi @David Whaley 

 

How can we ensure that snowfall occurs only during the winter season?

M_A
Tera Contributor

@AnkitK95 Here's a version that you can add to your portal and leave all year round.

I have split out the fields in the widget record for you:

HTML

<div class="snow-controller" ng-if="c.isSeason">
  <a href="javascript&colon;void(0)" ng-click="c.toggleSnow()" class="snow-toggle">
    <i class="fa fa-snowflake-o"></i> 
    <span ng-if="c.showSnow">Stop Snow</span>
    <span ng-if="!c.showSnow">Let it Snow</span>
  </a>
</div>

<div class="snowflakes" aria-hidden="true" ng-if="c.showSnow">
  <div class="snowflake" ng-repeat="item in c.flakes track by $index">
    {{ $index % 2 == 0 ? '❅' : '❆' }}
  </div>
</div>

 

CSS

/* customizable snowflake styling */
.snowflake {
  color: #fff;
  font-size: 1em;
  font-family: Arial, sans-serif;
  text-shadow: 0 0 5px #000;
}

@-webkit-keyframes snowflakes-fall{0%{top:-10%}100%{top:100%}}
@-webkit-keyframes snowflakes-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(80px);transform:translateX(80px)}}
@keyframes snowflakes-fall{0%{top:-10%}100%{top:100%}}
@keyframes snowflakes-shake{0%,100%{transform:translateX(0)}50%{transform:translateX(80px)}}

.snowflake {
  position:fixed;
  top:-10%;
  z-index:9999;
  -webkit-user-select:none;
  -moz-user-select:none;
  -ms-user-select:none;
  user-select:none;
  cursor:default;
  -webkit-animation-name:snowflakes-fall,snowflakes-shake;
  -webkit-animation-duration:10s,3s;
  -webkit-animation-timing-function:linear,ease-in-out;
  -webkit-animation-iteration-count:infinite,infinite;
  -webkit-animation-play-state:running,running;
  animation-name:snowflakes-fall,snowflakes-shake;
  animation-duration:10s,3s;
  animation-timing-function:linear,ease-in-out;
  animation-iteration-count:infinite,infinite;
  animation-play-state:running,running;
}

.snowflake:nth-of-type(0){left:1%;-webkit-animation-delay:0s,0s;animation-delay:0s,0s}
.snowflake:nth-of-type(1){left:10%;-webkit-animation-delay:1s,1s;animation-delay:1s,1s}
.snowflake:nth-of-type(2){left:20%;-webkit-animation-delay:6s,.5s;animation-delay:6s,.5s}
.snowflake:nth-of-type(3){left:30%;-webkit-animation-delay:4s,2s;animation-delay:4s,2s}
.snowflake:nth-of-type(4){left:40%;-webkit-animation-delay:2s,2s;animation-delay:2s,2s}
.snowflake:nth-of-type(5){left:50%;-webkit-animation-delay:8s,3s;animation-delay:8s,3s}
.snowflake:nth-of-type(6){left:60%;-webkit-animation-delay:6s,2s;animation-delay:6s,2s}
.snowflake:nth-of-type(7){left:70%;-webkit-animation-delay:2.5s,1s;animation-delay:2.5s,1s}
.snowflake:nth-of-type(8){left:80%;-webkit-animation-delay:1s,0s;animation-delay:1s,0s}
.snowflake:nth-of-type(9){left:90%;-webkit-animation-delay:3s,1.5s;animation-delay:3s,1.5s}
.snowflake:nth-of-type(10){left:25%;-webkit-animation-delay:2s,0s;animation-delay:2s,0s}
.snowflake:nth-of-type(11){left:65%;-webkit-animation-delay:4s,2.5s;animation-delay:4s,2.5s}


/* Make sure to add this to .snowflake class! */
.snowflake {
    pointer-events: none; 
}

/* Style the toggle button to sit discreetly in the corner or footer */
.snow-controller {
  position: fixed;
  bottom: 10px;
  right: 10px;
  z-index: 10000;
  background: rgba(0,0,0,0.5);
  padding: 5px 10px;
  border-radius: 15px;
}

.snow-toggle {
  color: #fff;
  text-decoration: none;
  font-size: 12px;
}

.snow-toggle:hover {
  color: #ddd;
}

 

Nothing in the server script in required.

 

Client controller

api.controller = function() {
  var c = this;
  
  // 1. Get the current date
  var now = new Date();
  
  // 2. Check if the month is December (11)
  // Note: JavaScript counts months from 0 to 11.
  var isDecember = (now.getMonth() === 11);
  
  // 3. Set the visibility based on the month
  c.isSeason = isDecember; // Used to show/hide the toggle button
  c.showSnow = isDecember; // Used to show/hide the actual snow
  
  // Create an array of 12 items
  c.flakes = new Array(12);
  
  // Function to switch the boolean value
  c.toggleSnow = function() {
    c.showSnow = !c.showSnow;
  };
};


So this version includes a toggle so users can turn it off/on.

 

I have this set so that it only turns on in December. The client controller holds this value.

 

Hope this helps

 

Elsbeth Kuipers
Tera Explorer

@M_A  This is awesome! I really like that the employee can turn off the animation.

Version history
Last update:
‎12-14-2022 07:47 AM
Updated by:
Contributors