<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alex Trost</title>
    <description>The latest articles on DEV Community by Alex Trost (@trostcodes).</description>
    <link>https://dev.to/trostcodes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F77302%2F9299fb46-cee8-43d5-ba25-746b6c1dfa59.jpg</url>
      <title>DEV Community: Alex Trost</title>
      <link>https://dev.to/trostcodes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/trostcodes"/>
    <language>en</language>
    <item>
      <title>Making Dynamic Animations with Shaders</title>
      <dc:creator>Alex Trost</dc:creator>
      <pubDate>Tue, 01 Sep 2020 21:39:00 +0000</pubDate>
      <link>https://dev.to/trostcodes/making-dynamic-animations-with-shaders-3m5h</link>
      <guid>https://dev.to/trostcodes/making-dynamic-animations-with-shaders-3m5h</guid>
      <description>&lt;p&gt;I’ve been following ilithya’s shader demos for a while and wanted to write about her work weeks ago, but quickly learned that I was out of my depth with shaders. Instead, ilithya helped me write the &lt;a href="https://frontend.horse/issues/8/"&gt;Introduction to Shaders&lt;/a&gt; issue as a warm-up. Now it's race day!&lt;/p&gt;

&lt;p&gt;If you're new to shaders and haven't read the &lt;a href="https://frontend.horse/issues/8/"&gt;Introduction to Shaders&lt;/a&gt; issue, that would be a good place to start. It provides a conceptual foundation that will make it easier to understand the shaders we're covering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summer Screen
&lt;/h2&gt;

&lt;p&gt;Let's dive deep into how ilithya made this awesome shader, &lt;a href="https://codepen.io/ilithya/pen/QWyJmda"&gt;Summer Screen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/ilithya/embed/QWyJmda?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;There's a few things going on here. First, we've got these vertical line sections that are shifting back and forth. Then we've got these gradients coming in from the top and bottom like color waves on a beach. Let's figure out these two effects.&lt;/p&gt;

&lt;p&gt;First we'll check out a shortened version of the GLSL code so we can see what's going on. You might see a new language and some math here but don't worry! We'll trot through them nice and slow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create three static colors&lt;/span&gt;
&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;colorA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;vec3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Purple&lt;/span&gt;
&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;colorB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;vec3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;71&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Pink&lt;/span&gt;
&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;colorC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;vec3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Teal blue&lt;/span&gt;

&lt;span class="c1"&gt;// Create three dynamic colors&lt;/span&gt;
&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;color1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;colorA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colorB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u_time&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;color2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;colorB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colorC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u_time&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;color3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u_time&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.));&lt;/span&gt;

&lt;span class="c1"&gt;// Our color output&lt;/span&gt;
&lt;span class="nb"&gt;gl_FragColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;vec4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first thing to address is that GLSL is a &lt;em&gt;typed language&lt;/em&gt;, so when you declare a variable you also declare its type.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;float&lt;/code&gt; for our purposes can be thought of as a number with a decimal.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;vec3&lt;/code&gt; for our purposes is kind of like a special JavaScript array with three values.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;vec4&lt;/code&gt; has one more value than a &lt;code&gt;vec3&lt;/code&gt; and is what the output of a shader &lt;code&gt;main()&lt;/code&gt; function needs to be. The four values there align to red, green, blue, alpha.&lt;/p&gt;

&lt;p&gt;First ilithya creates &lt;code&gt;colorA&lt;/code&gt;, &lt;code&gt;colorB&lt;/code&gt;, and &lt;code&gt;colorC&lt;/code&gt;. Each of these are static colors that aren't going to change.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L4p0wy7b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/me3q9o6o5d8z800johbd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L4p0wy7b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/me3q9o6o5d8z800johbd.png" alt="The three colors used in this piece: Purple, pink and teal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then she uses these colors and other variables to create dynamic colors that will change. We'll look at the vertical lines first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vertical Lines
&lt;/h2&gt;

&lt;p&gt;For the vertical lines let's zoom in and see what's really going on here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q7239rI_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6yyzp96qggelrasfmbmp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q7239rI_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6yyzp96qggelrasfmbmp.png" alt="A close up of the vertical lines"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The lines are really repeated gradients going from dark to light.&lt;/p&gt;

&lt;p&gt;To make gradients with GLSL we use the &lt;code&gt;mix&lt;/code&gt; function. &lt;code&gt;mix&lt;/code&gt; takes three arguments: &lt;code&gt;x&lt;/code&gt;: the start of the range, &lt;code&gt;y&lt;/code&gt;: the end of the range, and &lt;code&gt;a&lt;/code&gt;: the point between &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="c1"&gt;// vec3 mix(vec3 x, vec3 y, vec3 a)&lt;/span&gt;
&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;color1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;colorA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colorB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u_time&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ilithya is making a gradient between the purple and pink, so those are her first two arguments. The colors get mixed in different amounts based on the value of &lt;code&gt;a&lt;/code&gt;, which is a value from &lt;code&gt;0&lt;/code&gt; to &lt;code&gt;1&lt;/code&gt;. If &lt;code&gt;a&lt;/code&gt; is &lt;code&gt;0&lt;/code&gt;, we'll see 100% of the first color. If &lt;code&gt;a&lt;/code&gt; is &lt;code&gt;1&lt;/code&gt; we'll see 100% of the second color. Anything in between and we get a blend:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eRKhQyM7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/luvfgh2rrk8cjvk5vqsr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eRKhQyM7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/luvfgh2rrk8cjvk5vqsr.png" alt="The gradient in steps"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So that can give us one gradient, but how do we get repeating gradients?&lt;/p&gt;

&lt;p&gt;To get the gradients to stop and start from &lt;code&gt;0&lt;/code&gt; again, ilithya is using a GLSL function called &lt;code&gt;fract&lt;/code&gt;. This returns the fraction of a number, dropping the integer. &lt;code&gt;fract(x)&lt;/code&gt; is the same as doing &lt;code&gt;x - Math.floor(x)&lt;/code&gt; or &lt;code&gt;x % 1&lt;/code&gt; in JavaScript. So as &lt;code&gt;x&lt;/code&gt; increases, &lt;code&gt;fract(x)&lt;/code&gt; will always be a float between 0 and 1.&lt;/p&gt;

&lt;p&gt;I'm going to simplify it beyond what ilithya has in her piece to show how the &lt;code&gt;fract&lt;/code&gt; function works:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ERTaRs93--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/feycn9yru0x2s7xpm44p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ERTaRs93--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/feycn9yru0x2s7xpm44p.png" alt="Showing how the fract function works"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we can see, even though &lt;code&gt;x&lt;/code&gt; keeps increasing, the result of &lt;code&gt;fract(x)&lt;/code&gt; just returns the fraction, or whatever comes after the decimal, giving us that same purplish color. Translate that over the entire piece and you've got ilithya's cool vertical bars!&lt;/p&gt;

&lt;p&gt;We'll touch on how all these pieces animate a bit later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pink &amp;amp; Blue Gradient
&lt;/h2&gt;

&lt;p&gt;Now we move to &lt;code&gt;color2&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;color2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;colorB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colorC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u_time&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another mix, this time between the pink and blue. No &lt;code&gt;fract&lt;/code&gt; this time, so we're getting a smooth gradient. The &lt;code&gt;y&lt;/code&gt; value makes it change color from bottom to top. We'll touch on the &lt;code&gt;sin(u_time)&lt;/code&gt; bit soon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting it All Together
&lt;/h2&gt;

&lt;p&gt;Then she combines &lt;code&gt;color1&lt;/code&gt; and &lt;code&gt;color2&lt;/code&gt;, using a mix amount that gets closer to &lt;code&gt;1&lt;/code&gt; on the right side. The horizontal change is due to the &lt;code&gt;x&lt;/code&gt; value. The &lt;code&gt;cos(u_time+2)&lt;/code&gt; is for animation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;color3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u_time&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's a simplified version of the shader's parts and the final color output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6NgdtB8---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6bkv0bncgp5sc80z3syk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6NgdtB8---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6bkv0bncgp5sc80z3syk.png" alt="Showing how the different colors blend together to make the shader"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see our simplified version looks similar to the finished shader, it's just missing animations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Animation
&lt;/h2&gt;

&lt;p&gt;There are three main animations happening in Summer Screen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The bars shifting left and right in &lt;code&gt;color1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The pink and blue gradient moving up and down in &lt;code&gt;color2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The mix value for &lt;code&gt;color3&lt;/code&gt; moving left and right&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each of these are using the value of the current time, and familiar math functions, &lt;code&gt;sin&lt;/code&gt; and &lt;code&gt;cos&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;color1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;colorA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colorB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u_time&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;color2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;colorB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colorC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u_time&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;color3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u_time&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That &lt;code&gt;time&lt;/code&gt; value comes from a Three.js &lt;code&gt;Clock&lt;/code&gt; and is how ilithya animates most of her shaders. It returns the &lt;a href="https://threejs.org/docs/#api/en/core/Clock.getElapsedTime"&gt;elapsed time&lt;/a&gt; since the page loaded.&lt;/p&gt;

&lt;p&gt;Don't worry if you don't know Three.js. The code ilithya uses is reusable boilerplate that makes the shader code simpler. We'd have to have a lot more GLSL code without the little bit of Three.js. It's a handy WebGL abstraction.&lt;/p&gt;

&lt;p&gt;When ilithya calls either &lt;code&gt;sin(u_time)&lt;/code&gt; or &lt;code&gt;cos(u_time)&lt;/code&gt; she's going to get back a value between -1 and 1, and it'll transition smoothly. If you're familiar with CSS animations, it feels a lot like an &lt;code&gt;ease-in-out&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Super Quick Sine Wave Refresher:&lt;/p&gt;

&lt;p&gt;As we increase the value along the horizontal axis, the sine wave moves us up and peaks at &lt;code&gt;1&lt;/code&gt;, brings us down to &lt;code&gt;0&lt;/code&gt; and bottoms out at &lt;code&gt;-1&lt;/code&gt; before climbing again. No matter high the horizontal value is, the sine of that value will always be between &lt;code&gt;-1&lt;/code&gt; and &lt;code&gt;1&lt;/code&gt;. Cosine works similarly but gives a different value.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oeUws6jX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3kt9hcum8bo994kzzosj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oeUws6jX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3kt9hcum8bo994kzzosj.png" alt="Showing a sine wave"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And there you have it! Three different parts being blended and animated together to make one awesome animation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Break it Yourself
&lt;/h2&gt;

&lt;p&gt;As she was helping me understand it, ilithya encouraged me to swap values out in the shader code. I highly recommend you go and do just that.&lt;/p&gt;

&lt;p&gt;To see the vertical bars isolated, change the last line of the shader code to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="nb"&gt;gl_FragColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;vec4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To see the vertical pink and blue gradient:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="nb"&gt;gl_FragColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;vec4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or you can change that to &lt;code&gt;colorA&lt;/code&gt;, &lt;code&gt;colorB&lt;/code&gt;, or &lt;code&gt;colorC&lt;/code&gt; to see a screen of solid color. Play with it, have fun, figure out how it works.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/ilithya/pen/QWyJmda"&gt;Check out Summer Screen →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bubble Gum
&lt;/h2&gt;

&lt;p&gt;I won't be diving into how this shader works, but it's just so dang soothing to stare at, I had to share it. Let me know if you'd like to read about it in a future issue.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/ilithya/embed/XWXvvmj?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/ilithya/pen/XWXvvmj"&gt;Check out Bubble Gum →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Shader Resources
&lt;/h2&gt;

&lt;p&gt;Ilithya shared some great resources for learning shaders over on her &lt;a href="https://www.ilithya.rocks/blog/starting-with-shaders/#heading-how-i-got-started-with-shaders"&gt;blog&lt;/a&gt;. The resource that everyone recommends is &lt;a href="https://thebookofshaders.com/"&gt;The Book of Shaders&lt;/a&gt;, so definitely check that out if you're interested.&lt;/p&gt;

</description>
      <category>webgl</category>
      <category>webdev</category>
      <category>shaders</category>
      <category>design</category>
    </item>
    <item>
      <title>Creating Realistic Art with CSS</title>
      <dc:creator>Alex Trost</dc:creator>
      <pubDate>Mon, 24 Aug 2020 12:32:00 +0000</pubDate>
      <link>https://dev.to/trostcodes/creating-realistic-art-with-css-2id6</link>
      <guid>https://dev.to/trostcodes/creating-realistic-art-with-css-2id6</guid>
      <description>&lt;p&gt;It can be challenging enough to use CSS to match the exact layout you're going for, but could you imagine using it to paint a landscape? Or recreate an intricate playing card? Or even create a realistic portrait? That's exactly how Ben Evans uses CSS, and the methods he uses to make his art are fascinating.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--drgpIAH4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4usptpgf1g9murz03byy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--drgpIAH4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4usptpgf1g9murz03byy.png" alt="The Art of Ben Evans - A montage of the artwork we're covering in the article"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I could write pages about how detailed and beautiful each of these pieces are. I love it when people push the limits of HTML and CSS, so we had to bring Ben in and learn his techniques!&lt;/p&gt;

&lt;h2&gt;
  
  
  Unique HTML
&lt;/h2&gt;

&lt;p&gt;The first thing that struck me when I look through Ben's code was HTML. There's an intense amount of styling happening, and yet he isn't using a single class or id. For example, here's the first 12 lines of code in his landscape piece:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;landscape&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;sky&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;x&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;x&amp;gt;&amp;lt;/x&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;x&amp;gt;&amp;lt;/x&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;x&amp;gt;&amp;lt;/x&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/x&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;x&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;x&amp;gt;&amp;lt;/x&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;x&amp;gt;&amp;lt;/x&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;x&amp;gt;&amp;lt;/x&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;x&amp;gt;&amp;lt;/x&amp;gt;&lt;/span&gt;
      ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ben explains that he's obsessed with small code and likes the appearance of the &lt;code&gt;&amp;lt;x&amp;gt;&lt;/code&gt; elements. They're custom elements so there's no default CSS to battle against. For your own mental model, you can think of them as behaving just like divs.&lt;/p&gt;

&lt;p&gt;So how does he style all these elements if they don't have classes?&lt;/p&gt;

&lt;h2&gt;
  
  
  Styling with nth-of-type
&lt;/h2&gt;

&lt;p&gt;Ben creates a bunch of elements in his HTML and then moves to his CSS. There he doesn't need to worry about naming each bit, because he's using the &lt;code&gt;nth-of-type&lt;/code&gt; selector. This way he doesn't have to name things or change his HTML.&lt;/p&gt;

