// Based on design by Patrick Moriarty https://dribbble.com/shots/4059798-Boulder-Badge

.patch-container
  .patch-top
    .patch-top-rounding
  .patch-base
    .mountains
      .mountain__left
      .mountain__right
      .mountain__middle
      .tent
        .tent__flag
      .tree__left
      .tree__right
  .ribbon
    span WONDER & WANDER
  .sun
    each rayNum in [1, 2, 3, 4, 5, 6, 7, 8]
      .ray(class="ray" + rayNum)
  .curved-text
    each letter in ['B','O','U','L','D','E','R',',','C','O','L','O','R','A','D','O']
      span=letter
  .moon
  .cloud__small.left
  .cloud__small.right
  .cloud__big.left
  .cloud__big.right
  .stars
    each num in [1, 2, 3, 4, 5, 6, 7, 8]
      .star(class="star"+num)
        .cover.left
        .cover.right
.link-container
  span Original artwork by 
  a(href='https://dribbble.com/shots/4059798-Boulder-Badge' target='_blank') Patrick Moriarty
View Compiled
$font-size: 10px; // Change to scale

$white: #faf7e8;
$aqua: #86beb3;
$blue: #395a6d;
$bgcolor: #DCC48E;
// Original background color: #9fcc71
// Alternative background colors: #779CAB, #DCC48E

@mixin absolute-horizontal-center {
  position: absolute;
  transform: translateX(-50%);
  left: 50%;
}

@mixin absolute-vertical-center {
  position: absolute;
  transform: translateY(-50%);
  top: 50%;
}

