- var buttons = [
-  {
-   label: 'Sleep',
-  icon: 'moon',
-   type: 'red'
- }, {
-   label: 'Alarm',
-  icon: 'bell',
-   type: 'blue'
- }, {
-   label: 'Data',
-  icon: 'bar-chart',
-   type: 'green'
- }, {
-   label: 'Wifi',
-  icon: 'wifi',
-   type: 'orange'
- }, {
-   label: 'Alerts',
-  icon: 'alert-circle',
-   type: 'yellow'
- }, {
-   label: 'Power',
-  icon: 'power',
-   type: 'teal'
- }, {
-   label: 'Cast',
-  icon: 'cast',
-   type: 'indigo'
- }, {
-   label: 'Send',
-  icon: 'send',
-   type: 'purple'
- }, {
-   label: 'Phone',
-  icon: 'phone',
-   type: 'pink'
- },
- ]

.l-grid
  each button in buttons
    .l-grid__item
      button.c-button(data-button=button.type)
        i.c-button__icon(data-feather=button.icon)
        span.c-button__label= button.label
View Compiled
$light-grey: #E7EEF7;

$color: $light-grey;
$lighter-5: lighten($color, 5%);
$darker-5: darken($color, 5%);
$darker-10: darken($color, 10%);
$darker-15: darken($color, 15%);
$darker-20: darken($color, 20%);
$darker-25: darken($color, 25%);
$darker-30: darken($color, 30%);

$flat: rgba(white, 1);
$flat-24: transparentize($flat, 0.76);
$flat-70: transparentize($flat, 0.30);

$states: (
  red: #F56565,
  blue: #4299E1,
  green: #48BB78,
  orange: #ED8936,
  yellow: #D69E2E,
  teal: #38B2AC,
  indigo: #667EEA,
  purple: #9F7AEA,
  pink: #ED64A6
);

@mixin transition {
  transition: all 120ms ease-out 0s;
}

html {
  font-size: 62.5%;
  box-sizing: border-box;
}

*,*:before,*:after {
  box-sizing: inherit;
}

html, body {
  width: 100%;
  height: 100%;
}

body {
  font-size: 1.6rem;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: system-ui;
  background: $color;
}

button {
  cursor: pointer;
  color: inherit;
  font-family: inherit;
  &:active, &:focus {
    outline: 0;
  }
}

.l-grid {
  width: auto;
  margin: auto;
  display: grid;
  grid-column-gap: 4rem;
  grid-row-gap: 4rem;
  grid-template-columns: repeat(3,1fr);
  &__item {
    text-align: center;
  }
}

.c-button {
  $border-radius: 2.4rem;
  display: inline-flex;
  height: 8.8rem;
  width: 8.8rem;
  padding: 0;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  border-radius: $border-radius;
  border: 0;
  color: desaturate($darker-30, 20%);
  background: transparent;
  position: relative;
  box-shadow: 0.8rem 0.8rem 2.4rem $darker-10, -0.8rem -0.8rem 2.4rem $flat, -0.2rem -0.2rem 0.2rem $flat;
  @include transition;
  &:hover {
    &:before {
      background: $flat-24;
    }
  }
  &:before {
    content: '';
    position: absolute;
    border-radius: $border-radius;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    border: 2px solid transparent;
    filter: blur(2px);
    @include transition;
  }
  &:after {
    content: '';
    position: absolute;
    border-radius: $border-radius;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    @include transition;
  }
  &--active {
    background: linear-gradient(to top, $darker-5, $lighter-5);
    box-shadow: inset 0.2rem 0.2rem 0.8rem $darker-25, inset 0.8rem 0.8rem 1.6rem $darker-15, inset -0.4rem -0.4rem 0.8rem $flat, 2px 2px 8px $darker-20, -2px -2px 2px $flat-70;
    &:before {
      border-color: white;
      box-shadow: 0px 0.4rem 1.6rem $flat;
    }
    &:after {
      box-shadow: inset 0px 0px 1.6rem $flat;
    }
  }
  &__icon {
    filter: grayscale(40%) brightness(110%);
    @include transition;
  }
  &__label {
    filter: grayscale(40%) brightness(110%);
    display: block;
    margin-top: 0.8rem;
    font-size: 1.4rem;
    font-weight: 700;
    @include transition;
  }
}

@each $key,$val in $states {
  .u-text--#{$key} {
    color: $val;
  }
}
View Compiled
console.clear();

feather.replace();

// random true/false
const randomCheck = () => {
  return (Math.floor(Math.random() * 2) == 0) ? true : false;
}

const buttons = document.querySelectorAll('.c-button');

// active function
const buttonActive = button => {
  let buttonState = button.classList.contains('c-button--active')
  let buttonType = button.dataset.button
  buttonState ?
    button.classList.remove(`u-text--${buttonType}`) :
    button.classList.add(`u-text--${buttonType}`)
  button.classList.toggle('c-button--active')
}

buttons.forEach(button => {
  // click event listener
  button.addEventListener('click', () => {
    buttonActive(button)
  })
  // random active state on load
  let flipActive = randomCheck()
  
  flipActive ? buttonActive(button) : '';
})
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/feather-icons/4.26.0/feather.min.js