<button class="transformer"><span class="transformer__container"><span class="transformer__front transformer__segment"><span class="transformer__feature"><svg class="transformer__heart heart" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12.115 11.096">
  <defs>
    <clipPath id="outline">
      <path stroke-linecap="round" stroke-linejoin="round" stroke-width=".822" d="M1.325 1.386a3.307 3.307 0 00.055 4.621l4.677 4.678 4.678-4.678A3.308 3.308 0 009.252.474c-1.141-.306-2.36.55-3.195 1.385C5.222 1.023 4.004.168 2.862.474a3.307 3.307 0 00-1.537.912z"/>
    </clipPath>
    <clipPath id="inner">
      <path clip-path="url(#outline)" d="M-.2.044c-.383.4-.191 2.762-.335 3.297a3.307 3.307 0 00.856 3.195L5 11.214l4.677-4.678a3.308 3.308 0 00-1.482-5.533C7.052.697 4.176-1.237 3.34-.401c-.836-.835 1.141-.305 0 0-.586.158-3.123.005-3.542.445z"/>
    </clipPath>
  </defs>
  <path class="heart__segment heart__shine" stroke-linecap="round" stroke-linejoin="round" stroke-width=".822" d="M1.325 1.386a3.307 3.307 0 00.055 4.621l4.677 4.678 4.678-4.678A3.308 3.308 0 009.252.474c-1.141-.306-2.36.55-3.195 1.385C5.222 1.023 4.004.168 2.862.474a3.307 3.307 0 00-1.537.912z"/>
  <path class="heart__segment heart__shadow" clip-path="url(#outline)" d="M-.2.044c-.383.4-.191 2.762-.335 3.297a3.307 3.307 0 00.856 3.195L5 11.214l4.677-4.678a3.308 3.308 0 00-1.482-5.533C7.052.697 4.176-1.237 3.34-.401c-.836-.835 1.141-.305 0 0-.586.158-3.123.005-3.542.445z"/>
  <path class="heart__segment heart__body" clip-path="url(#inner)" d="M4.611.073a3.307 3.307 0 00-1.418 4.4l2.947 5.921 5.922-2.947a3.308 3.308 0 00.354-5.718c-.985-.653-1.116-2.76-2.174-2.233-.527-1.058-2.704.274-3.884.201a3.308 3.308 0 00-1.747.376z"/>
  <path class="heart__baseline" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width=".822" d="M1.325 1.386a3.307 3.307 0 00.055 4.621l4.677 4.678 4.678-4.678A3.308 3.308 0 009.252.474c-1.141-.306-2.36.55-3.195 1.385C5.222 1.023 4.004.168 2.862.474a3.307 3.307 0 00-1.537.912z"/>