&lt;p&gt;You might think this makes it harder to keep track of, but Ben leaves comments by the major pieces and that makes it easier to sort through.&lt;/p&gt;

&lt;p&gt;A great tip from Ben for anyone trying CSS illustration: Start with the background and work forward instead of using z-index or translateZ. Ben says, "Safari in particular gets very confused with pseudo-elements and z positioning."&lt;/p&gt;

&lt;h2&gt;
  
  
  Responsive rems
&lt;/h2&gt;

&lt;p&gt;The fact that all of these pieces are responsive is pretty dang neat. How does he do it?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1vmin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;vmin&lt;/code&gt; unit responds to the viewport's smallest side, so it will decrease if the screen gets smaller. The &lt;code&gt;rem&lt;/code&gt; unit is relative to the font-size of the root element. So if we base everything in rems, they're all relative to the same value. Great technique!&lt;/p&gt;

&lt;h2&gt;
  
  
  Drawing Techniques
&lt;/h2&gt;

&lt;p&gt;Ben sets the elements he's drawing with to &lt;code&gt;position: absolute; top: 0; left: 0;&lt;/code&gt; so that they leave the document flow. Then he moves them into place by using &lt;code&gt;transform: translate3d()&lt;/code&gt;. He shapes the pieces with &lt;code&gt;border-radius&lt;/code&gt; and various &lt;code&gt;transform&lt;/code&gt;s, and sizes them with &lt;code&gt;rems&lt;/code&gt;. Then most of the actual drawing uses &lt;code&gt;background: linear-gradient&lt;/code&gt; and/or &lt;code&gt;box-shadow&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;box-shadow&lt;/code&gt; and &lt;code&gt;linear-gradient&lt;/code&gt; are extra useful because they allow for multiple values separated by commas. Let's see how he used this technique to make the hair of the King of Hearts.&lt;/p&gt;

&lt;h2&gt;
  
  
  King of Hearts
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9XK7XWvd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tnpuv2ccpehgm8uzx3iw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9XK7XWvd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tnpuv2ccpehgm8uzx3iw.png" alt="A close up of a playing card illustrated with CSS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Box Shadow Hair
&lt;/h3&gt;

&lt;p&gt;I've mainly used the &lt;code&gt;box-shadow&lt;/code&gt; element for making soft blurry shadows under cards and other elements. Ben is using it for WAY more creative purposes in his work! The hair on the king is actually multiple layers of box-shadow. Let's check it out by messing with it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dYNEwJQ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/urpwnqzz5e65ilm9to14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dYNEwJQ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/urpwnqzz5e65ilm9to14.png" alt="A diagram showing how box-shadow is used to draw the hair"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By using commas you can put multiple box-shadows on a single element. Ben alternates blue and white, increasing the offset each time to space them out. In my version, I changed the &lt;code&gt;$blue&lt;/code&gt; to different colors to show us how it's working.&lt;/p&gt;

&lt;p&gt;The key for crisp lines? Setting the third property, &lt;code&gt;blur-radius&lt;/code&gt;, to &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Animation
&lt;/h3&gt;

&lt;p&gt;When you hover over the card it does a nice little spin and flip.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/ivorjetski/embed/ExaKmjw?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Ben's doing a few things to achieve this great effect.&lt;/p&gt;

&lt;p&gt;First, there's a bit of thickness to the card. It's really just two elements with white backs that Ben moves just a bit apart. The flip is quick enough that our eye registers the white in between as thickness. Awesome trick!&lt;/p&gt;

&lt;p&gt;As the card rotates it gets dark when facing down and brighter when facing upwards. You almost don't pick up on it because it's so realistic. Ben has elements covering the front and back that animate between transparent, black, and white. Here's the code for the effect with a nice animation shorthand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;light&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;%,&lt;/span&gt;
  &lt;span class="err"&gt;100&lt;/span&gt;&lt;span class="o"&gt;%,&lt;/span&gt;
  &lt;span class="err"&gt;50&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;25&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;75&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you might not believe it, but the back of the card is just a single element. Pretty awesome.&lt;/p&gt;

&lt;p&gt;Check out the video &lt;a href="https://www.youtube.com/watch?v=mUfsozWywwM"&gt;timelapse&lt;/a&gt; for this one to watch it all come together. Check out the &lt;a href="https://codepen.io/ivorjetski/pen/ExaKmjw"&gt;King of Hearts&lt;/a&gt; on CodePen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Isla
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qnIvaAKt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nvejhfgu18a17nui14tx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qnIvaAKt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nvejhfgu18a17nui14tx.png" alt="A portrait of a girl drawn in CSS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was the first piece I saw of Bens, and it's still probably my favorite. All the subtle touches he added to this to make the skin feel more realistic are just fantastic.&lt;/p&gt;

&lt;p&gt;If you look close you can see that the iris is a bunch of rounded squares rotated around the center point. Ben used the same technique in the next piece for the center of the lemons.&lt;/p&gt;

&lt;p&gt;The perfectly detailed hair really makes this piece. The eyelashes, eyebrows, face fuzz, and head hair all have different properties and make it feel more realistic. Ben's using &lt;code&gt;box-shadow&lt;/code&gt; here in a more complex way than he did for the King's hair. Instead of white between the colors, he makes the gap transparent and changes the color to add depth.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/ivorjetski/embed/dBYWWZ?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Here's a &lt;a href="https://www.youtube.com/watch?v=py8Nl_7Furc"&gt;timelapse&lt;/a&gt; of Ben making the piece, and here's &lt;a href="https://codepen.io/ivorjetski/pen/dBYWWZ"&gt;Isla on CodePen&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Water and Lemons
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cpSPN-mD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1kd4gxgnavqyniu2lkxq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cpSPN-mD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1kd4gxgnavqyniu2lkxq.png" alt="A glass of water and lemons, illustrated in CSS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  CSS Glass
&lt;/h3&gt;

&lt;p&gt;I assumed the most difficult part of this piece was the glass. All the refractions and highlights are perfect and make this glass look so good!&lt;/p&gt;

&lt;p&gt;Turns out I was mistaken. Ben says, "The main thing I have learned through all my CSS art is that man-made materials are a lot easier to draw with CSS than organic materials."&lt;/p&gt;

&lt;p&gt;Makes sense now that I think about it. The shapes and coloring of the lemons are much more complex than most man-made things. Ben even points to our Frontend Friend &lt;a href="https://codepen.io/raczo/pen/xxZyQGo"&gt;Oscar Salazar's awesome glass ball&lt;/a&gt; as an example of glass done well in CSS!&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/ivorjetski/embed/xMJoYO?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Landscape
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TWNzdZlx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/m8969f32l62213tif59d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TWNzdZlx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/m8969f32l62213tif59d.png" alt="A landscape illustration of a town overlooking the ocean"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not only is this piece stunning, but it holds a clever SCSS trick that lets the viewer tweak the colors. At the top of the CSS you see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;v&lt;/span&gt; &lt;span class="nt"&gt;CHANGE&lt;/span&gt; &lt;span class="nt"&gt;THE&lt;/span&gt; &lt;span class="nt"&gt;COLOUR&lt;/span&gt; &lt;span class="nt"&gt;OF&lt;/span&gt; &lt;span class="nt"&gt;THE&lt;/span&gt; &lt;span class="nt"&gt;SUN&lt;/span&gt; &lt;span class="nt"&gt;v&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt;

&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;sun1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;#f2de6f&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What's cool is that by using SCSS color functions, every other color is based on this one color. From that seed, Ben shifts the hue, changes the saturation, brightness, and opacity to create the rest of the colors.&lt;/p&gt;

&lt;p&gt;As an example, let's set the variable &lt;code&gt;$start&lt;/code&gt; to &lt;code&gt;aqua&lt;/code&gt; then use the &lt;code&gt;adjust-hue&lt;/code&gt; function to make a new color. Hue is a value between &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;360&lt;/code&gt; as you can see in the color wheel below. We can make a new color by increasing the teal's hue by &lt;code&gt;60deg&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--flYQ1fIZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gjvmhpy4c7cwtjo10qdb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--flYQ1fIZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gjvmhpy4c7cwtjo10qdb.png" alt="The color function adjust-hue and how it changes colors"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result is more of a 'blue' rather than teal. If we were to use &lt;code&gt;-60deg&lt;/code&gt; we'd get a green color.&lt;/p&gt;

&lt;p&gt;Ben is using this function and many other &lt;a href="https://sass-lang.com/documentation/modules/color"&gt;SCSS/Sass color functions&lt;/a&gt; to create his palette from the color you choose.&lt;/p&gt;

&lt;p&gt;Let's look at some examples. On the left is Ben's original color and four of the colors that are based on it. Then check out the results as I change &lt;code&gt;$sun1&lt;/code&gt; to &lt;code&gt;orange&lt;/code&gt;, &lt;code&gt;dodgerblue&lt;/code&gt;, and &lt;code&gt;darkgray&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jWLEe03k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oj0jimpipshme2ooxxyl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jWLEe03k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oj0jimpipshme2ooxxyl.png" alt="Creating landscape colors from different seed colors"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What a great way to utilize SCSS color functions! I love this concept and would love to see more people use it in their work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Halftone Dots
&lt;/h3&gt;

&lt;p&gt;If you look closely you'll notice a dot pattern in the water similar to an old-school comic strip.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SEcqrf6G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/74gkhoo6de3bs414njow.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SEcqrf6G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/74gkhoo6de3bs414njow.png" alt="A closeup of Halftone dots"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They're called halftone dots, and I didn't realize they could be made with just a couple lines of CSS. Ben shares his solution with us:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;background-image&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;radial-gradient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;blue&lt;/span&gt; &lt;span class="err"&gt;30&lt;/span&gt;&lt;span class="o"&gt;%,&lt;/span&gt; &lt;span class="nf"&gt;#fff&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;background-size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;background-position&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;5&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;5&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ben uses them in this landscape piece to add a bit of texture to the water. He's also using them on parts of the lemons in the previous piece.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/ivorjetski/embed/xxGYWQG?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="https://www.youtube.com/watch?v=rUCVBNNyjC4"&gt;timelapse here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap Up
&lt;/h2&gt;

&lt;p&gt;Well, that's the end of the trail for us today. We learned so much by looking through Ben Evans's work. Ben doesn't use ids or classes but instead picks up the next element to style with &lt;code&gt;nth-of-type&lt;/code&gt;. We saw just how powerful &lt;code&gt;box-shadow&lt;/code&gt; can be, and how Ben uses it to make repetitive shapes or thin, wispy hair. Ben made his landscape customizable through Sass variables, and we saw how they work along with a few examples.&lt;/p&gt;

&lt;p&gt;I hope this inspires you to give some CSS art a try, or maybe just use &lt;code&gt;box-shadow&lt;/code&gt; in a new way on your next web build.&lt;/p&gt;

&lt;p&gt;Huge thanks to Ben for teaching us his techniques. Go check out his &lt;a href="https://www.tinydesign.co.uk/"&gt;website&lt;/a&gt; and follow him on &lt;a href="https://twitter.com/ivorjetski"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>css</category>
      <category>html</category>
      <category>webdev</category>
      <category>design</category>
    </item>
    <item>
      <title>An Introduction to Shaders - Frontend Horse</title>
      <dc:creator>Alex Trost</dc:creator>
      <pubDate>Sun, 26 Jul 2020 18:13:51 +0000</pubDate>
      <link>https://dev.to/trostcodes/an-introduction-to-shaders-frontend-horse-pj3</link>
      <guid>https://dev.to/trostcodes/an-introduction-to-shaders-frontend-horse-pj3</guid>
      <description>&lt;p&gt;&lt;em&gt;This is an issue from the newsletter Frontend Horse. This was originally published on July 16th, 2020. Visit &lt;a href="https://frontend.horse" rel="noopener noreferrer"&gt;Frontend.Horse&lt;/a&gt; to subscribe and find more issues.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Howdy, and welcome to the thoroughbred web-dev newsletter!&lt;/p&gt;

&lt;p&gt;We've got something extra special on the trail this week. In collaboration with the amazing &lt;a href="https://www.ilithya.rocks" rel="noopener noreferrer"&gt;ilithya&lt;/a&gt;, we're bringing you an introduction to &lt;strong&gt;shaders&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Shaders can be a super power for a frontend developer, so it's good to have a general understanding of what they are and how they work. That's what this issue is all about.&lt;/p&gt;

&lt;p&gt;It's an overview of some main shader concepts and will serve as a gentle introduction to the wide world of shaders. If you already have some shader experience, this might help you solidify some of your understanding as well.&lt;/p&gt;

&lt;p&gt;In a future issue we'll dive into the awesome shaders &lt;a href="https://codepen.io/ilithya" rel="noopener noreferrer"&gt;ilithya makes on CodePen&lt;/a&gt;, so keep an eye out for that.&lt;/p&gt;

&lt;p&gt;Let's hit the trail and learn about &lt;strong&gt;shaders&lt;/strong&gt;!&lt;/p&gt;




&lt;h2&gt;
  
  
  A Conceptual Shader Introduction
&lt;/h2&gt;

&lt;p&gt;Shaders can feel a bit overwhelming if we immediately jump into the code. Instead, let's gain a high-level understanding of shaders by using a metaphor.&lt;/p&gt;

&lt;h4&gt;
  
  
  A Pixel Classroom
&lt;/h4&gt;

&lt;p&gt;Let's imagine a classroom of pixel students. Real screens can hold thousands of pixels, but for simplicity,  there are just 16 pixels in this classroom representing our screen. The students' desks are lined up in 4 rows and 4 columns.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkqggu615s6vqfl6esezz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkqggu615s6vqfl6esezz.png" alt="A grid of pixels 4 x 4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each pixel is taking a shader test &lt;strong&gt;to determine its color&lt;/strong&gt;. Like any good school, there's &lt;strong&gt;no cheating!&lt;/strong&gt; Each pixel has &lt;strong&gt;the same test&lt;/strong&gt; and has to complete it &lt;strong&gt;on their own&lt;/strong&gt;. Everyone takes the test at the same time and changes color to the answer at the same time.&lt;/p&gt;

&lt;p&gt;So if we want to make a solid pink shader, we'd give everyone a test that returns the color pink.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdlspxk5kw2z874j440bi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdlspxk5kw2z874j440bi.png" alt="The grid of pixels turning pink"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each student gets the same answer because there are no dynamic values. It's all hard-coded.&lt;/p&gt;

&lt;p&gt;So how would we make a gradient?&lt;/p&gt;

