<?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>Forem: James Baldwin</title>
    <description>The latest articles on Forem by James Baldwin (@jw_baldwin).</description>
    <link>https://forem.com/jw_baldwin</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%2F267845%2F2b0632b0-78c3-407e-9979-5339f74bffb9.jpg</url>
      <title>Forem: James Baldwin</title>
      <link>https://forem.com/jw_baldwin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jw_baldwin"/>
    <language>en</language>
    <item>
      <title>How to create a dropdown with TailwindCSS and Vue</title>
      <dc:creator>James Baldwin</dc:creator>
      <pubDate>Sat, 08 Feb 2020 00:05:40 +0000</pubDate>
      <link>https://forem.com/jw_baldwin/how-to-create-a-dropdown-with-tailwindcss-and-vue-31c</link>
      <guid>https://forem.com/jw_baldwin/how-to-create-a-dropdown-with-tailwindcss-and-vue-31c</guid>
      <description>&lt;h3&gt;
  
  
  Create custom dropdowns with TailwindCSS and Vue
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;This post was originally posted on my personal blog at &lt;a href="//www.jwbaldwin.com"&gt;jwbaldwin.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm going to assume you already have Vue and TailwindCSS set up, but if you don't here is a great resource: &lt;a href="https://github.com/tailwindcss/setup-examples/tree/master/examples/vue-cli"&gt;github.com/tailwindcss/setup-examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are the versions of Vue and TailwindCSS that I'm using:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Vue: 2.6.10&lt;/code&gt;&lt;br&gt;
&lt;code&gt;TailwindCSS: 1.2.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All the code for this can be found on my github at &lt;a href="https://github.com/jwbaldwin/tailwind-vue-dropdown-example"&gt;github.com/jwbaldwin&lt;/a&gt; and in the codesandbox below!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alright, let's get right into it.&lt;/p&gt;
&lt;h2&gt;
  
  
  First: The Setup
&lt;/h2&gt;

&lt;p&gt;We'll have two main components for this. The Vue component that will act as the dropdown, and the Vue component which will open the dropdown when clicked.&lt;/p&gt;

&lt;p&gt;The dropdown component will be pretty straight forward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight vue"&gt;&lt;code&gt;//MainDropdown.vue
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="na"&gt;Where&lt;/span&gt; &lt;span class="na"&gt;our&lt;/span&gt; &lt;span class="na"&gt;functionality&lt;/span&gt; &lt;span class="na"&gt;will&lt;/span&gt; &lt;span class="na"&gt;go&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="na"&gt;Where&lt;/span&gt; &lt;span class="na"&gt;we&lt;/span&gt; &lt;span class="na"&gt;will&lt;/span&gt; &lt;span class="na"&gt;put&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;dropdown&lt;/span&gt; &lt;span class="na"&gt;items&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nx"&gt;Where&lt;/span&gt; &lt;span class="nx"&gt;we&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;track&lt;/span&gt; &lt;span class="nx"&gt;our&lt;/span&gt; &lt;span class="nx"&gt;modal&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;open&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;closed&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;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nx"&gt;Where&lt;/span&gt; &lt;span class="nx"&gt;we&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;toggle&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Okay! Nothing fancy going on here. A little &lt;a href="https://vuejs.org/v2/guide/components-slots.html"&gt;Vue slot&lt;/a&gt; api usage, so that we can reuse this component for dropdowns all throughout the app! Basically, we're going to define what we want rendered in that &lt;em&gt;slot&lt;/em&gt; in another component.&lt;/p&gt;