</svg>
        <div class="paw paw--left">
          <svg class="bear-paw" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 34.611 55.365">
            <g transform="translate(-39.71 -165.748)">
              <circle cx="43.184" cy="170.945" r="1.323"></circle>
              <circle cx="51.121" cy="167.071" r="1.323"></circle>
              <circle cx="61.421" cy="167.732" r="1.323"></circle>
              <circle cx="69.075" cy="171.417" r="1.323"></circle>
              <path class="stroked bear-one bear-one--dark" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.246" d="M52.665 167.163c-2.333.002-4.55 1.149-6.074 3.142a4.037 4.037 0 00-.478-.036c-4.67.567-5.742 5.429-5.779 8.991-.048 4.657 1.305 8.702 1.514 13.09.445 9.37-.567 28.14-.567 28.14h29.886s-.2-18.156.567-27.188c.373-4.398 1.814-8.794 1.96-13.097.123-3.618-2.536-8.965-6.13-8.965a4.704 4.704 0 00-1.345.208c-1.388-2.135-3.475-3.375-5.68-3.377a6.14 6.14 0 00-3.108.875c-1.38-1.154-3.05-1.779-4.766-1.783z"></path>
              <path class="bear-one bear-one--light" d="M55.386 167.708c-2.627.541-4.348 4.247-5.596 6.946-1.308 2.829-1.573 6.074-1.746 9.187-.257 4.6.846 9.394 1.054 13.781.427 8.97-.261 21.241-.34 22.735l22.409.133s-.2-18.155.567-27.188c.373-4.398 1.814-8.794 1.96-13.096.123-3.619-2.536-8.966-6.13-8.966a4.704 4.704 0 00-1.345.208c-1.388-2.134-3.475-3.375-5.68-3.377a6.14 6.14 0 00-3.108.875 7.783 7.783 0 00-2.045-1.238z"></path>
              <path class="stroked" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.587" d="M52.665 167.163c-2.333.002-4.55 1.149-6.074 3.142a4.037 4.037 0 00-.478-.036c-4.67.567-5.742 5.429-5.779 8.991-.048 4.657 1.305 8.702 1.514 13.09.445 9.37-.567 28.14-.567 28.14h29.886s-.2-18.156.567-27.188c.373-4.398 1.814-8.794 1.96-13.097.123-3.618-2.536-8.965-6.13-8.965a4.704 4.704 0 00-1.345.208c-1.388-2.135-3.475-3.375-5.68-3.377a6.14 6.14 0 00-3.108.875c-1.38-1.154-3.05-1.779-4.766-1.783z"></path>
              <ellipse class="bear-pad bear-pad--light stroked" cx="50.143" cy="188.41" stroke-linecap="round" stroke-linejoin="round" stroke-width=".794" rx="8.724" ry="6.159" transform="matrix(1 -.00427 .03389 .99943 0 0)"></ellipse>
              <path class="bear-pad bear-pad--dark" d="M58.589 182.14a8.728 6.154 1.436 00-8.247 6.185 8.728 6.154 1.436 006.665 5.911 8.728 6.154 1.436 008.245-6.186 8.728 6.154 1.436 00-6.663-5.91z"></path>
              <ellipse class="stroked" cx="50.143" cy="188.41" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width=".794" rx="8.724" ry="6.159" transform="matrix(1 -.00427 .03389 .99943 0 0)"></ellipse>
              <g transform="translate(29.867 -10.156)">
                <circle class="bear-pad bear-pad--light stroked" cx="16.124" cy="188.105" r="3.274" stroke-linecap="round" stroke-linejoin="round" stroke-width=".794"></circle>
                <path class="bear-pad bear-pad--dark" d="M16.916 184.933a3.274 3.274 0 00-2.479 3.172 3.274 3.274 0 002.482 3.173 3.274 3.274 0 002.479-3.173 3.274 3.274 0 00-2.482-3.172z"></path>
                <circle class="stroked" cx="16.124" cy="188.105" r="3.274" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width=".794"></circle>
              </g>
              <g transform="translate(36.816 -14.767)">
                <circle class="bear-pad bear-pad--light stroked" cx="16.124" cy="188.105" r="3.274" stroke-linecap="round" stroke-linejoin="round" stroke-width=".794"></circle>
                <path class="bear-pad bear-pad--dark" d="M16.916 184.933a3.274 3.274 0 00-2.479 3.172 3.274 3.274 0 002.482 3.173 3.274 3.274 0 002.479-3.173 3.274 3.274 0 00-2.482-3.172z"></path>
                <circle class="stroked" cx="16.124" cy="188.105" r="3.274" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width=".794"></circle>
              </g>
              <g transform="translate(45.035 -12.361)">
                <circle class="bear-pad bear-pad--light stroked" cx="16.124" cy="188.105" r="3.274" stroke-linecap="round" stroke-linejoin="round" stroke-width=".794"></circle>
                <path class="bear-pad bear-pad--dark" d="M16.916 184.933a3.274 3.274 0 00-2.479 3.172 3.274 3.274 0 002.482 3.173 3.274 3.274 0 002.479-3.173 3.274 3.274 0 00-2.482-3.172z"></path>
                <circle class="stroked" cx="16.124" cy="188.105" r="3.274" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width=".794"></circle>
              </g>
              <g transform="translate(52.184 -7.15)">
                <circle class="bear-pad bear-pad--light stroked" cx="16.124" cy="188.105" r="3.274" stroke-linecap="round" stroke-linejoin="round" stroke-width=".794"></circle>
                <path class="bear-pad bear-pad--dark" d="M16.916 184.933a3.274 3.274 0 00-2.479 3.172 3.274 3.274 0 002.482 3.173 3.274 3.274 0 002.479-3.173 3.274 3.274 0 00-2.482-3.172z"></path>
                <circle class="stroked" cx="16.124" cy="188.105" r="3.274" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width=".794"></circle>
              </g>
            </g>
          </svg>
        </div></span></span>
    <div class="paw paw--right">
      <svg class="bear-paw" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 34.611 55.365">
        <g transform="translate(-39.71 -165.748)">
          <circle cx="43.184" cy="170.945" r="1.323"></circle>
          <circle cx="51.121" cy="167.071" r="1.323"></circle>
          <circle cx="61.421" cy="167.732" r="1.323"></circle>
          <circle cx="69.075" cy="171.417" r="1.323"></circle>
          <path class="stroked bear-two bear-two--dark" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.246" d="M52.665 167.163c-2.333.002-4.55 1.149-6.074 3.142a4.037 4.037 0 00-.478-.036c-4.67.567-5.742 5.429-5.779 8.991-.048 4.657 1.305 8.702 1.514 13.09.445 9.37-.567 28.14-.567 28.14h29.886s-.2-18.156.567-27.188c.373-4.398 1.814-8.794 1.96-13.097.123-3.618-2.536-8.965-6.13-8.965a4.704 4.704 0 00-1.345.208c-1.388-2.135-3.475-3.375-5.68-3.377a6.14 6.14 0 00-3.108.875c-1.38-1.154-3.05-1.779-4.766-1.783z"></path>
          <path class="bear-two bear-two--light" d="M55.386 167.708c-2.627.541-4.348 4.247-5.596 6.946-1.308 2.829-1.573 6.074-1.746 9.187-.257 4.6.846 9.394 1.054 13.781.427 8.97-.261 21.241-.34 22.735l22.409.133s-.2-18.155.567-27.188c.373-4.398 1.814-8.794 1.96-13.096.123-3.619-2.536-8.966-6.13-8.966a4.704 4.704 0 00-1.345.208c-1.388-2.134-3.475-3.375-5.68-3.377a6.14 6.14 0 00-3.108.875 7.783 7.783 0 00-2.045-1.238z"></path>
          <path class="stroked" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.587" d="M52.665 167.163c-2.333.002-4.55 1.149-6.074 3.142a4.037 4.037 0 00-.478-.036c-4.67.567-5.742 5.429-5.779 8.991-.048 4.657 1.305 8.702 1.514 13.09.445 9.37-.567 28.14-.567 28.14h29.886s-.2-18.156.567-27.188c.373-4.398 1.814-8.794 1.96-13.097.123-3.618-2.536-8.965-6.13-8.965a4.704 4.704 0 00-1.345.208c-1.388-2.135-3.475-3.375-5.68-3.377a6.14 6.14 0 00-3.108.875c-1.38-1.154-3.05-1.779-4.766-1.783z"></path>
        </g>
      </svg>
    </div><span class="transformer__middle transformer__segment"><span class="transformer__text">Like</span></span><span class="transformer__back transformer__segment"><span class="transformer__number"><span class="number__place"><span class="number number--ten number--current">8</span><span class="number number--ten number--next">8</span></span><span class="number__place"><span class="number number--current number--single">6</span><span class="number number--next number--single">7</span></span></span></span></span>
  <svg class="slap" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 50.271 50.271">
    <g fill="none" stroke-linecap="round" transform="translate(-53.239 -117.668)">
      <circle class="slap__circle" cx="78.374" cy="142.804" r="12.172" stroke="#f55" stroke-linejoin="round" stroke-width="25.928"></circle>
      <g class="slap__line">
        <path stroke="#000" stroke-width="2.117" stroke-dasharray="11" d="M78.374 137.592v10.423"></path>
      </g>
      <g class="slap__line">
        <path stroke="#000" stroke-width="2.117" stroke-dasharray="11" d="M78.374 137.592v10.423"></path>
      </g>
      <g class="slap__line">
        <path stroke="#000" stroke-width="2.117" stroke-dasharray="11" d="M78.374 137.592v10.423"></path>
      </g>
    </g>
  </svg><span class="transformer__outline transformer__outline--top"></span>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <svg class="wiggle" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 3.456 27.798">
    <path class="wiggle__line celebration-line" fill="none" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.323" d="M1.736 27.128S.528 24.968.678 23.821c.17-1.298 2.117-1.999 2.117-3.308 0-1.308-2.117-1.998-2.117-3.307s2.117-1.998 2.117-3.307S.678 11.9.678 10.592c0-1.31 2.117-1.999 2.117-3.308 0-1.309-1.948-2.01-2.117-3.307C.528 2.829 1.736.67 1.736.67"></path>
  </svg>
  <div class="dashed__container">
    <svg class="dashed" viewBox="-0.25 -0.25 0.5 30">
      <defs>
        <clipPath id="lineClip">
          <rect height="31" width="1" x="-0.5" y="-0.5"></rect>
        </clipPath>
      </defs>
      <g class="dashed__wrapper" clip-path="url(#lineClip)">
        <path class="dashed__line celebration-line" d="M 0 0, L 0 30" stroke-linecap="round" stroke-dasharray="2" stroke-width="0.75"></path>
      </g>
    </svg>
  </div>
  <div class="dashed__container">
    <svg class="dashed" viewBox="-0.25 -0.25 0.5 30">
      <defs>
        <clipPath id="lineClip">
          <rect height="31" width="1" x="-0.5" y="-0.5"></rect>
        </clipPath>
      </defs>
      <g class="dashed__wrapper" clip-path="url(#lineClip)">
        <path class="dashed__line celebration-line" d="M 0 0, L 0 30" stroke-linecap="round" stroke-dasharray="2" stroke-width="0.75"></path>
      </g>
    </svg>
  </div>
  <div class="dashed__container">
    <svg class="dashed" viewBox="-0.25 -0.25 0.5 30">
      <defs>
        <clipPath id="lineClip">
          <rect height="31" width="1" x="-0.5" y="-0.5"></rect>
        </clipPath>
      </defs>
      <g class="dashed__wrapper" clip-path="url(#lineClip)">
        <path class="dashed__line celebration-line" d="M 0 0, L 0 30" stroke-linecap="round" stroke-dasharray="2" stroke-width="0.75"></path>
      </g>
    </svg>
  </div>
  <div class="dashed__container">
    <svg class="dashed" viewBox="-0.25 -0.25 0.5 30">
      <defs>
        <clipPath id="lineClip">
          <rect height="31" width="1" x="-0.5" y="-0.5"></rect>
        </clipPath>
      </defs>
      <g class="dashed__wrapper" clip-path="url(#lineClip)">
        <path class="dashed__line celebration-line" d="M 0 0, L 0 30" stroke-linecap="round" stroke-dasharray="2" stroke-width="0.75"></path>
      </g>
    </svg>
  </div>
  <div class="dashed__container">
    <svg class="dashed" viewBox="-0.25 -0.25 0.5 30">
      <defs>
        <clipPath id="lineClip">
          <rect height="31" width="1" x="-0.5" y="-0.5"></rect>
        </clipPath>
      </defs>
      <g class="dashed__wrapper" clip-path="url(#lineClip)">
        <path class="dashed__line celebration-line" d="M 0 0, L 0 30" stroke-linecap="round" stroke-dasharray="2" stroke-width="0.75"></path>
      </g>
    </svg>
  </div>
  <div class="burst">
    <svg class="burst__line" viewBox="-0.25, -0.25 0.5 30" style="--index: 0;">
      <path class="celebration-line" d="M 0 0, L 0 30" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.5"></path>
    </svg>
    <svg class="burst__line" viewBox="-0.25, -0.25 0.5 30" style="--index: 1;">
      <path class="celebration-line" d="M 0 0, L 0 30" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.5"></path>
    </svg>
    <svg class="burst__line" viewBox="-0.25, -0.25 0.5 30" style="--index: 2;">
      <path class="celebration-line" d="M 0 0, L 0 30" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.5"></path>
    </svg>
    <svg class="burst__line" viewBox="-0.25, -0.25 0.5 30" style="--index: 3;">
      <path class="celebration-line" d="M 0 0, L 0 30" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.5"></path>
    </svg>
  </div>
  <div class="burst">
    <svg class="burst__line" viewBox="-0.25, -0.25 0.5 30" style="--index: 0;">
      <path class="celebration-line" d="M 0 0, L 0 30" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.5"></path>
    </svg>
    <svg class="burst__line" viewBox="-0.25, -0.25 0.5 30" style="--index: 1;">
      <path class="celebration-line" d="M 0 0, L 0 30" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.5"></path>
    </svg>
    <svg class="burst__line" viewBox="-0.25, -0.25 0.5 30" style="--index: 2;">
      <path class="celebration-line" d="M 0 0, L 0 30" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.5"></path>
    </svg>
    <svg class="burst__line" viewBox="-0.25, -0.25 0.5 30" style="--index: 3;">
      <path class="celebration-line" d="M 0 0, L 0 30" stroke-linecap="round" stroke-dasharray="32" stroke-width="1.5"></path>
    </svg>
  </div>