&lt;p&gt;We can't hard-code the gradient by handing students slightly different tests. &lt;strong&gt;Remember: each student gets the same test.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;However, our pixel students know where they sit in the classroom, and we can reference their column and row numbers on the test. If the test tells them to set their &lt;strong&gt;opacity&lt;/strong&gt; of the pink color equal to 3 divided by their column number, the students across the columns will get:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;0&lt;/code&gt;,&lt;/p&gt;

&lt;p&gt;&lt;code&gt;0.33&lt;/code&gt;,&lt;/p&gt;

&lt;p&gt;&lt;code&gt;0.66&lt;/code&gt;,&lt;/p&gt;

&lt;p&gt;and  &lt;code&gt;1.0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With that set to their opacity our classroom will go from white to pink like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fd8xsdx1pmvvos1rmce2d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fd8xsdx1pmvvos1rmce2d.png" alt="pixels-3.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This little pixel classroom is heavily simplified but helps us grasp some basic shader principles. Shader artists use factors like pixel position, the time, and math like sine waves and random values to create amazing visuals.&lt;/p&gt;

&lt;p&gt;It's important to note that shaders are great for animations. Our pixels are super fast and can take 60 tests every second (60 frames per second), as long as they're not too complex.&lt;/p&gt;

&lt;p&gt;Now that we have a metaphor to work with, let's transition to reality and learn what shaders are.&lt;/p&gt;

&lt;h4&gt;
  
  
  So what is a shader?
&lt;/h4&gt;

&lt;p&gt;Shaders are a special program that run on your computer's Graphics Processing Unit (GPU) instead of the CPU. The shader program gets called for each individual pixel in parallel, making them super fast. This was our classroom all taking the test at the same time.&lt;/p&gt;

&lt;p&gt;This comes with a catch, though: you need to design shaders differently than you might a JavaScript function.&lt;/p&gt;

&lt;p&gt;If I wanted to color a grid of pixels with JavaScript I might write a loop like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Loop across each pixel and change one at a time&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;someColor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But this changes one pixel at a time in the order of the loops. This would be like our students being told by the teacher one at a time what color they should show.&lt;/p&gt;

&lt;p&gt;With shaders you only have access to the inside of the loop, so you’d write this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="c1"&gt;// function called for every pixel at the same time&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;COLOR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;some_color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shaders are incredibly versatile and are used in graphics across movies, video games, and the web! That animated gradient on &lt;a href="https://www.stripe.com/" rel="noopener noreferrer"&gt;the new Stripe site&lt;/a&gt;? That’s a shader!&lt;/p&gt;

&lt;h4&gt;
  
  
  Vertex and Fragment Shaders
&lt;/h4&gt;

&lt;p&gt;There are two types of shaders, &lt;strong&gt;vertex shaders&lt;/strong&gt; and &lt;strong&gt;fragment shaders&lt;/strong&gt;. While we're only talking about fragment shaders today, It's helpful to briefly touch on the difference. Vertex shaders change the &lt;strong&gt;vertices of a shape&lt;/strong&gt;, while fragment shaders change the &lt;strong&gt;pixels inside that shape&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A vertex shader defines the &lt;strong&gt;shape&lt;/strong&gt; of our pixel classroom while the fragment shader controls the &lt;strong&gt;color of the pixels&lt;/strong&gt; inside.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq2fmus50r9douh7w4d60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq2fmus50r9douh7w4d60.png" alt="verts-pixels.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We need both to make our image, but our vertex shader is very simple when we want to focus on the colors.&lt;/p&gt;

&lt;p&gt;Cool, so I'm beginning to understand what shaders are, and I know they’re awesome. How tough is it to become a shader expert?&lt;/p&gt;

&lt;h4&gt;
  
  
  Are shaders hard?
&lt;/h4&gt;

&lt;p&gt;Ilithya explained that getting started with shaders can be tough. They’re &lt;strong&gt;not written in JavaScript&lt;/strong&gt;, but in OpenGL Shading Language (&lt;strong&gt;GLSL&lt;/strong&gt;), a C-style language. She also said that yeah, you should be decent with math if you’re going to be making &lt;em&gt;custom&lt;/em&gt; shaders.&lt;/p&gt;

&lt;p&gt;But ilithya told me how to start learning shaders &lt;em&gt;without&lt;/em&gt; getting a mathematics degree or learning C:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tweak other people’s shaders.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For any piece of code you’re trying to figure out: &lt;strong&gt;try to break it&lt;/strong&gt;. Learn what each line does through trial and error. Then add comments as you figure it out.&lt;/p&gt;

&lt;p&gt;Use a simple shader example as a starting point. Find the numbers in the shader and change them to see what they do. This playing with values, and changing a &lt;code&gt;+&lt;/code&gt; to a &lt;code&gt;-&lt;/code&gt; to see what happens is exactly how ilithya got started.&lt;/p&gt;

&lt;p&gt;Now we've covered a conceptual overview of shaders. Let's take a look at a few shaders to see some of what's possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shader Examples
&lt;/h2&gt;

&lt;p&gt;Here are just a few examples of shaders used on the web. I recommend searching on CodePen and other similar sites for 'shader' to see what's out there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frcz6w2jqypqsmhsmec61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frcz6w2jqypqsmhsmec61.png" alt="grunge-poster.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/ilithya/full/MWwxEvp" rel="noopener noreferrer"&gt;ilithya&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq0ymx7e748kp1sk726i0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq0ymx7e748kp1sk726i0.png" alt="mav-farm.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mav.farm/" rel="noopener noreferrer"&gt;Mav Farm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fw5k2ulxsgu4467569yty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fw5k2ulxsgu4467569yty.png" alt="halftone-circles.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/terabaud/pen/BajJbgd" rel="noopener noreferrer"&gt;Lea Rosema&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz2z2q582ylvpavq7tlpf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz2z2q582ylvpavq7tlpf.png" alt="psychadelic-waves.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/Yakudoo/pen/rJjOJx" rel="noopener noreferrer"&gt;Karim Maaloul&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Shader Resources
&lt;/h2&gt;

&lt;h4&gt;
  
  
  The Book of Shaders
&lt;/h4&gt;

&lt;p&gt;Ilithya pointed us to the holy grail of shader resources: &lt;a href="https://thebookofshaders.com/" rel="noopener noreferrer"&gt;The Book of Shaders&lt;/a&gt;. The authors take you by the hand and show you how a few basic shaders work. Like giving you red and yellow paint, then you mix them yourself to discover orange.&lt;/p&gt;

&lt;p&gt;The site has tons of working code demos, and they even point out lines of code that you should edit to change the effect. They even have a super helpful &lt;a href="https://thebookofshaders.com/appendix/04/" rel="noopener noreferrer"&gt;introduction for those coming from JS&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  ShaderToy
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.shadertoy.com/" rel="noopener noreferrer"&gt;ShaderToy&lt;/a&gt; is basically a CodePen dedicated purely to shaders. There’s some incredible stuff here, so don’t get overwhelmed. Start with the Book of Shaders to learn the basics, but peek here to see what’s possible.&lt;/p&gt;

&lt;p&gt;Check out &lt;a href="https://www.ilithya.rocks/" rel="noopener noreferrer"&gt;ilithya’s site&lt;/a&gt; and &lt;a href="https://codepen.io/ilithya" rel="noopener noreferrer"&gt;her CodePen -&amp;gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  So Long, Partner
&lt;/h2&gt;

&lt;p&gt;Well, that’s the end of the trail for this week. I appreciate you riding with me.&lt;/p&gt;

&lt;p&gt;Follow &lt;strong&gt;&lt;a href="https://twitter.com/frontendhorse" rel="noopener noreferrer"&gt;@FrontendHorse on Twitter&lt;/a&gt;&lt;/strong&gt;, and if you enjoyed this, I’d be over the moon if you share it with a friend or tweet about it.&lt;/p&gt;

&lt;p&gt;Extra special thanks to ilithya for helping me write this piece for &lt;strong&gt;two weeks!&lt;/strong&gt; It went through a ton of revisions and she provided so much information and feedback for both parts of the issue. Please assume that any mistakes are mine and anything clever was her insight. It was a huge collaborative effort and I'm incredibly thankful!&lt;/p&gt;

&lt;p&gt;This issue was very different from previous issues, so I'd love to know what you think. You can reply to this email to let me know. I read everything I get.&lt;/p&gt;

&lt;p&gt;This is the part where we ride off into the sunset. You take care.&lt;/p&gt;

&lt;p&gt;Your Neigh-bor,&lt;/p&gt;

&lt;p&gt;Alex&lt;/p&gt;




&lt;p&gt;If you liked this post, head to &lt;a href="https://www.frontend.horse" rel="noopener noreferrer"&gt;Frontend.Horse&lt;/a&gt; to subscribe! You'll get the next issue before it's posted here on Dev.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Gooey SVG Effects, Game UI, and Meetups - Frontend Horse #7</title>
      <dc:creator>Alex Trost</dc:creator>
      <pubDate>Mon, 20 Jul 2020 19:31:13 +0000</pubDate>
      <link>https://dev.to/trostcodes/gooey-svg-effects-game-ui-and-meetups-frontend-horse-7-414i</link>
      <guid>https://dev.to/trostcodes/gooey-svg-effects-game-ui-and-meetups-frontend-horse-7-414i</guid>
      <description>&lt;p&gt;&lt;em&gt;This is an issue from the newsletter Frontend Horse. This was originally published on July 16th, 2020. Visit &lt;a href="https://frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe and find more issues.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Helloooo, and welcome to &lt;em&gt;the Seabiscuit of frontend newsletters&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;We’ve got a coffee cup, a Zelda UI tutorial, and a meetup I'm hosting all ready for race day. I hope you're wearing &lt;a href="https://www.thetrendspotter.net/what-to-wear-to-the-races/"&gt;some ridiculous clothing and your fanciest hat&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So place your bets, find your seats, and let’s get started!&lt;/p&gt;




&lt;h3&gt;
  
  
  CODEPEN
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Coffee For You
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Sof8MZ8r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jlikjuvwr1w9fwzm8j2v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sof8MZ8r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jlikjuvwr1w9fwzm8j2v.png" alt="A CSS drawn Coffee Cup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m amazed by the level of detail and care that’s gone into &lt;a href="https://twitter.com/BauerVadim"&gt;Vadim Bauer&lt;/a&gt;’s gorgeous &lt;a href="https://codepen.io/v_Bauer/pen/zYrBoJa"&gt;cup of coffee&lt;/a&gt;. It's a great piece and &lt;em&gt;I just had to know how he made it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/v_Bauer/embed/zYrBoJa?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The detailed CSS drawing is stunning in its own right. However, the part that dropped my jaw was the animation on the bubbles. They drift from the center of the cup towards the edge to join the other foam there. When they get close, the edge foam moves outward like real form on liquid would!&lt;/p&gt;

&lt;p&gt;How the heck is he achieving this effect?&lt;/p&gt;

&lt;p&gt;His answer? &lt;strong&gt;SVG Filters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Welp, it’s official: I’m crushing &lt;em&gt;hard&lt;/em&gt; on SVG filters. They’re just so dang versatile! In previous issues we’ve seen them used to make water and lightning effects. Now you’re telling me that they can make stuff goop together? So rad.&lt;/p&gt;

&lt;p&gt;Vadim breaks down the effect:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It’s an SVG filter that basically applies a huge blur to the elements and then increases the contrast for the alpha channel, so that the now bigger shape doesn’t look blurred anymore. The result is the elements merging when they get close to each other.&lt;br&gt;
It’s known as the gooey effect. You can find a pretty good post about it on &lt;a href="https://css-tricks.com/gooey-effect/"&gt;CSS-Tricks: Gooey Effect&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is an awesome tutorial and you can see how it’s similar to Vadim’s effect.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wnq8f6G1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/iylaexals77zes24pqsq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wnq8f6G1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/iylaexals77zes24pqsq.gif" alt="Four circles that 'goo' together"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The other thing I loved about “Coffee for you” was the subtle steam that drifted by. Guess how he made it?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;That’s also an SVG filter. This time with feTurbulence for the texture and feDisplacementMap to distort it. The rest was pure trial and error to get it to look like some real steam.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To learn, Vadim recommends digging into the CodePens you admire and playing with them.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Changing things and seeing what happens is always a great way to learn about code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vadim, I couldn’t agree more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/v_Bauer/pen/zYrBoJa"&gt;Check it out -&amp;gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  TUTORIAL
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Building a Zelda UI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aZr7bQzI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/be097r8j4hwtdn5udfqm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aZr7bQzI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/be097r8j4hwtdn5udfqm.png" alt="The Zelda UI menu"&gt;&lt;/a&gt;&lt;br&gt;
I’ve always been a fan of video games, and the Zelda series is by far my favorite franchise. So when my friend Tim sent me a &lt;a href="https://dev.to/flagrede/how-to-replicate-the-zelda-botw-interface-with-react-tailwind-and-framer-motion-part-1-298g"&gt;a Zelda UI tutorial&lt;/a&gt;, how could I not dig into it?&lt;/p&gt;

&lt;p&gt;At first I thought it was just a cool idea, maybe a fun gimmick for a tutorial. But it’s much more than that. The author, &lt;a href="https://twitter.com/flagrede"&gt;Florent Lagrede&lt;/a&gt;, shows you how to build out a quality UI using React, TailwindCSS, and Framer-Motion.&lt;/p&gt;

&lt;p&gt;This is the gummy-vitamin of tutorials. Zelda is the hook, but there’s great stuff here, too.&lt;/p&gt;

&lt;p&gt;So much of teaching is packaging the content in ways that the learner enjoys. That’s why people like Bill Nye the Science Guy was able to sneak so much education into our brains.&lt;/p&gt;

&lt;p&gt;Throughout both articles, Florent decomposes the interface down to small parts, and concretely talks about how he plans to implement it. Turning a design spec into a web layout is such an important skill to develop, and it’s always helpful for me to see how other people approach it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aL3gGz-I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fd0qbxfoklqmm2d8bsw8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aL3gGz-I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fd0qbxfoklqmm2d8bsw8.png" alt="Making a wireframe from the final product"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.gameuionweb.com/zelda-botw/inventory"&gt;The result&lt;/a&gt; is just awesome. Not only can you navigate with your keyboard the way you’d expect to in the game, but it even accurately combines character buffs you get from wearing certain parts of clothing.&lt;/p&gt;