&lt;p&gt;So, let's scaffold the items we'll display!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight vue"&gt;&lt;code&gt;//ButtonWithDropdown.vue
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;main-dropdown&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;template&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="na"&gt;Where&lt;/span&gt; &lt;span class="na"&gt;we&lt;/span&gt; &lt;span class="na"&gt;will&lt;/span&gt; &lt;span class="na"&gt;say&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;hey&lt;/span&gt; &lt;span class="na"&gt;vue&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;put&lt;/span&gt; &lt;span class="na"&gt;this&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;slot&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"../assets/profile.png"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"profile image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="na"&gt;What&lt;/span&gt; &lt;span class="na"&gt;we&lt;/span&gt; &lt;span class="na"&gt;want&lt;/span&gt; &lt;span class="na"&gt;displayed&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;dropdown&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"/profile"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"/profile"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Profile&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&amp;gt;&lt;/span&gt;Sign out&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/main-dropdown&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MainDropdown&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/components/MainDropdown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button-with-dropdown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John Wick&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dontkillmydog@johnwick.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MainDropdown&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Great, so it looks terrible &lt;em&gt;and&lt;/em&gt; doesn't work. Let's fix the style with TailwindCSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next: The Styling
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight vue"&gt;&lt;code&gt;//MainDropdown.vue
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex justify-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"relative"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fixed inset-0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;methods&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;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The div element with &lt;code&gt;fixed inset-0&lt;/code&gt; will &lt;strong&gt;cover the entire page&lt;/strong&gt;. Just remember this little guy. More on what it does later!&lt;/p&gt;

&lt;p&gt;We're going to make sure the parent is "relative" so that we can position the child dropdown absolute in relation to that element. And then we apply some other positioning so that it sits where we want it to!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight vue"&gt;&lt;code&gt;//ButtonWithDropdown.vue
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;main-dropdown&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;template&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"h-10 w-10 cursor-pointer rounded-full border-2 border-gray-400 object-cover"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"../assets/profile.png"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"profile image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;transition&lt;/span&gt; 
             &lt;span class="na"&gt;enter-active-class=&lt;/span&gt;&lt;span class="s"&gt;"transition-all duration-100 ease-out"&lt;/span&gt; 
             &lt;span class="na"&gt;leave-active-class=&lt;/span&gt;&lt;span class="s"&gt;"transition-all duration-100 ease-in"&lt;/span&gt; 
             &lt;span class="na"&gt;enter-class=&lt;/span&gt;&lt;span class="s"&gt;"opacity-0 scale-75"&lt;/span&gt;
             &lt;span class="na"&gt;enter-to-class=&lt;/span&gt;&lt;span class="s"&gt;"opacity-100 scale-100"&lt;/span&gt;
             &lt;span class="na"&gt;leave-class=&lt;/span&gt;&lt;span class="s"&gt;"opacity-100 scale-100"&lt;/span&gt;
             &lt;span class="na"&gt;leave-to-class=&lt;/span&gt;&lt;span class="s"&gt;"opacity-0 scale-75"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"origin-top-right absolute right-0 mt-2 w-64 bg-white border overflow-hidden rounded-lg shadow-md"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"/profile"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"rounded-t-lg block px-4 py-3 hover:bg-gray-100"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"font-semibold "&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-gray-700"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hover:bg-gray-100"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"font-semibold block px-4 py-3"&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"/profile"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Profile&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hover:bg-gray-100"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"font-semibold block px-4 py-3"&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"/profile"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Sign Out&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;There's a bit more going on here. Most of it is just styling, but we are adding a couple of things I want to point out. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We are using the &lt;code&gt;transition&lt;/code&gt; element provided by Vue and then combining that with TailwindCSS classes to make the dropdown fade in and out! (when it actually opens and closes)&lt;/li&gt;