</button>
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@500&display=swap')

*
  box-sizing border-box
  user-select none
 
:root
  --pink hsl(326, 98%, 82%)
  --pink-bg hsl(325, 90%, 98%)
  --pink-light hsl(325, 93%, 95%)
  --pink-dark hsl(326, 78%, 65%)
  --button-bg hsl(0, 0%, 100%)
  --stroke hsl(180, 3%, 94%)
  --text hsl(180, 6%, 19%)
  --number hsl(180, 2%, 67%)
  --color hsl(180, 2%, 77%)
  --heart-stroke hsl(180, 2%, 77%)
  --stroke-active hsl(204, 6%, 16%)
  --transition 0.2s

body
  display grid
  place-items center
  min-height 100vh
  font-family "Roboto", sans-serif
  background url('https://assets.codepen.io/605876/heart-outline-bg.svg')
  background-position calc(var(--x, 50) * 1%) calc(var(--y, 50) * 1%)

  &:after
    content ''
    position absolute
    opacity var(--backdrop-opacity, 0)
    top 0
    right 0
    bottom 0
    left 0
    z-index -1
    background url('https://assets.codepen.io/605876/heart-bg.svg'), var(--pink-bg)
    background-position calc(var(--x, 50) * 1%) calc(var(--y, 50) * 1%)