&lt;p&gt;The tutorials are a part of something larger: Florent’s project, &lt;a href="https://www.gameuionweb.com/"&gt;Game UI on Web&lt;/a&gt;. It’s Florent’s site where he’s recreating video game UIs and creating tutorials on his process. To start he’s recreated menus from Hollow Knight and Zelda. It started when Florent was looking through the UI resource &lt;a href="https://www.interfaceingame.com"&gt;Interface In Game&lt;/a&gt;, which has hundreds of stills and videos from all kinds of video games. He wondered &lt;em&gt;why can’t we do this on the web&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;So he built out the &lt;a href="https://www.gameuionweb.com/hollow-knight"&gt;Hollow Knight demo&lt;/a&gt; as a challenge, and had so much fun he got hooked on making game UIs.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IhaJjzRO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7k1x6p2rpt923t67ve15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IhaJjzRO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7k1x6p2rpt923t67ve15.png" alt="Hollow Knight UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Then I came up with the idea to make tutorials that would focus on &lt;em&gt;doing&lt;/em&gt; instead of only &lt;em&gt;reading&lt;/em&gt;. As developers, I think we learn best by doing. However, it can be difficult to get started. I find that having a motivating goal can help you begin. Having fun while learning makes the process even easier.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I asked Florent what he thought web developers could learn from building these game interfaces? He said:&lt;br&gt;
• How to make interactions more enjoyable, visible and understandable&lt;br&gt;
• Small details that add to the experience&lt;br&gt;
• Using sounds in an interface&lt;/p&gt;

&lt;p&gt;While web dev has a lot of ‘sameness’ right now, Florent’s projects and tutorials on GameUIonWeb feel unique. Creating game UIs with web technology is such a great concept. So many UX design principles carry over.&lt;/p&gt;

&lt;p&gt;Picking apart a well designed game UI will deepen your understanding of web and user experience design. Plus, as the &lt;a href="https://whimsical.club/"&gt;web becomes more whimsical&lt;/a&gt;, some of these game dev skills are going to come in handy!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s to Come&lt;/strong&gt;&lt;br&gt;
Florent has big plans for Game UI on Web. He wants to build more game UIs that go beyond the ‘inventory menu’ type that he’s done already. He also wants to write tutorials that teach web developers the tricks that bring delight and joy to games.&lt;/p&gt;

&lt;p&gt;I think it’s safe to say that Florent wants to make the web a lot more fun.&lt;/p&gt;

&lt;p&gt;Check out &lt;a href="https://dev.to/flagrede/how-to-replicate-the-zelda-botw-interface-with-react-tailwind-and-framer-motion-part-1-298g"&gt;Part 1&lt;/a&gt; and &lt;a href="https://dev.to/flagrede/how-to-replicate-the-zelda-botw-interface-with-react-tailwind-and-framer-motion-part-2-3nd4"&gt;Part 2&lt;/a&gt; of his Zelda Breath of the Wild tutorial. Then check out &lt;a href="https://www.gameuionweb.com/"&gt;Game UI on Web&lt;/a&gt; to see the demos of what he’s built so far.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;This &lt;a href="https://interfaceingame.com/"&gt;Interface In Game&lt;/a&gt; site is such a fantastic resource. For example, check out this huge collection of &lt;a href="https://interfaceingame.com/games/animal-crossing-new-horizons/"&gt;Animal Crossing screenshots and videos&lt;/a&gt;!&lt;br&gt;
Florent created his excellent wireframes in &lt;a href="https://excalidraw.com/"&gt;Excalidraw&lt;/a&gt;, a free web-based drawing tool.&lt;/p&gt;




&lt;h3&gt;
  
  
  EVENT
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Codefwd: Design Patterns
&lt;/h2&gt;

&lt;p&gt;If you’re reading this as it comes out, then I have some exciting news! I’m going to be hosting a meetup with a wonderful round of talks and I’d LOVE to see you there!&lt;/p&gt;

&lt;p&gt;We’ll be streaming over on the &lt;a href="https://www.twitch.tv/codefwd"&gt;Codefwd Twitch channel&lt;/a&gt; starting at 6PM EST. Please ride through and throw some horse puns into the chat! It’s my first time hosting a remote conference, so I’m pretty excited.&lt;/p&gt;

&lt;p&gt;Here’s the lineup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responsive Design in 2020 - Kilian Valkhof&lt;/li&gt;
&lt;li&gt;Event Driven Serverless Microservices - Gareth Mc Cumskey&lt;/li&gt;
&lt;li&gt;Simple Rules for Complex Systems - Jake Burden&lt;/li&gt;
&lt;li&gt;MongoDB Schema Design Best Practices - Joe Karlsson&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope to see you there!&lt;/p&gt;




&lt;h2&gt;
  
  
  So Long, Partner
&lt;/h2&gt;

&lt;p&gt;And it's a photo finish! What a race, I don't care who won, I'm just glad you were here for it!&lt;/p&gt;

&lt;p&gt;Follow &lt;a href="https://twitter.com/frontendhorse"&gt;@FrontendHorse on Twitter&lt;/a&gt;. If you enjoyed this I’d be over the moon if you share it with a friend or tweet about it.&lt;/p&gt;

&lt;p&gt;Special thanks to Vadim Bauer and Florent Lagrede for speaking with me about their work.&lt;/p&gt;

&lt;p&gt;Now let's get out of here before the next race starts. You take care.&lt;/p&gt;

&lt;p&gt;Your Neigh-bor,&lt;/p&gt;

&lt;p&gt;Alex&lt;/p&gt;




&lt;p&gt;If you liked this post, head to &lt;a href="https://www.frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe! You'll get the next issue before it's posted here on Dev.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>html</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Frontend Horse #6  - Rockstars, Logo Grids, &amp; Image APIs</title>
      <dc:creator>Alex Trost</dc:creator>
      <pubDate>Tue, 07 Jul 2020 11:46:19 +0000</pubDate>
      <link>https://dev.to/trostcodes/rockstars-logo-grids-image-apis-22k3</link>
      <guid>https://dev.to/trostcodes/rockstars-logo-grids-image-apis-22k3</guid>
      <description>&lt;p&gt;&lt;em&gt;This is an issue from the newsletter Frontend Horse. This was originally published on July 2nd, 2020. Visit &lt;a href="https://frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe and find more issues.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Howdy, and welcome to the most educational horse trail on the internet! Saddle up, because we’re going to be racing through SVG filters, image APIs, and alignment techniques.&lt;/p&gt;

&lt;p&gt;We might stop for a snack or two, but we won’t dilly-dally. &lt;br&gt;
&lt;strong&gt;We never dilly-dally&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s ride!&lt;/p&gt;


&lt;h3&gt;
  
  
  CODEPEN
&lt;/h3&gt;
&lt;h2&gt;
  
  
  Slash
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7suCuBB2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v8lzpw9kwxp2bxrssmj2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7suCuBB2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v8lzpw9kwxp2bxrssmj2.png" alt="Slash by Oscar Salazar"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codepen.io/raczo/pen/YzwZNed"&gt;This SVG animation&lt;/a&gt; is so much fun that it actually won &lt;a href="https://greensock.com/cpc/"&gt;GreenSock’s CodePen challenge&lt;/a&gt;! Based on &lt;a href="https://dribbble.com/shots/6576616-Sliding-Slash"&gt;this excellent Dribble shot&lt;/a&gt;, it shows guitarist Slash shredding on his guitar as he slides across an infinite stage. The coolest part to me is the lightning and shock waves that follow every strum!&lt;/p&gt;

&lt;p&gt;The developer, &lt;a href="https://twitter.com/twistneck"&gt;Oscar Salazar&lt;/a&gt;, was kind enough to show us some of his techniques, and even share some fantastic resources. &lt;/p&gt;

&lt;p&gt;To get the remarkable lightning effect, Oscar applied two SVG filters to a long thin rectangle: &lt;code&gt;feTurbulence&lt;/code&gt; and &lt;code&gt;feDisplacementMap&lt;/code&gt;. We can see how those two filters can warp what they’re applied to:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fQXVAJ4b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ixj33b8s8s1jldun7jzh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fQXVAJ4b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ixj33b8s8s1jldun7jzh.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we comment out the HTML filters, we can see the dramatic effect they have on the piece!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R-pB9QDD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/40biijleetblk6zb8ixa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R-pB9QDD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/40biijleetblk6zb8ixa.png" alt="Slash with and without SVG Filters"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you use these filters, the content can often overflow, Oscar says. You can see that the lightning bolt gets much bigger than the original line. Oscar’s tip: avoid clipping issues by giving the bolt a parent element with plenty of padding.  &lt;/p&gt;

&lt;p&gt;Those circular shock waves add so much to the effect, and it turns out they’re just a div! Oscar took a square div, made it a circle with &lt;code&gt;border-radius: 50%;&lt;/code&gt; and applied those same wavy filters. Great solution!&lt;/p&gt;

&lt;p&gt;It’s subtle, but the blur effect on each strum is the icing on the cake. Oscar added an &lt;code&gt;feGaussianBlur&lt;/code&gt; filter to the body with a value of &lt;code&gt;0&lt;/code&gt;. This turns off the effect but allows him to animate that value, bumping up the blur when he wanted. If you change line 115 of his code to have &lt;code&gt;stdDeviation="5"&lt;/code&gt; you’d see a very blurry Slash!&lt;/p&gt;

&lt;p&gt;Oscar credits the blur technique to friend of the newsletter, &lt;a href="https://twitter.com/jh3yy"&gt;Jhey&lt;/a&gt;. Oscar watched him make &lt;a href="https://codepen.io/jh3y/pen/rNxjPNX"&gt;this CodePen&lt;/a&gt; on a live-stream and was able to use a similar effect.&lt;/p&gt;

&lt;p&gt;Oscar used a similar lightning effect on this fun &lt;a href="https://codepen.io/raczo/pen/BajBdmJ"&gt;Pokedex&lt;/a&gt; he made previously.  We also saw Kasper De Bruyne use it to make water back in &lt;a href="https://frontend.horse/issues/1/"&gt;Issue #1&lt;/a&gt;! &lt;/p&gt;
&lt;h4&gt;
  
  
  Resources
&lt;/h4&gt;

&lt;p&gt;One resource Oscar shared is a great tutorial, &lt;a href="https://tympanus.net/codrops/2019/01/15/svg-filters-101/"&gt;SVG Filters 101&lt;/a&gt;, by &lt;a href="https://twitter.com/SaraSoueidan"&gt;Sara Soueidan&lt;/a&gt;. The other is a super useful &lt;a href="https://yoksel.github.io/svg-filters/"&gt;SVG Filter Playground&lt;/a&gt; by  &lt;a href="https://twitter.com/yoksel_en"&gt;@yoksel_en&lt;/a&gt;. I hadn’t seen either of these before, and they’re both excellent.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/raczo/pen/YzwZNed"&gt;Check it out -&amp;gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  TUTORIAL
&lt;/h3&gt;
&lt;h2&gt;
  
  
  Aligning Logo Images in CSS
&lt;/h2&gt;

&lt;p&gt;Ahmad Shadeed has &lt;a href="https://ishadeed.com/article/aligning-logos-css/"&gt;a great tutorial&lt;/a&gt; for making a logo grid of proportionately sized elements. When you have a grid of images with different proportions, it’s tough to get them to all look equal. &lt;/p&gt;

&lt;p&gt;Here’s the key part of the tutorial: set a width and height and use &lt;code&gt;object-fit: contain;&lt;/code&gt;. Check out the difference!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--25LzRujT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t8jiqftincfdsff0x3b1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--25LzRujT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t8jiqftincfdsff0x3b1.png" alt="Aligning logo images"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://ishadeed.com/article/aligning-logos-css/"&gt;Image credit: Ahmad Shadeed&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahmad sums it up: “The great thing about &lt;code&gt;object-fit: contain&lt;/code&gt; is that no matter how the width or the height is, the logo is &lt;strong&gt;contained&lt;/strong&gt; within them, without distorting it.”&lt;/p&gt;

&lt;p&gt;I also learned that you can target specific file types with CSS: &lt;code&gt;img[src$='.jpg']&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lots of good stuff in this one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ishadeed.com/article/aligning-logos-css/"&gt;Check it out -&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  HORSE RESOURCE
&lt;/h3&gt;
&lt;h2&gt;
  
  
  Placeholder Images
&lt;/h2&gt;

&lt;p&gt;When I’m in the early stages of a project, building out components that have images can be a pain. I don’t want to switch between my image editor and code editor if I can help it. Luckily there are a couple of great resources that make using images in projects way more fun.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt; is the common choice for free, high-quality images, but did you know they have &lt;a href="https://source.unsplash.com/"&gt;a super simple API&lt;/a&gt;? &lt;/p&gt;

&lt;p&gt;If not: hold your horses. You’re gonna love this.&lt;/p&gt;

&lt;p&gt;Use this API to get a perfectly sized image that matches your search term.&lt;br&gt;
&lt;code&gt;https://source.unsplash.com/{width}x{height}/?{search term}&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Let’s use it to grab a random picture of horses:&lt;br&gt;
&lt;code&gt;https://source.unsplash.com/1600x900/?horses&lt;/code&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IH2qI5xr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/sjsv0pq5lm9ycs5i5ecn.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IH2qI5xr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/sjsv0pq5lm9ycs5i5ecn.jpeg" alt="Horses"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The best part is, there’s no auth you need to worry about, it just works. Use it as if it were a path to any jpg:&lt;br&gt;
&lt;code&gt;&amp;lt;img src="https://source.unsplash.com/1600x900/?horses" alt="Horses, I hope" /&amp;gt;&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Now if your designs change, you don’t have to open photoshop to crop a bunch of pictures. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hot Tip&lt;/strong&gt;&lt;br&gt;
If you’re hitting the same URL over and over, your browser will cache the result and serve up the same image. Images like this don’t look too great.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src="https://source.unsplash.com/550x225/?horses"/&amp;gt;
&amp;lt;img src="https://source.unsplash.com/550x225/?horses"/&amp;gt;
&amp;lt;img src="https://source.unsplash.com/550x225/?horses"/&amp;gt;
&amp;lt;img src="https://source.unsplash.com/550x225/?horses"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X_nPZYty--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/we7r2qblf3uz86dx901o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X_nPZYty--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/we7r2qblf3uz86dx901o.png" alt="Cached Images repeating"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bypass the cache by adding any query onto the end and feeding it a different value. The index of the item works nicely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src="https://source.unsplash.com/550x225/?horses&amp;amp;i=0"/&amp;gt;
&amp;lt;img src="https://source.unsplash.com/550x225/?horses&amp;amp;i=1"/&amp;gt;
&amp;lt;img src="https://source.unsplash.com/550x225/?horses&amp;amp;i=2"/&amp;gt;
&amp;lt;img src="https://source.unsplash.com/550x225/?horses&amp;amp;i=3"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W__lGQUI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7g8kdctcw2mn05m8co7b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W__lGQUI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7g8kdctcw2mn05m8co7b.png" alt="Different images each time"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just like that, our site is &lt;em&gt;mag-neigh-fique&lt;/em&gt;! This is a common cache-busting technique, but especially useful for giving your pages some variety with this API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://source.unsplash.com/"&gt;The Unsplash Source API&lt;/a&gt; has a few other features, but I think this is the most useful.&lt;/p&gt;

