#app
  button.reload(type="button" @click="reload()" :class="[bg(), pattern()]")
    i.fas.fa-redo-alt
  .quote
    template(v-for="(word, index) in words")
      .word(:key="`words_${index}`" :class="word")
        .letter(v-for="(letter, index) in word" :key="`letter_${index}`" :class="[rotate(), bg(), pattern()]" :data-letter="letter") {{letter}}
        span.space(v-if="index !== words.length - 1")  
View Compiled
// ~* for fun *~ //
$blend-mode: overlay;
$fill:'%23000';
$opacity: 0.33;

// start styles
@import 'https://use.typekit.net/swk3xjq.css';
html, body, #app {
  height: 100%;
}
body {
  background-color: #456;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 4 4'%3E%3Cpath fill='%23fff' fill-opacity='0.1' d='M1 3h1v1H1V3zm2-2h1v1H3V1z'%3E%3C/path%3E%3C/svg%3E");
  margin: 0;
  overflow: hidden;
  text-align: center;
}
#app {
  display: grid;
  filter: drop-shadow(1vmin 1vmin 0 rgba(black, 0.5));
  font: 800 25vmin/1.25 rooney-web, serif;
  place-items: center;
}
.letter,
.word {
  display: inline-block;
}
.letter {
  background-position: center;
  background-size: 5vmin;
  position: relative;
  &,
  &::before {
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
  }
}
.pattern::before {
  bottom: 0;
  content: attr(data-letter);
  left: 0;
  mix-blend-mode: $blend-mode;
  position: absolute;
  right: 0;
  top: 0;
}
.quote {
  user-select: none;
}
.reload {
  border: none;
  border-radius: 50em;
  cursor: pointer;
  font-size: 1.5rem;
  height: 3rem;
  outline: none;
  position: absolute;
  right: 1rem;
  top: 1rem;
  width: 3rem;
  z-index: 1000;
  &::before {
    border-radius: 50em;
  }
  i {
    mix-blend-mode: overlay;
  }
}
// kerning?
[data-letter="f"] {width:0.51em;}
.deg-10 {
  margin-left:-0.06em;
  & + & {margin-left: 0}
}
.deg10 {
  margin-right:-0.07em;
    & + & {margin-left: 0}
}
// generate classes
$degs: (-10, -5, 0, 5, 10);
@each $deg in $degs {
  .deg#{$deg} {
    transform: rotate(#{$deg}deg);
  }
}
@for $i from 0 to 10 {
  $scale: 36;
  $hue: $i * $scale;
  $color: hsl($hue, 100%, 75%);
  .color-#{$i} {
    background-color: $color;
    transition: 300ms;
    &:active,
    &:focus {
      &:not(.letter) {
        box-shadow: 0 0 0 1vmin rgba($color, 0.5);
      }
    }
  }
}
$patterns: (
  // zig zag
  "data:image/svg+xml,%3Csvg width='40' height='12' viewBox='0 0 40 12' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 6.172L6.172 0h5.656L0 11.828V6.172zm40 5.656L28.172 0h5.656L40 6.172v5.656zM6.172 12l12-12h3.656l12 12h-5.656L20 3.828 11.828 12H6.172zm12 0L20 10.172 21.828 12h-3.656z' fill='#{$fill}' fill-opacity='#{$opacity}' fill-rule='evenodd'/%3E%3C/svg%3E",
  // wiggle
"data:image/svg+xml,%3Csvg width='52' height='26' viewBox='0 0 52 26' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='#{$fill}' fill-opacity='#{$opacity}'%3E%3Cpath d='M10 10c0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6h2c0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4v2c-3.314 0-6-2.686-6-6 0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6zm25.464-1.95l8.486 8.486-1.414 1.414-8.486-8.486 1.414-1.414z' /%3E%3C/g%3E%3C/g%3E%3C/svg%3E",
  // bubbles
  "data:image/svg+xml,%3Csvg width='100' height='100' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z' fill='#{$fill}' fill-opacity='#{$opacity}' fill-rule='evenodd'/%3E%3C/svg%3E",
  // diagnal stripes
  "data:image/svg+xml,%3Csvg width='40' height='40' viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='#{$fill}' fill-opacity='#{$opacity}' fill-rule='evenodd'%3E%3Cpath d='M0 40L40 0H20L0 20M40 40V20L20 40'/%3E%3C/g%3E%3C/svg%3E",
  // lines in motion
  "data:image/svg+xml,%3Csvg width='120' height='120' viewBox='0 0 120 120' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9 0h2v20H9V0zm25.134.84l1.732 1-10 17.32-1.732-1 10-17.32zm-20 20l1.732 1-10 17.32-1.732-1 10-17.32zM58.16 4.134l1 1.732-17.32 10-1-1.732 17.32-10zm-40 40l1 1.732-17.32 10-1-1.732 17.32-10zM80 9v2H60V9h20zM20 69v2H0v-2h20zm79.32-55l-1 1.732-17.32-10L82 4l17.32 10zm-80 80l-1 1.732-17.32-10L2 84l17.32 10zm96.546-75.84l-1.732 1-10-17.32 1.732-1 10 17.32zm-100 100l-1.732 1-10-17.32 1.732-1 10 17.32zM38.16 24.134l1 1.732-17.32 10-1-1.732 17.32-10zM60 29v2H40v-2h20zm19.32 5l-1 1.732-17.32-10L62 24l17.32 10zm16.546 4.16l-1.732 1-10-17.32 1.732-1 10 17.32zM111 40h-2V20h2v20zm3.134.84l1.732 1-10 17.32-1.732-1 10-17.32zM40 49v2H20v-2h20zm19.32 5l-1 1.732-17.32-10L42 44l17.32 10zm16.546 4.16l-1.732 1-10-17.32 1.732-1 10 17.32zM91 60h-2V40h2v20zm3.134.84l1.732 1-10 17.32-1.732-1 10-17.32zm24.026 3.294l1 1.732-17.32 10-1-1.732 17.32-10zM39.32 74l-1 1.732-17.32-10L22 64l17.32 10zm16.546 4.16l-1.732 1-10-17.32 1.732-1 10 17.32zM71 80h-2V60h2v20zm3.134.84l1.732 1-10 17.32-1.732-1 10-17.32zm24.026 3.294l1 1.732-17.32 10-1-1.732 17.32-10zM120 89v2h-20v-2h20zm-84.134 9.16l-1.732 1-10-17.32 1.732-1 10 17.32zM51 100h-2V80h2v20zm3.134.84l1.732 1-10 17.32-1.732-1 10-17.32zm24.026 3.294l1 1.732-17.32 10-1-1.732 17.32-10zM100 109v2H80v-2h20zm19.32 5l-1 1.732-17.32-10 1-1.732 17.32 10zM31 120h-2v-20h2v20z' fill='#{$fill}' fill-opacity='#{$opacity}' fill-rule='evenodd'/%3E%3C/svg%3E"
);
@each $pattern in $patterns {
  $i: index($patterns, $pattern);
  .pattern-#{$i}::before {
    background-image: url("#{$pattern}");
    @if ($i == 1) {
      background-size: 13vmin;
    }
    @if ($i == 3) {
      background-size: 8vmin;
    }
    @if ($i == 5) {
      background-size: 10vmin;
    }
  }
}
View Compiled
// ~* for fun *~ //
const quotes = [
  'wash yer hands',
  'stay home',
  'take care of yourself',
  'we’re in this together',
  'don’t panic',
  'wear a mask'
]

// start js
const random = max => {
  return Math.floor(Math.random() * Math.floor(max))
}
const degs = [-10, -5, 0, 5, 10] // match $degs list
const numColors = 10
var colors = Array.from(Array(numColors).keys())
var app = new Vue({
  el: '#app',
  data: {
    colors: colors,
    degs: degs,
    quote: quotes[random(quotes.length)]
  },
  computed: {
    words: function() {
      return this.quote.split(' ')
    }
  },
  methods: {
    bg: function() {
      let n = this.colors[random(this.colors.length)]
      return `color-${n}`
    },
    pattern: function() {
      return `pattern pattern-${random(5) + 1}` // number of patterns
    },
    rotate: function() {
      return `deg${this.degs[random(degs.length)]}`
    },
    reload: function() {
      this.quote = quotes[random(quotes.length)]
    }
  }
});

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdn.jsdelivr.net/npm/vue@2
  2. https://kit.fontawesome.com/72a3efa272.js