button
  --hovered 0
  cursor pointer
  padding 0
  margin 0
  border 0
  appearance none
  background transparent
  position relative
  display none

button:hover
  --hovered 1

.stroked
  stroke var(--stroke-active)

.bear-one
  &--light
    fill hsl(29, 59%, 40%)
  &--dark
    fill hsl(29, 59%, 23%)
.bear-two
  &--light
    fill hsl(51, 98%, 92%)
  &--dark
    fill hsl(45, 99%, 68%)
.bear-pad
  &--light
    fill hsl(24, 57%, 65%)
  &--dark
    fill hsl(24, 57%, 85%)

.heart
  overflow visible !important
  height 100%
  position absolute
  top 50%
  left 50%
  transform translate(-50%, -50%)
  opacity calc(1 - var(--hovered, 0))

  &__outline
    stroke var(--stroke-active)
    stroke-width 1.25px
  &__baseline
    stroke var(--color)
    stroke-width 1.25px
  &__body
    fill var(--pink)
  &__shine
    fill var(--pink-light)
  &__shadow
    fill var(--pink-dark)


.transformer
  --font-size 32px
  --border-width 4px
  --border-radius 10px
  --padding-v 26px
  --padding-h 36px
  --padding-t 10px
  --padding-b 4px
  font-size var(--font-size)
  position relative
  outline transparent

  *
    display inline-block

  &__container
    display inline-flex
    align-items center
    justify-content center
    position relative
    overflow hidden

  &__paws
    height 100%
    width 80%
    position absolute
    border var(--border-width) solid pink
    border-left 0
    border-right 0
    z-index 2

  &__front
    padding var(--padding-v) calc(var(--padding-t) + var(--padding-b)) var(--padding-v) var(--padding-h)
    padding 0 calc(var(--padding-t) + var(--padding-b)) 0 var(--padding-h)
    border var(--border-width) solid var(--stroke)
    border-radius var(--border-radius) 0 0 var(--border-radius)
    border-right 0
    z-index 2

  &__middle
    padding var(--padding-v) var(--padding-t)
    padding 0 var(--padding-t)
    border var(--border-width) solid var(--stroke)
    border-radius 0
    border-left 0
    border-right 0

  &__back
    border var(--border-width) solid var(--stroke)
    border-radius 0 var(--border-radius) var(--border-radius) 0
    padding var(--padding-v) var(--padding-h) var(--padding-v) var(--padding-b)
    padding 0 var(--padding-h) 0 var(--padding-b)
    border-left 0
    z-index 2

  &__number
    font-size var(--font-size)
    line-height var(--font-size)
    height var(--font-size)
    color var(--color)
    transform translate(6px, 0)

  &__text
    color var(--text)
    font-size var(--font-size)
    line-height var(--font-size)
    opacity calc(1 - var(--hovered, 0))
    transition transform var(--transition), opacity var(--transition)
    transform translateY(calc(var(--hovered, 0) * 80%))

  &__outline
    position absolute
    height 100%
    width 90%
    left 50%
    top 0
    border var(--border-width) solid var(--stroke)
    border-left 0
    border-right 0
    z-index 10
    transform translate3d(-50%, 0, 0)

  &__segment
    background var(--button-bg)
    display flex
    align-items center
    justify-content center
    height 92px

  &__feature
    height var(--font-size)
    position relative
    width var(--font-size)
    transition transform var(--transition)
    transform translate(-6px, 0) translateX(calc(var(--hovered, 0) * 100%))