&lt;p&gt;One thing to note: Unsplash isn’t great if you need a bunch of user avatars. For that I reach for &lt;a href="https://pravatar.cc/"&gt;Pravatar&lt;/a&gt; or &lt;a href="http://avatars.adorable.io/"&gt;Adorable Avatars&lt;/a&gt; if the app is more fun.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="_https://twitter.com/trostcodes/status/1277371838528708610_"&gt;this thread by Swyx&lt;/a&gt; for inspiring this bit.&lt;/p&gt;

&lt;h3&gt;
  
  
  COMMUNITY
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Around the Stable
&lt;/h2&gt;

&lt;p&gt;Friend of the newsletter Jhey &lt;a href="https://twitter.com/jh3yy/status/1276937907761229824"&gt;gave us an awesome shoutout this week&lt;/a&gt;, along with a bunch of other great newsletters! Check out that thread and subscribe to some of those other newsletters, too. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Naming the community&lt;/strong&gt;&lt;br&gt;
Every cool community has a title for its members. Listeners of the &lt;a href="https://shoptalkshow.com/"&gt;Shoptalk Show&lt;/a&gt; are “Shop-o-maniacs,” for example. So what do you want to be called? Who do I address at the top of each issue? &lt;/p&gt;

&lt;p&gt;Comment on this post or tweet &lt;a href="https://www.twitter.com/frontendhorse"&gt;@FrontendHorse&lt;/a&gt; to help name us, and we can do a poll next week to make it official. The prize is huge for this one: you’ll be able to tell everyone you came up with the name. &lt;em&gt;Forever&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Will they write this accomplishment on your tombstone? Probably.&lt;/p&gt;

&lt;p&gt;I’m excited to hear what you come up with! All ideas welcome!&lt;/p&gt;




&lt;h2&gt;
  
  
  So Long, Partner
&lt;/h2&gt;

&lt;p&gt;Well, that’s the end of the trail for this week. I appreciate you riding with me.&lt;/p&gt;

&lt;p&gt;Follow &lt;a href="_https://twitter.com/frontendhorse_"&gt;@FrontendHorse on Twitter&lt;/a&gt;, and if you enjoyed this, I’d be over the moon if you share it with a friend or tweet about it.&lt;/p&gt;

&lt;p&gt;Special thanks to Oscar Salazar for speaking with me about their work.&lt;/p&gt;

&lt;p&gt;This is the part where we ride off into the sunset. You take care.&lt;/p&gt;

&lt;p&gt;Your Neigh-bor,&lt;/p&gt;

&lt;p&gt;Alex&lt;/p&gt;




&lt;p&gt;If you liked this post, head to &lt;a href="https://www.frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe! You'll get the next issue before it's posted here on Dev.&lt;/p&gt;

</description>
      <category>css</category>
      <category>html</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Frontend Horse #5 - Infinite Scrolling and Slick Animations</title>
      <dc:creator>Alex Trost</dc:creator>
      <pubDate>Fri, 26 Jun 2020 15:51:33 +0000</pubDate>
      <link>https://dev.to/trostcodes/frontend-horse-5-infinite-scrolling-and-slick-animations-4fm2</link>
      <guid>https://dev.to/trostcodes/frontend-horse-5-infinite-scrolling-and-slick-animations-4fm2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is an issue from the newsletter Frontend Horse. This was originally published on June 25th, 2020. Visit &lt;a href="https://frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe and find more issues.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Oh, howdy, I didn’t see you there! I was just saddling up to hit the trail. Care to ride with us? There’s a lot to learn in this issue, so I hope you packed a lunch.&lt;/p&gt;

&lt;p&gt;This week we’re taking a close look at a beautiful portfolio site menu and a CodePen demo for an impressive carousel library!&lt;/p&gt;




&lt;h3&gt;
  
  
  SITE SHOWCASE
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Marvin Schwaibold
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DF2G6CLR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wup6pk47rk736woqhrsb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DF2G6CLR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wup6pk47rk736woqhrsb.png" alt="A page for Isle of Dogs, on the portfolio site of Marvin Schwaibold"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I can’t say enough about &lt;a href="https://www.marvinschwaibold.com/"&gt;the incredible portfolio site of Marvin Schwaibold&lt;/a&gt;. I love the font choice and elegant design, the way every element has its own transition when you go to a new page, and the perfect execution.&lt;/p&gt;

&lt;p&gt;I spoke with Jesper Vos, the site’s developer, to learn some of his techniques. Jesper was kind enough to show us all the magic that went into making the &lt;a href="https://www.marvinschwaibold.com/projects"&gt;Projects Page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BhPwzjp0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/w1xc8lzxfz5ul98c5phs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BhPwzjp0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/w1xc8lzxfz5ul98c5phs.png" alt="The sideways list of portfolio pieces"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Technique: Infinite Scroll
&lt;/h4&gt;

&lt;p&gt;The page &lt;em&gt;seems&lt;/em&gt; simple: a list of projects flipped on its side so that as you scroll down, they move from right to left. There are 15 projects on display here, and yet you can scroll forever. The trick here is to double the list to make 30 items. Then, when the user is about to scroll to the end, you instantly snap them back to the start.&lt;/p&gt;

&lt;p&gt;It’s hard to wrap your head around, so here’s how you can visualize it. With your dev tools, change the text on one of the items to something noticeable like “HOOOOOOWDY.” Then, start scrolling and notice that at a certain point, it ‘fixes’ itself. Keep scrolling and watch your “HOOOOOOWDY” come right back around.&lt;/p&gt;

&lt;p&gt;It’s a great trick you can apply to anything to make it appear infinite. I used it  on a couple of &lt;a href="https://codepen.io/a-trost/pen/pXzbbq"&gt;CodePens&lt;/a&gt; myself!&lt;/p&gt;

&lt;h4&gt;
  
  
  Technique: Image Layering
&lt;/h4&gt;

&lt;p&gt;A few changes happen when you hover your mouse over a portfolio piece in the list. Let’s use the portfolio piece “Death of Stalin” as an example.&lt;/p&gt;

&lt;p&gt;For one, the background turns red to match the “Death of Stalin” page. That way if you click through, that part of the page transition has already happened.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P1geOEou--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l3ebvq6r2sf82hju4uzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P1geOEou--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l3ebvq6r2sf82hju4uzt.png" alt="A hover effect where the background changes from tan to red"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An image from the movie appears &lt;em&gt;behind&lt;/em&gt; the “Death of Stalin” text but &lt;em&gt;in front&lt;/em&gt; of the other items. When hovered, the “Death of Stalin” list item gets an &lt;code&gt;active&lt;/code&gt; class, which gives it &lt;code&gt;z-index:2;&lt;/code&gt;. The corresponding image becomes visible and gets a &lt;code&gt;z-index:1;&lt;/code&gt;, and everything else keeps the default &lt;code&gt;z-index&lt;/code&gt; of &lt;code&gt;0&lt;/code&gt;. The other items also drop a bit in opacity, letting you focus on the current element.&lt;/p&gt;

&lt;h4&gt;
  
  
  Technique: Image Physics
&lt;/h4&gt;

&lt;p&gt;My favorite part of this page is the tiny bit of rotation you’ll get on the images based on your mouse’s velocity. Jesper explains that “springy easing gives them that little physical/tactile feeling.” I highly recommend you open your dev tools as you mouse around the page to see the transforms taking place in real-time.&lt;/p&gt;

&lt;p&gt;The site was developed by &lt;a href="https://twitter.com/jesper_vos"&gt;Jesper Vos&lt;/a&gt;, designed by &lt;a href="https://twitter.com/MSchwaibold"&gt;@MSchwaibold&lt;/a&gt; and motion by &lt;a href="https://twitter.com/YaelBienenstock"&gt;@YaelBienenstock&lt;/a&gt;. This same team won the &lt;a href="https://www.awwwards.com/madeleine-dalla-wins-site-of-the-month-march-2020.html"&gt;Awwwards Site of the Month&lt;/a&gt; for March 2020 for their work on &lt;a href="https://www.madeleinedalla.com/"&gt;Madeleine Dalla&lt;/a&gt;.  That’s another must-see site with impeccable design and animations!&lt;/p&gt;

&lt;p&gt;The entire site has wonderful page-transitions on the images and text. If you’re interested in learning that technique, this &lt;a href="https://tympanus.net/codrops/2020/06/17/making-stagger-reveal-animations-for-text/"&gt;Codrops article&lt;/a&gt; seems like a great place to start.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.marvinschwaibold.com/"&gt;Check it out -&amp;gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  CODEPEN
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Mustache Guy
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://codepen.io/team/wtc/pen/mNdgxd"&gt;This CodePen&lt;/a&gt; by &lt;a href="https://www.wethecollective.com/"&gt;We The Collective&lt;/a&gt; is a fun demo to show off &lt;a href="https://github.com/wethegit/wtc-controller-carousel"&gt;their new carousel library&lt;/a&gt;. Since Carousels &amp;amp; Horses go together like Peanut Butter &amp;amp; Jelly, we just &lt;em&gt;had&lt;/em&gt; to check it out.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/team/wtc/embed/mNdgxd?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I’ve gotta start with the excellent illustrations. The hairstyle slideshow feels like looking through old photos of your dad over the decades.&lt;/p&gt;

&lt;p&gt;“It was the 60’s!”&lt;br&gt;
“There’s no excuse, Dad. No excuse.”&lt;/p&gt;

&lt;p&gt;The illustrator, &lt;a href="https://twitter.com/arielsaysmaybe"&gt;Ariel Hitchcock&lt;/a&gt;, did a fantastic job, especially on the hover-state illustrations. I recommend hovering over each Mustache Guy to find his hidden attire.&lt;/p&gt;

&lt;p&gt;The Mustache Guys are all SVG, brought to life with CSS animations. The carousel uses their new library, &lt;code&gt;wtc-controller-carousel&lt;/code&gt;, as well as another of their packages, &lt;code&gt;wtc-tween&lt;/code&gt;. I reached out to &lt;a href="https://twitter.com/liamegan"&gt;Liam&lt;/a&gt; of We the Collective to discover why his team decided to write their own carousel library.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The carousel library is meant to fill a really specific requirement, which is to have a responsive, infinite carousel of elements. There are other libraries that can accomplish this, but they clock in at huge file sizes. We built this library because we’d been doing this from scratch over and over again. We also have a number of other libraries that we built to do different things (like galleries) that are lean, simple-to-use, and fully accessible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I couldn’t agree more with his reason to make a library. My hatred for doing the same task, again and again, is the entire reason I picked up programming. His team has done the same thing multiple times, so now they save time and we all benefit from it being open sourced.&lt;/p&gt;

&lt;p&gt;One of my favorite parts of the pen is when you click the “Accelerate” button. The carousel starts speeding up until it’s a blur, while the sides shrink down. It then switches to one Mustache Guy at a time, and the whole effect is so good, I had to know how it worked.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This library has a property called &lt;code&gt;speed&lt;/code&gt;, which alters the speed at which it runs. We just tween that from the base speed to the speed at which this slideshow effect would happen while at the same time tweening down the width to a single element.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For the tweening, the developer, &lt;a href="https://twitter.com/marlonmarcello"&gt;Marlon Marcello&lt;/a&gt;, is using another custom library, &lt;code&gt;wtc-tween&lt;/code&gt;. There’s something to be said for having your own libraries to suit your specific needs!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/team/wtc/pen/mNdgxd"&gt;Check out this CodePen&lt;/a&gt; and then take their &lt;a href="https://github.com/wethegit/wtc-controller-carousel"&gt;carousel library for a spin&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Around the Campfire
&lt;/h2&gt;

&lt;p&gt;I’d like to start ropin' in conversations from other parts of town. Cause at the end of the day, there’s nothin’ nicer than a warm, friendly community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.twitter.com/colbyfayock"&gt;Colby Fayock tweeted:&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WS-UaVQ0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mec9tbnwhjuqalpq51vj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WS-UaVQ0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mec9tbnwhjuqalpq51vj.png" alt='Colby Fayock asking: "DAE read @FrontendHorse with a Cowboy Voice?"'&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let it be known that this is now canon. If Frontend Horse becomes a podcast, it’ll be voiced by &lt;a href="https://imgur.com/bMcGCXy"&gt;Sam Elliott&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’ll be on the lookout for more tweets to rope in next week. Just give a holler &lt;a href="https://twitter.com/frontendhorse"&gt;@FrontendHorse&lt;/a&gt;, and I’ll hear it.&lt;/p&gt;




&lt;h2&gt;
  
  
  So Long, Partner
&lt;/h2&gt;

&lt;p&gt;Well, that’s the end of the trail for this week. I appreciate you riding with me.&lt;/p&gt;

&lt;p&gt;Follow &lt;a href="https://twitter.com/frontendhorse"&gt;@FrontendHorse on Twitter&lt;/a&gt;, and if you enjoyed this, I’d be over the moon if you share it with a friend or tweet about it.&lt;/p&gt;

&lt;p&gt;Special thanks to Jesper Vos and Liam Egan for speaking with me about their work.&lt;/p&gt;

&lt;p&gt;This is the part where we ride off into the sunset. You take care.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Your Neigh-bor,&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Alex&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If you liked this post, head to &lt;a href="https://www.frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe! You'll get the next issue before it's posted here on Dev.&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Frontend Horse #4 - Airplanes, Inclusive Components, and Bootstrap V5</title>
      <dc:creator>Alex Trost</dc:creator>
      <pubDate>Mon, 22 Jun 2020 20:08:18 +0000</pubDate>
      <link>https://dev.to/trostcodes/frontend-horse-4-airplanes-inclusive-components-and-bootstrap-v5-5d46</link>
      <guid>https://dev.to/trostcodes/frontend-horse-4-airplanes-inclusive-components-and-bootstrap-v5-5d46</guid>
      <description>&lt;p&gt;&lt;em&gt;This is an issue from the newsletter Frontend Horse. This was originally published on June 18th, 2020. Visit &lt;a href="https://frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe and find more issues.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Howdy, partner and welcome to this week’s round-up!&lt;/p&gt;