&lt;li&gt;We have some &lt;code&gt;hover:&lt;/code&gt; pseudo-class variants that apply styles based on if an element is hovered or not.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Alright! It's really coming along. Not half-bad, but let's make it work!&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally: The Functionality
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The key interaction here:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;MainDropdown.vue&lt;/code&gt; component, that we &lt;code&gt;slot&lt;/code&gt; the button into, will allow the &lt;code&gt;ButtonWithDropdown.vue&lt;/code&gt; component to access it's context and call methods provided by &lt;code&gt;MainDropdown.vue&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let's see how that works!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight vue"&gt;&lt;code&gt;//MainDropdown.vue
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex justify-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"relative"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;v-if=&lt;/span&gt;&lt;span class="s"&gt;"open"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"open = false"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fixed inset-0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;slot&lt;/span&gt; &lt;span class="na"&gt;:open=&lt;/span&gt;&lt;span class="s"&gt;"open"&lt;/span&gt; &lt;span class="na"&gt;:toggleOpen=&lt;/span&gt;&lt;span class="s"&gt;"toggleOpen"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;open&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&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;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;toggleOpen&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;open&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;open&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;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Okay so let's go over what we did here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We added a boolean &lt;code&gt;open: false&lt;/code&gt; to our component data. This will determine if we show the dropdown (and our "fixed inset-0" element) or not.&lt;/li&gt;
&lt;li&gt;We added a &lt;code&gt;toggleOpen()&lt;/code&gt; method that will simple invert the state of that &lt;code&gt;open&lt;/code&gt; state.&lt;/li&gt;
&lt;li&gt;We added &lt;code&gt;v-if="open" @click="open = false"&lt;/code&gt; to our &lt;code&gt;fixed inset-0&lt;/code&gt; element. Remember how I said this element will cover the whole page? Right, so now it only shows when our dropdown is open, so if we click anywhere outside of the dropdown...boom! The dropdown closes as you'd expect! (told ya I'd explain that, not magic anymore)&lt;/li&gt;
&lt;li&gt;Finally, we bind &lt;code&gt;:open&lt;/code&gt; and &lt;code&gt;:toggleOpen&lt;/code&gt; to our 'slot'. Whatever get's "slotted" into this component, can now access &lt;code&gt;:open&lt;/code&gt; and &lt;code&gt;:toggleOpen&lt;/code&gt; as props. In our case, that's our &lt;code&gt;ButtonWithDropdown.vue&lt;/code&gt;. We'll see how in the next snippet!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Okay, the final touches!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight vue"&gt;&lt;code&gt;//ButtonWithDropdown.vue
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;main-dropdown&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;template&lt;/span&gt; &lt;span class="na"&gt;slot-scope=&lt;/span&gt;&lt;span class="s"&gt;"context"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"context.toggleOpen"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"h-10 w-10 cursor-pointer rounded-full border-2 border-gray-400 object-cover"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"../assets/profile.png"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"profile image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;transition&lt;/span&gt; &lt;span class="na"&gt;enter-active-class=&lt;/span&gt;&lt;span class="s"&gt;"transition-all duration-100 ease-out"&lt;/span&gt; &lt;span class="na"&gt;leave-active-class=&lt;/span&gt;&lt;span class="s"&gt;"transition-all duration-100 ease-in"&lt;/span&gt; &lt;span class="na"&gt;enter-class=&lt;/span&gt;&lt;span class="s"&gt;"opacity-0 scale-75"&lt;/span&gt;
                &lt;span class="na"&gt;enter-to-class=&lt;/span&gt;&lt;span class="s"&gt;"opacity-100 scale-100"&lt;/span&gt; &lt;span class="na"&gt;leave-class=&lt;/span&gt;&lt;span class="s"&gt;"opacity-100 scale-100"&lt;/span&gt; &lt;span class="na"&gt;leave-to-class=&lt;/span&gt;&lt;span class="s"&gt;"opacity-0 scale-75"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;v-if=&lt;/span&gt;&lt;span class="s"&gt;"context.open"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"origin-top-right absolute right-0 mt-2 w-64 bg-white border overflow-hidden rounded-lg shadow-md"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Only three things to note here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We tell our component that we can access the scope by using the variable &lt;code&gt;context&lt;/code&gt; (&lt;code&gt;slot-scope="context"&lt;/code&gt;). Now we have full access to those props we just bound (&lt;code&gt;:open&lt;/code&gt;, &lt;code&gt;:toggleOpen&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;We listen for clicks to our image, and toggle the dropdown using that context: &lt;code&gt;@click="context.toggleOpen"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Finally, we hide the dropdown elements: &lt;code&gt;v-if="context.open"&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  THAT'S IT!
&lt;/h4&gt;

&lt;p&gt;You now have a fully functioning dropdown in Vue, with styling courtesy of TailwindCSS!&lt;/p&gt;

&lt;p&gt;Here is a codesandbox with the full example!&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/tailwind-vue-dropdown-example-9vx4y?module=/src/components/MainDropdown.vue"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Fin
&lt;/h2&gt;

&lt;p&gt;The full working example (with each step as a branch) can be found in my &lt;a href="https://github.com/jwbaldwin"&gt;github.com/jwbaldwin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you liked this and want to see more stuff like it, feel free to follow me on twitter &lt;a href="https://mobile.twitter.com/jwbaldwin_"&gt;@jwbaldwin_&lt;/a&gt; or head over to &lt;a href="//www.jwbaldwin.com"&gt;my blog&lt;/a&gt; where I share these posts :)&lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>vue</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>⚡10 Vim + VSCode tips that will supercharge your productivity</title>
      <dc:creator>James Baldwin</dc:creator>
      <pubDate>Wed, 15 Jan 2020 01:48:59 +0000</pubDate>
      <link>https://forem.com/jw_baldwin/10-vim-vscode-tips-that-will-supercharge-your-productivity-504e</link>
      <guid>https://forem.com/jw_baldwin/10-vim-vscode-tips-that-will-supercharge-your-productivity-504e</guid>
      <description>&lt;h3&gt;
  
  
  Develop faster with these quick Vim + VSCode tips