.number
  position absolute
  left 0

  &__place
    height var(--font-size)
    display inline-block
    position relative
    width 18px


.slap
  position absolute
  height calc(var(--font-size) * 2)
  width calc(var(--font-size) * 2)
  top 50%
  left 38%
  transform translate(-50%, -50%)
  z-index 4
  display none
  // Important for CodePen
  overflow visible !important

.paw
  height calc(var(--font-size) * 2)
  position absolute
  top 0%
  left 50%
  transform translate(-50%, 0%)
  width var(--font-size)

  &--right
    z-index 5
    top 125%
    left 55%

.bear-paw
  position absolute
  height 150%
  opacity var(--hovered, 0)
  transition var(--transition)
  // Important for CodePen
  overflow visible !important
  left 50%
  top 0
  transform translate(-50%, -14%)

.wiggle
  position absolute
  top 50%
  left 50%
  transform translate(-50%, -50%)
  height 100px
  overflow visible !important
  display none
  z-index 10

.dashed
  height 100%
  overflow visible !important

  &__container
    display none
    top 50%
    left 50%
    height 100px
    position absolute
    transform translate(-50%, -50%)
    z-index 11

.geo
  height 100%
  // Keep CodePen happy
  overflow visible !important
  position absolute
  top 50%
  left 50%
  transform translate(-50%, -50%)

  &__wrap
    display none
    position absolute
    top 50%
    left 50%
    transform translate(-50%, -50%)
    z-index 12
    height 20px
    width 20px