&lt;p&gt;As always, I want to make you a prize-winning developer by showing you how others have created their brilliant frontend work. The best part is I learn from these, too, so we’re all growing together! Let’s hit the trail.&lt;/p&gt;




&lt;h3&gt;
  
  
  CODEPEN
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Airplanes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://twitter.com/steeevg"&gt;Steve Gardner&lt;/a&gt;’s &lt;a href="https://codepen.io/ste-vg/pen/GRooLza"&gt;Airplane&lt;/a&gt; is my favorite kind of tech demo. It looks good enough to be on a professional site, but the copy lets you know Steve had a lot of fun with it.&lt;/p&gt;

&lt;p&gt;A 3D airplane moves through the scene as we scroll, and even transitions to an x-ray style wireframe mode. I had to learn some of the techniques behind this one!&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NuXMYgR5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s5ts5kc6ftpt4h5ffiok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NuXMYgR5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s5ts5kc6ftpt4h5ffiok.png" alt="Steve Gardner's Airplanes"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;I was going to embed the CodePen, but the scaling doesn't make certain animations match up right. I highly suggest you &lt;a href="https://codepen.io/ste-vg/pen/GRooLza"&gt;open it in its own window&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The Techniques
&lt;/h4&gt;

&lt;p&gt;I love how the plane moves throughout the piece smoothly without any noticeable hard stops. Steve explained that it’s really just a GSAP timeline that the user moves through with the scrollbar. He even gives us a great behind-the-scenes tip to watch it in action!&lt;/p&gt;

&lt;p&gt;Right after line 340 in the JavaScript, make a new line and add &lt;code&gt;tl.play();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You should see the airplane go through the animations while the rest of the page stays put!&lt;/p&gt;

&lt;p&gt;The other thing I had to know was how he does this transition from solid to wireframe.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dF6_BTMk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lr3wadpppiufw1xewkhk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dF6_BTMk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lr3wadpppiufw1xewkhk.png" alt="The Airplane transitioning between solid and wireframe"&gt;&lt;/a&gt;&lt;br&gt;
Steve explained that there are actually &lt;em&gt;two airplanes&lt;/em&gt; animating at the same time. He’s using a ThreeJS trick that allows him to have two cameras in the scene. Each camera can only see one version of the plane, so the wireframe section only shows what the wireframe camera sees.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Steve used an open-source airplane model from &lt;a href="https://poly.google.com/"&gt;Google Poly&lt;/a&gt;. It’s a great free resource you should definitely lean on.&lt;/p&gt;

&lt;p&gt;Steve also shared &lt;a href="https://tympanus.net/codrops/2016/04/26/the-aviator-animating-basic-3d-scene-threejs/"&gt;his favorite ThreeJS tutorial&lt;/a&gt; with us, and I’ve gotta say, it’s AMAZING. A single tutorial, using basic shapes, but with a gorgeous result. Check this one out!&lt;/p&gt;

&lt;p&gt;The scrolling is thanks to &lt;a href="https://greensock.com/docs/v3/Plugins/ScrollTrigger"&gt;GSAP’s new ScrollTrigger plugin&lt;/a&gt;, which we mentioned last week as well. I have a feeling this won’t be the last time, either!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/ste-vg/pen/GRooLza"&gt;Check it out -&amp;gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  HORSE RESOURCE
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Inclusive Components
&lt;/h2&gt;

&lt;p&gt;I’ve been reading &lt;a href="https://inclusive-components.design/"&gt;Inclusive Components&lt;/a&gt;, an excellent book on “designing inclusive web interfaces, piece by piece.” The author, &lt;a href="https://heydonworks.com/"&gt;Heydon Pickering&lt;/a&gt;, teaches a11y principles by building out several common components.&lt;/p&gt;

&lt;p&gt;I wanted to share what I learned in the chapter “A Todo List” with you.&lt;/p&gt;

&lt;h4&gt;
  
  
  Placeholders and Autocomplete
&lt;/h4&gt;

&lt;p&gt;There’s a big design trend to remove labels, leaving only placeholders to show users what each input is for. Sure labels look like clutter, but it’s necessary information, especially the longer a form gets.&lt;/p&gt;

&lt;p&gt;Heydon points out two things I hadn’t thought of that make this pattern extra terrible: focus and autocomplete. “Placeholders disappear on focus and can be eradicated by autocomplete behavior, meaning sighted users lose their labels.” Yet another reason to always have a visible label!&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; for more than Forms
&lt;/h4&gt;

&lt;p&gt;When I’ve made todo list apps in the past, I’d use an &lt;code&gt;&amp;lt;input /&amp;gt;&lt;/code&gt; and a &lt;code&gt;&amp;lt;button /&amp;gt;&lt;/code&gt; but not a form element, because I didn’t think I needed it. Heydon points out why you’d want to use a &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; element to wrap that input and button:&lt;/p&gt;

&lt;p&gt;“We’ll want to allow users to submit on &lt;code&gt;Enter&lt;/code&gt; and this only works reliably where a &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; contains the input upon which &lt;code&gt;Enter&lt;/code&gt; is being pressed.”&lt;/p&gt;

&lt;p&gt;So to make sure your user can slam that enter key across all browsers, devices, and assistive technologies, wrap your input in a &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can check out &lt;a href="https://inclusive-components.design/a-todo-list/"&gt;this specific chapter here&lt;/a&gt;, and &lt;a href="http://book.inclusive-components.design/"&gt;buy the book here&lt;/a&gt;. Big thanks to &lt;a href="https://twitter.com/jh3yy"&gt;Jhey&lt;/a&gt; for recommending I pick up this fantastic book.&lt;/p&gt;




&lt;h3&gt;
  
  
  DEV NEWS
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Bootstrap V5
&lt;/h2&gt;

&lt;p&gt;Version 5 of Bootstrap has released this week, and while I haven’t used Bootstrap in years, this feels like a big step for the web. Bootstrap is still massively popular, so the fact that they’ve dropped jQuery and support for IE feels huge. As someone who is eagerly awaiting the death of Internet Explorer, I fully support this move.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://v5.getbootstrap.com/"&gt;Check it out -&amp;gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  So Long, Partner
&lt;/h2&gt;

&lt;p&gt;That’s the end of the trail for this week. Thanks for riding with me.&lt;/p&gt;

&lt;p&gt;Follow @FrontendHorse on  &lt;a href="https://twitter.com/frontendhorse"&gt;Twitter&lt;/a&gt; and  &lt;a href="https://instagram.com/frontendhorse"&gt;Instagram&lt;/a&gt;. If you enjoyed this, I’d be thrilled if you share it with a friend or tweet about it.&lt;/p&gt;

&lt;p&gt;Special thanks to Steve Gardner for speaking with me about their work.&lt;/p&gt;

&lt;p&gt;This is the part where we ride off into the sunset. Roll credits.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Your Neigh-bor,&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Alex&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If you liked this post, head to &lt;a href="https://www.frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe! You'll get the next issue before it's posted here on Dev.&lt;/p&gt;

</description>
      <category>css</category>
      <category>html</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Frontend Horse #3 - iPads, Turntables, Cards and lots of GSAP!</title>
      <dc:creator>Alex Trost</dc:creator>
      <pubDate>Wed, 17 Jun 2020 11:06:12 +0000</pubDate>
      <link>https://dev.to/trostcodes/frontend-horse-3-ipads-turntables-cards-and-lots-of-gsap-508a</link>
      <guid>https://dev.to/trostcodes/frontend-horse-3-ipads-turntables-cards-and-lots-of-gsap-508a</guid>
      <description>&lt;p&gt;&lt;em&gt;This is an issue from the newsletter Frontend Horse. This was originally published on June 11th, 2020. Visit &lt;a href="https://frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe and find more issues.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Hey, there! I hope your week is going great, and welcome to our third issue!&lt;/p&gt;

&lt;p&gt;While this week is a return to form, racial equality isn’t a trend. There’s still so much to do, and it’s going to take a long time. I encourage you to sign up for &lt;strong&gt;monthly donations&lt;/strong&gt; to an organization like Black Lives Matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I’m still looking to match $400 to a related charity&lt;/strong&gt;. Reply to this email with your receipts.&lt;/p&gt;

&lt;p&gt;Here’s our weekly &lt;em&gt;round-up&lt;/em&gt; of awesome things. I learned a lot this week, and I’m excited to share what we’ve got. Let’s ride!&lt;/p&gt;




&lt;h3&gt;
  
  
  CODEPEN
&lt;/h3&gt;

&lt;h2&gt;
  
  
  One Div iPad Pro
&lt;/h2&gt;

&lt;p&gt;First up is this awesome one div iPad Pro from &lt;a href="https://www.twitter.com/anniebombanie_"&gt;Annie Liew&lt;/a&gt;. Photorealistic CSS pictures are awesome, and it’s like playing in Hard Mode when it’s done in a single div.&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/anniebombanie/embed/pojmNzN?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  The Technique
&lt;/h4&gt;

&lt;p&gt;There’s a few techniques to pick up here. The drawing is done by chaining &lt;code&gt;radial-gradient&lt;/code&gt; and &lt;code&gt;linear-gradient&lt;/code&gt; functions on the &lt;code&gt;background&lt;/code&gt; property. You could use this trick to add some details to a button or header without adding more DOM elements.&lt;/p&gt;

&lt;p&gt;Important to note: Annie uses both the &lt;code&gt;::before&lt;/code&gt; and &lt;code&gt;::after&lt;/code&gt; psuedoelements on that div. With that she gains two more elements to work with.&lt;/p&gt;

&lt;p&gt;Annie says that the order of the gradient layers makes a big difference. "Having an understanding of how gradients work with transparency is very important."&lt;/p&gt;

&lt;p&gt;Annie said the two resources that helped her the most were a &lt;a href="https://lynnandtonic.com/thoughts/entries/talk-illustration-with-css/"&gt;CSSDays talk&lt;/a&gt;, and a &lt;a href="https://hacks.mozilla.org/2014/09/single-div-drawings-with-css/"&gt;blog post&lt;/a&gt;, both by the excellent &lt;a href="https://twitter.com/lynnandtonic"&gt;Lynn Fisher&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lastly, the whole piece is responsive because everything is done with the &lt;a href="http://thenewcode.com/1137/MinMaxing-Understanding-vMin-and-vMax-in-CSS"&gt;vmin unit&lt;/a&gt;. This unit is based on the viewport’s smallest side.&lt;/p&gt;

&lt;p&gt;Start small and take some of these techniques for a ride!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/anniebombanie/full/pojmNzN"&gt;Check It Out -&amp;gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  CODEPEN
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Superstar DJ
&lt;/h2&gt;

&lt;p&gt;This week GreenSock announced their amazing new &lt;a href="https://greensock.com/scrolltrigger"&gt;ScrollTrigger&lt;/a&gt; plugin that integrates with GSAP. There are &lt;a href="https://codepen.io/collection/DkvGzg"&gt;a bunch of awesome demos  made with it&lt;/a&gt;, and I especially love &lt;a href="https://codepen.io/jh3y/full/jOWNaZw"&gt;this record player&lt;/a&gt; by &lt;a href="https://twitter.com/jh3yy"&gt;Jhey Tompkins&lt;/a&gt; . It uses your scroll to move the record back and forth, like a DJ scratching!&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/jh3y/embed/jOWNaZw?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  The Technique
&lt;/h4&gt;

&lt;p&gt;Jhey is using GSAP to rotate the record at a set speed. Then he needs to detect the velocity of the user’s scroll. ScrollTrigger provides a built in &lt;code&gt;getVelocity()&lt;/code&gt; function. Using that value, he’s able to change the speed. So if a user scrolls up quickly, the record goes backwards quickly.&lt;/p&gt;

&lt;p&gt;It even works on mobile, letting you swipe up and down to DJ. Super cool!&lt;/p&gt;

&lt;p&gt;Jhey says he’s adding a couple Easter eggs to this pen in the coming days, so &lt;em&gt;circle back&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/jh3y/full/jOWNaZw"&gt;Check It Out -&amp;gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  CODEPEN
&lt;/h3&gt;

&lt;h2&gt;
  
  
  User Interaction Card
&lt;/h2&gt;

&lt;p&gt;I love &lt;a href="https://codepen.io/shahidshaikhs/full/mdVJjgv"&gt;this card interaction demo&lt;/a&gt; by &lt;a href="https://twitter.com/__shahidshaikh"&gt;Shahid Shaikh&lt;/a&gt;. My favorite part is the way the button at the bottom animates to become a bottom bar. It’s so smooth that I thought he was manipulating SVG elements to get the effect.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/shahidshaikhs/embed/mdVJjgv?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  The Technique
&lt;/h4&gt;

&lt;p&gt;Turns out it’s a regular button with a border-radius. When clicked, it expands , moves, and loses the border radius at the same time. It’s so seamless!&lt;/p&gt;

&lt;p&gt;Shahid used GSAP to animate, and said he made this to learn more about controlling timelines. He used the &lt;a href="https://www.greensock.com/get-started/"&gt;official docs&lt;/a&gt; and included videos to learn.&lt;/p&gt;

&lt;p&gt;This card has animations we’re used to seeing in mobile apps, but I’d love to see more of this quality across the web, too!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/shahidshaikhs/full/mdVJjgv"&gt;Check It Out -&amp;gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  TUTORIAL
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Background Image Grid Motion Effect
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://tympanus.net/codrops/2020/06/10/how-to-create-a-motion-hover-effect-for-a-background-image-grid/"&gt;This is a great tutorial&lt;/a&gt; for making a grid of images that move with the user’s mouse. &lt;a href="http://twitter.com/crnacura"&gt;Mary Lou&lt;/a&gt; walks us through this great technique that you’ve probably seen on several sites by now.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--egWV0phe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ns7sihj18h49k8drchqq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--egWV0phe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ns7sihj18h49k8drchqq.png" alt="A grid of images"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Like all Codrops tutorials, it’s a professional-grade effect, complete with &lt;a href="https://tympanus.net/Tutorials/ImageGridMotionEffect/"&gt;Demos&lt;/a&gt; and &lt;a href="https://github.com/codrops/ImageGridMotionEffect"&gt;source files on GitHub&lt;/a&gt;. One thing the tutorial doesn’t mention is you’ll definitely need the source files. Especially this &lt;a href="https://github.com/codrops/ImageGridMotionEffect/blob/master/src/js/utils.js"&gt;utils.js&lt;/a&gt; file.&lt;/p&gt;