@mixin centerAbsolute() {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

@mixin circle($radius) {
  height: $radius;
  width: $radius;
  border-radius: 100%;
}

@mixin isosceles-triangle($height, $width, $color) {
  border-bottom: solid $height $color;
  border-left: solid ($width/2) transparent;
  border-right: solid ($width/2) transparent;
}

@mixin isosceles-triangle-pointed-right($height, $width, $color) {
  border-left: solid $height $color;
  border-top: solid ($width/2) transparent;
  border-bottom: solid ($width/2) transparent;
}

@mixin isosceles-triangle-pointed-left($height, $width, $color) {
  border-right: solid $height $color;
  border-top: solid ($width/2) transparent;
  border-bottom: solid ($width/2) transparent;
}

@mixin right-triangle($height, $width, $color) {
  border-bottom: solid $height $color;
  border-right: solid $width transparent;
}

@mixin right-triangle-pointed-left($height, $width, $color) {
  border-bottom: solid $height $color;
  border-left: solid $width transparent;
}

// Styles to extend

.pseudo {
  content: '';
  position: absolute;
}

// ===============================

.star {
  height: 2.5em;
  width: 2.5em;
  background: $white;
  position: absolute;
  
  &:before, &:after { @extend .pseudo; }
  
  &:before, &:after, .cover {
    @include circle(2.5em);
    background: $blue;
    position: absolute;
  }
  
  &:before {
    top: -1.25em;
    left: -1.25em;
  }
  &:after {
    top: -1.25em;
    right: -1.25em;
  }
  .cover.left {
    left: -1.25em;
    bottom: -1.25em;
  }
  .cover.right {
    bottom: -1.25em;
    right: -1.25em;
  }
}

.cloud-small {
  // Bigger half circle
  width: 4em;
  height: 2em;
  border-radius: 4em 4em 0 0;
  position: absolute;
  background: $aqua;
  
  &:before { // Small half circle
    @extend .pseudo;
    background: $aqua;
    height: 1em;
    width: 2em;
    border-radius: 2em 2em 0 0;
    left: -1.2em;
    bottom: 0;
  }
}

.cloud-big {
  @extend .cloud-small;
  
  &:after {
    @extend .pseudo;
    width: 4.2em;
    height: 2.1em;
    border-radius: 4.2em 4.2em 0 0;
    background: $aqua;
    position: absolute;
    right: -3.1em;
    bottom: 0;
  }
}

body {
  font-size: $font-size;
  min-height: 97vh;
  display: flex;
  justify-content: center;
  align-items: center;
  background: #DCC48E;
}

.patch-container {
  position: relative;
  z-index: -2; // So ribbons sides will show
  height: 50em;
  width: 46em;
  top: -1em;
}

.patch-base {
  height: 45.5em;
  width: 40em;
  //background: #395a6d;
  background: linear-gradient(180deg, $blue 55%, $aqua 55%);
  @include absolute-horizontal-center;
  bottom: 0;
  border-radius: 0 0 20em 20em; 
  border: 1.3em solid $white;
  border-top: none;
  box-sizing: border-box;
}

.patch-top {
  height: 4.5em;
  width: 40em;
  @include absolute-horizontal-center;
  top: 0;
  overflow: hidden;
  
  .patch-top-rounding {
    @include circle(110em); // Calculated as 104
    background: $blue;
    @include absolute-horizontal-center;
    top: 0;
    border: 1.3em solid $white; 
  }
}

.ribbon {
  width: 42.5em;
  height: 7.6em;
  position: relative; // So that :before and :after can be positioned behind
  top: 26.5em;
  left: (46em - 42.5em) / 2;
  border: (7.6em / 2) solid $blue;
  border-right-width: 1em;
  border-right-color: $white;
  border-left-width: 1em;
  border-left-color: $white;
  box-sizing: border-box;
  
  text-align: center;

  &:before, &:after {
    @extend .pseudo;
    border: 5em solid $white;
    top: -5em;
    z-index: -1;
  }
  
  &:before {
    border-left-width: 1.3em;
    border-left-color: transparent;
    left: -2.7em;
  }
  
  &:after {
    border-right-width: 1.3em;
    border-right-color: transparent;
    right: -2.7em;
  }
}

// Text in ribbon
.ribbon span {
  @include centerAbsolute;
  width: 100%;
  font-size: 3.2em;
  font-family: 'Montserrat', sans-serif;    
  font-weight: 900;
  color: $white;
}

.sun {
  font-size: 1.05em;
  position: absolute;
  height: 0;
  width: 0;
  //@include circle(4em);
  //border: 0.6em solid $white;
  box-sizing: border-box;
  
  @include absolute-horizontal-center;
  bottom: 8.2em + 1.7em;
  
  &:after {
    @extend .pseudo;
    @include circle(2.8em);
    border: 0.6em solid $white;
    @include centerAbsolute;
    background: $aqua;
  }
  
  .ray {
    width: 0.55em;
    background: $white;
    border-radius: 1.1em;
    @include centerAbsolute;
  }

  .ray1 { height: 7.6em; width: 0.6em; }
  .ray2 {
    transform: translate(-50%, -50%) rotate(22.5deg);
    height: 8em;
    top: -0.05em;
    right: -0.05em;
  }
  .ray3 {
    transform: translate(-50%, -50%) rotate(2*22.5deg);
    height: 9.7em;
    top: -0.25em;
    left: 0.28em;
  }
  .ray4 {
    transform: translate(-50%, -50%) rotate(3 * 22.5deg);
    height: 15.6em;
    top: -0.585em;
    left: 1.4em;
  }
  .ray5 {
    transform: translate(-50%, -50%) rotate(4 * 22.5deg);
    height: 18.6em;
  }
  .ray6 {
    transform: translate(-50%, -50%) rotate(5 * 22.5deg);
    height: 15.6em;
    top: -0.585em;
    left: -1.4em;
  }
  .ray7 {
    transform: translate(-50%, -50%) rotate(6 * 22.5deg);
    height: 9.7em;
    top: -0.25em;
    left: -0.28em;
  }
  .ray8 {
    transform: translate(-50%, -50%) rotate(7 * 22.5deg);
    height: 8em;
  }
}

// Referenced: https://codepen.io/oloman/pen/sHGAl
.curved-text {
  font-family: 'Montserrat', sans-serif;  
  font-weight: 800;
  color: $white;
  
  //width: 32em;
  width: 36em;
  //height: 16em;
  height: 18em;
  position: relative;
  margin: 0 auto;
  //top: 30.2em;
  top: 22.6em;
  
  span {
    //font-size: 2.6em;
    font-size: 2.8em;
    position: absolute;
    top: 0;
    height: 7.4em;
    width: 1em;
    margin-left: -0.5em;
    //line-height: 12.4em;
    line-height: 11.5em;
    transform-origin: top center;
    @include absolute-horizontal-center;
    text-align: center;
    //border: 1px solid black;
  }
  
  // Python: [66.6 - (x * 7.4) for x in range(9)]
  // (180 - 2*23.25) / 15 = 8.9
  // >>> [66.75 - (x * 8.9) for x in range(8)]
// [66.75, 57.85, 48.95, 40.05, 31.15, 22.25, 13.35, 4.45]
  span:nth-child(1) { transform: rotate(66.75deg); } // B
  span:nth-child(2) { transform: rotate(57.85deg); } // O
  span:nth-child(3) { transform: rotate(48.95deg); } // U
  span:nth-child(4) { transform: rotate(40.05deg); } // L
  span:nth-child(5) { transform: rotate(31.15deg); } // D
  span:nth-child(6) { transform: rotate(22.25deg); } // E
  span:nth-child(7) { transform: rotate(13.35deg); } // R
  span:nth-child(8) { transform: rotate(4.45deg); } //
  span:nth-child(9) { transform: rotate(-4.45deg); } // C
  span:nth-child(10) { transform: rotate(-13.35deg); } // O
  span:nth-child(11) { transform: rotate(-22.25deg); } // L
  span:nth-child(12) { transform: rotate(-31.15deg); } // O
  span:nth-child(13) { transform: rotate(-40.05deg); } // R
  span:nth-child(14) { transform: rotate(-48.95deg); } // A
  span:nth-child(15) { transform: rotate(-57.85deg); } // D
  span:nth-child(16) { transform: rotate(-66.75deg); } // O*/
  
}

.moon {
  @include circle(6.2em);
  background: $white;
  position: absolute;
  @include absolute-horizontal-center;
  top: 4.7em;
  
  &:before {
    @extend .pseudo;
    @include circle(3.6em);
    background: $blue;
    @include absolute-vertical-center;
    right: -0.6em;
  }
}

.cloud__small {
  @extend .cloud-small;
  top: 7.4em;
  
  &.left { left: 12.5em; }
  &.right {
    transform: scaleX(-1);
    right: 12.5em;
  }
}

.cloud__big {
  @extend .cloud-big;
  top: 12.8em;
  
  &.left { left: 7.3em; }
  &.right {
    transform: scaleX(-1);
    right: 7.3em;
  }
}

.mountains {
  //z-index: 5;
  height: 13em;
  width: 37.4;
  position: absolute;
  @include absolute-horizontal-center;
  top: 9em;
  
  .mountain__left, .mountain__right, .mountain__middle {
    position: absolute;
    bottom: 0;
  }
  
  .mountain__left {
    @include right-triangle-pointed-left(9.2em, 9.3em, $aqua);
    
    &:before {
      @extend .pseudo;
      @include right-triangle(9.2em, 9.3em, $white);
    }
  }
  
  .mountain__right {
    @include right-triangle(9.2em, 9.3em, $white);
    right: 0;
    
    &:before {
      @extend .pseudo;
      @include right-triangle-pointed-left(9.2em, 9.3em, $aqua);
      left: -9.3em;
    }
  }
  
  .mountain__middle {
    @include isosceles-triangle(13em, 26em, $aqua);
    @include absolute-horizontal-center;
    
    &:before {
      @extend .pseudo;
      @include right-triangle(13em, 13em, $white);
    }
  }
}

.tent {
  @include isosceles-triangle(4.5em, 9.6em, $blue);
  @include absolute-horizontal-center;
  bottom: 0;
  
  &:before, &:after {
    @extend .pseudo;
    bottom: -4.5em;
  }
  
  &:before {
    height: 1.7em;
    width: 1.7em;
    background: $aqua;
  }
  
  // Doorway
  &:after {
    @include absolute-horizontal-center;
    @include isosceles-triangle(1.7em, 3.4em, $white);
  }
  
  .tent__flag {
    @include isosceles-triangle-pointed-right(3em, 1.1em, $blue);
    position: absolute;
    bottom: 0;
  }
}

.tree__left, .tree__right {
  @include isosceles-triangle(1.4em, 3.2em, $blue);
  position: absolute;
  bottom: 0;
  
  &:before, &:after {
    @extend .pseudo;
    @include isosceles-triangle(1.4em, 3.2em, $blue);
    @include absolute-horizontal-center;
  }
  
  &:before { bottom: -0.15em; }
  &:after { bottom: 1.1em; }
}

.tree__left {
  right: 4.8em;
}

.tree__right {
    right: -4.8em - 3.2em;
}

// --- Stars ---
.stars {
  width: 32.5em;
  height: 16em;
  @include absolute-horizontal-center;
  top: 3em;
  
  .star1 { top: 2.7em; left: 0em; }
  .star2 { top: 0em; left: 9.3em; }
  .star3 { top: 0em; right: 9.3em; }
  .star4 { top: 2.7em; right: 0em; }
  .star5 { bottom: 0em; left: 0em; }
  .star6 { top: 8.2em; left: 9em; }
  .star7 { top: 8.2em; right: 9em; }
  .star8 { bottom: 0em; right: 0em; } 
}

.link-container {
  position: fixed;
  bottom: 0;
  right: 0;
  width: auto;
  padding: 0.75em;
  font-size: 1.5em;
  color: $blue;
  font-family: sans-serif;
  
  a {
    color: darken($aqua, 25);
    font-weight: 600;
    text-decoration: none;
    
    &:hover, &:focus {
      color: darken($aqua, 10);
    }
  }
}
View Compiled
// ¯\_(ツ)_/¯

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.