.burst
  display none
  height 30px
  width 30px
  position absolute
  top 50%
  left 50%
  transform translate(-50%, -50%) rotate(calc(var(--rotate, 0) * 1deg)) translateY(calc(var(--translate, 0) * -1px))
  z-index 12

  &__line
    position absolute
    height 30px
    top 50%
    left 50%
    transform translate(-50%, -50%) rotate(calc((-45 + (var(--index) * 30)) * 1deg))
    transform-origin 50% 100%
    overflow visible !important
    z-index 12
View Compiled
// import gsap from 'https://cdn.skypack.dev/gsap'
const gsap = window.gsap
const { timeline } = gsap
const TRANSFORMER = document.querySelector('.transformer')
const TTEXT = document.querySelector('.transformer__middle')
const duration = 0.2

const AUDIO = {
  CHEER: new Audio('https://assets.codepen.io/605876/kids-cheering.mp3'),
  SIGH: new Audio('https://assets.codepen.io/605876/sigh.mp3'),
  CLICK: new Audio('https://assets.codepen.io/605876/click.mp3'),
  CLAP: new Audio('https://assets.codepen.io/605876/clap.mp3'),
}

gsap.set('.number--next', {
  yPercent: -100,
  opacity: 0,
})
gsap.set('.slap__line', {
  transformOrigin: '50% 50%',
  rotate: index => -45 + index * 45,
})
gsap.set('.slap__line path', {
  transformOrigin: '50% 50%',
  yPercent: -350,
  scaleY: 0.75,
})
gsap.set('.heart__segment', {
  opacity: 0,
})

/**
 * The Timeline
 * 1. Move Paw to Left
 * 2. Meet to slap in the middle with right paw
 * 3. Paws disappear
 */

const LEFT_PAW_TL = () =>
  timeline({})
    .set('.transformer__feature', {
      transition: 'none',
    })
    .to('.transformer__feature', {
      keyframes: [
        {
          xPercent: -130,
          ease: 'power1.out',
          duration: 0.125,
        },
        {
          xPercent: 20,
          ease: 'power1.in',
          duration: 0.125,
        },
        {
          xPercent: -20,
          delay: 0.1,
          ease: 'power1.out',
          duration: 0.15,
        },
      ],
    })

const RIGHT_PAW_TL = () =>
  timeline().to('.paw--right', {
    keyframes: [
      {
        ease: 'power1.in',
        xPercent: -175,
        yPercent: -125,
        duration: 0.25,
      },
      {
        ease: 'power1.out',
        delay: 0.15,
        duration: 0.35,
        xPercent: 0,
        yPercent: 0,
      },
    ],
  })