&lt;p&gt;There’s some nice, reusable functions in there, the key one being &lt;a href="https://github.com/codrops/ImageGridMotionEffect/blob/master/src/js/utils.js#L16-L30"&gt;get mouse position&lt;/a&gt;. With that value and &lt;a href="https://github.com/codrops/ImageGridMotionEffect/blob/master/src/js/utils.js#L4"&gt;a little math&lt;/a&gt;, you get new &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; position for the grid. Transition between positions with GSAP and you’re set!&lt;/p&gt;

&lt;p&gt;The technique of offsetting things based on mouse position can be taken even further, as their &lt;a href="https://gfycat.com/weightywetfunnelweaverspider"&gt;inspiration examples show&lt;/a&gt;. I’d love to see how you take this technique and run with it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tympanus.net/codrops/2020/06/10/how-to-create-a-motion-hover-effect-for-a-background-image-grid/"&gt;Check It Out -&amp;gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  HORSE RESOURCE
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Live-Code Streaming
&lt;/h2&gt;

&lt;p&gt;I’ve been watching live-coding streamers the past couple months and have learned &lt;em&gt;so much&lt;/em&gt;! Getting to watch someone work and explain their thought process is invaluable. I ask lots of questions and have found these streamers more than happy to help. I highly recommend stopping by even for a few minutes when you see someone go live.&lt;/p&gt;

&lt;p&gt;Here are some of the excellent streamers I’ve dropped in on in the last couple months.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.twitch.tv/blacktechdiva"&gt;BlackTechDiva (Monica Powell)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twitch.tv/jh3yy"&gt;Jhey Tompkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twitch.tv/maxcellw"&gt;maxcellw (Prince Wilson)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twitch.tv/noopkat"&gt;Noopkat (Suz Hinton)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twitch.tv/jlengstorf"&gt;Learn with Jason (Jason Lengstorf)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twitch.tv/xdesro"&gt;xDesro (Henry Desroches)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twitch.tv/domitriusclark"&gt;Dometrius Clark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twitch.tv/brawrdon"&gt;Brawrdon (Brandon Okeke)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twitch.tv/ryanwarnercodes"&gt;RyanWarnerCodes (Ryan Warner)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  In Horse News
&lt;/h2&gt;

&lt;p&gt;I’m very new to the horse world, but I’m thrilled that non-digital equestrians are &lt;a href="https://www.chronofhorse.com/article/breaking-the-silence-surrounding-white-privilege-in-the-horse-world"&gt;Breaking The Silence Surrounding White Privilege.&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  So Long, Partner
&lt;/h2&gt;

&lt;p&gt;That’s the end of the trail for this week. Thanks for riding with me.&lt;/p&gt;

&lt;p&gt;Follow @FrontendHorse on &lt;a href="https://twitter.com/frontendhorse"&gt;Twitter&lt;/a&gt; and if you enjoyed this, I’d be thrilled if you share it with a friend or tweet about it.&lt;/p&gt;

&lt;p&gt;Special thanks to Annie Liew, Shahid Shaikh, and Jhey Tompkins for speaking with me about their work.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Your Neigh-bor,&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Alex&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If you liked this post, head to &lt;a href="https://www.frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe! You'll get the next issue before it's posted here on Dev.&lt;/p&gt;

</description>
      <category>css</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>html</category>
    </item>
    <item>
      <title>Frontend Horse #2 - Black Lives Matter</title>
      <dc:creator>Alex Trost</dc:creator>
      <pubDate>Mon, 15 Jun 2020 21:49:59 +0000</pubDate>
      <link>https://dev.to/trostcodes/frontend-horse-2-black-lives-matter-31mf</link>
      <guid>https://dev.to/trostcodes/frontend-horse-2-black-lives-matter-31mf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is an issue from the newsletter Frontend Horse. It was originally sent June 4th, 2020. Visit &lt;a href="https://www.frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe and find more issues.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Like many of you, I spent this week witnessing the violence against Black people that occurs every day in the United States and across the world. I’m sad, I’m angry, I’m ashamed, I’m disgusted. Racist policies and ideas corrupt our government, law enforcement, and financial institutions.&lt;/p&gt;

&lt;p&gt;It’s not one bad apple. It’s the tree.&lt;/p&gt;

&lt;p&gt;While massive changes need to happen, individuals will make the difference. You can protest, you can donate, you can vote, you can inform your friends and family.&lt;/p&gt;

&lt;p&gt;I stand with the Black community against these racist policies and police brutality. I stand in solidarity with George Floyd, Breonna Taylor, Ahmaud Arbery, and countless others.&lt;/p&gt;

&lt;p&gt;This was a week for listening, not talking tech, so I’m including a different set of links. I urge you to support these organizations, support Black businesses, Black voices, and the Black community.&lt;/p&gt;

&lt;p&gt;If you donate to these, or any other similar organizations, send me the receipt and I’ll match up to $400.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blacklivesmatter.com/"&gt;Black Lives Matter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.communityjusticeexchange.org/nbfn-directory"&gt;National Bail Fund Network&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.naacpldf.org/"&gt;NAACP Legal Defense and Educational Fund&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://eji.org/"&gt;Equal Justice Initiative&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re in the US, reach out and &lt;a href="https://www.house.gov/representatives/find-your-representative"&gt;apply Pressure on Your Representative&lt;/a&gt;. Last, here’s a resource I personally found helpful for &lt;a href="https://tatianamac.com/posts/white-guyde/"&gt;White men&lt;/a&gt; and &lt;a href="https://tatianamac.com/posts/save-the-tears"&gt;White women&lt;/a&gt; who want to make meaningful change right now.&lt;/p&gt;

&lt;p&gt;Please, take care.&lt;/p&gt;

&lt;p&gt;Alex&lt;/p&gt;




&lt;p&gt;If you liked this post, head to &lt;a href="https://frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe! You'll get the next issue before it's posted here on Dev.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Frontend Horse #1 - Our First Rodeo</title>
      <dc:creator>Alex Trost</dc:creator>
      <pubDate>Fri, 12 Jun 2020 02:12:11 +0000</pubDate>
      <link>https://dev.to/trostcodes/frontend-horse-1-our-first-rodeo-46d2</link>
      <guid>https://dev.to/trostcodes/frontend-horse-1-our-first-rodeo-46d2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is an issue from the newsletter Frontend Horse. Visit &lt;a href="https://frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe and find more issues.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Hey there, and welcome to the first issue of Frontend Horse! I can’t say how thankful I am that you subscribed before the very first one. Someday this will be worth as much as a copy of Spider-Man #1!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Probably&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For all the things I share I’ll try to bring you more details and a deeper understanding. Often times I’ll reach out to the creators to get it straight from the horse’s mouth.&lt;/p&gt;

&lt;p&gt;I’ve got a lot for you this week, so let’s &lt;em&gt;saddle up&lt;/em&gt;!&lt;/p&gt;




&lt;h3&gt;
  
  
  CODEPEN
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Water
&lt;/h2&gt;

&lt;p&gt;I love the composition and colors in  &lt;a href="https://codepen.io/kdbkapsere/pen/ZEbMWMy"&gt;this pen by Kasper De Bruyne&lt;/a&gt; , but the animated water effects steal the show!&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/kdbkapsere/embed/ZEbMWMy?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  The Technique
&lt;/h4&gt;

&lt;p&gt;Kasper is using a combination of SVG filters and animation to simulate the water ripples. He’s using a &lt;strong&gt;fractal noise filter&lt;/strong&gt;, which creates an image like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U8BRpnHC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t65wd9tqnj6p4pp54xol.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U8BRpnHC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t65wd9tqnj6p4pp54xol.png" alt="Fractal Noise"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;He’s then using a &lt;strong&gt;displacement map&lt;/strong&gt;, which &lt;em&gt;displaces&lt;/em&gt; or warps an image with the color values of another image.&lt;/p&gt;

&lt;p&gt;Kasper explains that we pass the fractal noise_“to the displacement map and then animate thebaseFrequencyvalue of the fractal noise.”_ Animating that value is what creates the water ripples!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/kasperdebruyne"&gt;Kasper&lt;/a&gt;  gives us  &lt;a href="https://tympanus.net/codrops/2019/02/19/svg-filter-effects-creating-texture-with-feturbulence/"&gt;this Codrops article&lt;/a&gt;  by  &lt;a href="https://www.sarasoueidan.com/"&gt;Sara Soueidan&lt;/a&gt;  to learn more about the effect. For all the animations in the piece, he’s utilizing  &lt;a href="https://greensock.com/gsap/"&gt;GSAP&lt;/a&gt; .&lt;/p&gt;




&lt;h3&gt;
  
  
  CODEPEN
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Canyonlands
&lt;/h2&gt;

&lt;p&gt;Adam Kuhn makes such delightful pens,  &lt;a href="https://codepen.io/cobra_winfrey/pen/RwWYGxj"&gt;and this one is no exception&lt;/a&gt; . The colors are gorgeous in light and dark mode, and the interactivity is a great touch.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/cobra_winfrey/embed/RwWYGxj?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  The Technique
&lt;/h4&gt;

&lt;p&gt;There’s so much to learn from this pen, but I want to focus on the way he’s changing the paths.&lt;/p&gt;

&lt;p&gt;He’s declared a bunch of SVG paths as variables in his CSS. In the HTML he’s made a grid of SVG shapes that all look to their local &lt;code&gt;var(--path)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For context, there’s a 6x6 grid of SVG elements. JavaScript loops through and randomly assigns each SVG a new path variable like this:&lt;br&gt;
&lt;code&gt;var(--path): var(--path5);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Adam tells us the key to his smooth transitions. &lt;em&gt;“Each path needs to use the same number of handles and points as the next or they won’t transition smoothly. Rather, it looks as if they jump from one state to the next”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/cobra_winfrey"&gt;Adam&lt;/a&gt;  also points out that this trick only works in Chrome and Edge at the moment.&lt;/p&gt;

&lt;p&gt;To learn how to use scope with CSS custom properties, here’s  &lt;a href="https://css-tricks.com/the-power-and-fun-of-scope-with-css-custom-properties/"&gt;a great article&lt;/a&gt;  by  &lt;a href="https://twitter.com/jh3yy"&gt;Jhey Tompkins&lt;/a&gt; .&lt;/p&gt;




&lt;h3&gt;
  
  
  SITE SHOWCASE
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Say Cheese
&lt;/h2&gt;

&lt;p&gt;This  &lt;a href="https://saycheese.almeida.work/"&gt;wonderful one-page experience&lt;/a&gt;  teaches the basics of photography through clear interactive examples and scroll-based animation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ehVBpper--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ls7ar68rzm4rn5h38ec5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ehVBpper--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ls7ar68rzm4rn5h38ec5.png" alt="The main page for Say Cheese"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The Techniques
&lt;/h4&gt;

&lt;p&gt;Say Cheese has a lot going on with animations, hover states, and dynamic typography. The key is &lt;strong&gt;they all support the content&lt;/strong&gt;, never take from it. The creator,  &lt;a href="https://twitter.com/arthurdealmeida"&gt;Arthur de Almeida&lt;/a&gt;  knows that content is king. He wanted the subject matter to &lt;em&gt;“be as simple and accessible as possible.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is great &lt;strong&gt;web design&lt;/strong&gt; and &lt;strong&gt;education design&lt;/strong&gt;, too. As web developers, &lt;strong&gt;we’re always educating our users&lt;/strong&gt;. It might be about a brand, a product, a topic like photography, or even telling about ourselves.&lt;/p&gt;

&lt;p&gt;When your goal is to educate, break the subject into its &lt;strong&gt;simplest components,&lt;/strong&gt;and build from there.&lt;/p&gt;

&lt;p&gt;Arthur avoided as much technical jargon as he could, putting it in simple terms anyone can understand. Try this in your next project!&lt;/p&gt;




&lt;h3&gt;
  
  
  HORSE RESOURCE
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Blush
&lt;/h2&gt;

&lt;p&gt;Image resources like Unsplash and Undraw help you communicate your message and look professional.  &lt;a href="https://twitter.com/pablostanley"&gt;Pablo Stanley&lt;/a&gt;  and his team recently launched  &lt;a href="https://blush.design/"&gt;Blush&lt;/a&gt; , the newest picture resource site. With Blush, you can create, mix, and customize illustrations from artists around the world.&lt;/p&gt;

&lt;p&gt;Like Pablo’s  &lt;a href="https://www.humaaans.com/"&gt;Humaaans&lt;/a&gt;  and  &lt;a href="https://www.openpeeps.com/"&gt;Open Peeps&lt;/a&gt; , the bodies and scenes are highly customizable. The difference is that Pablo isn’t the only horse in the stable: he’s got 7 other illustrators, with more to come.&lt;br&gt;
There’s a Figma plugin with a Sketch plugin on the way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x5T_h4UJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cphnjmx2bcgbch9qasf7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x5T_h4UJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cphnjmx2bcgbch9qasf7.png" alt="A customizable scene of people"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything in this scene is customizable! From the background to the body positions, clothes, heads, hair, and facial expressions. It’s a bit like playing dress-up, and a great tool to have in your toolbox.&lt;/p&gt;

&lt;p&gt;You can download up to a medium PNG with a free account, and unlock the large PNG and SVG options with a paid plan.&lt;/p&gt;




&lt;h3&gt;
  
  
  TOP TROTTIN’ TUTORIAL
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Animated Sparkle Text in React
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://twitter.com/JoshWComeau"&gt;Josh W. Comeau&lt;/a&gt;  has made his site one of the most delightful places on the web, and he shares his methods in tutorials like  &lt;a href="https://joshwcomeau.com/react/animated-sparkles-in-react/"&gt;this one&lt;/a&gt; . We make a component that can wrap elements like text and images in animated sparkles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yvcDK9l---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0pc5yczdel6h8emp2t92.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yvcDK9l---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0pc5yczdel6h8emp2t92.png" alt="Sparkle Text across an image, text and button"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;An image can’t do the animation justice. You’ve gotta see it for yourself!&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The Technique
&lt;/h4&gt;

&lt;p&gt;The technique to learn here is much more than just animated sparkle text! It’s the concept of adding emotion, clarity, and fun to content through reusable components.&lt;/p&gt;