&lt;/h3&gt;

&lt;p&gt;This post was originally posted on my personal blog at &lt;a href="//www.jwbaldwin.com"&gt;jwbaldwin.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I started &lt;a href="https://flowist.io"&gt;Flowist.io&lt;/a&gt;, I decided: &lt;strong&gt;I want to learn vim. And I want to be fast.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Learning Vim can be hard at first. But combining it with VSCode can make that a bit easier - and you get the best of both worlds!&lt;/p&gt;

&lt;p&gt;Here are some of the most useful tips and tricks that instantly allowed me to work faster! &lt;em&gt;P.S.: great resource for starting out: &lt;a href="https://devhints.io/vim"&gt;devhints.io/vim&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Vim secret:&lt;/strong&gt; It's not hard. Just learn what the letters mean, combine them, and see what happens!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;First of all, to install vim in vscode:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Open Visual Studio Code
2. Go to Extensions
3. Search for vim
4. The first plugin named Vim is the one you want
5. Click install
6. Boom!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  1. vim-surround
&lt;/h2&gt;

&lt;p&gt;This plugin lets you surround with or remove surrounding elements (think: &lt;code&gt;"&lt;/code&gt;, &lt;code&gt;'&lt;/code&gt;, &lt;code&gt;{}&lt;/code&gt;, &lt;code&gt;()&lt;/code&gt;, etc.)&lt;/p&gt;

&lt;p&gt;This is a must-have plugin for Vim. I don't believe in immediately installing tons of plugins, but some of them are just necessary.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ve S&amp;lt;tag&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;a href="https://i.giphy.com/media/MaaI2xC7bDA9oqAUKx/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/MaaI2xC7bDA9oqAUKx/giphy.gif" alt="vim-surround"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. vim-motion
&lt;/h2&gt;

&lt;p&gt;Press the keybind and then use the letters to move through your file. Another must-have. Not a replacement for other Vim movements, but incredibly useful for moving quickly and being more productive.&lt;/p&gt;

&lt;p&gt;My keybind and config to jump-start you :)&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nl"&gt;"vim.easymotionMarkerFontFamily"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FiraCode-Retina"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vim.easymotionMarkerBackgroundColor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#7e57c2"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vim.easymotionMarkerWidthPerChar"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vim.easymotionMarkerFontSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vim.easymotionMarkerYOffset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vim.normalModeKeyBindingsNonRecursive"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"before"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"after"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"leader"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"leader"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"leader"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"w"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vim.easymotion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vim.hlsearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;&amp;gt; &amp;lt;space&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;a href="https://i.giphy.com/media/mFHYnFaAh4EsK6mOp8/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/mFHYnFaAh4EsK6mOp8/giphy.gif" alt="vim-motion"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3. jj
&lt;/h2&gt;