const RESIZE_TL = () =>
  timeline({})
    .set('.bear-paw', {
      opacity: 1,
    })
    .to(
      document.documentElement,
      {
        '--backdrop-opacity': 1,
        duration,
      },
      0
    )
    .to(
      document.documentElement,
      {
        '--stroke': 'hsl(326, 56%, 85%)',
        '--color': 'hsl(204, 6%, 16%)',
        duration,
      },
      0
    )
    .to(
      '.transformer__segment',
      {
        background: 'hsl(327, 91%, 96%)',
        duration,
      },
      0
    )
    .to(
      '.transformer__heart',
      {
        opacity: 1,
        duration,
      },
      0
    )
    .to(
      '.paw--left',
      {
        opacity: 0,
        duration,
      },
      0
    )
    .to(
      '.transformer__feature',
      {
        xPercent: -100,
        duration,
      },
      0
    )
    .to(
      '.transformer__outline',
      {
        scaleX: 0.6,
        duration,
      },
      0
    )
    .to(
      '.transformer__front',
      {
        x: TTEXT.offsetWidth / 2,
        duration,
      },
      0
    )
    .to(
      '.transformer__back',
      {
        x: -(TTEXT.offsetWidth / 2),
        duration,
      },
      0
    )
    .to(
      '.number.number--current.number--single',
      {
        yPercent: 100,
        opacity: 0,
        duration,
      },
      0
    )
    .to(
      '.number.number--next.number--single',
      {
        yPercent: 0,
        duration,
        opacity: 1,
      },
      0
    )
    .to(
      '.heart__segment',
      {
        opacity: 1,
        duration,
      },
      0
    )

const SLAP_TL = () =>
  gsap
    .timeline({
      onStart: () => {
        AUDIO.CLAP.play()
        gsap.set('.slap', {
          display: 'block',
        })
      },
      onComplete: () => {
        gsap.set('.slap', {
          display: 'none',
        })
        gsap.set('.slap__circle', { clearProps: 'all' })
      },
    })
    .set('.slap__circle', {
      stroke: `hsl(${Math.random() * 359}, 85%, 60%)`,
    })
    .to('.slap__circle', {
      strokeWidth: 0,
      scale: 2.5,
      duration: 0.15,
      transformOrigin: '50% 50%',
    })
    .fromTo(
      '.slap__line path',
      {
        strokeDashoffset: -11,
      },
      {
        yPercent: -400,
        duration: 0.15,
        strokeDashoffset: 11,
      },
      0
    )

const CELEBRATE_TL = () =>
  gsap
    .timeline({
      repeatRefresh: true,
      onStart: () => {
        gsap.delayedCall(0.25, () => AUDIO.CHEER.play())
        gsap.set(['.wiggle', '.dashed__container', '.burst'], {
          display: 'block',
        })
      },
      onComplete: () => {
        gsap.set(['.wiggle', '.dashed__container', '.burst'], {
          display: 'none',
        })
      },
    })
    .set('.celebration-line', {
      stroke: () => `hsl(${Math.random() * 359}, 100%, 70%)`,
    })
    .set('.dashed__line', {
      yPercent: -120,
    })
    .set('.dashed', {
      yPercent: 0,
    })
    .set('.burst', {
      '--rotate': () => Math.random() * 360,
      '--translate': () => Math.random() * 100 + 180,
    })
    .set(['.wiggle', '.dashed__container'], {
      rotate: () => Math.random() * 360,
    })
    .set(['.wiggle__line', '.dashed'], {
      yPercent: () => Math.random() * 150 + 180,
      scaleY: () => Math.random() + 0.5,
    })
    .fromTo(
      '.dashed__line',
      {
        yPercent: -120,
      },
      {
        yPercent: 120,
        duration: 0.5,
      },
      0
    )
    .to('.dashed', {
      yPercent: 'random(20, 100)',
    })
    .fromTo(
      ['.wiggle__line'],
      {
        strokeDashoffset: -32,
      },
      {
        delay: () => Math.random(),
        yPercent: '+=50',
        duration: 0.5,
        strokeDashoffset: 32,
      },
      0
    )
    .fromTo(
      '.burst__line path',
      {
        strokeDashoffset: -32,
      },
      {
        delay: () => Math.random() * 0.5,
        yPercent: `-=50`,
        strokeDashoffset: 32,
      },
      0
    )

const TRANSFORMER_TL = () =>
  timeline({
    onComplete: () => {
      TRANSFORMER.removeAttribute('disabled')
    },
  })
    // Set the hover states concretely
    .set('.transformer__feature', {
      // Setting xPercent is only going to work on desktop
      '--hovered': 1,
    })
    .set('.bear-paw', {
      opacity: 1,
    })
    .set('.transformer__text', {
      yPercent: 80,
      opacity: 0,
    })
    // Make the left paw movement using the feature element
    // This means the heart and the paw track movement
    .add(LEFT_PAW_TL(), 0.25)
    .add(RIGHT_PAW_TL(), '<')
    .add(SLAP_TL(), '>-0.5')
    .add(CELEBRATE_TL(), '<')
    .add(RESIZE_TL(), '<+0.5')
    .to(
      '.transformer__heart',
      {
        scale: 1.25,
        repeat: 1,
        yoyo: true,
        ease: 'elastic.in',
      },
      '>-0.2'
    )