&lt;p&gt;Like any great idea, it’s catching on! Josh pointed us to Richard Haines’s  &lt;a href="https://richardhaines.dev/"&gt;animated music notes&lt;/a&gt; , and  &lt;a href="https://mindsaha.com/"&gt;Mindsaha&lt;/a&gt;  uses it with a few different icons.&lt;/p&gt;

&lt;p&gt;I want to see devs take this idea and run with it. How about rainclouds that drench your pictures when toggled? Or a rainbow that animates across text? Josh has given us the tools, let’s use them!&lt;/p&gt;




&lt;h2&gt;
  
  
  So Long, Partner
&lt;/h2&gt;

&lt;p&gt;That’s it for this week! I hope you found this useful, informative, and just a bit of fun. I’ll occasionally share what I’ve been working on, but for the past couple of weeks, I’ve been working towards this first issue!&lt;/p&gt;

&lt;p&gt;Follow @FrontendHorse on  &lt;a href="https://twitter.com/frontendhorse"&gt;Twitter&lt;/a&gt;  and  &lt;a href="https://instagram.com/frontendhorse"&gt;Instagram&lt;/a&gt; , or send this to a friend who might enjoy it!&lt;/p&gt;

&lt;p&gt;Special thanks for Adam Kuhn, Arthur de Almeida, Kasper De Bruyne, Pablo Stanley, and Josh W. Comeau for speaking with me about their work.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Your Neigh-bor,&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Alex&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If you liked this post, head to &lt;a href="https://www.frontend.horse"&gt;Frontend.Horse&lt;/a&gt; to subscribe! You'll get the next issue before it's posted here on Dev.&lt;/p&gt;

</description>
      <category>css</category>
      <category>javascript</category>
      <category>html</category>
      <category>webdev</category>
    </item>
    <item>
      <title>12 Mac Apps That Do One Thing Really Well</title>
      <dc:creator>Alex Trost</dc:creator>
      <pubDate>Mon, 22 Jul 2019 02:22:16 +0000</pubDate>
      <link>https://dev.to/trostcodes/12-mac-apps-that-do-one-thing-really-well-5f4m</link>
      <guid>https://dev.to/trostcodes/12-mac-apps-that-do-one-thing-really-well-5f4m</guid>
      <description>&lt;p&gt;Tools created to solve one problem often solve that problem best.&lt;/p&gt;

&lt;p&gt;Swiss army knives are convenient, but they’re not the best bottle-opener, nail file or saw. &lt;/p&gt;

&lt;p&gt;These little &lt;em&gt;macOS apps&lt;/em&gt; do one or two things well and I consider most of these to be essential. &lt;/p&gt;

&lt;p&gt;Grab a couple if you’re looking for a cleaner, faster, and more productive workflow.&lt;/p&gt;

&lt;p&gt;Most of these are free, a couple are under $5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Magnet - Window Organization
&lt;/h2&gt;

&lt;p&gt;Arranging windows, especially with multiple screens, can be a hassle. Magnet makes it easy to set apps to whatever fraction you’d like. Full, half, thirds, fourths - whatever you want, it’s easy with Magnet.&lt;/p&gt;

&lt;p&gt;You trigger Magnet by keyboard shortcut or dragging a window to the edges of the screen. It snaps into place and gives you perfect proportions. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnch4lmp4ctj3m0ski4aj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnch4lmp4ctj3m0ski4aj.png" alt="Magnet illustration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Magnet even allows you to move windows across screens. With a few keyboard strokes, my code editor moves from the left monitor to the right monitor.&lt;/p&gt;

&lt;p&gt;Easily one of my most-used apps and the first thing I install on new computers. It even works on vertical screens! For $1 it’s surprisingly robust. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Price&lt;/em&gt;: $1&lt;br&gt;
&lt;em&gt;Website&lt;/em&gt; &lt;a href="https://magnet.crowdcafe.com/" rel="noopener noreferrer"&gt;Magnet Website&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vanilla - Tidy Toolbar
&lt;/h2&gt;

&lt;p&gt;If you’re running all the apps on this list, your toolbar will be pretty cluttered. You might already have 10 icons across the top of your screen, driving you insane. &lt;/p&gt;

&lt;p&gt;That’s where Vanilla comes in. &lt;/p&gt;

&lt;p&gt;With an open/close toggle, it tucks away the icons you want hidden. I only want to see my volume, battery and the time. Other than that, everything gets folded into Vanilla’s drawer. &lt;/p&gt;

&lt;p&gt;If you like clean desktops and minimal clutter, Vanilla is a must-have.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8q6ykb9zx0txckrc0e8v.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8q6ykb9zx0txckrc0e8v.gif" alt="Screenshot of Vanilla hiding icons"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So fresh. So clean.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Price&lt;/em&gt;: Free (Pro versions available)&lt;br&gt;
&lt;em&gt;Website&lt;/em&gt;:  &lt;a href="https://matthewpalmer.net/vanilla/" rel="noopener noreferrer"&gt;Vanilla Website&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Dato - Time Toolbar++
&lt;/h2&gt;

&lt;p&gt;Dato looks identical to the macOS clock, but when clicked you get so much more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fv4an92x3gcb8r9n79kl0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fv4an92x3gcb8r9n79kl0.jpg" alt="Screenshot of Dato's Calendar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That might seem like a trivial improvement over the regular toolbar, but I’ve already used it many times in the 3 days I’ve had it. &lt;/p&gt;

&lt;p&gt;When you open it, you get a little calendar, events for the day, and you can even add time zones that you care about. &lt;/p&gt;

&lt;p&gt;Having quick access to a calendar is handier than you might think right now. You’ll use it. Trust me.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Price&lt;/em&gt;: Free&lt;br&gt;
&lt;em&gt;Website&lt;/em&gt;:   &lt;a href="https://sindresorhus.com/dato" rel="noopener noreferrer"&gt;Dato Website&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Horo - Easy Timer
&lt;/h2&gt;

&lt;p&gt;Horo is a great little timer that lives in your toolbar. It understands natural language, so typing &lt;code&gt;30m&lt;/code&gt; or &lt;code&gt;30 minutes&lt;/code&gt; both get you a 30-minute timer. &lt;/p&gt;

&lt;p&gt;Horo’s developer, Matthew Palmer, says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If starting a timer takes more than a second, your timer app sucks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I agree. Horo can handle multiple timers, is effortless to start, and best of all it’s free. Grab it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F7cxexuupl5ky26h75u1g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F7cxexuupl5ky26h75u1g.gif" alt="An animation of Horo being triggered with natural language"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Price&lt;/em&gt;: Free (Pro version available)&lt;br&gt;
&lt;em&gt;Website&lt;/em&gt;: &lt;a href="https://matthewpalmer.net/horo-free-timer-mac/" rel="noopener noreferrer"&gt;Horo Website&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  aText - Text Expansion
&lt;/h2&gt;

&lt;p&gt;If you have a snippet plugin for your IDE, you probably know just how great it is to type a few letters and get lines of code generated for you. &lt;/p&gt;

&lt;p&gt;On the iPhone, there are handy typing shortcuts, like &lt;code&gt;omw&lt;/code&gt; expands to “On my way!”&lt;/p&gt;

&lt;p&gt;aText brings that functionality and then some. The developer explains:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;aText accelerates your typing by replacing abbreviations with frequently used phrases you define.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;aText is great for boilerplate text like email responses or journaling templates. It’s a massive timesaver. &lt;/p&gt;

&lt;p&gt;It can even insert images, the current date/time, AppleScript, Shell Script, etc. Check out the trial.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Falui9eru713v22a05d1j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Falui9eru713v22a05d1j.png" alt="A screenshot of some aText features"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Price&lt;/em&gt;: $5&lt;br&gt;&lt;br&gt;
&lt;em&gt;Trial&lt;/em&gt;: 21 Days&lt;br&gt;
&lt;em&gt;Website&lt;/em&gt;:  &lt;a href="https://www.trankynam.com/atext/" rel="noopener noreferrer"&gt;aText Website&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  CopyClip - Clipboard History
&lt;/h2&gt;

&lt;p&gt;As a programmer, you’re doing a lot of copying and paste. (Insert Stack Overflow joke here)&lt;/p&gt;

&lt;p&gt;The problem is the clipboard only fits 1 item at a time. If you copy something new, the last item is gone forever.&lt;/p&gt;

&lt;p&gt;That’s where CopyClip helps. Instead of losing each item copied, it hangs on to your last 20 or so. Don’t worry, you can also clear the clipboard to remove sensitive info. &lt;/p&gt;

&lt;p&gt;As one reviewer puts it, CopyClip is an “invaluable time and stress reliever.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fuep3ocq2nwe3h4j7aatr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fuep3ocq2nwe3h4j7aatr.png" alt="A list of clipboard history from CopyClip"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Price&lt;/em&gt;: Free&lt;br&gt;
&lt;em&gt;Website&lt;/em&gt;:  &lt;a href="https://apps.apple.com/us/app/copyclip-clipboard-history/id595191960?mt=12" rel="noopener noreferrer"&gt;Apple Appstore&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Karabiner - Custom Keyboard
&lt;/h2&gt;

&lt;p&gt;Karabiner is a power-user’s dream. It allows you to remap your keyboard however you want. Karabiner lets you set up custom hotkeys for pretty much anything.&lt;/p&gt;

&lt;p&gt;The same way you can create snippets and shortcuts in VSCode, you can set keyboard shortcuts across your entire OS. &lt;/p&gt;

&lt;p&gt;I recently found a great use case for it when I started using a Windows keyboard at work.&lt;/p&gt;

&lt;p&gt;The Mac and Windows keyboards are the same, but &lt;code&gt;command&lt;/code&gt; and &lt;code&gt;alt&lt;/code&gt; buttons are flipped, so I kept making mistakes. Easy Karabiner change. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Price&lt;/em&gt;: Free&lt;br&gt;
&lt;em&gt;Website&lt;/em&gt;:  &lt;a href="https://pqrs.org/osx/karabiner/" rel="noopener noreferrer"&gt;Karabiner Website&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Amphetamine - Screen Espresso
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnjyyh6cht2y5qd24nb4d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnjyyh6cht2y5qd24nb4d.png" alt="Amphetamine Logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometimes you need your computer to stay on to finish an install or run tests, or whatever else. &lt;/p&gt;

&lt;p&gt;Amphetamine stops your computer from going to sleep until you turn it off. &lt;/p&gt;

&lt;p&gt;Simple app, handy function. Give it a spin.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Price&lt;/em&gt;: Free&lt;br&gt;
&lt;em&gt;Website&lt;/em&gt;:   &lt;a href="https://apps.apple.com/us/app/amphetamine/id937984704?mt=12" rel="noopener noreferrer"&gt;Apple Appstore&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Muzzle - Auto DND
&lt;/h2&gt;

&lt;p&gt;Muzzle blocks potentially embarrassing alerts while screen sharing. &lt;/p&gt;

&lt;p&gt;It’s good practice to put your computer on Do Not Disturb whenever you have people watching your screen. Muzzle recognizes when you’re sharing your screen and triggers DND for you. When you’re done, it toggles it off. &lt;/p&gt;

&lt;p&gt;Even if you don’t download it, check out the website for a few laughs and an excellent lesson on how to show a product’s value.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Price&lt;/em&gt;: Free&lt;br&gt;
&lt;em&gt;Website&lt;/em&gt;:   &lt;a href="https://muzzleapp.com/" rel="noopener noreferrer"&gt;Muzzle Website&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Toothfairy - Better Bluetooth
&lt;/h2&gt;

&lt;p&gt;Connecting your AirPods or other Bluetooth headphones to your MacBook can be a pain. &lt;/p&gt;

&lt;p&gt;Toothfairy makes connection dead simple. Connect with a menu bar click or even set up a keyboard shortcut.&lt;/p&gt;

&lt;p&gt;Toothfairy lets you create an icon in your toolbar for each Bluetooth device. Icons let you know when you’re connected and when your battery is running low.&lt;/p&gt;

&lt;p&gt;Do you switch your headphones between your phone and laptop often? Toothfairy is worth the 5 bucks.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Price&lt;/em&gt;: $5&lt;br&gt;
&lt;em&gt;Trial&lt;/em&gt;:  Nope&lt;br&gt;
&lt;em&gt;Website&lt;/em&gt;: &lt;a href="https://apps.apple.com/us/app/toothfairy/id1191449274?mt=12" rel="noopener noreferrer"&gt;Apple Appstore&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Kap - Screen Recorder
&lt;/h2&gt;

&lt;p&gt;Kap is the quickest way I’ve found to create GIFs from my screen. Set the aspect ratio, select the area, and click record. &lt;/p&gt;

&lt;p&gt;Easily convert snippets of videos or your latest CodePen into a repeating GIF. Then share to Twitter, Reddit, Giphy, Slack, wherever.&lt;/p&gt;

&lt;p&gt;Kap also features a bunch of plugins to make sharing or saving even faster. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fim1gbp219t469qw5haxf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fim1gbp219t469qw5haxf.png" alt="Screenshot of Kap"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Price&lt;/em&gt;: Free&lt;br&gt;
&lt;em&gt;Website&lt;/em&gt;:  &lt;a href="https://getkap.co/" rel="noopener noreferrer"&gt;Kap Website&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Rocket - Quick Emojis
&lt;/h2&gt;

&lt;p&gt;If you use emojis often, this one’s a must-have. &lt;/p&gt;

&lt;p&gt;Not all apps allow for quick and easy emoji-ing. Slack has introduced us to the excellent &lt;code&gt;:dog:&lt;/code&gt; = 🐶 emoji shorthand. Rocket spreads that same functionality everywhere.&lt;/p&gt;

&lt;p&gt;Type a colon, start typing, and watch the autocomplete matches populate. &lt;/p&gt;

&lt;p&gt;Rocket even lets you choose which websites and Apps to not run in, so it won’t get annoying when you’re programming.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fyigss9jhq4ydmp9n0k9s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fyigss9jhq4ydmp9n0k9s.png" alt="Rocket Settings panel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Price&lt;/em&gt;: Free&lt;br&gt;
&lt;em&gt;Website&lt;/em&gt;:  &lt;a href="https://matthewpalmer.net/rocket/" rel="noopener noreferrer"&gt;Rocket Website&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  That’s It!
&lt;/h2&gt;

&lt;p&gt;If you know of any other great apps that solve one or two problems, please let me know! Hopefully, you’ve found an app on this list to make your day go a bit smoother. &lt;/p&gt;

&lt;p&gt;I think this kind of app is a great way for any developer to think about creating products. Don’t try to be Evernote with 1,000 features. Identify your problem and solve it well.&lt;/p&gt;

</description>
      <category>mac</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
