svg loader

by Alexandru Gatea

HTML

<div class="loader" id="loader">
  <svg id="loaderShape" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 109.4">
    <path d="M0,0C121.44,0,101.4,109.4,250,109.4S378.56,0,500,0Z" />
  </svg>

  <div class="loader-content">
    <p class="loader-text">Gathering Data</p>
    <div class="loader-spinner">
      <div class="sk-cube-grid">
        <div class="sk-cube sk-cube1"></div>
        <div class="sk-cube sk-cube2"></div>
        <div class="sk-cube sk-cube3"></div>
        <div class="sk-cube sk-cube4"></div>
        <div class="sk-cube sk-cube5"></div>
        <div class="sk-cube sk-cube6"></div>
        <div class="sk-cube sk-cube7"></div>
        <div class="sk-cube sk-cube8"></div>
        <div class="sk-cube sk-cube9"></div>
      </div>
    </div>
  </div>

</div>

<script>

	let toggler = document.getElementsByTagName('body')[0];
  let sidebar = document.getElementById('loader');



  toggler.addEventListener('click', event => {
    sidebar.classList.toggle('visible');
  });

</script>

SCSS

@import url('https://fonts.googleapis.com/css2?family=Lato&family=Raleway:wght@400;500;600;700;900&display=swap');


$loaderWidth: 500px;
$loaderContentWidth: 500px;

$brand-dark: #0e0727;
$brand-dark-medium: #221c3a;
$brand-light: #a59fb8;
$brand-accent: #42B98B;

$brand-title: 'Raleway',
sans-serif;
$brand-text: 'Lato',
sans-serif;

body {
  min-height: 100vh;
}

.loader {
  position: fixed;
  display: grid;
  grid-template-columns: $loaderWidth;
  top: 0;
  left: 50%;
  transform: translateX(-50%) scaleY(0);
  transform-origin: top center;
  overflow: hidden;
  transition: all 0.25s ease-in-out;
  
  &.visible {
    transform: translateX(-50%) scaleY(1);
  }
  
  #loaderShape {
    path {
      fill: $brand-dark;
    }
  }
  
  &-content {
    position: absolute;
    display: grid;
    grid-template-columns: $loaderContentWidth;
    grid-gap: 0px;
    align-items: center;
    justify-items: center;
    align-self: center;
    top: 10%;
    bottom: 15%;
    left: 50%;
    transform: translateX(-50%);
    color: $brand-light;
    padding: 10px 0 0 0;
  }
  &-text {
    font-family: $brand-title;
    text-transform: uppercase;
    font-size: 12px;
    line-height: 12px;
    font-weight: 900;
    letter-spacing: 2px;
    text-align: center;
    user-select: none;
  }
  
  &-percent {
    font-family: $brand-text;
    font-size: 12px;
    position: absolute;
  }
  
  &-spinner {
    display: flex;
    align-items: center;
    justify-content: center;
  }
}

.sk-cube-grid {
  width: 40px;
  height: 40px;
  border-radius: 44px;
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-gap: 2px;
  
  .sk-cube {
    width: 100%;
    height: 100%;
    border-radius: 2px;

    background-color: $brand-accent;
    animation: sk-cubeGridScaleDelay 1.3s infinite linear; 
  }
  
  .sk-cube1 {background-color: $brand-light; animation-delay: 0.15s; }
  .sk-cube2 {background-color: $brand-accent;animation-delay: 0.25s; }
  .sk-cube3 {background-color:...