const RESET_TL = timeline({
  paused: true,
  onStart: () => {
    AUDIO.SIGH.play()
  },
  onComplete: () => {
    gsap.set(['.transformer__heart', '.paw--left', '.bear-paw'], {
      clearProps: 'all',
    })
  },
})
  .set(['.transformer__feature', '.transformer__text'], {
    clearProps: 'all',
  })
  .to('.transformer__front', {
    x: 0,
    duration,
  })
  .to(
    '.heart__segment',
    {
      opacity: 0,
      duration,
    },
    0
  )
  .to(
    '.transformer__outline',
    {
      scaleX: 1,
      duration,
    },
    0
  )
  .to(
    '.transformer__segment',
    {
      background: 'hsl(0, 0%, 100%)',
      duration,
    },
    0
  )
  .to(
    '.transformer__back',
    {
      x: 0,
      duration,
    },
    0
  )
  .to(
    document.documentElement,
    {
      '--backdrop-opacity': 0,
      '--stroke': 'hsl(180, 3%, 94%)',
      '--color': 'hsl(180, 2%, 77%)',
      duration,
    },
    0
  )
  .to(
    '.number.number--current.number--single',
    {
      yPercent: 0,
      duration,
      opacity: 1,
    },
    0
  )
  .to(
    '.number.number--next.number--single',
    {
      yPercent: -100,
      duration,
      opacity: 0,
    },
    0
  )
  .to(
    '.paw--left',
    {
      opacity: 1,
      duration,
    },
    0
  )
  .to(
    '.transformer__heart',
    {
      opacity: 0,
      duration,
    },
    0
  )

TRANSFORMER.addEventListener('pointerdown', ({ x, y }) => {
  if (TRANSFORMER.hasAttribute('disabled')) return
  if (TRANSFORMER.getAttribute('aria-pressed') === 'true') {
    TRANSFORMER.setAttribute('aria-pressed', false)
    RESET_TL.restart()
  } else {
    TRANSFORMER.setAttribute('aria-pressed', true)
    TRANSFORMER.setAttribute('disabled', true)
    const SVG = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
    const CIRCLE = document.createElementNS(
      'http://www.w3.org/2000/svg',
      'circle'
    )
    const BOUNDS = TRANSFORMER.getBoundingClientRect()
    gsap.set(SVG, {
      height: 50,
      width: 50,
      left: x - BOUNDS.left - 25,
      top: y - BOUNDS.top - 25,
      overflow: 'visible !important',
      zIndex: 12,
      transformOrigin: '50% 50%',
      position: 'absolute',
      attr: {
        viewBox: '0 0 100 100',
        fill: 'none',
      },
    })
    SVG.appendChild(CIRCLE)
    TRANSFORMER.appendChild(SVG)
    gsap.set(CIRCLE, {
      attr: {
        r: 30,
        cx: 50,
        cy: 50,
      },
      stroke: `hsl(${Math.random() * 359}, 80%, 50%)`,
      strokeWidth: 20,
    })
    gsap
      .timeline({
        onStart: () => TRANSFORMER_TL(),
        onComplete: () => SVG.remove(),
      })
      .fromTo(
        CIRCLE,
        {
          scale: 0,
          transformOrigin: '50% 50%',
        },
        {
          scale: 1.25,
          duration: 0.2,
        }
      )
      .to(
        CIRCLE,
        {
          opacity: 0,
          duration: 0.1,
        },
        '>-0.1'
      )
  }
})

const LIMIT = 5
document.addEventListener('pointermove', ({ x, y }) => {
  const posX = gsap.utils.mapRange(0, window.innerWidth, -LIMIT, LIMIT, x)
  const posY = gsap.utils.mapRange(0, window.innerHeight, -LIMIT, LIMIT, y)
  gsap.set(document.documentElement, {
    '--x': posX,
    '--mx': x,
    '--y': posY,
    '--my': y,
  })
})

gsap.set('.transformer', {
  display: 'block',
})
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://unpkg.co/gsap@3.2.6/dist/gsap.min.js