&lt;p&gt;Hitting &lt;code&gt;&amp;lt;esc&amp;gt;&lt;/code&gt; sucks. I didn't realize I wasn't the only one who felt this, and everyone knew a better way. Map something simple to &lt;code&gt;&amp;lt;esc&amp;gt;&lt;/code&gt; instead (I use &lt;code&gt;jj&lt;/code&gt;, but anything easy works.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    "vim.insertModeKeyBindings": [
        {
            "before": ["j", "j"],
            "after": ["&amp;lt;esc&amp;gt;"]
        }
    ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;&amp;gt; jj&lt;/code&gt;&lt;br&gt;
&lt;a href="https://i.giphy.com/media/VhjC1QG5QBuVJmoUJF/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/VhjC1QG5QBuVJmoUJF/giphy.gif" alt="jj"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. cmd + p
&lt;/h2&gt;

&lt;p&gt;Open files super quickly. Don't use the mouse!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; cmd+p&lt;/code&gt;&lt;br&gt;
&lt;a href="https://i.giphy.com/media/IhDnmZwZRtZ9VNOtYR/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/IhDnmZwZRtZ9VNOtYR/giphy.gif" alt="cmd+p"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. V
&lt;/h2&gt;

&lt;p&gt;Visual mode (think highlight and select) but for a &lt;em&gt;whole line&lt;/em&gt; at a time. &lt;br&gt;
Didn't know this existed either. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; V&lt;/code&gt;&lt;br&gt;
&lt;a href="https://i.giphy.com/media/f6hc3ifyZl3YeVDwB5/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/f6hc3ifyZl3YeVDwB5/giphy.gif" alt="V"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. yip, yap
&lt;/h2&gt;

&lt;p&gt;Here's where things get expressive!&lt;/p&gt;

&lt;p&gt;Helpful for grabbing functions or methods and quickly copying them to paste elsewhere.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;y&lt;/strong&gt; = yank&lt;br&gt;
&lt;strong&gt;i&lt;/strong&gt; = inner (in)&lt;br&gt;
&lt;strong&gt;p&lt;/strong&gt; = paragraph&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;y&lt;/strong&gt; = yank&lt;br&gt;
&lt;strong&gt;a&lt;/strong&gt; = a&lt;br&gt;
&lt;strong&gt;p&lt;/strong&gt; = paragraph (including newlines)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; yap&lt;/code&gt;&lt;br&gt;
&lt;a href="https://i.giphy.com/media/fw8yroCvHwb0A6AFkE/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/fw8yroCvHwb0A6AFkE/giphy.gif" alt="yap"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. cit, yit
&lt;/h2&gt;

&lt;p&gt;Great for editing HTML. 10x faster then navigating inside of the tag and editing or copying it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;c&lt;/strong&gt; = change&lt;br&gt;
&lt;strong&gt;i&lt;/strong&gt; = inner (in)&lt;br&gt;
&lt;strong&gt;t&lt;/strong&gt; = tag (&lt;strong&gt;YES, html tags!&lt;/strong&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Bonus tip:&lt;/strong&gt; Use ", and { to speed up html and javascript editing too!&lt;br&gt;
and&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;y&lt;/strong&gt; = yank&lt;br&gt;
&lt;strong&gt;i&lt;/strong&gt; = inner (in)&lt;br&gt;
&lt;strong&gt;t&lt;/strong&gt; = tag&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; cit&lt;/code&gt;&lt;br&gt;
&lt;a href="https://i.giphy.com/media/VfDvTq4lIcH1kKd6K0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/VfDvTq4lIcH1kKd6K0/giphy.gif" alt="change in tag"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. dw, df
&lt;/h2&gt;

&lt;p&gt;Easily remove words faster.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;d&lt;/strong&gt; = delete&lt;br&gt;
&lt;strong&gt;w&lt;/strong&gt; = word&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;d&lt;/strong&gt; = delete&lt;br&gt;
&lt;strong&gt;f&lt;/strong&gt; = find&lt;br&gt;
&lt;strong&gt;&lt;/strong&gt; = item to search for and include in the delete&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; dw dfs&lt;/code&gt;&lt;br&gt;
&lt;a href="https://i.giphy.com/media/J6CerVKapxpzPAZW6v/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/J6CerVKapxpzPAZW6v/giphy.gif" alt="delete"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. ci", ci{
&lt;/h2&gt;

&lt;p&gt;Change class tags, hrefs, strings and edit function bodies way faster.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;c&lt;/strong&gt; = change&lt;br&gt;
&lt;strong&gt;i&lt;/strong&gt; = inner (in)&lt;br&gt;
&lt;strong&gt;"&lt;/strong&gt; = item to change inside of&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;c&lt;/strong&gt; = change&lt;br&gt;
&lt;strong&gt;i&lt;/strong&gt; = inner (in)&lt;br&gt;
&lt;strong&gt;{&lt;/strong&gt; = item to change inside of&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; ci{&lt;/code&gt;&lt;br&gt;
&lt;a href="https://i.giphy.com/media/Wov6oiizGBRtQajSAH/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/Wov6oiizGBRtQajSAH/giphy.gif" alt="change in {"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  10. f_, F_
&lt;/h2&gt;

&lt;p&gt;Super useful for moving to specific items. Way faster than &lt;code&gt;lllllll&lt;/code&gt; or even &lt;code&gt;8l&lt;/code&gt;...&lt;code&gt;h&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;f&lt;/strong&gt; = find (ahead of cursor)&lt;br&gt;
&lt;strong&gt;_&lt;/strong&gt; = anything to search for&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;F&lt;/strong&gt; = Find (behind cursor)&lt;br&gt;
&lt;strong&gt;_&lt;/strong&gt; = anything to search for&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; f2 F3&lt;/code&gt;&lt;br&gt;
&lt;a href="https://i.giphy.com/media/ZD7x5gjbgLDESwr4nz/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/ZD7x5gjbgLDESwr4nz/giphy.gif" alt="find"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  BONUS: u, r
&lt;/h2&gt;

&lt;p&gt;Some bonus must-haves!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;u&lt;/strong&gt; = undo the last change&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;r&lt;/strong&gt; = replace (r + thing to replace with)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; &amp;lt;space&amp;gt; dit ... u&lt;/code&gt;&lt;br&gt;
&lt;a href="https://i.giphy.com/media/WsXAdBLva8z4soCNg9/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/WsXAdBLva8z4soCNg9/giphy.gif" alt="undo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Since I started working on &lt;a href="https://flowist.io"&gt;Flowist.io&lt;/a&gt; I made a serious effort to get proficient with vim. Hopefully, this helps you boost your vim speed too!&lt;/p&gt;

&lt;p&gt;Thanks for reading :) Catch me on twitter &lt;a href="https://twitter.com/jwbaldwin_"&gt;@jwbaldwin_&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vim</category>
      <category>vscode</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
    <item>
      <title>3 Ways I Improved My Remote Work</title>
      <dc:creator>James Baldwin</dc:creator>
      <pubDate>Sun, 29 Dec 2019 20:06:25 +0000</pubDate>
      <link>https://forem.com/jw_baldwin/3-ways-i-improved-my-remote-work-312p</link>
      <guid>https://forem.com/jw_baldwin/3-ways-i-improved-my-remote-work-312p</guid>
      <description>&lt;h3&gt;
  
  
  Boost your productivity and balance with 3 simple things
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;This post was originally posted on my personal blog at &lt;a href="//jwbaldwin.com"&gt;jwbaldwin.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Remote work is awesome. Remote work is growing. Remote work is deceptively tough. At first it seems like the dream, but it can be a lot harder than it first appears if you don't take it seriously.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Transition In/Out of Work
&lt;/h2&gt;

&lt;p&gt;One thing that makes remote work tough, mentally, is that there is no physical transition period. There is no commute where you get ready for work, or get ready to be home and spend time with your family. &lt;br&gt;
Remote makes it easier and easier to blur the work/life lines, and soon enough you start bringing work with you wherever you go. Here's the fix: &lt;em&gt;don't remove the commute, change it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Instead of a 30 minute drive, setup a routine of doing something (gym, coffee + book, meditate, etc.) before hitting the day's work. Turn what was your unproductive commute time, into a productive slice of time where you transition from home to work and back. Even if that means commuting to your favorite coffee shop for an hour of emails. This breaks the day into specific chunks and turns a blurry, unhealthy mix of work + life, into a clear time for work and home.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Take Breaks
&lt;/h2&gt;

&lt;p&gt;This one is simple. Breaks are necessary - but when you're working from home it's easy to just grind for hours and hours - after all, there's no one there to interrupt you!&lt;/p&gt;

&lt;p&gt;Taking breaks lets you organize your mind, and improve your mental health.&lt;/p&gt;

&lt;p&gt;Here are some things I do for breaks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;5 minute walk with my dog&lt;/li&gt;
&lt;li&gt;Make a snack&lt;/li&gt;
&lt;li&gt;Do 10 minutes of an exercise&lt;/li&gt;
&lt;li&gt;Read some articles&lt;/li&gt;
&lt;li&gt;GET COFFEE :) (I do this a lot)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  3. Make Time for Focus
&lt;/h2&gt;

&lt;p&gt;The biggest boon for me when I work from home, is the amount of focused time I can create. So when you have that one task that needs your attention - plan your breaks and your work day around this. Schedule your meetings on either end of this block of time.&lt;/p&gt;

&lt;p&gt;Set time aside so that you can enter flow.&lt;/p&gt;

&lt;p&gt;Remove distractions. Disable notifications. Take the dog out to pee. Then get to it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;There are tons of little hack and tricks that help boost your remote work life. Hopefully these ideas, fresh or just reiterated, can allow you to lead a more balanced and productive work day!&lt;/p&gt;

&lt;p&gt;Thanks for reading :) Catch me on twitter &lt;a href="https://twitter.com/jwbaldwin_"&gt;@jwbaldwin_&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>remote</category>
      <category>life</category>
      <category>advice</category>
    </item>
    <item>
      <title>Solving FizzBuzz with Elixir</title>
      <dc:creator>James Baldwin</dc:creator>
      <pubDate>Mon, 09 Dec 2019 04:40:45 +0000</pubDate>
      <link>https://forem.com/jw_baldwin/solving-fizzbuzz-with-elixir-3a62</link>
      <guid>https://forem.com/jw_baldwin/solving-fizzbuzz-with-elixir-3a62</guid>
      <description>&lt;h1&gt;
  
  
  Solve FizzBuzz in Elixir
&lt;/h1&gt;

&lt;h3&gt;
  
  
  FizzBuzz with multiple solutions in Elixir. Which is best?
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Why FizzBuzz?
&lt;/h2&gt;

&lt;p&gt;It’s a problem everyone knows, so we can focus more on the way I solve it, than how I solve it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solutions
&lt;/h2&gt;

&lt;p&gt;Elixir is a functional language. And it’s very flexible.&lt;/p&gt;

&lt;p&gt;This means there are tons of ways to solve a problem like FizzBuzz, and sometimes that means too many.&lt;/p&gt;

&lt;p&gt;Let’s take a look at two ways we can use Elixir’s features to solve FizzBuzz in a clean and readable way. I don’t think one is better than the other, that’s for you to decide.&lt;/p&gt;

&lt;p&gt;Though, it’s my opinion that the one that doesn’t make you say ugh, or scratch your head, is the better one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Whenever I have to think to understand what the code is doing, I ask myself if I can refactor the code to make that understanding more immediately apparent.”&lt;br&gt;
— Martin Fowler&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. Guards
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hexdocs.pm/elixir/guards.html"&gt;https://hexdocs.pm/elixir/guards.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first solution uses Elixir’s guards. A feature that augments pattern matching by allowing you to add some additional checks to your function.&lt;br&gt;
i.e. ( from the docs)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;empty_map?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;when&lt;/span&gt; &lt;span class="n"&gt;map_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;map&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="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;empty_map?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;when&lt;/span&gt; &lt;span class="n"&gt;is_map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here’s what is looks like when applied to FizzBuzz&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GaurdFizzBuzz&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;solve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;solve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;&amp;amp;1&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;solve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&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="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"FizzBuzz"&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;solve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&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="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="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Buzz"&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;solve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&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="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Fizz"&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;solve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Conditionals
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://elixir-lang.org/getting-started/case-cond-and-if.html"&gt;https://elixir-lang.org/getting-started/case-cond-and-if.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second solution uses Elixir’s conditionals. &lt;br&gt;
A way to match based off of some operations. Like a condensed and simple way to do &lt;code&gt;if-else's&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;They look a bit like &lt;code&gt;switch&lt;/code&gt; statements, but operate like an &lt;code&gt;if&lt;/code&gt; clause.&lt;/p&gt;

&lt;p&gt;i.e. ( from the docs)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;cond&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"This is never true"&lt;/span&gt;
  &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Nor this"&lt;/span&gt;
  &lt;span class="no"&gt;true&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"This is always true (equivalent to else)
end
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here’s what is looks like when applied to FizzBuzz!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;MatchFizzBuzz&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;solve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;solve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;&amp;amp;1&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;solve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;cond&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"FizzBuzz"&lt;/span&gt;
      &lt;span class="n"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&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="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Buzz"&lt;/span&gt;
      &lt;span class="n"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Fizz"&lt;/span&gt;
      &lt;span class="no"&gt;true&lt;/span&gt;              &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Which is better? Each has its merits. And as far as which I would rather see in a production code-base. I’m not really certain. Let’s take a look at the pros and cons:&lt;/p&gt;

&lt;p&gt;Gaurds&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Are not as readable when used for lots of pattern matching&lt;/li&gt;
&lt;li&gt;Would be more extendable and testable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Conds&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Are more readable.&lt;/li&gt;
&lt;li&gt;Would be harder to extend if some other requirements came down.&lt;/li&gt;
&lt;li&gt;You’d have to refactor it if you wanted to add additional logic to it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It’s really up to you and your team which you’d rather work-with. Often the finally level of optimization (guard v.s. cond) is not worth it. Shipped code is the best code.&lt;/p&gt;

&lt;p&gt;So there you have it! FizzBuzz solved in two ways, each using a different language feature of Elixir.&lt;/p&gt;

&lt;p&gt;Thanks for reading :)&lt;br&gt;
Catch me on twitter &lt;a href="https://twitter.com/jwbaldwin_"&gt;https://twitter.com/jwbaldwin_&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>codequality</category>
      <category>tutorial</category>
      <category>refactorit</category>
    </item>
    <item>
      <title>How To Create a Great Blog Title</title>
      <dc:creator>James Baldwin</dc:creator>
      <pubDate>Tue, 19 Nov 2019 01:58:18 +0000</pubDate>
      <link>https://forem.com/jw_baldwin/how-to-create-a-great-blog-title-2n29</link>
      <guid>https://forem.com/jw_baldwin/how-to-create-a-great-blog-title-2n29</guid>
      <description>&lt;p&gt;This post was originally posted on my personal blog at &lt;a href="https://www.jwbaldwin.com/blog/how-to-create-a-great-blog-title/"&gt;jwbaldwin.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Writing a good blog title is an art. Here are some tips I use personally, that will help make &lt;strong&gt;your blogs stand out from the rest&lt;/strong&gt;. We'll use the blog title &lt;em&gt;below&lt;/em&gt; as a starting point, and see how we can make it something that might actually get clicked on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our starting blog title for our awesome blog:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Generating websites with Elixir and Phoenix&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. How To's and Listicles
&lt;/h2&gt;

&lt;p&gt;These are the most common forms of blogs, and for good reason. They easily describe the contents of the artciles and pique people's interest. Don't be afraid to use this tried and true method!&lt;/p&gt;

&lt;p&gt;Instead of: &lt;code&gt;Generating backends with Elixir and Phoenix Framework&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;Rephrase it just a bit to be: &lt;code&gt;How to generate a backend in a couple minutes with Elixir and Phoenix&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;This small shift allows you to tell your reader that you're going to teach them something useful, and it's catchy while not being false.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Provide value
&lt;/h2&gt;

&lt;p&gt;This is the &lt;strong&gt;#1 THING&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Blog titles should be all about communicating what value you provide to the reader as fast as possible. Keep it short and punchy with a clear value statement.  &lt;/p&gt;

&lt;p&gt;Instead of: &lt;code&gt;How to generate a backend in a couple minutes with Elixir and Phoenix&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;Show the value with: &lt;code&gt;How to create your backend in 5 minutes with Elixir and Phoenix&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Keep it Short
&lt;/h2&gt;

&lt;p&gt;People &lt;em&gt;don't have time&lt;/em&gt; to read your long blog title. They will just gloss right over it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A0bKbU9B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.ifunny.co/images/c378733edf08597d06b3727b30f638a8f24026cf7f25f19682a04b85382a6655_1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A0bKbU9B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.ifunny.co/images/c378733edf08597d06b3727b30f638a8f24026cf7f25f19682a04b85382a6655_1.jpg" alt="Keep it Short"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of: &lt;code&gt;How to create your backend in 5 minutes with Elixir and Phoenix&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;Drop the implied words: &lt;code&gt;Create your backend in 5 minutes with Elixir and Phoenix&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Conclusion
&lt;/h2&gt;

&lt;p&gt;Basically, catch peoples attention with the &lt;strong&gt;what&lt;/strong&gt; and &lt;strong&gt;why&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What are they clicking on.&lt;/p&gt;

&lt;p&gt;Why should they read it.&lt;/p&gt;

&lt;p&gt;If you put each blog title through these filters, and make sure it answers those questions, you're well on your way to a great blog title!&lt;/p&gt;

&lt;p&gt;I hope this helps! Reach out to me with questions or comments :)&lt;/p&gt;

</description>
      <category>writing</category>
      <category>meta</category>
    </item>
  </channel>
</rss>
