<header>
  <a target="_blank" href="https://github.com/Siddharth11/gradstop" id="heading">gradstop.js</a>
  <div id="description">JavaScript micro library to generate gradient color stops</div>
</header>

<div id="app" ng-app="generator">

  <div id="app-wrapper" ng-controller="ctrl">

    <form class="pure-form">
      <div class="pure-control-group">
        <label for="stop">Stops</label>
        <input id="stop" type="number" ng-model="data.stops" min="2" max="255"/>
      </div>
      <div class="pure-control-group">
        <label for="type">Input Format</label>
        <!--<input id="type" type="text" ng-model="data.inColor" />-->
        <select id="type" ng-model="data.inputFormat">
          <option value='hex'>hex</option>
          <option value='rgb'>rgb</option>
          <option value='hsl'>hsl</option>
        </select>
      </div>
      <div class="pure-control-group">
        <label for="from">Color1</label>
        <input id="from" type="text" ng-model="colors[0]" />
      </div>
      <div class="pure-control-group">
        <label for="from">Color2</label>
        <input id="from" type="text" ng-model="colors[1]" />
      </div>
      <div class="pure-control-group">
        <label for="from">Color3</label>
        <input id="from" type="text" ng-model="colors[2]" />
      </div>
      <div class="pure-control-group">
        <label for="from">Color4</label>
        <input id="from" type="text" ng-model="colors[3]" />
      </div>
      <button ng-click="update()">Generate</button>
    </form>

    <div id="gradient-wrapper">
      <div ng-repeat="item in gradient" class="colorBox" ng-style="{'background-color': '{{item[0]}}'}"></div>
    </div>

  </div>
  <div id="extra-info">
    <div><b>Check console for color values</b></div>
    <div>This is a standalone library, Angular is used just for the demo purpose</div>
  </div>
</div>

<a target="_blank" href="https://github.com/Siddharth11/gradStop.js" class="github-corner"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#129FEA; color:#fff; position: absolute; top: 0; border: 0; right: 0;"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a>
$blue: #129FEA;

body {
  padding-bottom: 100px;
}

header {
  width: 90%;
  max-width: 1000px;
  margin: 0 auto;
}

#heading {
  display: block;
  font-size: 3em;
  font-weight: 700;
  margin-top: 50px;
  text-align: center;
  color: $blue;
  text-decoration: none;
}

#description {
  margin-top: 50px;
  text-align: center;
}

form {
  margin: 50px auto;
  text-align: center;
  max-width: 300px;
  font-size: .85em;
}

label {
  float: left;
}
input {
  float: right;
  max-width: 200px;
}
select {
  float: right;
}
.pure-control-group {
  clear: both;
  margin-bottom: 20px;
  overflow: hidden;
}

button {
  color: $blue;
  border-radius: 4px;
  border: 1px solid $blue;
  background-color: #fff;
  outline: none;
  opacity: .75;
  padding: 10px 20px;
  text-transform: uppercase;
  transition: 250ms all;
  &:hover {
    background-color: $blue;
    color: #fff;
    box-shadow: 0 0 1px $blue;
  }
  &:active {
    opacity: 1;
  }
}

#gradient-wrapper {
  width: 80%;
  height: 50px;
  overflow: hidden;
  margin: 50px auto 0;
  display: flex;
  box-shadow: 0 5px 10px -7px #000;
}
.colorBox {
  flex: 1;
}

.colorBox.ng-move,
.colorBox.ng-enter {
    transition: all 0.5s;
}
.colorBox.ng-move,
.colorBox.ng-enter {
    transform: translateX(-100px);
}
.colorBox.ng-move.ng-move-active,
.colorBox.ng-enter.ng-enter-active {
    transform: translateX(0);
}


#extra-info {
    text-align: center;
    margin-top: 50px;
    font-size: .8em;
    opacity: .75;
}

b {
  background-color: $blue;
  color: #fff;
  padding: 2px 5px;
}

/* github corner styles */
.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}
/* end */
View Compiled
const consoleColVals = colArr => {
  if (console.clear) {
    console.clear()
  }

  const displayCol = el => {
    console.log(`%c       ` + `%c ${el}`, `background: ${el}`, `background: #fff`)
  }

  for (let i = 0; i < colArr.length; i++) {
    displayCol(colArr[i][0])
  }
}

const transformArr = arr => arr.map((c, index) => [c, index])

let app = angular.module('generator', ['ngAnimate'])

app.controller('ctrl', $scope => {
  
  console.log($scope)
  $scope.colors = ['#343838', '#00DFFC', '#F6FF00', '#FFFFFF']

  $scope.data = {
    stops: 10,
    inputFormat: 'hex'
  }

  $scope.data.colorArray = $scope.colors.filter(el => {
    if (el) return el
  })

  console.log($scope.data)

  //  map to avoid repeated elements conflict in ng-repeat
  $scope.gradient = transformArr(gradstop($scope.data))
  consoleColVals($scope.gradient)

  $scope.update = () => {

    $scope.data.colorArray = $scope.colors.filter(el => {
      if (el) return el
    })

    $scope.gradient = transformArr(gradstop($scope.data))
    consoleColVals($scope.gradient)

  }
});

const heading = document.querySelector('#heading');

const chars = heading.innerText;

heading.innerHTML = chars.split('').map(char => (
  `<span>${char}</span>`
)).join('')

const headingColors = gradstop({
  stops: chars.length,
  colorArray: ['#343838', '#00DFFC']
})

const spans = document.querySelectorAll('#heading span')

Array.from(spans).forEach((item, index) => {
  item.style.color = headingColors[index];
})
View Compiled

External CSS

  1. //cdn.jsdelivr.net/pure/0.6.0/pure-min.css

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.8/angular.min.js
  2. https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.8/angular-animate.min.js
  3. https://cdn.jsdelivr.net/gh/siddharth11/gradstop/gradstopUMD.js