<?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: Gedalya Krycer</title>
    <description>The latest articles on DEV Community by Gedalya Krycer (@gedalyakrycer).</description>
    <link>https://dev.to/gedalyakrycer</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%2F537261%2F8c5707dc-338c-449f-b608-cc896b161638.jpeg</url>
      <title>DEV Community: Gedalya Krycer</title>
      <link>https://dev.to/gedalyakrycer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gedalyakrycer"/>
    <language>en</language>
    <item>
      <title>Design &amp; Front-End Takeaways From "An Event Apart" Conference</title>
      <dc:creator>Gedalya Krycer</dc:creator>
      <pubDate>Mon, 19 Dec 2022 03:25:50 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/design-front-end-takeaways-from-an-event-apart-conference-1kin</link>
      <guid>https://dev.to/gedalyakrycer/design-front-end-takeaways-from-an-event-apart-conference-1kin</guid>
      <description>&lt;p&gt;A few days ago I attend the &lt;a href="https://aneventapart.com/event/san-francisco-2022"&gt;An Event Apart conference&lt;/a&gt; in San Fransisco and it was such a wonderful experience!&lt;/p&gt;

&lt;p&gt;It featured 15 amazing speakers covering topics on CSS, user experience, SEO, and so much more. &lt;/p&gt;

&lt;p&gt;This post contains some of the takeaways that really stood out to me. Each section has links to the speaker and resources they mentioned. &lt;/p&gt;

&lt;p&gt;I'd definitely encourage hearing any of their talks if the opportunity is available! &lt;/p&gt;

&lt;h4&gt;
  
  
  Talks in this post:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;📢 Declarative Design&lt;/li&gt;
&lt;li&gt;📢 Eyes on the Prize: Lessons in User-Centered Design&lt;/li&gt;
&lt;li&gt;📢 When New CSS Features Collide: Possibility and Complexity at the Intersections&lt;/li&gt;
&lt;li&gt;📢 Cascading Layers of !mportance&lt;/li&gt;
&lt;li&gt;📢 SEO teams—The UX Ally You’ve Been Missing All Your Life!&lt;/li&gt;
&lt;li&gt;📢 Supercharge Your Development with GitHub Codespaces&lt;/li&gt;
&lt;li&gt;📢 Animation in Today's Responsive Design&lt;/li&gt;
&lt;li&gt;📢 How to Win at ARIA and Influence Web Accessibility&lt;/li&gt;
&lt;li&gt;📢 Better Onboarding Through Guided Interaction&lt;/li&gt;
&lt;li&gt;📢 CSS &lt;code&gt;:has()&lt;/code&gt; Unlimited Power&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, I'm so grateful to &lt;a href="https://www.planningcenter.com/"&gt;Planning Center&lt;/a&gt;, for enabling myself and fellow teammates to attend conferences like this one. The way they care for our growth is just one of the many reasons why I love working here!&lt;/p&gt;

&lt;p&gt;Shameless plug… We are hiring! For anyone looking to join a great company, check out &lt;a href="https://www.planningcenter.com/careers"&gt;our career page&lt;/a&gt;. :) &lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📢 Declarative Design
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Speaker:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://aneventapart.com/speakers/jeremy-keith"&gt;Jeremy Keith&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Author &amp;amp; Co-Founder of Clearleft&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Main Takeaway
&lt;/h3&gt;

&lt;p&gt;Consider if a system should be given step-by-step instructions or instead guidance on the output, allowing it to decide the steps for us. &lt;/p&gt;
&lt;h3&gt;
  
  
  Imperative vs Declarative Programming
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Imperative programming&lt;/strong&gt; is where you describe how the program operates, giving it step-by-step instructions. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Think of a tool like front-end JavaScript, where we can query a specific API for data and then specifically tell the browser how (or even if) to display that data in the DOM. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Similarly ARIA labels lets us tell screen readers specifically what to say and what elements to look at first.   &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Declarative programming&lt;/strong&gt; on the other hand takes in a description of the output and then figures out the rest on its own. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;For example, we tell HTML we want a &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; and then it figures how to communicate a lot of helpful information to screen readers, browsers, search engines, and even gives some base styling. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Similarly CSS allows us to using &lt;code&gt;rem&lt;/code&gt; units to specify how big a font size should be. Then if needed, a user can change that font size to be larger.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We can take it a step further and specify &lt;code&gt;padding-inline-start: 1rem;&lt;/code&gt; instead of &lt;code&gt;padding-left: 1rem;&lt;/code&gt;. This does the same thing, but takes away the (imperative) assumption that the browser is showing a left-to-right language.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Different Mindsets
&lt;/h3&gt;

&lt;p&gt;Imperative mindset gives more control with the code, which might be the right call if you are inventing something from scratch. Declarative mindset can feel like giving up control, however it also means your making less assumptions.&lt;/p&gt;

&lt;p&gt;One of the ways Jeremy described declarative programming was to “Be the browser’s mentor, not its micro-manager”. It leads to a mindset of asking "should I be making assumptions for the browser and user?"&lt;/p&gt;

&lt;p&gt;This mindset shift really stood out to me, because it takes things like ARIA labels that I usually think of as inherently a good thing and makes me consider the output more carefully. &lt;/p&gt;

&lt;p&gt;As Jeremy mentioned, "The more ARIA you use, the more control you are trying to assert."&lt;/p&gt;
&lt;h3&gt;
  
  
  Principle of Least Power
&lt;/h3&gt;

&lt;p&gt;This is where we choose the least powerful language suitable for a given purpose. The lower in the stack we go, the more simplicity in our solutions we might have. This simplicity might lead to less things breaking and a lower bar for learning. &lt;/p&gt;

&lt;p&gt;If we don't legitimately need greater control that front-end JS and ARIA offers, then it might be a better choice to use HTML. In other words, don't use a &lt;code&gt;&amp;lt;div role="button"&amp;gt;&lt;/code&gt; when &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; already exists. &lt;/p&gt;

&lt;p&gt;Another thing to consider when moving lower in the stack, is that HTML is more "false tolerant" when compared to an imperative language like JavaScript. This means that it ignores what it doesn't understand (like a missing image) and keeps rendering the DOM. JavaScript however will throw up an error, that might break the page.&lt;/p&gt;
&lt;h3&gt;
  
  
  Taking A Layered Approach
&lt;/h3&gt;

&lt;p&gt;Sometimes we can split the difference and use imperative and declarative programs and patterns together. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For example, use HTML &amp;amp; CSS as the foundation for the project and default for solving front-end problems. Then "sprinkle" JavaScript and ARIA on top, using them for the things that only they can do.&lt;/li&gt;
&lt;li&gt;Using utilities like &lt;code&gt;clamp()&lt;/code&gt; in CSS, lets us use imperative values, in a declarative way. Yes, we are setting a min and max value, but also allowing the value to shift between them as needed. &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Other Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Be aware that the tools that we use are influencing us to go in a certain way. Figma, is probably making us go towards imperative design/programming as we can make pixel perfect mockups. It might be worth designing in Figma, but making final decisions once in the browser. &lt;/li&gt;
&lt;li&gt;Look at approaches vs specific tools/solutions. Approaches lasts longer then the tools that enact them.&lt;/li&gt;
&lt;li&gt;Culture drives if a Declarative approach is the right one. Is the team focused on the outcomes (declarative) or the actual way things are done (imperative)?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://buildexcellentwebsit.es/"&gt;Be the browser’s mentor, not its micromanager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.smashingmagazine.com/2021/04/designing-developing-fluid-type-space-scales/"&gt;Meet Utopia: Designing And Building With Fluid Type And Space Scales&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alistapart.com/article/dao/"&gt;A Dao of Web Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.browserstack.com/guide/difference-between-progressive-enhancement-and-graceful-degradation"&gt;Progressive Enhancement vs Graceful Degradation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  📢 Eyes on the Prize: Lessons in User-Centered Design
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Speaker:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://aneventapart.com/speakers/anita-cheng"&gt;Anita Cheng&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Former Cancer Researcher &amp;amp; Content Designer for San Francisco Digital Services&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Main Takeaway
&lt;/h3&gt;

&lt;p&gt;High stress environments highlights the importance of understanding the problem and getting input from people so that we are ready when it times to create a solution.&lt;/p&gt;
&lt;h3&gt;
  
  
  A Testimony Of Working Under Pressure
&lt;/h3&gt;

&lt;p&gt;Anita was the only content designer embedded in San Francisco’s COVID Command Center. She recounted her incredible experience of translating highly complicated health notices and reports into readable content on the government website.&lt;/p&gt;

&lt;p&gt;To say she was under tremendous pressure, would be a gross understatement. Policy and information was continually changing, requiring that she be always proactive, engaged and flexible through an incredibly stressful time. Yet she more then rose to the task, making sure any communication to the population was clear and timely.&lt;/p&gt;
&lt;h3&gt;
  
  
  Some Of The Lessons She Shared
&lt;/h3&gt;

&lt;p&gt;Surprisingly, despite high stress and long hours she did not burn out. She attributed her energy and ability to focus to getting incredible support from her counterparts and higher-ups. She also truly believed that the work they were doing was for the greater good and important. This belief gave her continual energy and motivation on her hardest days.&lt;/p&gt;

&lt;p&gt;Here are just a few of the other traits that helped her to be successful during this time. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identifying her strengths and leaning into them. She created a personal mandate of what were the most important things in her role. As much as possible she delegated the rest away, which helped protect her time. &lt;/li&gt;
&lt;li&gt;She used research to understand any risks and considered existing similar guidelines when tackling something she didn't know how to do. That helped minimize guessing. &lt;/li&gt;
&lt;li&gt;She asked for help a lot. She might have been the only content designer, but she didn't go at it alone and collaborated frequently with different experts.&lt;/li&gt;
&lt;li&gt;She reached out to different government departments, asking to be in more meetings. This gave her context (and lead time) of what was coming down the line.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hmntycntrd.com/"&gt;hmntycntrd.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  📢 When New CSS Features Collide: Possibility and Complexity at the Intersections
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Speaker:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://aneventapart.com/speakers/rachel-andrew"&gt;Rachel Andrew&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Technical Writer at Google &amp;amp; Member of the CSS Working Group&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Main Takeaway
&lt;/h3&gt;

&lt;p&gt;The future of CSS is bright, with many new features just landing or being added very soon that have been years in the making.&lt;/p&gt;
&lt;h3&gt;
  
  
  So Many New Features!
&lt;/h3&gt;

&lt;p&gt;Rachel's talk was fascinating, covering the thought process and challenges the CSS Working Group consider when updating CSS. &lt;/p&gt;

&lt;p&gt;She highlighted the history of developing Flexbox to solve the issues of float layouts. In someways, Flexbox is like the quote that is sometimes attributed to Henry Ford; "If I would have asked people what they wanted, they would have said faster horses." &lt;/p&gt;

&lt;p&gt;It solves the specific problems of floated elements being hard to manipulate, since they are taken out of the document flow. However, it may not live up to the true potential of two dimensional layout, which came later on with CSS Grids.&lt;/p&gt;

&lt;p&gt;She spoke about the power of CSS Grids and a new feature in the works called &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout/Subgrid"&gt;Subgrid&lt;/a&gt;. This lets child elements inherit their parent grid's size and track number. &lt;/p&gt;

&lt;p&gt;She also covered new features like &lt;code&gt;:has()&lt;/code&gt; (which I'll talk more about with a different speaker) and an CSS feature she is working on. &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout/Subgrid"&gt;Her proposal&lt;/a&gt; would allow developers to specify a custom focus order when laying out a complex grid of elements. This is a highly requested feature and is currently in review by the CSS Working Group.&lt;/p&gt;
&lt;h3&gt;
  
  
  Container Queries
&lt;/h3&gt;

&lt;p&gt;The thing that grabbed my attention the most, was a new game changing feature called container queries. This allows the breakpoints to be based on a container size instead of the view-ports size. &lt;/p&gt;

&lt;p&gt;This is a game changer because we can now design reusable components that can be used in a variety of layouts. Since it manages its own layout, such a component would be incredibly versatile. &lt;/p&gt;

&lt;p&gt;If a "card" component was used in a single column it might show a wider layout and bigger font sizes. But if it had to appear in a row of cards at half the size, then we could stack the card content and reduce the font sizes. &lt;/p&gt;

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

&lt;p&gt;This is already in Safari, Chrome, and just came to Firefox in version 109! 🎉 If the two top cards in the above example don't turn red, then try updating your browser.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries"&gt;CSS Container Queries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://css-tricks.com/container-units-should-be-pretty-handy/"&gt;Container Units Should Be Pretty Handy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.smashingmagazine.com/2021/05/complete-guide-css-container-queries/"&gt;A Primer On CSS Container Queries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📢 Cascading Layers of !mportance
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Speaker:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://aneventapart.com/speakers/miriam-suzanne"&gt;Miriam Suzanne&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Members of the CSS Working Group &amp;amp; SASS Core Team&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Main Takeaway
&lt;/h3&gt;

&lt;p&gt;CSS Cascading Layers lets us use more explicit selectors, by reducing specificity. &lt;/p&gt;
&lt;h3&gt;
  
  
  CSS Cascading Layers
&lt;/h3&gt;

&lt;p&gt;Miriam lead us through a history of CSS and a fascinating demo of the new CSS Cascading Layer feature. &lt;/p&gt;

&lt;p&gt;This feature allows for CSS selectors to be contained within &lt;code&gt;@layer&lt;/code&gt; decorations. What is cool is that specificity of selectors is contained within that layer. We can then declare layers in the order of their priority. &lt;/p&gt;

&lt;p&gt;Selectors outside of a layer by nature have the highest level of specificity, which gives us more flexibility.&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;@layer&lt;/span&gt; &lt;span class="nb"&gt;low&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;medium&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;high&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;––––&lt;/span&gt; &lt;span class="nt"&gt;order&lt;/span&gt; &lt;span class="nt"&gt;here&lt;/span&gt; &lt;span class="nt"&gt;defines&lt;/span&gt; &lt;span class="nt"&gt;specificity&lt;/span&gt; 

&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="nb"&gt;medium&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"submit"&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;@layer&lt;/span&gt; &lt;span class="nb"&gt;high&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"submit"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;This&lt;/span&gt; &lt;span class="nt"&gt;wins&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="nb"&gt;low&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"submit"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are many use cases, but one would be to contain an external library in a layer. Then another layer with a higher priority can contain our overrides. &lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://css-tricks.com/css-cascade-layers/"&gt;A Complete Guide to CSS Cascade Layers&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📢 SEO teams—The UX Ally You’ve Been Missing All Your Life!
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Speaker:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://aneventapart.com/speakers/wil-reynolds"&gt;Wil Reynolds&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Owner of Seer Interactive&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Main Takeaway
&lt;/h3&gt;

&lt;p&gt;Google search is really good at knowing the questions customers are asking and the intent behind their requests. Search results could be one of the tools we can use to understand our customers.&lt;/p&gt;
&lt;h3&gt;
  
  
  Speak The language Of The Customer
&lt;/h3&gt;

&lt;p&gt;Google Search is really good at understand customer intent and intonation. (The feeling behind a question.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt; &lt;br&gt;
At the start of Covid-19 people searched for the term “FDIC” because they were worried about the safety of their funds. However, banks were advertising about opening new checking accounts, which most people were not interested in. &lt;/p&gt;

&lt;p&gt;Had they looked at what people were searching for, they could have instead assured existing and new customers that their money was secure during a tumultuous time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 2:&lt;/strong&gt; &lt;br&gt;
Google also knows when customers change their language, based on the search terms customers look for. For a while “Ian” was bringing up results about an actor, until “Hurricane Ian” hit. &lt;/p&gt;

&lt;p&gt;In about 12 minutes, Google understood that the intent of people’s searched changed and they directed results about the hurricane.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 3:&lt;/strong&gt; &lt;br&gt;
Many colleges were promoting their librarian programs with the technical name of the degree. As it turns out, potential students rarely searched by that degree’s name. Instead they typed in the phrase: “Become a librarian”. &lt;/p&gt;

&lt;p&gt;By including that terminology within landing pages and advertisements, schools where able to answer the very question people were asking.&lt;/p&gt;
&lt;h3&gt;
  
  
  Using Google Search to Understand Intent Tips
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Type a word or two in Google Search and let it complete the sentence. This will preview what actual questions people are asking. Sometimes we assume what people are looking for incorrectly. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the "People also ask" and "Related searches" sections of the Google SERP. This shows what people searched after they looked at the current results. These are questions that your product might be able to answer for them. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check what Google Images is serving to people for search terms, then use similar images to communicate products and ideas. For example, "Modern Pool Lighting" will bring back images of beautiful pools lit up at night. However many eCommerce sites will use images of the lights themselves. They are missing the point by showing the literal product, while Google Images show how the product is being used. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When testing search results, check the same result on mobile and desktop. Google looks for very different things on each platform and will often display different results for the same term. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  📢 Supercharge Your Development with GitHub Codespaces
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Speaker:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://aneventapart.com/speakers/morten-rand-hendriksen"&gt;Morten Rand-Hendriksen&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Senior Staff Instructor for LinkedIn Learning&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Main Takeaway
&lt;/h3&gt;

&lt;p&gt;GitHub Codespaces removes the barrier to entry for writing code by creating a per-configured development environment on the cloud, allowing you to write code in the browser. &lt;/p&gt;
&lt;h3&gt;
  
  
  What Is It?
&lt;/h3&gt;

&lt;p&gt;Codespaces is a new service by GitHub that creates a virtual computer that can run your program within GitHub. It will install any libraries and packages, running them in a server. It lets you push, pull, and sync commits directly with your repo.&lt;/p&gt;

&lt;p&gt;In the demo, Morten spun up Next site and made an update in a matter of minutes, all from an under powered 2017 Chromebook that didn't have VS Code installed.   &lt;/p&gt;
&lt;h3&gt;
  
  
  Some Benefits Discussed
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Removes the blocker of needing a powerful machine to run process heavy tasks. Since everything is run off-site in the virtual computer. &lt;/li&gt;
&lt;li&gt;Makes coding more accessible, since it takes care of starting up complex environments like Gatsby.
&lt;/li&gt;
&lt;li&gt;Makes teaching code easier. Since the teachers and students will be working off virtual computers, the settings can be unified. &lt;/li&gt;
&lt;li&gt;Enhances both security and messing around with code. Since the Codespace is a virtual computer it can be thrown away if a malicious script was added in a PR or testing a feature breaks "all the things". &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/features/codespaces"&gt;GitHub Codespaces&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  📢 Animation in Today's Responsive Design
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Speaker:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://aneventapart.com/speakers/val-head"&gt;Val Head&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Author &amp;amp; Senior Staff Designer at Adobe&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Main Takeaway
&lt;/h3&gt;

&lt;p&gt;Recent improvements to CSS has given us greater control over animation properties, while still releasing control as needed to our users. &lt;/p&gt;
&lt;h3&gt;
  
  
  Individual Transform Properties
&lt;/h3&gt;

&lt;p&gt;Declaring individual transform properties lets us get more flexibility when animating with keyframes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We can create “composable” keyframe animation&lt;/li&gt;
&lt;li&gt;It lets us add CSS variables for individual properties&lt;/li&gt;
&lt;li&gt;It currently works for &lt;code&gt;translate&lt;/code&gt;, &lt;code&gt;rotate&lt;/code&gt;, and &lt;code&gt;scale&lt;/code&gt; and always gets applied in that order.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.animate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;translate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;20%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-15deg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;slideAndSpin&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="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;translate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="py"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0deg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="err"&gt;30&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2deg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&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="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;translate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--move&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.composableAnimate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grow&lt;/span&gt; &lt;span class="m"&gt;2s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spin&lt;/span&gt; &lt;span class="m"&gt;3s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;grow&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="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&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="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;spin&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="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10deg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&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="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20deg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;prefers-reduced-motion&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This is used to detect if the user has requested the system minimize the amount of animation or motion it uses. It is set either in the browser or at the OS level.&lt;/p&gt;

&lt;p&gt;Identify potentially triggering motion effects. These relate to things that actually move or give the illusion of movement. Not necessarily an opacity change. &lt;/p&gt;

&lt;p&gt;People asking for this preference still want the context of the motion, but just reduced.&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;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/* styles to apply if the user's settings are set to reduced motion */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion"&gt;MDN on &lt;code&gt;prefers-reduced-motion&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📢 How to Win at ARIA and Influence Web Accessibility
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Speaker:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://aneventapart.com/speakers/tolu-adegbite"&gt;Tolu Adegbite&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Product Designer at Meta&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Main Takeaway
&lt;/h3&gt;

&lt;p&gt;No ARIA is better then bad ARIA. Whenever possible, use native semantic HTML elements.&lt;/p&gt;
&lt;h3&gt;
  
  
  Tips &amp;amp; Rules of ARIA
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Do not change the native elements, unless absolutely needed.&lt;/li&gt;
&lt;li&gt;All interactive ARIA controls, must be usable with a keyboard.&lt;/li&gt;
&lt;li&gt;Interactive controls must have proper semantics and cannot be hidden.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;role&lt;/code&gt; is a promise to the user that an element will behave a certain way. (&lt;code&gt;role="button"&lt;/code&gt; means that this element is a button)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;aria-label&lt;/code&gt; will override the original text. For example: &lt;code&gt;&amp;lt;a aria-label="This text will read"&amp;gt;This won't&amp;lt;/a&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Toggle buttons like mute/unmute or pause/pause, need &lt;code&gt;aria-pressed&lt;/code&gt; to read out their state at the right time&lt;/li&gt;
&lt;li&gt;Radio buttons need &lt;code&gt;aria-checked&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Interactive elements usually use a &lt;code&gt;tabindex=”0”&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-pressed"&gt;aria-pressed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex"&gt;tabindex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/landmark_role"&gt;Landmark Role&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-labelledby"&gt;aria-labelledby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-describedby"&gt;aria-describedby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-live"&gt;aria-live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  📢 Better Onboarding Through Guided Interaction
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Speaker:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://aneventapart.com/speakers/krystal-higgins"&gt;Krystal Higgins&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Author &amp;amp; UX Designer at Google&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Main Takeaway
&lt;/h3&gt;

&lt;p&gt;Onboarding a new customer doesn't happen in one interaction at the beginning, but over a period of time. &lt;/p&gt;
&lt;h3&gt;
  
  
  The Fear of Good Onboarding
&lt;/h3&gt;

&lt;p&gt;It can be easy to worry that new users will leave the product without understanding "all the things". Because of this fear, products resort to "Front-loaded instructions". Using cards, guides, overlays, tutorials, we try to make the user into an expert before they start using the product. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem with "Front-loaded instructions"…&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Too much information upfront is hard to remember &lt;/li&gt;
&lt;li&gt;The information is often presented out of context (ie. "Welcome to store, did you know our checkout has this awesome feature?")&lt;/li&gt;
&lt;li&gt;By just having a tutorial upfront, the product might seem more complicated then it actually is.&lt;/li&gt;
&lt;li&gt;Extensive and in-depth front-load information might be costly to maintain, as features are improved or added.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Treat Onboarding As A Journey Over Time
&lt;/h3&gt;

&lt;p&gt;It is easy to look at "how many people completed the welcome guide" as a metric for if onboarding was successful. However, for the reasons mentioned above this metric might not equal customers feeling comfortable in our products.  &lt;/p&gt;

&lt;p&gt;Myth: we only have a single moment to help people learn the product.&lt;/p&gt;

&lt;p&gt;Instead we should look at where customers/users begin in the product. (This might be different based on their roles or platform used.) Then only consider the onboarding done, when the "core usage of features" ends. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core usage is…&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Achievable for the user&lt;/li&gt;
&lt;li&gt;Aligned to long term goals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, for a community focused product the expectation is for an organization to create groups of people, with the goal of connecting them via in-person or online events. &lt;/p&gt;

&lt;p&gt;Core usage might be when a group leader created 2 groups (achievable) and an event in each (aligned to long term goals). Throughout this time they would still be in the "Onboarding stage". &lt;/p&gt;
&lt;h3&gt;
  
  
  Onboarding Opportunities Along The Journey
&lt;/h3&gt;

&lt;p&gt;Better onboarding is about guided interactions. Krystal outlined three key states/stages that a new user/customer can be guided and informed. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prompt:&lt;/strong&gt; Lead the person to choose or understand an action at the time they are ready to take it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work:&lt;/strong&gt; Helping the person complete the action they just started.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Followup:&lt;/strong&gt; Guide to next step(s) after the action was taken
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Where Does Onbording Take Place?
&lt;/h3&gt;

&lt;p&gt;Onboarding should not be one size fits all and happens over time. As such, better onboarding starts as part of the core product's design. &lt;/p&gt;

&lt;p&gt;Krystal advises to anchor information in context to the action being taken and not resort to overlays or add-ons if possible. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some text near a "post" button that explains posting guidelines, instead of a big alert.&lt;/li&gt;
&lt;li&gt;When writing the post, show some placeholder text that suggests great titles. &lt;/li&gt;
&lt;li&gt;Instead of a big video upfront that covers all the features, use informative feature blank/empty states that provides or links educates about that specific feature.&lt;/li&gt;
&lt;li&gt;Provide inline hints on how a feature works that reduce in visual impact and frequency over time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Caution About Using Overlays
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;90% of participates ignore dialog overlay messages that interrupt tasks. They just get rid of them to get them out of the way.&lt;/li&gt;
&lt;li&gt;Overlays are sometimes designed in isolation and can collide if forgotten about. (Login modal &amp;amp; "Welcome First Time User" modal)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://abookapart.com/products/better-onboarding"&gt;Better Onboarding Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  📢 CSS &lt;code&gt;:has()&lt;/code&gt; Unlimited Power
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Speaker:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://aneventapart.com/speakers/eric-meyer"&gt;Eric Meyer&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Co-Founder of An Event Apart&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Main Takeaway
&lt;/h3&gt;

&lt;p&gt;A powerful way to select parent elements (and more) with CSS.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Other Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;a:has(.b)&lt;/code&gt; This is means &lt;code&gt;a&lt;/code&gt; &lt;em&gt;has a relationship&lt;/em&gt; with &lt;code&gt;.b&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Don’t nest a &lt;code&gt;:has()&lt;/code&gt; inside a &lt;code&gt;:has()&lt;/code&gt;. Example: ❌ &lt;code&gt;:has(:has())&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Don’t nest a pseudo elements inside of &lt;code&gt;:has()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Don’t nest a &lt;code&gt;:has()&lt;/code&gt; inside of pseudo elements&lt;/li&gt;
&lt;li&gt;Don’t add a &lt;code&gt;:has()&lt;/code&gt; after a pseudo element&lt;/li&gt;
&lt;li&gt;You can’t match &lt;code&gt;:has(a[href]:visited&lt;/code&gt;) for user privacy reasons&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;:has()&lt;/code&gt; takes in a forgiving relative selector list, which means if it drops any item that isn’t valid. So if we do &lt;code&gt;:has(h1, h-9a)&lt;/code&gt; the &lt;code&gt;h1&lt;/code&gt; will  be looked at and &lt;code&gt;h-9a&lt;/code&gt; will be ignored&lt;/li&gt;
&lt;li&gt;Specificity follows whatever the most specific selector it contains&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:has"&gt;&lt;code&gt;:has()&lt;/code&gt; MDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>design</category>
      <category>css</category>
      <category>career</category>
    </item>
    <item>
      <title>Facing Imposter Syndrome: Am I Worthy?</title>
      <dc:creator>Gedalya Krycer</dc:creator>
      <pubDate>Sat, 17 Sep 2022 22:26:21 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/facing-imposter-syndrome-am-i-worthy-3dh9</link>
      <guid>https://dev.to/gedalyakrycer/facing-imposter-syndrome-am-i-worthy-3dh9</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;In the last article we explored feeling like "The Perfectionist" from the book "&lt;a href="https://www.goodreads.com/book/show/58792119-the-imposter-syndrome"&gt;The Imposter Syndrome&lt;/a&gt;" and ways to overcome this at work.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/gedalyakrycer" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X_UMWGU6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--n_opOIn4--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/537261/8c5707dc-338c-449f-b608-cc896b161638.jpeg" alt="gedalyakrycer"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/gedalyakrycer/facing-impostor-syndrome-am-i-controlling-anp" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Facing Imposter Syndrome: Am I Controlling?&lt;/h2&gt;
      &lt;h3&gt;Gedalya Krycer ・ Aug 22 ・ 7 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#mentalhealth&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;In this post let's look at another facet of Imposter Syndrome, a character called "The Superhero".  &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Sections
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"The Superhero"&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Character Traits&lt;/li&gt;
&lt;li&gt;The Result&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal Reflection&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Being A Workaholic&lt;/li&gt;
&lt;li&gt;Hustle Or Get Out&lt;/li&gt;
&lt;li&gt;Hard Work !== Reward&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finding Validation From Within&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Awareness&lt;/li&gt;
&lt;li&gt;Understand Your Need For Approval&lt;/li&gt;
&lt;li&gt;Work On Self-Worth&lt;/li&gt;
&lt;li&gt;Say Nice Things To Yourself Out Loud&lt;/li&gt;
&lt;li&gt;Accept Your Limits&lt;/li&gt;
&lt;li&gt;Fact Check Your Beliefs&lt;/li&gt;
&lt;li&gt;Stop Comparing Yourself&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  "The Superhero"
&lt;/h2&gt;

&lt;p&gt;This person tends to go above and beyond at work to prove they are worthy of their title. Even if this person is producing strong results, they still feel like a fraud. &lt;/p&gt;

&lt;p&gt;One way they cope with this feeling is to overwork, sometimes to the point of burnout. Working hard and getting great results is usually a good thing, but that isn't the case for this Imposter Syndrome type. &lt;/p&gt;

&lt;p&gt;Their superhuman effort given is really to just cover up feeling insecure. So instead of feeling fulfilled, they continue to feel unworthy. &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Character Traits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Addicted to External Validation:&lt;/strong&gt; Often from work, getting validation from others about the quality, time, and effort spent on a project can feel life-changing. However, in this case, it is the only or at least the main source of validation. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low Self-Esteem:&lt;/strong&gt; Ironically superheroes don’t feel like this label. They feel subpar, not exceptional. Because healthy self-esteem doesn’t come from within, being alone can be uncomfortable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unhealthy Boundaries - Inner:&lt;/strong&gt; These relate to our emotions and how we handle the effect of things happening in the external world around us. This might look like not taking a day off because we are worried about doing well on a big project. Or feeling defensive about accepting criticism of our work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unhealthy Boundaries - Outer:&lt;/strong&gt; These are boundaries between yourself and other people. It often centers around knowing when to say “No” and not try to do it all. Often times saying “Yes” to something great, means we had to say many “no”’s to things that were’t serving us as much.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unhealthy Relationships:&lt;/strong&gt; One example of this is over-working all the time out of insecurity and a boss takes advantage of it or continually expecting it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Burnout:&lt;/strong&gt; All of the above can lead to feeling drained, resentful, and feeling even more unworthy since now we have no energy. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back to top ⬆️&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Personal Reflection
&lt;/h2&gt;

&lt;p&gt;Like the "The Perfectionist" this type of Imposter Syndrome really hit close to home. &lt;/p&gt;

&lt;p&gt;The book listed the following three questions that throughout my career I would have to answer a resounding "yes".&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Question 1:&lt;/strong&gt; Do you work later than others, just to be sure that your required 8 hours was really good enough?
&lt;/h4&gt;

&lt;p&gt;Because I felt unworthy of holding a certain job title or the responsibility that came with a project, I felt like I could "make up the difference" by putting in extra hours. I began to believe that my work ethic and not my skillset was what was valuable. &lt;/p&gt;

&lt;p&gt;When a request would come in at 4:50pm to design a website that needed to be presented the next day, I felt validated. Because I knew if I spent all night on it, I would get a "thank you for saving the day" from my boss. &lt;/p&gt;

&lt;p&gt;The problem is when this became year in and year out, no matter what job I went to. My behavior resulted in my feeling burnout, sacrificing time with my family and friends, and still not feeling worthy.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Question 2:&lt;/strong&gt; Do you struggle to have downtime because you feel like you should always be doing, and working more?
&lt;/h4&gt;

&lt;p&gt;Since college I have heard that "a really graphic designer is always learning and always freelancing". Later as a developer I would hear "a real developer contributes to multiple open source projects and stays up until 3am coding for the joy of it". &lt;/p&gt;

&lt;p&gt;When I did do all of those things, there were some benefit for sure. Again, great effort will usually bring at least some results.&lt;/p&gt;

&lt;p&gt;However, as hard as I tried there was never enough time to learn EVERYTHING and take on every kind of client. I was doing it because of other people's expectations and to get their validation. Not because I enjoyed it. &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Question 3:&lt;/strong&gt; Do you feel undeserving of certain aspects of your life even though you worked hard to learn and earn them?
&lt;/h4&gt;

&lt;p&gt;In 2020 I worked at a fast paced design agency full time, while going almost full time to a coding bootcamp at night. I worked really hard at both. &lt;/p&gt;

&lt;p&gt;Eventually I left my job and spent 8 months learning code all day and fine tuning projects to become a very specific type of front-end developer / designer. That again took a lot of work. &lt;/p&gt;

&lt;p&gt;It paid off and I landed my dream job, where I absolutely love what I do and who I work with. &lt;/p&gt;

&lt;p&gt;Yet with all that being true, I have continually struggled with feeling like I belong. Specifically, feeling like I am not worthy and one day it will all be taken away. I would feel like a fraud, even when those around me are saying "good job". (It is the very reason I started learning more about Imposter Syndrome.) &lt;/p&gt;

&lt;p&gt;Back to top ⬆️&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding Validation From Within
&lt;/h2&gt;

&lt;p&gt;The following are some helpful mindset changes from the book that resonated with me…&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Awareness
&lt;/h4&gt;

&lt;p&gt;By just recognizing the behavior and knowing when we seek approval, can be so impactful in starting to change it.  Keeping a journal can be a good way to document and analyze this. &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Understand Your Need For Approval
&lt;/h4&gt;

&lt;p&gt;When you're about to ask for someone to validate your work, stop for a moment first. Ask yourself what do you think about your work. Do you think it is good and do you like it? Why or why not? &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Work on self-worth
&lt;/h4&gt;

&lt;p&gt;By literally giving ourselves self-validation, we can start to build up self-worth. Look at a task you just did objectively and really ask if it was a solid job and if you did well. 9/10 it is worthy of some self-praise. &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Say Nice Things To Yourself Out Loud
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;I did my best.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;It is ok to not feel great all the time.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;I am worthy, just the way I am.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;I'm proud of myself and all I have accomplished.&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;&lt;em&gt;I work hard and deserve a break.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;My feelings matter.&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;&lt;em&gt;I trust myself.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;I like [blank] about myself.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Accept Your Limits
&lt;/h4&gt;

&lt;p&gt;Do not make crazy expectations for yourself and then allow other people to let you down. Your internal and external limits should be equal. &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Fact Check Your Beliefs
&lt;/h4&gt;

&lt;p&gt;Our brains are hardwired to center on thoughts that are easier, not necessarily more logical. When feeling unqualified this can lead to thinking negative things about ourselves that the rest of the world doesn't actually believe. This can also lead to our thoughts controlling our behaviors. &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Stop Comparing Yourself
&lt;/h4&gt;

&lt;p&gt;Our purpose and someone else's purpose are not the same. Comparison is unproductive&lt;/p&gt;

&lt;p&gt;Back to top ⬆️&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Like I said in the last post, I am still a work in progress. 😅 But since learning about "The Superhero" traits and imbalance it feeds in, I've been making some changes. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some weekends or days I still work late, but they are now much fewer and far-between. When it does happen, I give myself grace and don't hold the same expectation to practice code that day. &lt;/li&gt;
&lt;li&gt;Saying "no" to all freelance work these days has been life-bringing. It has open up time to do things I really love. Some things are related to code/design, but also starting new hobbies and having time with my wife and friends. Some weekends it means getting to sleep in and just watch movies, guilt free. &lt;/li&gt;
&lt;li&gt;When I work on projects, I have been trying to take pride in my work vs basing its success completely on what other people say about it.&lt;/li&gt;
&lt;li&gt;Sometimes my code gets a lot of feedback and change requests. That doesn't mean I should quit code and am unworthy. Instead it can be a moment to be grateful. "I am about to learn something new, which will make me more equipped the next time. This is kind of exciting!"&lt;/li&gt;
&lt;li&gt;I have been trying to be a lot more open and vocal about my feelings to my bosses and co-workers. Feeling safe to share who I really am and capabilities, and then still be accepted for any shortcomings has bred new self-confidence. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think a standout lesson learned from reading about this type of Imposter Syndrome for me is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Perfection doesn't equal self worth.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'll be good at somethings, maybe great at one of two and have a whole lot of things go wrong along the way. But that is ok. Who I am currently is enough. It's ok to have plans to grow and improve, but that also doesn't all have to happen to today. One day at a time, is more than enough. 🧡 &lt;/p&gt;

&lt;p&gt;Back to top ⬆️&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>beginners</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Facing Imposter Syndrome: Am I Controlling?</title>
      <dc:creator>Gedalya Krycer</dc:creator>
      <pubDate>Mon, 22 Aug 2022 01:56:00 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/facing-impostor-syndrome-am-i-controlling-anp</link>
      <guid>https://dev.to/gedalyakrycer/facing-impostor-syndrome-am-i-controlling-anp</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Recently I got really curious about the topic of imposter syndrome. Ever since college I have felt like an imposter. &lt;/p&gt;

&lt;p&gt;I believed that everyone would recognize how little I knew and how incompetent I felt. Those fears did not leave, even after getting my dream job last year, as a front-end designer. &lt;/p&gt;

&lt;p&gt;The crazy part, is that my work is full of encouraging people, who continually build me up. So the only person saying that I am not good enough, is me. &lt;/p&gt;

&lt;p&gt;A few months ago I read a book called "&lt;a href="https://www.goodreads.com/book/show/58792119-the-imposter-syndrome"&gt;The Imposter Syndrome&lt;/a&gt;", by Phil Roberts. My goal was to learn more about this topic and finally accept that I truly belong. This series of posts are a reflection and analysis from this book.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Sections
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Cast Of Imposter Syndrome&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"The Perfectionist"&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Character Traits&lt;/li&gt;
&lt;li&gt;The Result&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal Reflection&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Fear Of Mistakes&lt;/li&gt;
&lt;li&gt;Struggle To Delegate&lt;/li&gt;
&lt;li&gt;Fear Of Uncertainty&lt;/li&gt;
&lt;li&gt;Struggle to Celebrate&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Addressing Perfectionism&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Recognizing Behavior&lt;/li&gt;
&lt;li&gt;Black/White Thinking or Splitting&lt;/li&gt;
&lt;li&gt;Catastrophic Thinking&lt;/li&gt;
&lt;li&gt;Probability Overestimation&lt;/li&gt;
&lt;li&gt;"Shoulds"&lt;/li&gt;
&lt;li&gt;Work On Realistic Thinking&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cast Of Imposter Syndrome
&lt;/h2&gt;

&lt;p&gt;Imposter Syndrome (I.S.) can mean a lot more then "I am not good enough". What we feel and what triggers us to feel that way can differ from person to person.   &lt;/p&gt;

&lt;p&gt;What I liked about "&lt;a href="https://www.goodreads.com/book/show/58792119-the-imposter-syndrome"&gt;The Imposter Syndrome&lt;/a&gt;" book, is how it categorized I.S. into five unique personas. Each persona embodied specific traits and experiences that someone might go through, and then what they might do to make positive change.&lt;/p&gt;

&lt;p&gt;Almost like characters in a movie, I found myself identifying with these people in different ways. I could picture times that I also struggled with similar thoughts and took comfort in the solutions suggested. &lt;/p&gt;

&lt;p&gt;This post is focused on what I learned about the first character, "The Perfectionist". &lt;/p&gt;

&lt;p&gt;Back to top ⬆️&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  "The Perfectionist"
&lt;/h2&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Character Traits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Worries about meeting their own expectations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Worries how others will judge them, if they don't hit their goals.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Primarily focuses on what went wrong after completing a task. Even if it went 99% successful, they may still feel like a failure. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Result
&lt;/h3&gt;

&lt;p&gt;Because they put so much focus on the end result and what people will think of them, they can be very controlling. The stakes of a single mistake can seem much higher, so this can make it hard for them to delegate responsibilities and trust others to do things right.&lt;/p&gt;

&lt;p&gt;Often times The Perfectionist will self-impose a very high bar on what success should look like. This sets them up for failure from the very beginning, further "validating" the feeling that they are not good enough. Thus starts the cycle of needing to be in more control the next time. &lt;/p&gt;

&lt;p&gt;So much of this need to control outcomes and achieve perfection, stems from a fear of uncertainty. The Perfectionist will work themselves (and maybe those around them) very hard in order to ever again feel uncertain. &lt;/p&gt;

&lt;p&gt;Refusing to accept anything less than 100% perfection can often translate to real success. The problem is that The Perfectionist finds it hard to celebrate what they have achieved. They only focus on the outcome and will worry all along the path to get here. This can lead them feeling drained at the end, instead of fulfilled and proud. &lt;/p&gt;

&lt;p&gt;Back to top ⬆️&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Personal Reflection
&lt;/h2&gt;

&lt;p&gt;Whew, I really identified with this character as I learned more about their struggles and how they thought. &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fear Of Mistakes
&lt;/h3&gt;

&lt;p&gt;In the beginning of my career I worked for a design agency where I was responsible for managing several client accounts in addition to design work. &lt;/p&gt;

&lt;p&gt;After talking to the client about their project's details, I would work on the print or web designs and then present the finished piece to the client.&lt;/p&gt;

&lt;p&gt;If there was any mistakes in the work or they did not like the design, I'd have to answer for it right then and there. I constantly worried during those presentations that that I made a mistake and the client would get angry. &lt;/p&gt;

&lt;p&gt;While being detailed oriented is a trait I am proud of, worrying to the point of panic isn't healthy. Mistakes can be learning experiences to grow and looking back I "grew" a lot, despite my best efforts to always be perfect. 😆 &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Struggle To Delegate
&lt;/h3&gt;

&lt;p&gt;Later on as a Senior Web Designer and then Digital Design Director, I struggled with delegating work to other designers or account managers on my team. &lt;/p&gt;

&lt;p&gt;When I did assign work, I'd often micro-manage our team, regularly checking how the work was being done and how client facing emails were being written. &lt;/p&gt;

&lt;p&gt;There is a saying that a good leader will "trust, then verify" when managing a project. Unfortunately, I tended to focus more on the "verify" part than trusting things would go well. &lt;/p&gt;

&lt;p&gt;It took me a long time and a lot of effort to build and in some cases, stabilize client relationships. I set a very high bar for success, out of fear that those client would stop working with us and it would be my fault in the end. &lt;/p&gt;

&lt;p&gt;Taking a step back, no one ever died from a website presentation not going to plan. In reality I should have trusted my team's capabilities more and allowed them to learn from any mistakes as I had to. &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fear Of Uncertainty
&lt;/h3&gt;

&lt;p&gt;Fear of uncertainty is actually what got me into learning how to code. &lt;/p&gt;

&lt;p&gt;During project kick-off or update calls, I would get questions about servers, how long it might take to build a certain feature or what sort of API we could work with. &lt;/p&gt;

&lt;p&gt;I never felt more like an imposter in those client meetings, not knowing what in the world to say. As a designer I could explain why the button should go there, but I couldn't communicate how the button worked. &lt;/p&gt;

&lt;p&gt;I hated being viewed as "the expert", but not feeling capable. I was tired of saying "let me check with my development team on that". &lt;/p&gt;

&lt;p&gt;After a code bootcamp and a lot of practice, I eventually could answer some of those questions. But I later realized that the real issue wasn't a lack of skill or knowledge. Rather that I didn't feel comfortable or safe to just say "I don't know". &lt;/p&gt;

&lt;p&gt;In the last few years of learning front-end development, I have been trying to really embrace the state of not knowing. &lt;/p&gt;

&lt;p&gt;Being a beginner or ignorant on subject doesn't have to be a judgment and condemnation on my intelligence. Instead it can simply be a starting off point to learn something new.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Struggle to Celebrate
&lt;/h3&gt;

&lt;p&gt;Celebrating the wins are definitely a challenge. I’m chuckling now because even writing this paragraph is a bit hard for me. &lt;/p&gt;

&lt;p&gt;Celebrating often feels uncomfortable, undeserved, and maybe even arrogant to say "Good job, I've earned that".  &lt;/p&gt;

&lt;p&gt;I expect a lot from myself, but that is just the effort put into the project. The fruits of that labour uselessly feels like a mistake, meant for someone else. &lt;/p&gt;

&lt;p&gt;That is maybe why I really like working on a team vs freelancing. It feels good to be a part of something bigger than just my efforts.&lt;/p&gt;

&lt;p&gt;Back to top ⬆️&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Addressing Perfectionism
&lt;/h2&gt;

&lt;p&gt;The following are some helpful mindset changes from from the book that resonated with me…&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Recognizing Behavior
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Going forward I can take time to recognize specific thought patterns around perfectionism and what triggered them. &lt;/li&gt;
&lt;li&gt;Be aware that when I criticize myself as this can lead to a perfectionist mindset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Black/White Thinking or Splitting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;This is when I think things (like a project at work) are either a complete success or a complete failure.&lt;/li&gt;
&lt;li&gt;This is unrealistic thinking because not everything can be all good or bad. It is ok to have things in the gray area.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Catastrophic Thinking
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;This is thinking of the worst-case scenario when tackling a project. Such as “If this doesn’t go perfectly I will never recover from shame and I will be fired.”&lt;/li&gt;
&lt;li&gt;This thinking does nothing to help me and only serves to discourage me.&lt;/li&gt;
&lt;li&gt;Instead thinking about things in a more positive light can actually help things. My mood will improve and with less stress I can perform at a higher level.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Probability Overestimation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;This is where I discount any hard work that I have done and am waiting for people to judge me.&lt;/li&gt;
&lt;li&gt;In reality, I can’t possibly know what others are thinking and I need to learn to give myself a chance to be imperfect and see what actually happens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  "Shoulds"
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Having trouble allowing myself to relax. However, relaxing is ok and a healthy part of being alive.&lt;/li&gt;
&lt;li&gt;It also includes comparing myself to what I think other people are doing. This is not a helpful thought process because I am basing my expectations on an assumption of someone else.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Work On Realistic Thinking
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It's okay if my perspective is wrong and I can challenge my current thoughts for healthier ones.

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;I should do better.&lt;/em&gt; ➡️ &lt;em&gt;Nobody is perfect. I will do better next time.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;I can’t believe I made that mistake. I’m so stupid.&lt;/em&gt; ➡️ &lt;em&gt;I messed up. But I learned something from it.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back to top ⬆️&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;After learning about "The Perfectionist", I have to raise my hand and acknowledge taking on this mindset quite a bit. I have been and am still at times a very controlling person, because I want things to be perfect.  &lt;/p&gt;

&lt;p&gt;While being detailed oriented and hard working aren't inherently bad things, I think the struggle comes from the being imbalanced in those efforts. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work hard &lt;em&gt;and&lt;/em&gt; celebrate the wins&lt;/li&gt;
&lt;li&gt;Learn new things &lt;em&gt;and&lt;/em&gt; be ok with not knowing everything &lt;/li&gt;
&lt;li&gt;Do your your best &lt;em&gt;and&lt;/em&gt; give yourself grace when there are mistakes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I love this quote from "&lt;a href="https://www.goodreads.com/book/show/58792119-the-imposter-syndrome"&gt;The Imposter Syndrome&lt;/a&gt;" book, chapter 2.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“…instead of wanting everything to be perfect, we can work to notice the things we love about ourselves and accept the things we need to improve on.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While I am still a work in progress, there is a lot I can love about myself and feel grateful for the many blessings along the way. &lt;/p&gt;

&lt;p&gt;What do you love about yourself? I bet if you sat with it for a few minutes, you would find there is a lot to love. 🧡&lt;/p&gt;

&lt;p&gt;Back to top ⬆️&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>beginners</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Facing Imposter Syndrome: Do I Belong?</title>
      <dc:creator>Gedalya Krycer</dc:creator>
      <pubDate>Sun, 07 Aug 2022 08:56:00 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/facing-imposter-syndrome-do-i-belong-50gh</link>
      <guid>https://dev.to/gedalyakrycer/facing-imposter-syndrome-do-i-belong-50gh</guid>
      <description>&lt;p&gt;At the beginning of this year I set several goals. &lt;/p&gt;

&lt;p&gt;A few include…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;learn more React &amp;amp; CSS, &lt;/li&gt;
&lt;li&gt;do more things after work that bring joy,&lt;/li&gt;
&lt;li&gt;and find my place on my product team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tackling most of the goals were pretty straight forward. There are plenty of courses on React I could take and fulfilling activities in my free time that I could prioritize.&lt;/p&gt;

&lt;p&gt;That last goal, &lt;em&gt;find my place on my product team&lt;/em&gt;, that one however was a bit more allusive to define… &lt;/p&gt;

&lt;p&gt;What does it even mean to "find my place" on my product team? &lt;/p&gt;

&lt;h3&gt;
  
  
  Feeling Out Of Place
&lt;/h3&gt;

&lt;p&gt;My role on our team is pretty easy to identify. As a Front-End Designer, I get to work on the look and feel of our software throughout a feature cycle. &lt;/p&gt;

&lt;p&gt;Towards the beginning of a project I work with our UX and product teams on how the feature looks and works. Once we have a direction, I often collaborate with my full-stack developer teammates in implementing the front-end code.&lt;/p&gt;

&lt;p&gt;This combination of design and code is so much fun and in all honesty — a real dream role for me. Part of what makes it so great are the amazing people on my team. They are incredibly caring, fun to be around and so talented in what they do. &lt;/p&gt;

&lt;p&gt;Yet, despite all of this being true, I &lt;del&gt;sometimes&lt;/del&gt; often fear not belonging and being a fraud. This fear has followed me into almost every project, team meeting and can keep me up at night. &lt;/p&gt;

&lt;h3&gt;
  
  
  Realizing There Was Disconnect
&lt;/h3&gt;

&lt;p&gt;Throughout my first year in this role I frequently reflected on these thoughts, further defining them as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A belief of inadequacy:&lt;/strong&gt; I lack the talent, experience and skills to design easy-to-use features and write high quality code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A feeling of insecurity:&lt;/strong&gt; What if I'm bringing my team down by not making timely contributions that will truly benefit our customers?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our company's culture promotes genuinely safe spaces to speak vulnerably and be heard. So I shared these concerns with both my managers. &lt;/p&gt;

&lt;p&gt;It turns out that my self-perceptions did not align with how they viewed me. Sure, there are plenty of areas that I can grow in, but in their eyes I was still bringing value and doing my job well.   &lt;/p&gt;

&lt;p&gt;So how do I get over/past/through feeling so inadequate, feeling out of place and ultimately view my work through the same lens that my peers &amp;amp; managers do? &lt;/p&gt;

&lt;p&gt;With these questions in mind, I decided to change my original goal of "finding my place on my product team" to &lt;strong&gt;"accepting my place on my product team"&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Digging Into Imposter Syndrome
&lt;/h2&gt;

&lt;p&gt;Now that I had a clearer idea of what this goal was about, a way to make progress on this goal was to learn more about what fuels my fears. So I started reading a book called "&lt;a href="https://www.goodreads.com/book/show/58792119-the-imposter-syndrome"&gt;The Imposter Syndrome&lt;/a&gt;", by Phil Roberts.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(There are several non-affiliate links to this book throughout the post. I am not being paid to promote it, simply want to share a resource that is helping me.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This book proved to be incredibly helpful in demystifying the worries I (and as it turns out many others) where having. In fact, Phil talked about how over 70% of people feel this way at one point in their life or another. &lt;/p&gt;

&lt;h3&gt;
  
  
  Experience vs Syndrome
&lt;/h3&gt;

&lt;p&gt;Funnily enough, he shares that because so many people have these thoughts —  Imposter Syndrome is an "Experience", not a "Syndrome". &lt;/p&gt;

&lt;p&gt;A syndrome is defined as &lt;em&gt;“group of signs and symptoms that occur together to characterize a particular abnormality or condition”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Imposter Syndrome does not characterize an abnormality, rather it is considered a shared experience. &lt;/p&gt;

&lt;p&gt;I felt a lot of relief reading that, because an "Experience" certainly sounds less daunting to work through than a "Syndrome".&lt;/p&gt;

&lt;h3&gt;
  
  
  Imposter Syndrome Characteristics
&lt;/h3&gt;

&lt;p&gt;The book also lists many different feelings and beliefs that can be associated with Imposter Syndrome. Below are the ones I really resonated with.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Self-doubt&lt;/li&gt;
&lt;li&gt;Feeling like a fraud&lt;/li&gt;
&lt;li&gt;Attributing success to external factors or luck&lt;/li&gt;
&lt;li&gt;Fear of being found out as a fraud&lt;/li&gt;
&lt;li&gt;Berating my performance&lt;/li&gt;
&lt;li&gt;Fear of living up to expectations&lt;/li&gt;
&lt;li&gt;Overachieving to prove worthiness&lt;/li&gt;
&lt;li&gt;Sabotaging success out of fear&lt;/li&gt;
&lt;li&gt;Setting challenging goals then feeling disappointed when I fall short&lt;/li&gt;
&lt;li&gt;Negative inner voice&lt;/li&gt;
&lt;li&gt;Dwelling on past mistakes/failures&lt;/li&gt;
&lt;li&gt;Constantly comparing myself to others&lt;/li&gt;
&lt;li&gt;Feeling inferior if I am not recognized as the best or special in an area&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Are there any that speak to you?&lt;/p&gt;

&lt;h3&gt;
  
  
  Clance Imposter Phenomenon Scale (CIPS)
&lt;/h3&gt;

&lt;p&gt;Mid-way through the first chapter was a collection of 20 statements called CIPS. These can help determine how intense someone’s experience is with Impostor Syndrome.  &lt;/p&gt;

&lt;p&gt;I scored 79, which is just two points away from “Intense” (81+), and signifies a “frequent” (61-80) experience. 😬 This really confirmed for me that this is an area I can focus on healing and have a lot of room to grow.&lt;/p&gt;

&lt;p&gt;(Here is a &lt;a href="http://impostortest.nickol.as/"&gt;free online version of the test&lt;/a&gt; you can take for yourself.)&lt;/p&gt;

&lt;h4&gt;
  
  
  Some Quotes from Chapter One That Resonated
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“Working ourselves so hard may indicate we need this external validation in order to feel worthy.”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“You may be trying to prove that you are in fact not a fraud when in reality, you are the only one thinking this way. This is exhausting…”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;“&lt;em&gt;We need to be the one who is confident in order to internalize our success and not feel like a fake.”&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Write This Post?
&lt;/h2&gt;

&lt;p&gt;After reading "&lt;a href="https://www.goodreads.com/book/show/58792119-the-imposter-syndrome"&gt;The Imposter Syndrome&lt;/a&gt;" I've found it easier lately to identify and challenge the insecure thoughts as they come up. More and more I feel like I do belong in my role and have something to contribute. &lt;/p&gt;

&lt;p&gt;A lot of this post came from notes I took while reading this book. Writing is such a helpful tool in understanding and internalizing new information. So I might write some more posts in the near future pulling out parts that I really identified with and where my fears come from. &lt;/p&gt;

&lt;p&gt;I also wanted to share with any budding designers &amp;amp; developers reading that feeling inadequate and like an imposter is a shared experience. If you feel this way too, it's going to be ok! As I'm learning for myself, those feelings aren't always a true reflection of what we have to offer. &lt;/p&gt;

&lt;p&gt;I encourage you to get curious around the subject and where your fears stem from. Try to talk about them with your teammates if you feel comfortable. You might be surprised that they can really relate and may have similar feelings.  &lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>beginners</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Project Showcase: Building A React Site For A Non-Profit School In Africa</title>
      <dc:creator>Gedalya Krycer</dc:creator>
      <pubDate>Sun, 20 Jun 2021 17:03:24 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/project-showcase-building-a-react-site-for-a-non-profit-school-in-africa-48j4</link>
      <guid>https://dev.to/gedalyakrycer/project-showcase-building-a-react-site-for-a-non-profit-school-in-africa-48j4</guid>
      <description>&lt;h4&gt;
  
  
  TLDR:
&lt;/h4&gt;

&lt;p&gt;The following was my process in creating a marketing site for a new type of hybrid learning school in Sierra Leone.  &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://genhybridsystems.com/" rel="noopener noreferrer"&gt;🔗 View Deployed Version&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://github.com/GedalyaKrycer/genhybridsystems" rel="noopener noreferrer"&gt;🔗 View GitHub Repository&lt;/a&gt;
&lt;/h4&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Table Of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
The Project Brief &lt;/li&gt;
&lt;li&gt;
Logo Concepts &lt;/li&gt;
&lt;li&gt;
Web Design &lt;/li&gt;
&lt;li&gt;Tech Used&lt;/li&gt;
&lt;li&gt;Custom Navigation&lt;/li&gt;
&lt;li&gt;Mailchimp Intergration&lt;/li&gt;
&lt;li&gt;Slideshow Hero Banner&lt;/li&gt;
&lt;li&gt;Dynamic "Back To Top" Buttons&lt;/li&gt;
&lt;li&gt;Crisis Accordion &amp;amp; Vertical Tabs&lt;/li&gt;
&lt;li&gt;YouTube Playlist API Intergration&lt;/li&gt;
&lt;li&gt;Netlify Contact Form&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  The Project Brief
&lt;/h1&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%2Fuploads%2Farticles%2F5nxqz4my1o93ziv8w366.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5nxqz4my1o93ziv8w366.jpg" alt="Kids in class"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gen Hybrid Systems is a new nonprofit with one mission... To build a hybrid learning school in Sierra Leone, Africa.&lt;/p&gt;

&lt;p&gt;Hybrid learning is where a student can take classes either in a physical school building or online. For some in Sierra Leone, this means they won't have to walk 5-8 miles to get to class. It will be a game-changer for them.    &lt;/p&gt;

&lt;p&gt;My job was to first help flesh out the branding with some logo concepts, then design and build their initial website.&lt;/p&gt;

&lt;p&gt;The goal of the website was to first introduce the education crisis in Sierra Leone and how Gen Hybrid Systems will help.  Secondly, provide them with a way to share progress and build a follower base. &lt;/p&gt;

&lt;p&gt;Back To Top&lt;/p&gt;




&lt;h2&gt;
  
  
  Logo Concepts
&lt;/h2&gt;

&lt;p&gt;The project kicked off with creating several logo concepts to help represent the new organization. I don't really offer logo design as a services these day, but it was a helpful exercise to get started.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tools used:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.adobe.com/products/illustrator.html" rel="noopener noreferrer"&gt;Adobe Illustrator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://color.adobe.com/" rel="noopener noreferrer"&gt;Adobe Color&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://figma.com/" rel="noopener noreferrer"&gt;Figma&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Fmbcx2i4aom4qmsj2xwod.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%2Fuploads%2Farticles%2Fmbcx2i4aom4qmsj2xwod.png" alt="Computer and Book logo concept"&gt;&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%2Fuploads%2Farticles%2Fe7i3fdeu4oaf5bjlp6s0.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%2Fuploads%2Farticles%2Fe7i3fdeu4oaf5bjlp6s0.png" alt="Badge logo concept"&gt;&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%2Fuploads%2Farticles%2F5c8lcekoj4kimjmooctz.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%2Fuploads%2Farticles%2F5c8lcekoj4kimjmooctz.png" alt="Thick logo concept"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the end, Gen Hybrid went in a different direction and created this final logo mark with one of their other partners. &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%2Fuploads%2Farticles%2F2jk2jwktasvmy96n9q66.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%2Fuploads%2Farticles%2F2jk2jwktasvmy96n9q66.png" alt="Final logo concept"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even though my suggested concepts were not used, this was not time wasted by any means. I ended up using my research for the logo comps, to help inform the next stage — designing the website's UI and structure. &lt;/p&gt;

&lt;p&gt;Back To Top&lt;/p&gt;




&lt;h2&gt;
  
  
  Web Design
&lt;/h2&gt;

&lt;p&gt;My approach to the design was to have it first and foremost serve the goals of Gen Hybrid. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stand out from other educational organizations visually &lt;/li&gt;
&lt;li&gt;Educate site visitors about the crisis in Sierra Leone&lt;/li&gt;
&lt;li&gt;Enable visitors to follow the progress of this mission&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To stand out visually I used deep brown colors with yellow and blue as accents. (Interactive elements specifically use the yellow highlight color.) I chose the brown and serif font to tie into a "book" theme, but not be overly scholastic. &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%2Fuploads%2Farticles%2Fsza04y9tunodzyv6za55.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsza04y9tunodzyv6za55.jpg" alt="Desktop Screen Mockups"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.freepik.com/psd/mockup" rel="noopener noreferrer"&gt;&lt;em&gt;Credit: Render mockup downloaded from ebhy | www.freepik.com&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I used &lt;a href="http://figma.com/" rel="noopener noreferrer"&gt;Figma&lt;/a&gt; primarily to design and prototype the site. &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%2Fuploads%2Farticles%2Fhtqjmzi71g5ilddlhytt.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtqjmzi71g5ilddlhytt.jpg" alt="Mobile Screen Mockups"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The following sections will highlight ways how the site educates visitors about the crisis and ways to follow Gen Hybrid Systems. &lt;/p&gt;

&lt;p&gt;Back To Top&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech Used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sass-lang.com/guide" rel="noopener noreferrer"&gt;SASS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mailchimp.com/" rel="noopener noreferrer"&gt;Mailchimp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/axios" rel="noopener noreferrer"&gt;&lt;code&gt;axios&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/react-ga" rel="noopener noreferrer"&gt;&lt;code&gt;react-ga&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://react-icons.github.io/react-icons/" rel="noopener noreferrer"&gt;&lt;code&gt;react-icons&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/react-mailchimp-subscribe" rel="noopener noreferrer"&gt;&lt;code&gt;react-mailchimp-subscribe&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@n8tb1t/use-scroll-position" rel="noopener noreferrer"&gt;&lt;code&gt;use-scroll-position&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.netlify.com/" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.networksolutions.com/" rel="noopener noreferrer"&gt;Network Solutions&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/youtube/v3/docs/playlistItems/list" rel="noopener noreferrer"&gt;YouTube API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://popupsmart.com/" rel="noopener noreferrer"&gt;Popsmart&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back To Top&lt;/p&gt;




&lt;h2&gt;
  
  
  Custom Navigation
&lt;/h2&gt;

&lt;p&gt;The site as a whole does not use a CSS framework but relies on custom SCSS styles. (With some help from Stack Overflow. 😇)&lt;/p&gt;

&lt;p&gt;This posed an interesting challenge for the navbar, as it behaves very differently on mobile than desktop. It was a wonderful learning experience in the end though!   &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%2Fuploads%2Farticles%2Fklkytmo04v18mlp3u40s.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklkytmo04v18mlp3u40s.gif" alt="sticky mobile nav"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On mobile, I ended up using a custom React hook called &lt;a href="https://www.npmjs.com/package/@n8tb1t/use-scroll-position" rel="noopener noreferrer"&gt;&lt;code&gt;use-scroll-position&lt;/code&gt;&lt;/a&gt; to help calculate how much of the page has been scrolled. Once down 100px – 200px or so, the menu becomes sticky and receives a background color.&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%2Fuploads%2Farticles%2F9xjd6m67vosflvyvhrtr.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9xjd6m67vosflvyvhrtr.gif" alt="Mobile Menu Toggle"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the toggle menu button, there is a fun little CSS animation. It is also a11y friendly, with some hidden screen reader text. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/GedalyaKrycer/genhybridsystems/blob/main/src/components/header/Navbar/navbarStyles.scss#L53-L118" rel="noopener noreferrer"&gt;View SCSS Code →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back To Top&lt;/p&gt;




&lt;h2&gt;
  
  
  Mailchimp Intergration
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yaz2smx3d14ul1gvuvo.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yaz2smx3d14ul1gvuvo.gif" alt="Modal with Mailchimp form opening"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To help build a following there is a subscription form in the navigation that stores contact information in Mailchimp. &lt;/p&gt;

&lt;p&gt;For a complete guide on integrating Mailchimp with React, check out my previous article. &lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/gedalyakrycer" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuploads%2Fuser%2Fprofile_image%2F537261%2F8c5707dc-338c-449f-b608-cc896b161638.jpeg" alt="gedalyakrycer"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/gedalyakrycer/create-an-email-list-with-react-mailchimp-965" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Create an email list with React + Mailchimp&lt;/h2&gt;
      &lt;h3&gt;Gedalya Krycer ・ May 3 '21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mailchimp&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Back To Top&lt;/p&gt;




&lt;h2&gt;
  
  
  Slideshow Hero Banner
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0ltcnlweqf9ao88sh6j.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0ltcnlweqf9ao88sh6j.gif" alt="Hero Banner Image Fading"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;It was really important to visually showcase the ability to study in school and at home. After all, this is one of the main benefits of hybrid learning. &lt;/p&gt;

&lt;p&gt;The main hero banner archives this with two responsive images, that fade back-and-forth between each other. It took a lot of googling but ended up achieving with the help of absolute positioning and CSS animations. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/GedalyaKrycer/genhybridsystems/blob/main/src/components/header/HeroContainer/HeroContainer.js#L22-L28" rel="noopener noreferrer"&gt;View JSX Code →&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/GedalyaKrycer/genhybridsystems/blob/main/src/components/header/HeroContainer/heroStyles.scss#L48-L118" rel="noopener noreferrer"&gt;View SCSS Code →&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/GedalyaKrycer/genhybridsystems/blob/main/src/sassStyles/_animations.scss#L75-L112" rel="noopener noreferrer"&gt;View CSS Animation Code →&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back To Top&lt;/p&gt;




&lt;h2&gt;
  
  
  Dynamic "Back To Top" Buttons
&lt;/h2&gt;

&lt;p&gt;Because this was a single-page site that was rather long, I felt it important to add a "back to top" button. However, it isn't helpful to show this button when the viewer is already at the top of the page. &lt;/p&gt;

&lt;p&gt;Once again the custom React hook &lt;a href="https://www.npmjs.com/package/@n8tb1t/use-scroll-position" rel="noopener noreferrer"&gt;&lt;code&gt;use-scroll-position&lt;/code&gt;&lt;/a&gt; came to the rescue. &lt;/p&gt;

&lt;p&gt;On desktop screens, I used it to calculate when a button should appear/disappear within the social media pinned sidebar. &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%2Fuploads%2Farticles%2Fu53tvi2k4q4943ftk4ak.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu53tvi2k4q4943ftk4ak.gif" alt="Desktop back to top"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On mobile screens the same button shows up past a certain scroll distance, but this time on the bottom right of the screen. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/GedalyaKrycer/genhybridsystems/blob/main/src/components/MobileBackToTop/MobileBackToTop.js" rel="noopener noreferrer"&gt;View JSX Code →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Fi0c25b06skbtmycxdkdg.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0c25b06skbtmycxdkdg.gif" alt="Back To Top Button Mobile"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Back To Top&lt;/p&gt;




&lt;h2&gt;
  
  
  Crisis Accordion &amp;amp; Vertical Tabs
&lt;/h2&gt;

&lt;p&gt;One of the more complex challenges to design and build was the Crisis section. I wanted to illustrate in an interactive way, what issues Gen Hybrid Systems is looking to solve.&lt;/p&gt;

&lt;p&gt;Using a bunch of tutorials I created a vertical tab menu that also acts as accordion. &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%2Fuploads%2Farticles%2Fkq4qo1y5rz6s5t08z3bk.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkq4qo1y5rz6s5t08z3bk.gif" alt="Desktop Crisis Tabs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When a tab is clicked, an image animates in and the accordion opens to reveal more text and a button. On mobile the images go away, with the focus being on the vertical tab accordions.&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%2Fuploads%2Farticles%2F63u9t1dqb2ya16bc5bzl.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63u9t1dqb2ya16bc5bzl.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole section also has slight a parallax scroll. &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%2Fuploads%2Farticles%2F01vj52rgggbnc760o4qe.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01vj52rgggbnc760o4qe.gif" alt="Alt Text"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/GedalyaKrycer/genhybridsystems/blob/main/src/components/crisis/CrisisContainer/CrisisContainer.js" rel="noopener noreferrer"&gt;View JSX Code →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back To Top&lt;/p&gt;




&lt;h2&gt;
  
  
  YouTube Playlist API Intergration
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa6s9crzmrq6fuv8xkzi6.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa6s9crzmrq6fuv8xkzi6.gif" alt="Scrolling through YouTube videos on the Gen Hybrid website"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I used YouTube's API, (specifically the &lt;a href="https://developers.google.com/youtube/v3/docs/playlistItems/list" rel="noopener noreferrer"&gt;&lt;code&gt;PlaylistItems&lt;/code&gt;&lt;/a&gt; endpoint) to bring in the latest Gen Hybrid System videos. This gave them an easy way to keep the site's visitors up to date, without needing to touch any code.  &lt;/p&gt;

&lt;p&gt;Back To Top&lt;/p&gt;




&lt;h2&gt;
  
  
  Netlify Contact Form
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2nj0q892jc3993hi2z4.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2nj0q892jc3993hi2z4.gif" alt="Filling out contact form so the submit button enables"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Leveraging the custom input fields (mentioned above) and &lt;a href="https://www.youtube.com/watch?v=5oOhoBI7b8M" rel="noopener noreferrer"&gt;Netlify's super simple (&amp;amp; free) mail server&lt;/a&gt; I built in a contact form. &lt;/p&gt;

&lt;p&gt;Netlify does a lot of the heavy lifting with spam protection, but I built in some additional validation to ensure the correct info is captured. &lt;/p&gt;

&lt;p&gt;The "Send" button will not "enable" until all the form fields are filled out and the email field contains an &lt;code&gt;@&lt;/code&gt; in it.  &lt;/p&gt;

&lt;p&gt;Back To Top&lt;/p&gt;




&lt;p&gt;I hope you enjoyed viewing this project and maybe even got a few ideas for your next one! Please share in the comments what you come up with. Always love seeing how people approach designing and building freelance sites. &lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thumbnail designed with &lt;a href="https://www.figma.com/" rel="noopener noreferrer"&gt;Figma&lt;/a&gt;&lt;/em&gt; &lt;/p&gt;

</description>
      <category>react</category>
      <category>showdev</category>
      <category>webdev</category>
      <category>design</category>
    </item>
    <item>
      <title>OhSnap! Manage Global Styles In React Native</title>
      <dc:creator>Gedalya Krycer</dc:creator>
      <pubDate>Mon, 24 May 2021 08:20:30 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/ohsnap-manage-global-styles-in-react-native-334</link>
      <guid>https://dev.to/gedalyakrycer/ohsnap-manage-global-styles-in-react-native-334</guid>
      <description>&lt;p&gt;&lt;em&gt;The "OhSnap!" series explores bite-sized tips that you can apply today.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;One of the big adjustments I had to make when using React Native, is not relying on CSS. &lt;/p&gt;

&lt;p&gt;Sure, there are still "CSS-like" properties that use the JS-based &lt;code&gt;StyleSheet&lt;/code&gt; method, but they are not the same. &lt;/p&gt;

&lt;p&gt;For example, since everything is locally scoped, we can’t easily set global styles. &lt;/p&gt;

&lt;h4&gt;
  
  
  Well, not quite...
&lt;/h4&gt;

&lt;p&gt;Here are two ways to handle global styles that are actually pretty simple, yet powerful. &lt;/p&gt;




&lt;h2&gt;
  
  
  Method A: Custom Styled Component
&lt;/h2&gt;

&lt;p&gt;Using a standard React pattern, we will create a custom component for the element we want to style globally. &lt;/p&gt;

&lt;p&gt;Within this component, we can set default styles and also use props to override those styles. &lt;/p&gt;

&lt;p&gt;Then we can import and use this component anywhere in our project. If the styles need to change, only that component needs to be updated. &lt;/p&gt;

&lt;h4&gt;
  
  
  For example:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;HeaderOne /&amp;gt;&lt;/code&gt;&lt;/strong&gt; could contain a bold &lt;code&gt;&amp;lt;Text&amp;gt;&lt;/code&gt; element with a large font size. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;BodyText /&amp;gt;&lt;/code&gt;&lt;/strong&gt; could contain a smaller, dark grey &lt;code&gt;&amp;lt;Text&amp;gt;&lt;/code&gt; element. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;PrimaryButton /&amp;gt;&lt;/code&gt;&lt;/strong&gt; could contain a &lt;code&gt;&amp;lt;TouchableOpacity&amp;gt;&lt;/code&gt; element with a green background and uppercase text.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;(This is a very similar concept to the &lt;a href="https://styled-components.com/"&gt;styled-componets&lt;/a&gt; package.)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aright! Enough talk. Let's see how it actually looks and set up a styled button we can use globally. &lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Create base &lt;code&gt;&amp;lt;PrimaryButton /&amp;gt;&lt;/code&gt; component
&lt;/h4&gt;

&lt;p&gt;Our component should accept props and import some standard React Native default components to create the base structure &amp;amp; functionality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TouchableOpacity&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PrimaryButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TouchableOpacity&lt;/span&gt; 
      &lt;span class="na"&gt;onPress&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pressHandler&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;TouchableOpacity&lt;/span&gt;&lt;span class="p"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;PrimaryButton&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 2: Add base styles
&lt;/h4&gt;

&lt;p&gt;Using the &lt;code&gt;StyleSheet&lt;/code&gt; method from React Native, set up some base styles for this button.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TouchableOpacity&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PrimaryButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TouchableOpacity&lt;/span&gt; 
      &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;btnContainer&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; 
      &lt;span class="na"&gt;onPress&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pressHandler&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;TouchableOpacity&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;btnContainer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;paddingVertical&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="na"&gt;paddingHorizontal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
        &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;justifyContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&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;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;white&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;PrimaryButton&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 3: Spread local styles &amp;amp; prop styles
&lt;/h4&gt;

&lt;p&gt;Use the spread operator to add all current styles and then any custom styles being passed in via props. This will allow additional styles to be added/overwritten.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TouchableOpacity&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PrimaryButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TouchableOpacity&lt;/span&gt; 
      &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;btnContainer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;containerStyle&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;onPress&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pressHandler&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; 
       &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textStyle&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
     &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
     &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;TouchableOpacity&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;btnContainer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;paddingVertical&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="na"&gt;paddingHorizontal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
        &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;justifyContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&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;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;white&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;PrimaryButton&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 4: Use &lt;code&gt;&amp;lt;PrimaryButton /&amp;gt;&lt;/code&gt; anywhere in the project
&lt;/h4&gt;

&lt;p&gt;Note how we are passing in a custom margin, via props. This will get applied to the button, in addition to the default local style we set up already.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;PrimaryButton&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./components/PrimaryButton&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;


&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ContactScreen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Contact Us&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    •••
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;PrimaryButton&lt;/span&gt; 
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Submit"&lt;/span&gt;
      &lt;span class="na"&gt;pressHandler&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;someCoolFunction&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;containerStyle&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;textStyle&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;marginTop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;btnTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;grey&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="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="nx"&gt;ContactScreen&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Method B: Export Global Object
&lt;/h2&gt;

&lt;p&gt;This next method can either be used instead of custom components or in conjunction with it. &lt;/p&gt;

&lt;p&gt;The idea to store &lt;em&gt;values&lt;/em&gt; for CSS properties inside of objects or variables that are exported from global files.&lt;/p&gt;

&lt;p&gt;Let's take the example of how to work with colors. Imagine having to change the "Primary" brand color from blue to green. With the below method you just need to update that color in one file. &lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Create a global styles folder
&lt;/h4&gt;

&lt;p&gt;In the root of the &lt;code&gt;src&lt;/code&gt; directory create a new folder called &lt;code&gt;styles&lt;/code&gt; and add a new file called &lt;code&gt;colors.js&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/src
|—— /styles
    |—— colors.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 2: Add property values.
&lt;/h4&gt;

&lt;p&gt;Create and export an object within the colors file that holds the values&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="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;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FFBB0B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;primaryLight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FFDF8E&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;primaryDark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#CB9303&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;secondary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#63321C&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;secondaryLight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#735243&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;secondaryDark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#170F0C&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 3: Import and use the Colors file.
&lt;/h4&gt;

&lt;p&gt;Now you can go to any file in your project and reference the colors you have set up in step 2 on any acceptable property.&lt;/p&gt;

&lt;p&gt;If any time your brand colors change, these files will update automatically!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;colors&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../styles/colors&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;-----------&lt;/span&gt;


&lt;span class="na"&gt;const&lt;/span&gt; &lt;span class="na"&gt;ContactScreen&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="na"&gt;props&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="si"&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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headline&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Contact Us&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="si"&gt;}&lt;/span&gt;;

const styles = StyleSheet.create(&lt;span class="si"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;flex&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="nx"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;secondaryLight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;-----------&lt;/span&gt;
    &lt;span class="err"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;headline&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;-----------&lt;/span&gt;
    &lt;span class="err"&gt;},&lt;/span&gt;
&lt;span class="err"&gt;});&lt;/span&gt;

&lt;span class="na"&gt;export&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt; &lt;span class="na"&gt;ContactScreen&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Thumbnail designed with &lt;a href="https://www.adobe.com/products/photoshop.html"&gt;Adobe Photoshop&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How puzzles 🧩 help me code 💻</title>
      <dc:creator>Gedalya Krycer</dc:creator>
      <pubDate>Mon, 17 May 2021 11:07:14 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/how-puzzles-help-me-code-4fh1</link>
      <guid>https://dev.to/gedalyakrycer/how-puzzles-help-me-code-4fh1</guid>
      <description>&lt;p&gt;Ok, I know what you are probably thinking...&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post will be about how puzzles train your brain to solve more complex problems, just like practicing with HackerRank or LeetCode.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;However, this is not that kind of post. &lt;/p&gt;

&lt;p&gt;Doing puzzles have not helped me to become a cleverer developer. &lt;/p&gt;

&lt;p&gt;Rather, puzzles help me &lt;strong&gt;&lt;em&gt;set a healthier expectation on how to define progress&lt;/em&gt;&lt;/strong&gt;. &lt;/p&gt;




&lt;h2&gt;
  
  
  Let's rewind a bit...
&lt;/h2&gt;

&lt;p&gt;A few months ago I got a lovely welcome package from my new team at Planning Center. &lt;/p&gt;

&lt;p&gt;One of the items was a puzzle that when completed, shows some of our main products as the MCU Avenger characters. Super cool!  &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%2Fuploads%2Farticles%2F51h753lhak63lemrri2l.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51h753lhak63lemrri2l.jpg" alt="PCO Avenger Puzzle"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, I don't enjoy doing puzzles. Since childhood, they have given me headaches. But, I do love the Avengers and if I could learn JavaScript, could this really be much harder? 😆&lt;/p&gt;

&lt;p&gt;So one afternoon I dumped all the puzzle pieces out and gave it a shot. I immediately felt overwhelmed. So many seemingly non-sensical shapes and colors. &lt;/p&gt;

&lt;p&gt;I thought to myself &lt;em&gt;"Ok, got to do at least something, right?"&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;So I spent the next 15 min separating all the edge pieces into a different pile. Admittedly, that one was smaller and less overwhelming to look at. Decided to call it a day at that point. &lt;/p&gt;




&lt;p&gt;Later that week I needed to take a break during work and approached the pile of edged puzzle pieces. &lt;/p&gt;

&lt;p&gt;After about 5 min I got 3 pieces to fit together. Nice! 🧩🧩🧩&lt;/p&gt;

&lt;p&gt;The next day I got two more pieces together. 🧩🧩&lt;/p&gt;

&lt;p&gt;That Friday I got another 8 pieces figured out!! 🧩🧩🧩🧩🧩🧩🧩🧩 &lt;/p&gt;

&lt;p&gt;By the next week, I had most of the edges done. 🎉&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%2Fuploads%2Farticles%2Fs9cam727jqcw90xfvk7t.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9cam727jqcw90xfvk7t.jpg" alt="Puzzle edges"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today I moved to the middle and made some more progress on all the green pieces. &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%2Fuploads%2Farticles%2Fomxzkop3jfbagj5gxyod.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fomxzkop3jfbagj5gxyod.jpg" alt="Puzzle green pieces"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Taking it 5 min at a time made it actually enjoyable and validating to see it slowly take shape. &lt;/p&gt;




&lt;h2&gt;
  
  
  So how does this help you code again?
&lt;/h2&gt;

&lt;p&gt;While working on this little puzzle side-project something dawned on me. I &lt;strong&gt;&lt;em&gt;am making progress&lt;/em&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;It is super slow, but each 5 min stretch of time spent on this is indeed contributing to the overall project. I don't need to solve the whole puzzle in one shot. I just need to get one puzzle piece figured out to move the whole thing forward. &lt;/p&gt;

&lt;h4&gt;
  
  
  I started to actively apply this idea in my designs and code...
&lt;/h4&gt;

&lt;p&gt;It is so easy to beat myself up for spending 20 min on a function and not completing it. If I don't finish 100% of it, it can feel like all my efforts are for nothing.&lt;/p&gt;

&lt;p&gt;However, is that &lt;strong&gt;&lt;em&gt;really&lt;/em&gt;&lt;/strong&gt; true? &lt;/p&gt;

&lt;p&gt;What are the "puzzle pieces" that I did figure out? Did I find a good name for the function? Did I read 3 articles on &lt;code&gt;guard clauses&lt;/code&gt; which will help me set up future conditionals? Did I find the right file to make an edit in a code base of 100 files?&lt;/p&gt;

&lt;p&gt;These are small pieces, but they are all valid and necessary in getting the whole thing done. &lt;/p&gt;

&lt;p&gt;Instead of being discouraged, these little achievements are all signs of progress that I can be encouraged by.&lt;/p&gt;




&lt;h3&gt;
  
  
  In conclusion
&lt;/h3&gt;

&lt;p&gt;Doing this puzzle has been a reminder to be strategic and to have some grace. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Break down the big scary problem into easier-to-understand parts. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don't discredit the small wins. They will lead to a much bigger victory. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Happy coding my friends! 🤓&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>OhSnap! Handy Terminal &amp; Git Commands</title>
      <dc:creator>Gedalya Krycer</dc:creator>
      <pubDate>Mon, 10 May 2021 12:56:44 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/ohsnap-handy-terminal-git-commands-3ggl</link>
      <guid>https://dev.to/gedalyakrycer/ohsnap-handy-terminal-git-commands-3ggl</guid>
      <description>&lt;p&gt;&lt;em&gt;The "OhSnap!" series explores bite-sized tips that you can apply today.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Here is a list of some helpful terminal and git commands for your viewing pleasure and my own future reference. 😉&lt;/p&gt;

&lt;h1&gt;
  
  
  Terminal Commands
&lt;/h1&gt;

&lt;h4&gt;
  
  
  Working With Spaces
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd Class\ Work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd 'Class Work'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use a backslash (&lt;code&gt;\&lt;/code&gt;) to make "Class\ Work" equal "Class Work”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Encapsulate the phrase with quote marks to preserve spaces between words. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Open project folder in VS Code
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd my-project-folder-name 

code .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Only show directories
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ls -d */
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Clear the terminal
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cmd + k
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Go back to the main directory
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Show permissions
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ls -l
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Create a file
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Create a folder/directory
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir my-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Removes a file
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rm index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Remove a folder
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rm -r my-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-r&lt;/code&gt; stands for “recursive”. It means to delete this thing and everything in it.&lt;/p&gt;




&lt;h4&gt;
  
  
  Copy a file/folder
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp img images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first value is the original file/folder and the second value is what it is copied as.&lt;/p&gt;




&lt;h4&gt;
  
  
  Rename a file/folder name
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mv old-name.html new-name.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first value is the original file/folder name and the second value is the new name.&lt;/p&gt;




&lt;h4&gt;
  
  
  Open folder in Finder
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;open .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Getting unstuck from hard-to-exit terminal screens
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shift + z
shift + z
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Git Commands
&lt;/h1&gt;

&lt;h4&gt;
  
  
  Show available local branches
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Create new branch
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b feature-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;checkout&lt;/code&gt; moves to the new branch &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-b&lt;/code&gt; creates a new branch&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;feature-1&lt;/code&gt; name for branch&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Push local branch to remote
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push origin feature-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Switch to a new branch
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Merge changes from one branch to another
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git merge master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Navigate to the branch you want to work in&lt;/li&gt;
&lt;li&gt;After the &lt;code&gt;merge&lt;/code&gt; keyword, specify the branch that &lt;strong&gt;has the changes to be merged from&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h4&gt;
  
  
  Grab all remote branches without merging
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git fetch --all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Reset the local master with the remote version
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git reset --hard origin/master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Remove non-committed changes from all branches and master since
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  View differences between commits
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To leave this view hit &lt;code&gt;Q&lt;/code&gt; on the keyboard &lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thumbnail designed with &lt;a href="https://www.figma.com/"&gt;Figma&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>beginners</category>
      <category>git</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Create an email list with React + Mailchimp</title>
      <dc:creator>Gedalya Krycer</dc:creator>
      <pubDate>Mon, 03 May 2021 13:04:24 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/create-an-email-list-with-react-mailchimp-965</link>
      <guid>https://dev.to/gedalyakrycer/create-an-email-list-with-react-mailchimp-965</guid>
      <description>&lt;h1&gt;
  
  
  In this tutorial...
&lt;/h1&gt;

&lt;p&gt;We are going to build a custom subscriber form in React and connect it to a Mailchimp audience (list). ⚛️ 📤 🙉 &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://mailchimp.com/" rel="noopener noreferrer"&gt;Mailchimp&lt;/a&gt; is a marketing platform that collects contact information into lists (recently renamed to "audiences"). You can then send email campaigns to these lists.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In building this for a freelance project, I found it to be more complex than I had anticipated. So this post is an A-Z guide on how to do it and hopefully saves you some headaches!&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%2Fuploads%2Farticles%2Fzzn3vo2k9z1ampsjqyd1.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzzn3vo2k9z1ampsjqyd1.gif" alt="Email Subscriber Form In React"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To view the form live, click the "get updates" button in the navbar.&lt;br&gt;
&lt;a href="http://genhybridsystems.com/" rel="noopener noreferrer"&gt;genhybridsystems.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Some notes on this tutorial structure
&lt;/h4&gt;

&lt;p&gt;To help simplify the steps, I will be presenting blocks of related code together, while hiding others. This way you can focus on just what is relevant for that step. &lt;/p&gt;

&lt;p&gt;Also, the original site I built had this form in a modal. I tried to strip out any code specific to that modal for this tutorial. &lt;/p&gt;

&lt;p&gt;However, if you want to review all the code at once + the modal specific code. I will include a complete &lt;code&gt;gist&lt;/code&gt; at the end. 👍&lt;/p&gt;


&lt;h1&gt;
  
  
  Steps to success
&lt;/h1&gt;
&lt;h4&gt;
  
  
  1. Build a base sign-up form in Mailchimp
&lt;/h4&gt;
&lt;h4&gt;
  
  
  2. Get the &lt;code&gt;u&lt;/code&gt; and &lt;code&gt;id&lt;/code&gt; form values
&lt;/h4&gt;
&lt;h4&gt;
  
  
  3. Install &lt;code&gt;react-mailchimp-subscribe&lt;/code&gt;
&lt;/h4&gt;
&lt;h4&gt;
  
  
  4. Create a component to hold the Mailchimp form
&lt;/h4&gt;
&lt;h4&gt;
  
  
  5. Create a &lt;code&gt;&amp;lt;CustomForm /&amp;gt;&lt;/code&gt; component 
&lt;/h4&gt;
&lt;h4&gt;
  
  
  6. Set up &lt;code&gt;handleSubmit&lt;/code&gt; function
&lt;/h4&gt;
&lt;h4&gt;
  
  
  7. Format status messages
&lt;/h4&gt;
&lt;h4&gt;
  
  
  8. Show confirmation screen with conditionals
&lt;/h4&gt;
&lt;h4&gt;
  
  
  9. Clear all fields on a successful form submission
&lt;/h4&gt;
&lt;h4&gt;
  
  
  10. Add form SCSS styles
&lt;/h4&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1 — Build a base sign-up form in Mailchimp
&lt;/h2&gt;

&lt;p&gt;Before jumping into any React code, we need to first create a form in Mailchimp. This will power our custom form later on, from behind the scenes. &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%2Fuploads%2Farticles%2Fxe63s0zvgvv355muwjr6.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxe63s0zvgvv355muwjr6.jpg" alt="Select the Form Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a1 —&lt;/strong&gt; Go to the &lt;strong&gt;Audience&lt;/strong&gt; section, select &lt;strong&gt;Signup forms&lt;/strong&gt; from the sub-menu, and finally select the &lt;strong&gt;Form builder&lt;/strong&gt;. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fuploads%2Farticles%2F6dhddo15r4euwcdd4ghl.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dhddo15r4euwcdd4ghl.jpg" alt="Confirm Form Fields"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;b1 —&lt;/strong&gt; With a new form generated, scroll down the page to the &lt;strong&gt;Built It&lt;/strong&gt; section.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;c1 —&lt;/strong&gt; For this tutorial, we just want to keep the "First Name", "Last Name" and "Email" fields. Go ahead and delete any other fields so it looks like the example above.&lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2 — Get the &lt;code&gt;u&lt;/code&gt; and &lt;code&gt;id&lt;/code&gt; form values
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fylugfrleuubckktcu7ip.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fylugfrleuubckktcu7ip.jpg" alt="Signup form URL"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a2 —&lt;/strong&gt; Above the form, copy the &lt;strong&gt;Signup form URL&lt;/strong&gt; and open it in a new tab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;b2 —&lt;/strong&gt; Then right-click on the "Sign Up Form" page and select &lt;strong&gt;View page source&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fuploads%2Farticles%2F5b4fxta7nxb0yqsj8j3f.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b4fxta7nxb0yqsj8j3f.jpg" alt="Source Code for Signup form"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;c2 —&lt;/strong&gt; Scroll way down the page, past all the CSS code in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, until you get to the &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; section. (For me it was at line 860.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There are 4 parts to copy and save for later reference...&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The URL inside of the &lt;code&gt;action=""&lt;/code&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;value&lt;/code&gt; in the input field with &lt;code&gt;name="u"&lt;/code&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;value&lt;/code&gt; in the input field with &lt;code&gt;name="id"&lt;/code&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the input field sections for &lt;em&gt;Email&lt;/em&gt;, &lt;em&gt;First Name&lt;/em&gt;, &lt;em&gt;Last Name&lt;/em&gt; – take note of the &lt;code&gt;for=""&lt;/code&gt; in each of them. For me they are named &lt;code&gt;MERGE0&lt;/code&gt;, &lt;code&gt;MERGE1&lt;/code&gt;, and &lt;code&gt;MERGE2&lt;/code&gt; respectively. We will reference these later in our form to map our own fields with these Mailchimp fields.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3 — Install &lt;code&gt;react-mailchimp-subscribe&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;As it turns out it isn't super straightforward to query the Mailchimp API on a static site. &lt;/p&gt;

&lt;p&gt;After trying a bunch of options, I found that the npm package &lt;a href="https://www.npmjs.com/package/react-mailchimp-subscribe" rel="noopener noreferrer"&gt;react-mailchimp-subscribe&lt;/a&gt; does a great job at handling the Mailchimp integration.  &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

$ npm i react-mailchimp-subscribe


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

&lt;/div&gt;
&lt;p&gt;We will just need to feed it the &lt;code&gt;url&lt;/code&gt; / &lt;code&gt;u&lt;/code&gt; / &lt;code&gt;id&lt;/code&gt; values from the last step and make some components. Easy peasy!! &lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 4 — Create a component to hold the Mailchimp form
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./mcFormStyles.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MailchimpSubscribe&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;react-mailchimp-subscribe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MailchimpFormContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__form-container"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MailchimpSubscribe&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;MailchimpFormContainer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;a4 —&lt;/strong&gt; Import React, your styles, and &lt;code&gt;react-mailchimp-subscribe&lt;/code&gt; into your new component. I also placed the &lt;code&gt;&amp;lt;MailchimpSubscribe /&amp;gt;&lt;/code&gt; component inside a div to help with positioning. (We will add styling later.)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./mcFormStyles.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MailchimpSubscribe&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;react-mailchimp-subscribe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MailchimpFormContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://genhybridsystems.us1.list-manage.com/subscribe/post?u=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REACT_APP_MAILCHIMP_U&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;id=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REACT_APP_MAILCHIMP_ID&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__form-container"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MailchimpSubscribe&lt;/span&gt;
                &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;postUrl&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;MailchimpFormContainer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;b4 —&lt;/strong&gt; Next create a variable called &lt;code&gt;postUrl&lt;/code&gt;. (Actual name is up to you). Inside it, store the URL we copied from the form's &lt;code&gt;action=""&lt;/code&gt; in step 2. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;c4 —&lt;/strong&gt; Then add the &lt;code&gt;u&lt;/code&gt; and &lt;code&gt;id&lt;/code&gt; keys from step 3 at the end of the URL.  I suggest storing the actual values in a &lt;code&gt;dotenv&lt;/code&gt; file and just referencing them in the url. (Remember to prepend the &lt;code&gt;dotenv&lt;/code&gt; variables with "REACT_APP_".)  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;d4 —&lt;/strong&gt; Finally pass the &lt;code&gt;postUrl&lt;/code&gt; as a &lt;code&gt;url&lt;/code&gt; prop on the &lt;code&gt;&amp;lt;MailchimpSubscribe /&amp;gt;&lt;/code&gt; component. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./mcFormStyles.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MailchimpSubscribe&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;react-mailchimp-subscribe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MailchimpFormContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://genhybridsystems.us1.list-manage.com/subscribe/post?u=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REACT_APP_MAILCHIMP_U&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;id=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REACT_APP_MAILCHIMP_ID&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__form-container"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MailchimpSubscribe&lt;/span&gt;
                &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;postUrl&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="na"&gt;render&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;CustomForm&lt;/span&gt;
                        &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; 
                        &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                        &lt;span class="na"&gt;onValidated&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;formData&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;MailchimpFormContainer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;e4 —&lt;/strong&gt; After the &lt;code&gt;url&lt;/code&gt; props add a &lt;code&gt;render&lt;/code&gt; with a call back function. This callback function should return a &lt;code&gt;&amp;lt;CustomForm /&amp;gt;&lt;/code&gt; component. (We will build this in Step 5.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;f4 —&lt;/strong&gt; Within the &lt;code&gt;render&lt;/code&gt; callback function, destructure the 3 values indicated below and pass them as props (also below) to the &lt;code&gt;&amp;lt;CustomForm /&amp;gt;&lt;/code&gt; component. &lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 5 — Create a &lt;code&gt;&amp;lt;CustomForm /&amp;gt;&lt;/code&gt; component
&lt;/h2&gt;

&lt;p&gt;This &lt;code&gt;&amp;lt;CustomForm /&amp;gt;&lt;/code&gt; component can by all means be in its own file. To make it easier to see how the two related, I kept it in the same file as the &lt;code&gt;MailchimpFormContainer&lt;/code&gt;. (Code example is below the instructions.)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./mcFormStyles.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MailchimpSubscribe&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;react-mailchimp-subscribe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;InputField&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;../../ui/InputField/InputField&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CustomForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onValidated&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setFirstName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLastName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&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="c1"&gt;//MailchimpFormContainer Parent Component Below&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;a5 —&lt;/strong&gt; Add &lt;code&gt;useState&lt;/code&gt; to the React import.&lt;/p&gt;

&lt;p&gt;I am also importing a custom &lt;code&gt;InputField&lt;/code&gt; component to help control styling and basic validation. Check out my previous article to see how to build this. &lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/gedalyakrycer" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuploads%2Fuser%2Fprofile_image%2F537261%2F8c5707dc-338c-449f-b608-cc896b161638.jpeg" alt="gedalyakrycer"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/gedalyakrycer/let-s-build-a-3-in-1-form-field-component-3416" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Let's build a 3-in-1 form field component&lt;/h2&gt;
      &lt;h3&gt;Gedalya Krycer ・ Apr 19 '21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;b5 —&lt;/strong&gt; At the start of the function, destructure the three props that are passed in from the parent component during step 4. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;c5 —&lt;/strong&gt; Set up &lt;code&gt;useState&lt;/code&gt; variables for each of our input fields. These will hold the values that the user types in.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./mcFormStyles.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MailchimpSubscribe&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;react-mailchimp-subscribe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;InputField&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;../../ui/InputField/InputField&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CustomForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onValidated&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setFirstName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLastName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__form"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__title"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Join our email list for future updates.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__field-container"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;InputField&lt;/span&gt;
            &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"First Name"&lt;/span&gt;
            &lt;span class="na"&gt;onChangeHandler&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;setFirstName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Jane"&lt;/span&gt;
            &lt;span class="na"&gt;isRequired&lt;/span&gt;
          &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;InputField&lt;/span&gt;
            &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Last Name"&lt;/span&gt;
            &lt;span class="na"&gt;onChangeHandler&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;setLastName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Doe"&lt;/span&gt;
            &lt;span class="na"&gt;isRequired&lt;/span&gt;
          &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;InputField&lt;/span&gt;
            &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Email"&lt;/span&gt;
            &lt;span class="na"&gt;onChangeHandler&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&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="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"your@email.com"&lt;/span&gt;
            &lt;span class="na"&gt;isRequired&lt;/span&gt;
          &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;InputField&lt;/span&gt;
          &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"subscribe"&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;
          &lt;span class="na"&gt;formValues&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;//MailchimpFormContainer Parent Component Below&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;d5 —&lt;/strong&gt; Add a &lt;code&gt;form&lt;/code&gt; element and within it another &lt;code&gt;div&lt;/code&gt; to contain and position the input fields. (Styles to come later.) &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;e5 —&lt;/strong&gt; Add input fields for "Email", "First Name" and "Last Name". Pass in the corresponding state for each &lt;code&gt;value&lt;/code&gt; and &lt;code&gt;onChange&lt;/code&gt; handler. (Remember that the above example is using my custom input fields, so it looks a little different than regular JSX.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;f5 —&lt;/strong&gt; Outside of the &lt;code&gt;div&lt;/code&gt; add a &lt;code&gt;submit&lt;/code&gt; input field. &lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 6 — Set up &lt;code&gt;handleSubmit&lt;/code&gt; function
&lt;/h2&gt;

&lt;p&gt;Now that we got our input fields set up, it is time to send that data to Mailchimp. This is where the &lt;code&gt;react-mailchimp-subscribe&lt;/code&gt; package really does all the heavy lifting. Most of the below code is actually provided by them. I'll do my best to describe (assume) what it all does. &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// imports...&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CustomForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onValidated&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setFirstName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLastName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        &lt;span class="nx"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        &lt;span class="nx"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        &lt;span class="nf"&gt;onValidated&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="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;MERGE1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;MERGE2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;lastName&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; 
        &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__form"&lt;/span&gt;
        &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        // form field code... 
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;//MailchimpFormContainer Parent Component Below&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;6a —&lt;/strong&gt; Inside of the &lt;code&gt;&amp;lt;Form&amp;gt;&lt;/code&gt; element adds an &lt;code&gt;onSubmit&lt;/code&gt; function and passes in the event (&lt;code&gt;e&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6b —&lt;/strong&gt; Inside of that function (called &lt;code&gt;handleSubmit&lt;/code&gt;) we have a few things going on... &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Breakdown&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;e.preventDefault();&lt;/code&gt; will stop the page from refreshing when the form submits and thereby preserving our state.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;email &amp;amp;&amp;amp; firstName &amp;amp;&amp;amp; lastName &amp;amp;&amp;amp;&lt;/code&gt; checks if our state values are "truthy". In other words, if a user misses a field, that state will be empty and thereby &lt;code&gt;false&lt;/code&gt;. If so the form won't submit. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;email.indexOf("@") &amp;gt; -1&lt;/code&gt; checks if a &lt;code&gt;@&lt;/code&gt; has been included in the user input. If not the form won't submit. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;onValidated()&lt;/code&gt; &lt;strong&gt;This one is very important!&lt;/strong&gt; Remember in step 2 I instructed you to store the input field values from Mailchimp? (MERGE0, MERGE1, and MERGE2) We will use these names (except for MERGE0 which "EMAIL") and assign our state to them&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 7 — Format status messages
&lt;/h2&gt;

&lt;p&gt;Mailchimp's API sends back some really awesome status responses, in 3 categories. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sending &lt;/li&gt;
&lt;li&gt;Success&lt;/li&gt;
&lt;li&gt;Error&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;code&gt;error&lt;/code&gt; status comes with really helpfully specific messages. For example, including a link back to Mailchimp to update your email, if the one you entered already exists.&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%2Fuploads%2Farticles%2Fkg6v06kqo6jn2zc9x9pa.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkg6v06kqo6jn2zc9x9pa.gif" alt="Email Already Exists error response"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// imports...&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CustomForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onValidated&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="c1"&gt;// states...&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="c1"&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__form"&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__title"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Join our email list for future updates.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sending&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__alert mc__alert--sending"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            sending...
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; 
            &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__alert mc__alert--error"&lt;/span&gt;
            &lt;span class="na"&gt;dangerouslySetInnerHTML&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;__html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;
            &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__alert mc__alert--success"&lt;/span&gt;
            &lt;span class="na"&gt;dangerouslySetInnerHTML&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;__html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__field-container"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        // form field code... 
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;//MailchimpFormContainer Parent Component Below&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;7a —&lt;/strong&gt; Right below the &lt;code&gt;&amp;lt;h3&amp;gt;&lt;/code&gt; add some conditional JSX for if the &lt;code&gt;status&lt;/code&gt; prop equal &lt;em&gt;sending&lt;/em&gt;. Instead of a ternary operator, I am using the &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; operator to show the content if the value before is &lt;code&gt;true&lt;/code&gt;. I also opted for some simple text that blinks with CSS animations. But you can totally render a cool spinner here instead. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7b —&lt;/strong&gt; Next is the conditional JSX for when the &lt;code&gt;status&lt;/code&gt; prop equals &lt;em&gt;error&lt;/em&gt;. The content is pulled from the API and is set up based on &lt;code&gt;react-mailchimp-subscribe&lt;/code&gt;'s example. The classes for this section (covered later) will also include styles for any links that might be provided. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7c —&lt;/strong&gt; Lastly add the conditional JSX for when the &lt;code&gt;status&lt;/code&gt; prop equals &lt;em&gt;success&lt;/em&gt;. The content is also pulled from the API and is set up based on &lt;code&gt;react-mailchimp-subscribe&lt;/code&gt;'s example. &lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 8 — Show confirmation screen with conditionals
&lt;/h2&gt;

&lt;p&gt;Besides showing helpful messages we can use the &lt;code&gt;success&lt;/code&gt; status response to show a confirmation in our modal. (We partly set this up in the step before.)&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%2Fuploads%2Farticles%2Fzzn3vo2k9z1ampsjqyd1.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzzn3vo2k9z1ampsjqyd1.gif" alt="Email Subscriber Form In React"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// imports...&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CustomForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onValidated&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="c1"&gt;// states...&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="c1"&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__form"&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__title"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
            &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Success!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
            &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Join our email list for future updates.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
          &lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        // error and sending status messages...

        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;
            &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__alert mc__alert--success"&lt;/span&gt;
            &lt;span class="na"&gt;dangerouslySetInnerHTML&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;__html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;

        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;success&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__field-container"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            // form field code... 
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;

        &lt;span class="si"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;
            &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setModalOpen&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="si"&gt;}&lt;/span&gt;
            &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"g__justify-self-center"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Close&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;InputField&lt;/span&gt;
                 &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"subscribe"&lt;/span&gt;
                 &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;
                 &lt;span class="na"&gt;formValues&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
               &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;//MailchimpFormContainer Parent Component Below&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;8a —&lt;/strong&gt; Starting with the &lt;code&gt;&amp;lt;h3&amp;gt;&lt;/code&gt; we can use the &lt;code&gt;status&lt;/code&gt; prop to show "Success!" if the form is submitted correctly. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8b —&lt;/strong&gt; Next we can use the &lt;code&gt;status&lt;/code&gt; prop to hide the input fields &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; on a &lt;code&gt;success&lt;/code&gt; response. (It will be replaced by the &lt;code&gt;success&lt;/code&gt; status message that we set up in step 7.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8c —&lt;/strong&gt; Lastly, we will use the &lt;code&gt;status&lt;/code&gt; prop to change the submit button to a regular button that closes the modal. (This is very specific to my setup and uses a custom button component. If you don't have a modal you can totally just hide the submit button instead.)&lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 9 — Clear all fields on a successful form submission
&lt;/h2&gt;

&lt;p&gt;Nice! We are almost there. The last thing (re: functionality) is to clear the state when we submit the form. That way the old values are not preserved when we successfully submit the form.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// imports...&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CustomForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onValidated&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="c1"&gt;// states...&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;clearFields&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="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clearFields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setFirstName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setLastName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;(&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="c1"&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__form"&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        // Form content...
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;//MailchimpFormContainer Parent Component Below&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;9a —&lt;/strong&gt; Add &lt;code&gt;useEffect&lt;/code&gt; to the React import. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9b —&lt;/strong&gt; Create a function called &lt;code&gt;clearFields&lt;/code&gt; that sets all the input field states to "". &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9c —&lt;/strong&gt; Call that function in a &lt;code&gt;useEffect&lt;/code&gt;. It should only run if the &lt;code&gt;status === "success"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9d —&lt;/strong&gt; Lastly, set the &lt;code&gt;useEffect&lt;/code&gt; dependency to look at &lt;code&gt;status&lt;/code&gt;. That way every time it updates, the &lt;code&gt;useEffect&lt;/code&gt; will run. &lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;h2&gt;
  
  
  Step 10 — Add form SCSS styles
&lt;/h2&gt;

&lt;p&gt;Ok final step! Let's style this sucker up. &lt;/p&gt;

&lt;p&gt;It is worth noting the I am using &lt;code&gt;SCSS&lt;/code&gt; and importing some custom variables. I'll include some comments to help explain what these are and what to do on your end.&lt;/p&gt;

&lt;p&gt;Also, this is all based on the website's brand. By all means, change these styles to match your branding! &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;

&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s2"&gt;"../../../sassStyles/_variables"&lt;/span&gt; &lt;span class="nt"&gt;as&lt;/span&gt; &lt;span class="nt"&gt;v&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s2"&gt;"../../../sassStyles/_mixins"&lt;/span&gt; &lt;span class="nt"&gt;as&lt;/span&gt; &lt;span class="nt"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

 &lt;span class="cm"&gt;/* Styles the h3 */&lt;/span&gt;
&lt;span class="nc"&gt;.mc__title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;235px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="cm"&gt;/* Replace with your brand's main text color */&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$secondary1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;25px&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="m"&gt;35px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


  &lt;span class="cm"&gt;/* Media query for breakpoints over 676px */&lt;/span&gt;
  &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nd"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;smMinBreakPoint&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="m"&gt;30px&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="cm"&gt;/* Positions the form in the middle of the modal and ensures the content doesn't jump as status messages get added/removed */&lt;/span&gt;
&lt;span class="nc"&gt;.mc__form-container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="mi"&gt;.2s&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/* Positions Text and form fields nicely in the middle with some spacing. */&lt;/span&gt;
&lt;span class="nc"&gt;.mc__form&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;grid-template-rows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;min-content&lt;/span&gt; &lt;span class="n"&gt;min-content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;grid-row-gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;40px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;stretch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="mi"&gt;.2s&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/* Seperates the input fields vertically */&lt;/span&gt;
&lt;span class="nc"&gt;.mc__field-container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;grid-row-gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/* Provides styles for status messages */&lt;/span&gt;
&lt;span class="nc"&gt;.mc__alert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="cm"&gt;/* Imports my site's Google Font from another file */&lt;/span&gt;
  &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nd"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;poppinsFontStack&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="cm"&gt;/* If "sending" this will animate the text.*/&lt;/span&gt;
  &lt;span class="cm"&gt;/* Keyframes for this will be included below.*/&lt;/span&gt;
  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nt"&gt;--sending&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$highlight2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="na"&gt;-webkit-animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fade-loop&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="mi"&gt;.8s&lt;/span&gt; &lt;span class="n"&gt;ease-in-out&lt;/span&gt; &lt;span class="n"&gt;infinite&lt;/span&gt; &lt;span class="n"&gt;alternate-reverse&lt;/span&gt; &lt;span class="nb"&gt;both&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fade-loop&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="mi"&gt;.8s&lt;/span&gt; &lt;span class="n"&gt;ease-in-out&lt;/span&gt; &lt;span class="n"&gt;infinite&lt;/span&gt; &lt;span class="n"&gt;alternate-reverse&lt;/span&gt; &lt;span class="nb"&gt;both&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cm"&gt;/* "success" status styles with text color */&lt;/span&gt;
  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nt"&gt;--success&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$secondary2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-60px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cm"&gt;/* "error" status styles*/&lt;/span&gt;
  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nt"&gt;--error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$warning&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="cm"&gt;/* This addresses any links the error message includes */&lt;/span&gt;
    &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

      &lt;span class="cm"&gt;/* Select a high contrast color from your brand. */&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$highlight1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;.3s&lt;/span&gt; &lt;span class="n"&gt;ease-in-out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;.7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&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="p"&gt;}&lt;/span&gt;


&lt;span class="cm"&gt;/* ----------------------------------------------
 * Generated by Animista on 2021-4-1 16:18:48
 * Licensed under FreeBSD License.
 * See http://animista.net/license for more info.
 * w: http://animista.net, t: @cssanimista
 * ---------------------------------------------- */&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * ----------------------------------------
 * animation fade-loop
 * ----------------------------------------
 */&lt;/span&gt;
&lt;span class="k"&gt;@-webkit-keyframes&lt;/span&gt; &lt;span class="nt"&gt;fade-loop&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;100&lt;/span&gt;&lt;span class="nv"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&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="k"&gt;@keyframes&lt;/span&gt; &lt;span class="nt"&gt;fade-loop&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;100&lt;/span&gt;&lt;span class="nv"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&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;h2&gt;
  
  
  Complete JSX Code
&lt;/h2&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Thumbnail designed with &lt;a href="https://www.figma.com/" rel="noopener noreferrer"&gt;Figma&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>mailchimp</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>165+ Developer Resources I Discovered in 2020-2021</title>
      <dc:creator>Gedalya Krycer</dc:creator>
      <pubDate>Mon, 26 Apr 2021 12:56:03 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma</link>
      <guid>https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma</guid>
      <description>&lt;p&gt;Since starting to actively code in 2020, I have come across many helpful resources.&lt;/p&gt;

&lt;p&gt;Some I have completed and others I still have in the queue. Hopefully, they will be helpful to you as well! &lt;/p&gt;

&lt;h4&gt;
  
  
  Resource Types
&lt;/h4&gt;

&lt;p&gt;🎓 = Complete course on a subject(s) &lt;br&gt;
🧰 = Tool that makes development easier &lt;br&gt;
🧐 = Single article or video on a subject(s)&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Resources Lists
&lt;/h1&gt;

&lt;h3&gt;
  
  
  • HTML
&lt;/h3&gt;

&lt;h3&gt;
  
  
  • CSS
&lt;/h3&gt;

&lt;h3&gt;
  
  
  • JavaScript
&lt;/h3&gt;

&lt;h3&gt;
  
  
  • React
&lt;/h3&gt;

&lt;h3&gt;
  
  
  • WordPress
&lt;/h3&gt;

&lt;h3&gt;
  
  
  • Git &amp;amp; CLI
&lt;/h3&gt;

&lt;h3&gt;
  
  
  • Hosting
&lt;/h3&gt;

&lt;h3&gt;
  
  
  • Optimizations
&lt;/h3&gt;

&lt;h3&gt;
  
  
  • Databases
&lt;/h3&gt;

&lt;h3&gt;
  
  
  • MISC Web Dev
&lt;/h3&gt;

&lt;h3&gt;
  
  
  • Career
&lt;/h3&gt;

&lt;h3&gt;
  
  
  • Design
&lt;/h3&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  HTML Resources
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;My Thoughts&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://moz.com/learn/seo/alt-text" rel="noopener noreferrer"&gt;Alt Text&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Loved how it gave examples of what good alt text looks like.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.techonthenet.com/html/elements/doctype_tag.php" rel="noopener noreferrer"&gt;HTML: &lt;code&gt;&amp;lt;!DOCTYPE&amp;gt;&lt;/code&gt; tag&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Especially helpful when I was first learning HTML syntax&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.w3schools.com/html/html5_semantic_elements.asp" rel="noopener noreferrer"&gt;W3S HTML5 Semantic Elements&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Great quick intro to why everything shouldn't be in a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element" rel="noopener noreferrer"&gt;MDN HTML elements reference&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Ready to go to the next level? This guide goes even deeper in the many HTML elements.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.opera.com/articles/new-structural-elements-in-html5/" rel="noopener noreferrer"&gt;New Structural Elements in HTML5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This guide really helped me understand elements like &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;figcaption&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a href="https://websitesetup.org/html5-periodical-table/" rel="noopener noreferrer"&gt;HTML5 Periodical Table&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I love how interactive, yet simplified this approach is to learning the elements.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;a href="https://javascript.info/script-async-defer" rel="noopener noreferrer"&gt;Scripts: async, defer&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This taught me different ways to load JS into html files, drastically improving performance.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;a href="https://learn.shayhowe.com/html-css/" rel="noopener noreferrer"&gt;Learn to Code HTML &amp;amp; CSS&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Took this course to prepare for the bootcamp. Great intro to HTML.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;a href="https://learn.shayhowe.com/advanced-html-css/" rel="noopener noreferrer"&gt;Learn to Code Advanced HTML &amp;amp; CSS&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I really enjoyed the above beginner course and looking forward to taking this one.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=4HuAnM6b2d8" rel="noopener noreferrer"&gt;Derek Banas Handlebars Tutorial&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Not technically HTML, but it sure helps you write it efficiently. Looking forward to viewing this tutorial.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;&lt;a href="https://metatags.io/" rel="noopener noreferrer"&gt;metatags.io&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;One of my favorite generators for creating meta tags for multiple social media platforms.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;&lt;a href="https://css-tricks.com/a-complete-guide-to-links-and-buttons/" rel="noopener noreferrer"&gt;A Complete Guide to Links and Buttons&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Using the right tool for the right job is never more apparent in this deep-dive comparison article.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;&lt;a href="https://getwaves.io" rel="noopener noreferrer"&gt;getwaves.io&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Love this tool! Generate svg waves, to create curved separations for page sections!&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  CSS Resources
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;My Thoughts&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;&lt;a href="https://getbootstrap.com/docs/5.0/getting-started/introduction/" rel="noopener noreferrer"&gt;Bootstrap Documentation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Even if I am not using the framework I love using their documentation for inspiration on common web components.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;&lt;a href="https://css-tricks.com/specifics-on-css-specificity/" rel="noopener noreferrer"&gt;Specifics on CSS Specificity&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Great breakdown by CSS-Tricks and has nice graphic examples at the end.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.w3schools.com/css/css3_box-sizing.asp" rel="noopener noreferrer"&gt;CSS Box Sizing&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Very easy to approach example of how the box-model works.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.creativebloq.com/advice/tips-for-css-animation" rel="noopener noreferrer"&gt;12 tips for amazing CSS animation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This has so many good tips on creating cool animations and making sure they are performant.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;&lt;a href="https://designcode.io/css-layout-and-animations" rel="noopener noreferrer"&gt;CSS Layout and Animations&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Haven't taken this one yet, but can't wait to do so. The course designs are top notch.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/playlist?list=PL4cUxeGkcC9iEwigam3gTjU_7IA3W2WZA" rel="noopener noreferrer"&gt;Net Ninja SASS Tutorial&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This was my first course on SASS and still refer back to it from time to time.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=Zz6eOVaaelI" rel="noopener noreferrer"&gt;Learn Sass In 20 Minutes&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This is great for a first primer into what SASS is.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;a href="https://medium.com/@andrew_barnes/bem-and-sass-a-perfect-match-5e48d9bc3894" rel="noopener noreferrer"&gt;BEM and SASS: A Perfect Match&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This blew my mind when introduced how BEM and SASS could be used together.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;a href="http://getbem.com/" rel="noopener noreferrer"&gt;getbem.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This gives an overview from the creators of the popular naming convention.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;a href="https://css-tricks.com/bem-101/" rel="noopener noreferrer"&gt;CSS-Tricks BEM 101&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I love the button examples that this article gives on how to use BEM.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;&lt;a href="https://sparkbox.com/foundry/bem_by_example" rel="noopener noreferrer"&gt;BEM by Example &lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This explanation on BEM is really good, but I especially like how they have a short and full versions of the article.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/display" rel="noopener noreferrer"&gt;MDN Display Docs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Everything you could ever want to know about the powerful &lt;code&gt;display&lt;/code&gt; property.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;&lt;a href="https://css-tricks.com/a-couple-of-use-cases-for-calc/" rel="noopener noreferrer"&gt;A Couple of Use Cases for Calc()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;calc()&lt;/code&gt; is one of the more powerful features in CSS and this article shows some great use cases for it.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;&lt;a href="https://cssgrid.io" rel="noopener noreferrer"&gt;Wes Bos CSS Grid&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;You can't argue with free and that Wes Bos is one of the best teachers out there for development.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;&lt;a href="https://flexbox.io" rel="noopener noreferrer"&gt;Wes Bos Flexbox&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;See above, but this time for Flexbox&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.cssmatic.com" rel="noopener noreferrer"&gt;CSSmatic&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Collection of powerful css generators for gradients, border radius, noise texture and box shadows.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;&lt;a href="https://css-tricks.com/almanac/properties/p/position/" rel="noopener noreferrer"&gt;CSS Tricks Position&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;If I could have access to only one resource for the &lt;code&gt;position&lt;/code&gt; property, this would be it.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com" rel="noopener noreferrer"&gt;Can I Use?&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This site lets you know the browser support for every property out there.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;&lt;a href="https://yoksel.github.io/flex-cheatsheet/" rel="noopener noreferrer"&gt;yoksel Flex Cheatsheet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I love the layout and way it lets you visually preview the flexbox properties.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;&lt;a href="https://code.tutsplus.com/tutorials/the-30-css-selectors-you-must-memorize--net-16048" rel="noopener noreferrer"&gt;The 30 CSS Selectors You Must Memorize&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;When I feel like getting into the weeds of CSS selectors, (sorry BEM) this is the article I refer back to.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;&lt;a href="http://csslint.net" rel="noopener noreferrer"&gt;CSS Lint&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This tool will check your code and highlight any errors.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;&lt;a href="https://systemfontstack.com" rel="noopener noreferrer"&gt;System Font Stack&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Predefined font fallback stacks that can be plugged into a project.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;&lt;a href="https://neumorphism.io/#c0b5b5" rel="noopener noreferrer"&gt;Neumorphism.io&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This tool makes elements look like they are just under the surface of the page.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.udemy.com/course/advanced-css-and-sass/" rel="noopener noreferrer"&gt;Advanced CSS and Sass: Flexbox, Grid, Animations and More!&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Bought this amazing course on Udemy but haven't gotten a chance to take it yet...one day soon though!&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;&lt;a href="https://css-scroll-shadows.now.sh/?bgColor=9d80d6&amp;amp;shadowColor=222222&amp;amp;pxSize=15" rel="noopener noreferrer"&gt;CSS Scroll Shadows&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This tool generates shadows that appear based on scroll position with just CSS!&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  JavaScript Resources
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;My Thoughts&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;&lt;a href="https://javascript.info" rel="noopener noreferrer"&gt;javascript.info&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This is one of the complete and well explained overview of JS.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;&lt;a href="https://codebeautify.org/jsvalidate" rel="noopener noreferrer"&gt;Code Beautify&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Before getting into ESlint, I really liked this tool to make sure my JS was all kosher.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.sitepoint.com/javascript-truthy-falsy/" rel="noopener noreferrer"&gt;Truthy and Falsy: When All is Not Equal in JavaScript&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This article is a great refernce for all the instances that a value might be considered true or false.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;&lt;a href="https://youtu.be/8aGhZQkoFbQ" rel="noopener noreferrer"&gt;What the heck is the event loop anyway?&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I have not watched this yet, but looking forward to it.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=s9wW2PpJsmQ" rel="noopener noreferrer"&gt;JavaScript Loops&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;If I could only watch one video to understand common JS loops, this would be the one.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.tutorialrepublic.com/javascript-tutorial/javascript-loops.php" rel="noopener noreferrer"&gt;JavaScript Loops&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;If I could only read one article to understand common JS loops, this would be the one.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.codecademy.com/learn/introduction-to-javascript/modules/learn-javascript-introduction/cheatsheet" rel="noopener noreferrer"&gt;Codecademy JS Cheatsheet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Totally free and a nice collection of common JS elements and concepts.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" rel="noopener noreferrer"&gt;MDN JS String&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Everything I'd ever want to know about strings and where to use them.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;&lt;a href="https://medium.com/@debbie.obrien/json-parse-v-json-stringify-4b9d104c78d0" rel="noopener noreferrer"&gt;JSON Parse v JSON Stringify&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;These JSON functions confused me to no end. This article really helped explain the differences.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developers.google.com/speed/libraries#jquery" rel="noopener noreferrer"&gt;Google Hosted Library jQuery&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Bookmark this link. :) It has the latest jQuery cdn script at all time.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/public-apis/public-apis/" rel="noopener noreferrer"&gt;Public APIs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Great list of public APIs that you can use projects today!&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dmitripavlutin.com/javascript-event-delegation/" rel="noopener noreferrer"&gt;Javascript Event Delegation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Awesome visual representation of what events are and how event delegation works.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.freecodecamp.org/news/var-let-and-const-whats-the-difference/" rel="noopener noreferrer"&gt;Var, Let, and Const – What's the Difference?&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Great introduction to the different variable types (and why &lt;code&gt;var&lt;/code&gt; is trash.)&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dmitripavlutin.com/differences-between-arrow-and-regular-functions/" rel="noopener noreferrer"&gt;5 Differences Between Arrow and Regular Functions&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I love how this demystifies how the two function types are used.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=0ik6X4DJKCc" rel="noopener noreferrer"&gt;JavaScript DOM Crash Course - Part 1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Discover how to select elements in the DOM to be used with JS&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=mPd2aJXCZ2g" rel="noopener noreferrer"&gt;JavaScript DOM Crash Course - Part 2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Learn the basics of how to traverse the DOM.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=wK2cBMcDTss" rel="noopener noreferrer"&gt;JavaScript DOM Crash Course - Part 3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Learn how to attach attach events to DOM elements.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=i37KVt_IcXw" rel="noopener noreferrer"&gt;JavaScript DOM Crash Course - Part 4&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Build a small project based on the last 3 videos.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/introduction-to-the-dom" rel="noopener noreferrer"&gt;Introduction to the DOM&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Another great resource on the DOM, this quick article will get you up and running.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/playlist?list=PL4cUxeGkcC9jx2TTZk3IGWKSbtugYdrlu" rel="noopener noreferrer"&gt;Asynchronous Javascript&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I forgot I bookmarked this until now. This an awesome free course by the Net Ninja.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.codewars.com/kata/54c27a33fb7da0db0100040e/train/javascript" rel="noopener noreferrer"&gt;Code Wars Kata&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This awesomely themed training tool lets you practice your sweet Javascript skills.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.sitepoint.com/event-bubbling-javascript/" rel="noopener noreferrer"&gt;What Is Event Bubbling in JavaScript?&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Another great resource on what event bubbling is and how to take advantage of it.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.sitepoint.com/javascript-event-delegation-is-easier-than-you-think/" rel="noopener noreferrer"&gt;JavaScript Event Delegation is Easier than You Think&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Learn how to trigger and listen to events correctly.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.quirksmode.org/js/events_properties.html#target" rel="noopener noreferrer"&gt;Which HTML element is the target of the event?&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Find out which element was interacted with.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;&lt;a href="https://scotch.io/tutorials/understanding-scope-in-javascript" rel="noopener noreferrer"&gt;Understanding Scope in JavaScript&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Love the design of this site and it does a thorough job of explaining scope.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;&lt;a href="https://medium.com/til-js/different-ways-of-writing-a-function-in-javascript-part-i-80d9a9e0138b" rel="noopener noreferrer"&gt;Different ways of writing a function in JavaScript&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Quick article on how to write a "Function Declaration" function.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.softauthor.com/javascript-image-slider-slideshow-carousel/" rel="noopener noreferrer"&gt;JavaScript Image Slider for Beginners&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This teaches how to build a simple image slider with Vanilla JS.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;&lt;a href="https://testingjavascript.com" rel="noopener noreferrer"&gt;Learn the smart, efficient way to test any JavaScript application.&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I have not taken this one yet, but looking forward to it—as it is such an important subject!&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.udemy.com/course/js-algorithms-and-data-structures-masterclass/" rel="noopener noreferrer"&gt;JavaScript Algorithms and Data Structures Masterclass&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I am not a fan of algorithms, but that is why I have this course bookmarked!&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;&lt;a href="https://teamtreehouse.com/library/ajax-basics-2" rel="noopener noreferrer"&gt;AJAX Basics&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Everything you ever wanted to know about making AJAX requests to a web server.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;69&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.taniarascia.com/how-to-connect-to-an-api-with-javascript/" rel="noopener noreferrer"&gt;How to Connect to an API with JavaScript&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This article really helped me understand how API calls can be used in projects.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.taniarascia.com/how-to-use-json-data-with-php-or-javascript/" rel="noopener noreferrer"&gt;JSON Tutorial: Request API Data with JavaScript or PHP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;It's so interesting to see how PHP and JavaScript handle JSON differently.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;&lt;a href="https://barnabas.hashnode.dev/basics-of-javascript-reduce-method-ckdk81c6402y7zzs1f13p4x7t" rel="noopener noreferrer"&gt;Basics Of JavaScript Reduce Method&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This short article does such a great job of breaking down this powerful JS method.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;&lt;a href="https://blog.logrocket.com/axios-or-fetch-api/#:~:text=To%20send%20data%2C%20fetch(),set%20in%20the%20options%20object" rel="noopener noreferrer"&gt;Axios or fetch(): Which should you use? &lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I tend to reach for Axios, but this article does a great job explaining both.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.codecademy.com/learn/introduction-to-javascript" rel="noopener noreferrer"&gt;Learn JavaScript  Start &lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I took this 30-hour course and it is amazing. Does a great job explaining the basics.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;td&gt;&lt;a href="https://validatejs.org" rel="noopener noreferrer"&gt;validatejs.org&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Great tool to use on sign-up and login forms to make sure the user data is correct.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=ymmtEgp0Tuc" rel="noopener noreferrer"&gt;HTML5 Canvas Tutorial for Beginners&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;As a designer, this is one I am very excited about diving into.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  React Resources
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;My Thoughts&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ihatetomatoes.net/wp-content/uploads/2017/01/react-cheat-sheet-v1.pdf" rel="noopener noreferrer"&gt;React Cheat Sheet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Quick and easy to skim cheat sheet on common React patterns and pieces.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;&lt;a href="https://advancedreact.com" rel="noopener noreferrer"&gt;Fullstack Advanced  React &amp;amp; GraphQL&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Little pricer then Udemy, but no one teaches like Wes Bos. Hopefully will be able to purchase this one soon.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;&lt;a href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en" rel="noopener noreferrer"&gt;React Developer Tools&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This lets you view props, components, renders and more right in Chrome DevTools&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;&lt;a href="https://react-icons.github.io/react-icons/" rel="noopener noreferrer"&gt;React Icons&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This is one of my favorite icon packages, because it has almost every major icon library out there.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.udemy.com/course/react-the-complete-guide-incl-redux/" rel="noopener noreferrer"&gt;React - The Complete Guide (incl Hooks, React Router, Redux)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;One of my favorite courses and has prepared me so much to code in React.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;&lt;a href="https://daveceddia.com/usereducer-hook-examples/" rel="noopener noreferrer"&gt;Examples of the useReducer Hook&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This article / video breaks down a very cool hook lets you get a "Redux-like" store without downloading the library.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;&lt;a href="https://mdxjs.com/getting-started" rel="noopener noreferrer"&gt;MDX Documentation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This syntax combines JSX and Markdown in one!&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;&lt;a href="https://reactfordesigners.com" rel="noopener noreferrer"&gt;React For Designers&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This features some great courses and beginner projects for getting started in React.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/react-bootstrap/react-router-bootstrap" rel="noopener noreferrer"&gt;React Router Bootstrap&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Get the power of React Router navigation and the stylings of Bootstrap mixed into one.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/nfl/react-helmet" rel="noopener noreferrer"&gt;React Helmet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I really want to learn this package. It lets you add SEO meta tags to different "React Pages"&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;td&gt;&lt;a href="https://web.dev/code-splitting-suspense/?utm_source=lighthouse&amp;amp;utm_medium=devtools" rel="noopener noreferrer"&gt;Code splitting with React.lazy and Suspense&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This really works! After implementing on my website my performance scores improved.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;&lt;a href="https://react.rocks/tag/Validation" rel="noopener noreferrer"&gt;33 Validation Examples&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Awesome collection of form validation and demo code for React.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.reddit.com/r/learnjavascript/comments/ifqa03/37_reactjs_basics_useref_hook/" rel="noopener noreferrer"&gt;37 ReactJS basics useRef Hook&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Helpful video on how to work with the React hook &lt;code&gt;useRef&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.npmjs.com/package/react-validation" rel="noopener noreferrer"&gt;npm react-validation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Robust package to set up form validation. Need to dive deeper one day to learn all it can do.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/formsy/formsy-react/" rel="noopener noreferrer"&gt;Formsy React&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This package lets you build custom forms and it takes care of the validation for you.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;&lt;a href="//styled-components.com"&gt;Styled Componets&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A favorite with React users, allowing you to create CSS focused custom components.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;&lt;a href="https://medium.com/@ttennant/react-inline-styles-and-media-queries-using-a-custom-react-hook-e76fa9ec89f6" rel="noopener noreferrer"&gt;React inline styles and media queries using a custom React Hook&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This article helped me mimic responsive styling within the JSX environment.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;td&gt;&lt;a href="https://react-bootstrap.github.io/getting-started/introduction/" rel="noopener noreferrer"&gt;React Bootstrap&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Really good documentation on using bootstrap with React.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=3zoIigieur0" rel="noopener noreferrer"&gt;React Redux Using Hooks&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Work with the modern Hook syntax for Redux. This saved me so much time!&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;&lt;a href="https://stackoverflow.com/questions/37755997/why-cant-i-directly-modify-a-components-state-really" rel="noopener noreferrer"&gt;Why can't I directly modify a component's state, really?&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This explains so well why you must use &lt;code&gt;setState&lt;/code&gt; for changing state in class components.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;&lt;a href="https://blog.bitsrc.io/react-communication-between-components-c0cfccfa996a" rel="noopener noreferrer"&gt;React: Communication Between Components&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Great deep dive into how React components pass data to one another.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.freecodecamp.org/news/how-to-identify-and-resolve-wasted-renders-in-react-cc4b1e910d10/" rel="noopener noreferrer"&gt;How to identify and resolve wasted renders in React&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Performance is everything and this teaches how to work with renders correctly.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;&lt;a href="https://reactjs.org/docs/components-and-props.html" rel="noopener noreferrer"&gt;Components and Props&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;One of the core and most visited pages in the React Documentation for me.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;&lt;a href="https://medium.com/@samueldinesh/setting-up-redux-devtools-a-simple-guide-3b386a6254fa" rel="noopener noreferrer"&gt;Setting Up Redux DevTools&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Redux DevTools is not the most straightforward thing for me to set up, but this helped explain the process well.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.reddit.com/r/learnjavascript/comments/ipfikv/stuck_with_learning_react_redux_i_am_making_a/?utm_source=share&amp;amp;utm_medium=ios_app&amp;amp;utm_name=iossmf" rel="noopener noreferrer"&gt;React Redux Easy Peasy Course&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Haven't watched this beginner course on Redux yet, but heard good things.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.gatsbyjs.org/" rel="noopener noreferrer"&gt;Gatsby JS&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;So excited to work with this static site generator very soon.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.udemy.com/course/mern-stack-front-to-back/" rel="noopener noreferrer"&gt;MERN Stack Front To Back&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Purchased this course but have not taken it yet. Very excited to do so soon as it covers so much.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.udemy.com/course/react-native-the-practical-guide/" rel="noopener noreferrer"&gt;React Native The Practical Guide&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;In the middle of taking this now and love all the detail it goes into.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  WordPress Resources
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;My Thoughts&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;104&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=-h7gOJbIpmo" rel="noopener noreferrer"&gt;How to Create a Custom WordPress Theme - Full Course&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Wonderful introduction to custom theming in WordPress.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/playlist?list=PLC5E59DD6D84D34DC" rel="noopener noreferrer"&gt;WordPress Basics&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;All the videos are very well broken out.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/playlist?list=PLriKzYyLb28nUFbe0Y9d-19uVkOnhYxFE" rel="noopener noreferrer"&gt;WordPress 101 for Beginner Developers&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Another great playlist on the basics of WordPress.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/playlist?list=PLriKzYyLb28kpEnFFi9_vJWPf5-_7d3rX" rel="noopener noreferrer"&gt;Create a Premium WordPress Theme&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Haven't taken this one, but there are a lot of helpful video topics in this playlist.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;108&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/playlist?list=PLLnpHn493BHGACfv4rC29kJamYMtw34D9" rel="noopener noreferrer"&gt;Customizing WordPress&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Really helpful playlist on advanced WordPress theme topics.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;109&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.udemy.com/course/wordpress-intermediate/" rel="noopener noreferrer"&gt;WordPress Intermediate Skills&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I like that this course covers working with a server as well.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=OriRDlUbAFg" rel="noopener noreferrer"&gt;How to install WordPress on your local computer with MAMP (Mac)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This video taught me how to work with WordPress locally on my machine.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;111&lt;/td&gt;
&lt;td&gt;&lt;a href="https://wphierarchy.com/" rel="noopener noreferrer"&gt;wphierarchy.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This website does a great job in explaining all the different file types in WordPress and their importance levels.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;112&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developer.wordpress.org/themes/basics/including-css-javascript/" rel="noopener noreferrer"&gt;Including CSS &amp;amp; JavaScript&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Documentation on using CSS &amp;amp; JS in WordPress.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Git &amp;amp; CLI Resources
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;My Thoughts&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;113&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.atlassian.com/git/tutorials/comparing-workflows" rel="noopener noreferrer"&gt;Comparing Git Workflows&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This was so helpful in understanding there are different Git workflows for each team need.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;114&lt;/td&gt;
&lt;td&gt;&lt;a href="https://commandlinepoweruser.com/" rel="noopener noreferrer"&gt;Command Line Power User&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Can't wait to become a true terminal master with this course.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;115&lt;/td&gt;
&lt;td&gt;&lt;a href="https://learngitbranching.js.org/" rel="noopener noreferrer"&gt;Learn Git Branching&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This interactive course was so helpful in understanding how branching worked.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;116&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=oFYyTZwMyAg" rel="noopener noreferrer"&gt;GITHUB PULL REQUEST, Branching, Merging &amp;amp; Team Workflow&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Great overview of how it looks to work with a team in a Git workflow.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;117&lt;/td&gt;
&lt;td&gt;&lt;a href="https://guides.github.com/features/mastering-markdown/" rel="noopener noreferrer"&gt;Mastering Markdown&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Such a great resource for seeing common Markdown syntax and upgrading Git README&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;118&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.quora.com/What-is-the-difference-between-the-add-and-commit-commands-in-Git" rel="noopener noreferrer"&gt;Mastering Markdown&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Super helpful when I first started using Git for version control.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;119&lt;/td&gt;
&lt;td&gt;&lt;a href="https://reactsensei.com/basic-git-commands/" rel="noopener noreferrer"&gt;Basic Git Commands&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Another great cheat sheet on common git commands.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;&lt;a href="https://guides.github.com/activities/hello-world/" rel="noopener noreferrer"&gt;GitHub Guide Hello World&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Get started with Github with this very user friendly guide.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;121&lt;/td&gt;
&lt;td&gt;&lt;a href="http://rogerdudler.github.io/git-guide/" rel="noopener noreferrer"&gt;Git Commands&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Very visual approach for common Git commands.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;122&lt;/td&gt;
&lt;td&gt;&lt;a href="https://shortcode.dev/git-cheatsheet#git-cheatsheet" rel="noopener noreferrer"&gt;Short Code Git Cheat Sheet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Searchable cheatsheet&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;123&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.codecademy.com/articles/command-line-commands" rel="noopener noreferrer"&gt;List of Command Line Commands&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Awesome list by Codecademy on many CLI terminal commands.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Hosting Resources
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;My Thoughts&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;124&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.netlify.com/products/build/" rel="noopener noreferrer"&gt;Netlify Build&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Awesome Netlify process to trigger builds to the live site once a specific branch is updated.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;125&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/playlist?list=PLzlG0L9jlhEPMR8haUPkxj2hJ_3jh5qa6" rel="noopener noreferrer"&gt;Netlify Tutorials&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Free course to get up and running with Netlify hosting&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;126&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=6ElQ689HRcY" rel="noopener noreferrer"&gt;Simple Contact Form Submission With Netlify&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Easy tutorial on how to set up Netlify as the mail server.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;127&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=6r9NJDHiJwA" rel="noopener noreferrer"&gt;PHPStorm FTP Server Connection to Remote Host &lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Tutorial on how to connect with SFTP or FTP with PHPStorm. (It makes it a joy compared to VS Code)&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Optimization Resources
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;My Thoughts&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;td&gt;&lt;a href="https://teamtreehouse.com/library/front-end-web-optimization-workflow" rel="noopener noreferrer"&gt;Front End Web Optimization Workflow&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Can't wait to take this one and learn about CDNs and optimizing assets&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;129&lt;/td&gt;
&lt;td&gt;&lt;a href="https://yoast.com/rel-canonical/" rel="noopener noreferrer"&gt;&lt;code&gt;rel=canonical&lt;/code&gt;: the ultimate guide&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Such a good description of what Canonical urls are and where to use them.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;130&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Performance/Lazy_loading" rel="noopener noreferrer"&gt;MDN Lazy Loading&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Great place to start to learn how Lazy loading works.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;131&lt;/td&gt;
&lt;td&gt;&lt;a href="https://hackernoon.com/seo-web-development-tutorial-for-beginners-7273308b6448" rel="noopener noreferrer"&gt;SEO Web Development Tutorial for Beginners&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Awesome intro for what SEO is and how to approach it.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;132&lt;/td&gt;
&lt;td&gt;&lt;a href="https://moz.com/learn/seo/page-speed" rel="noopener noreferrer"&gt;MOZ Page Speed&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This shows a bunch of areas to check for poor page speeds.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;133&lt;/td&gt;
&lt;td&gt;&lt;a href="https://remysharp.com/2015/10/14/the-art-of-debugging" rel="noopener noreferrer"&gt;The Art of Debugging&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Fascinating deep dive on the process of debugging a website and tools to help.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Databases Resources
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;My Thoughts&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;134&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.freecodecamp.org/news/introduction-to-mongoose-for-mongodb-d2a7aa593c57" rel="noopener noreferrer"&gt;Introduction to Mongoose for MongoDB&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This article thoroughly explains what MongoDB is and why it is essential to use Mongoose with it.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;135&lt;/td&gt;
&lt;td&gt;&lt;a href="https://medium.com/@atingenkay/restful-routes-what-are-they-8fe221521bb" rel="noopener noreferrer"&gt;Restful Routes, What are they?&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I did not fully understand RESTful API calls until reading this.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;136&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" rel="noopener noreferrer"&gt;HTTP response status codes&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Code 418 is the best. ;)&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;137&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.passportjs.org/docs/" rel="noopener noreferrer"&gt;Passport&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Great tool to use for full-stack user authentication&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  MISC Web Dev Resources
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;My Thoughts&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;138&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=OdQtww8ZfEw" rel="noopener noreferrer"&gt;Working with Code Written by Someone Else&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Wonderful tips in how to explore a new codebase.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;139&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.tablesgenerator.com/markdown_tables" rel="noopener noreferrer"&gt;Markdown Table Generator&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This is how I made the tables in this post ;)&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;140&lt;/td&gt;
&lt;td&gt;&lt;a href="https://facebook.github.io/jest/" rel="noopener noreferrer"&gt;Jest&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;One of the industry testing frameworks used for test driven development.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;141&lt;/td&gt;
&lt;td&gt;&lt;a href="https://get.foundation/emails.html" rel="noopener noreferrer"&gt;Foundation for Emails&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This framework makes it easy to code responsive HTML emails.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;142&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/playlist?list=PLR_ZJO3q73HalAe5sRs7ByjHvptmbflsL" rel="noopener noreferrer"&gt;Zurb Foundation for Email Course&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Great course for the above email framework.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;143&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.npmjs.com/package/dotenv" rel="noopener noreferrer"&gt;NPM dotenv&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This package lets you secure sensitive information like API keys within projects.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;144&lt;/td&gt;
&lt;td&gt;&lt;a href="https://typing.io/" rel="noopener noreferrer"&gt;typing.io&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I used this before the bootcamp to practice typing code faster.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;145&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developers.google.com/maps/documentation/" rel="noopener noreferrer"&gt;Google Maps Platform Documentation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Api documentation for using Google Maps in projects.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;146&lt;/td&gt;
&lt;td&gt;&lt;a href="https://auth0.com/blog/what-is-and-how-does-single-sign-on-work/" rel="noopener noreferrer"&gt;What Is and How Does Single Sign-On Authentication Work?&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This was so helpful in helping me understand at a high-level how SSO works&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;147&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.searchenginejournal.com/subdomains-vs-subfolders-seo/239795/#close" rel="noopener noreferrer"&gt;Subdomains vs. Subfolders: Which Is Better for SEO &amp;amp; Why?&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Very interesting article on how to structure loosely related web content.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;148&lt;/td&gt;
&lt;td&gt;&lt;a href="https://favicon.io/favicon-generator/" rel="noopener noreferrer"&gt;favicon.io&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This is my favorite Favicon generator (small icon in browser tab) and has a great interface.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;149&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/wesbos/eslint-config-wesbos" rel="noopener noreferrer"&gt;Wes Bos Eslint Config&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Download the settings that Wes Bos uses for linting his code.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.emmet.io/cheat-sheet/" rel="noopener noreferrer"&gt;Emmet Cheat Sheet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Super helpful reference to common Emmet commands in multiple languages&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;151&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.jetbrains.com/phpstorm/documentation/" rel="noopener noreferrer"&gt;Learn Jetbrains PHPStorm IDE&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This became my favorite IDE and love all their resources on how to use it correctly.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;152&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=yc3J2TGreBo" rel="noopener noreferrer"&gt;Agile Scrum Development Process and How UI/UX Design Fit In&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Really good overview of how Agile workflows are set up.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Career Resources
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;My Thoughts&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;153&lt;/td&gt;
&lt;td&gt;&lt;a href="https://medium.com/@archie4321/the-golden-guide-to-landing-a-developer-position-c78ad34a965f" rel="noopener noreferrer"&gt;The Golden Guide to Landing a Developer Position&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;An incredible guide on preparing hiring material like resumes to interviewing with examples.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;154&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.coursera.org/learn/learning-how-to-learn?action=enroll" rel="noopener noreferrer"&gt;Learn How To Learn&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Can't wait to take this one and learn how to be a better "learner".&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;155&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.glassdoor.com/blog/common-interview-questions/" rel="noopener noreferrer"&gt;Glassdoor Common Interview Questions&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;List of 50 questions that can be asked in interviews&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;156&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.themuse.com/advice/how-to-tackle-something-you-have-no-idea-how-to-do" rel="noopener noreferrer"&gt;How to Tackle Something You Have No Idea How to Do&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This is one of my favorite articles and I often refer back to it for motivation.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;157&lt;/td&gt;
&lt;td&gt;&lt;a href="https://coding-bootcamp-whiteboarding-algorithms.readthedocs-hosted.com/en/latest/modules/practicing-for-the-whiteboarding-interview/" rel="noopener noreferrer"&gt;Practice for the Whiteboarding Interview&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Helpful links and guide to doing a Whiteboarding interview.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;158&lt;/td&gt;
&lt;td&gt;&lt;a href="https://m.youtube.com/watch?v=XKu_SEDAykw&amp;amp;feature=youtu.be" rel="noopener noreferrer"&gt;How to: Work at Google — Example Coding/Engineering Interview&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Very interesting to see the level of interviewing at Google.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;159&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.jobscan.co/" rel="noopener noreferrer"&gt;jobscan.co&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Helpful site that optimizes cover letters and resumes.&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Design Resources
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;My Thoughts&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;160&lt;/td&gt;
&lt;td&gt;&lt;a href="https://teamtreehouse.com/library/rapid-website-prototyping" rel="noopener noreferrer"&gt;Rapid Website Prototyping&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Learning how to quickly mockup feature ideas and this covers many important areas of how to do it.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;161&lt;/td&gt;
&lt;td&gt;&lt;a href="https://teamtreehouse.com/tracks/ux-design" rel="noopener noreferrer"&gt;Tree House UX Design&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This course covers so many important UX subjects and how to think through design.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;162&lt;/td&gt;
&lt;td&gt;&lt;a href="https://youtube.com/playlist?list=PLXC_gcsKLD6n7p6tHPBxsKjN5hA_quaPI" rel="noopener noreferrer"&gt;Flux Free Web Design Course 2020&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;One of the best free courses in the basics of Web Design.&lt;/td&gt;
&lt;td&gt;🎓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;163&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=H18PvAKtkSY&amp;amp;list=PLxjRS2tWLJdE-FS4tpsfyjN3eF_XxkbAY&amp;amp;index=11" rel="noopener noreferrer"&gt;Build it in Figma: Design a responsive website&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This video goes deep into using auto layout in Figma.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;164&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=rfAdJYLRVqI&amp;amp;list=PLxjRS2tWLJdE-FS4tpsfyjN3eF_XxkbAY&amp;amp;index=9" rel="noopener noreferrer"&gt;In the file: A look into building selection colors and OpenType&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Haven't seen this one yet, but can't wait to go through it.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;165&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=TkKm87Crfns" rel="noopener noreferrer"&gt;In the File: Making data-informed design decisions&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Such a fascinating webinar on how big brands take data into account when creating designs or making changes.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;166&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=8RFDPC_Fsnc" rel="noopener noreferrer"&gt;In the File: Developer and designer, working together to build design systems&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Another one I can't wait to watch. Truly effective teams have clear communication between design and development early in the process.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;167&lt;/td&gt;
&lt;td&gt;&lt;a href="https://youtu.be/WPRD8_L6hf0" rel="noopener noreferrer"&gt;Build it in Figma: Design a responsive website navigation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;There are many design tidbits and Figma tricks backed into this one.&lt;/td&gt;
&lt;td&gt;🧐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go to 🔝&lt;/p&gt;




&lt;h3&gt;
  
  
  Nice job making it to the end!
&lt;/h3&gt;

&lt;p&gt;Here is a happy dance Gif to celebrate upgrading your sweet skills!&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%2Fi.gifer.com%2FCFSn.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%2Fi.gifer.com%2FCFSn.gif" alt="Napoleon Dynomite Happy Dance"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thumbnail designed with &lt;a href="https://www.adobe.com/" rel="noopener noreferrer"&gt;photoshop&lt;/a&gt; and &lt;a href="https://unsplash.com/photos/w7ZyuGYNpRQ" rel="noopener noreferrer"&gt;unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Let's build a 3-in-1 form field component</title>
      <dc:creator>Gedalya Krycer</dc:creator>
      <pubDate>Mon, 19 Apr 2021 12:51:59 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/let-s-build-a-3-in-1-form-field-component-3416</link>
      <guid>https://dev.to/gedalyakrycer/let-s-build-a-3-in-1-form-field-component-3416</guid>
      <description>&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Three for the price of one...
&lt;/h1&gt;

&lt;p&gt;In this post, we are going to build a robust contact form with validation – using one input field component! &lt;/p&gt;

&lt;p&gt;Why is this helpful? If you ever need to change the styles or functionality globally, you can do so in just this file. &lt;/p&gt;

&lt;p&gt;I'd love to show you how it works today! &lt;/p&gt;

&lt;h2&gt;
  
  
  What we are going to build:
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fobqqxjt6rwdymiy20knx.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fobqqxjt6rwdymiy20knx.gif" alt="Form Filling Out Demo"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  How to build the component
&lt;/h1&gt;

&lt;p&gt;We are going to start by building our custom component &lt;code&gt;InputField&lt;/code&gt;. Once that is set up, we will look at styling and the parent Form component that holds everything. &lt;/p&gt;

&lt;h4&gt;
  
  
  Steps
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Set up &lt;code&gt;InputField&lt;/code&gt; base code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the first input field into the if statement&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the second input field into the if statement&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the final input field into the if statement &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add input validator helper function&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add &lt;code&gt;InputField&lt;/code&gt; styles&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setup Contact Form parent component&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add our custom &lt;code&gt;InputField&lt;/code&gt; components&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1 — Set up &lt;code&gt;InputField&lt;/code&gt; base code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./inputFieldStyles.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;InputField&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;


    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&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="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="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;textarea&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="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="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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="p"&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="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;InputField&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Breakdown
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We start by importing React and an SCSS stylesheet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inside our &lt;code&gt;InputField&lt;/code&gt; component we will use an &lt;code&gt;if statement&lt;/code&gt; to determine what type of input element we want to render.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Our component will receive multiple &lt;code&gt;props&lt;/code&gt; and the first one is &lt;code&gt;props.type&lt;/code&gt;. Among other places, we will use &lt;code&gt;type&lt;/code&gt; to choose the correct input. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At the bottom, we export the component and wrap around the Higher-Order React component &lt;code&gt;memo&lt;/code&gt;. This will make sure our component won't re-render if its props haven’t change. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2 — Add the first input field into the if statement
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./inputFieldStyles.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;InputField&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;


    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&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="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="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;textarea&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="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="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__label"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
                    &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onChangeHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isRequired&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__field"&lt;/span&gt;
                    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;InputField&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Breakdown
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Starting from the bottom &lt;code&gt;else&lt;/code&gt; statement we have added our first possible input field to render. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It is wrapped in a &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt;, with a &lt;code&gt;props.label&lt;/code&gt; so we can dynamically pass in a name as a string. This text will appear above the form field and will also focus on the field if clicked. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;onChange&lt;/code&gt; holds &lt;code&gt;props.onChangeHandler&lt;/code&gt; which passes back the input field's data to the parent form component.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;type&lt;/code&gt; holds the &lt;code&gt;props.type&lt;/code&gt;. In this instance, it is used to tell if this &lt;a href="https://www.w3schools.com/html/html_form_input_types.asp" rel="noopener noreferrer"&gt;field's functionality&lt;/a&gt; should be for an email, text, tel, etc &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;placeholder&lt;/code&gt; holds the &lt;code&gt;props.placeholder&lt;/code&gt; string and will show some greyed-out text before the user types. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;value&lt;/code&gt; holds the &lt;code&gt;props.value&lt;/code&gt; which is actually the parent passing back in the &lt;code&gt;onChangeHandler&lt;/code&gt;. This will show the text inside the field in a controlled way. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;required&lt;/code&gt; holds a boolean, which is passed in via &lt;code&gt;props.isRequired&lt;/code&gt;. If this is added in the parent component, the field will be required. If left off it won't. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;name&lt;/code&gt; is passed in via &lt;code&gt;props.name&lt;/code&gt;. This is especially helpful with a Netlify mail server.  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3 — Add the second input field into the if statement
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./inputFieldStyles.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;InputField&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;


    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&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="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="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;textarea&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
           &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__label"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;textarea&lt;/span&gt;
                    &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onChangeHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isRequired&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__field"&lt;/span&gt;
                    &lt;span class="na"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;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;else&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__label"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
                    &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onChangeHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isRequired&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__field"&lt;/span&gt;
                    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;InputField&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Breakdown
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Moving up to the &lt;code&gt;else if&lt;/code&gt; statement we have now added our &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; field to render.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The props it receives are very similar to the input field below it, with one addition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;rows&lt;/code&gt; does not receive a prop in my example, but totally can if you wish to make it dynamic. The number placed as its value will determine how tall the &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; is. The above example will support 7 lines of user text. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4 — Add the final input field into the if statement
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./inputFieldStyles.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;InputField&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;


    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
                &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'primaryBtn primaryBtn--big g__justify-self-center'&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'submit'&lt;/span&gt;
                &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;validateInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;formValues&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;/&amp;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;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;textarea&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
           &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__label"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;textarea&lt;/span&gt;
                    &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onChangeHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isRequired&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__field"&lt;/span&gt;
                    &lt;span class="na"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;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;else&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__label"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
                    &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onChangeHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isRequired&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__field"&lt;/span&gt;
                    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;InputField&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Breakdown
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Moving up to the top &lt;code&gt;if&lt;/code&gt; statement we have now added our &lt;code&gt;&amp;lt;input type="submit"&amp;gt;&lt;/code&gt; field to render.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This input will be the submit button for our forms. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The value takes in a &lt;code&gt;props.label&lt;/code&gt; because this is technically the label or button text. (Such as "Submit", "Send", "Confirm", etc)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;disabled&lt;/code&gt; method takes in a custom function that also passes in an array from props called &lt;code&gt;props.formValues&lt;/code&gt;. This will be explained in the next step. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5 — Add input validator helper function
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./inputFieldStyles.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;InputField&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validateInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;values&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="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&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="kc"&gt;true&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
                &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'primaryBtn primaryBtn--big g__justify-self-center'&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'submit'&lt;/span&gt;
                &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;validateInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;formValues&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;/&amp;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;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;textarea&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
           &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__label"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;textarea&lt;/span&gt;
                    &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onChangeHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isRequired&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__field"&lt;/span&gt;
                    &lt;span class="na"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;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;else&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__label"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
                    &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onChangeHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isRequired&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inputField__field"&lt;/span&gt;
                    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;InputField&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Breakdown
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;This function is used in the &lt;code&gt;input type="submit"&lt;/code&gt;disabled field. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It takes in an array of all the form values. This was passed down as props from the parent component. It's important to note that the email value will always be the first item in this array. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The function checks if any of the values in the array empty using the &lt;code&gt;.some()&lt;/code&gt; method. If true, then the function will return true and the button will be disabled.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It then checks if the email value contains an "@". If not, then the function will return true and the submit input will also be disabled.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In all other cases the function will return false and the submit input will *&lt;em&gt;not&lt;/em&gt; be disabled. (Remember that &lt;code&gt;disabled={false}&lt;/code&gt; will keep the input active.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6 — Add &lt;code&gt;InputField&lt;/code&gt; styles
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s1"&gt;"../../../sassStyles/_variables"&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s1"&gt;"../../../sassStyles/_mixins"&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;.inputField__label&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;grid-row-gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;secondary2&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;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="err"&gt;@include&lt;/span&gt; &lt;span class="err"&gt;m.poppinsFontStack;&lt;/span&gt;

  &lt;span class="err"&gt;@include&lt;/span&gt; &lt;span class="err"&gt;m.smMinBreakPoint&lt;/span&gt; &lt;span class="err"&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;18px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.inputField__field&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;@include&lt;/span&gt; &lt;span class="err"&gt;m.poppinsFontStack;&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;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;primaryDark3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&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;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;secondary2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="err"&gt;@include&lt;/span&gt; &lt;span class="err"&gt;m.smMinBreakPoint&lt;/span&gt; &lt;span class="err"&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;18px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="m"&gt;25px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;::placeholder&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* Firefox */&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;:-ms-input-placeholder&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* Internet Explorer 10-11 */&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;::-ms-input-placeholder&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* Microsoft Edge */&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;disabled&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;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;primaryDark2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;default&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.45&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="err"&gt;&amp;amp;:hover&lt;/span&gt; &lt;span class="err"&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;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;primaryDark2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.45&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Breakdown
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;These styles are applied to the labels, inputs, placeholders, and even the disabled states. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I am importing SCSS mixins for pre-determined breakpoints and variables for colors. But you can easily replace them with media queries and hex color codes. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7 — Setup Contact Form parent component
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./contactFormStyles.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;InputField&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;../../ui/InputField/InputField&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ContactForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setMessage&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;coolFunctionHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// your code here&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__form"&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;coolFunctionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;



      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;ContactForm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Breakdown
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;This component is the base for the Contact Form.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We are importing React, styles, and our custom &lt;code&gt;InputForm&lt;/code&gt; components&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We are setting up states for each input field in our form. (Not including the submit input). These will hold the values that our users enter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;onSubmit&lt;/code&gt; on the &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; will can contain any next steps you want to happen once the form is submitted. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back to 🔝&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7 — Add our custom &lt;code&gt;InputField&lt;/code&gt; components
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./contactFormStyles.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;InputField&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;../../ui/InputField/InputField&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ContactForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setMessage&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;coolFunctionHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// your code here&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mc__form"&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;coolFunctionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;InputField&lt;/span&gt;
          &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Name"&lt;/span&gt;
          &lt;span class="na"&gt;onChangeHandler&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;setName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Jane Smith"&lt;/span&gt;
          &lt;span class="na"&gt;isRequired&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;InputField&lt;/span&gt;
          &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Email"&lt;/span&gt;
          &lt;span class="na"&gt;onChangeHandler&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&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="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"your@email.com"&lt;/span&gt;
          &lt;span class="na"&gt;isRequired&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;InputField&lt;/span&gt;
          &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Message"&lt;/span&gt;
          &lt;span class="na"&gt;onChangeHandler&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;setMessage&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"textarea"&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"How can we help..."&lt;/span&gt;
          &lt;span class="na"&gt;isRequired&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;InputField&lt;/span&gt;
          &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"send"&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;
          &lt;span class="na"&gt;formValues&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;ContactForm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Breakdown
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Now we add in our custom &lt;code&gt;InputField&lt;/code&gt; components and pass in the prop values that we previously set up. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Note how the last &lt;code&gt;&amp;lt;InputField /&amp;gt;&lt;/code&gt; takes in an array on the &lt;code&gt;formValues&lt;/code&gt; prop, with email being the first item. This is for the validation and making sure it isn't active if there is a single missing field or invalid email entry.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back to 🔝&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;It definitely took a few steps, but now you have a super robust component to use across all your website's forms! Over the long run, this setup will save a lot of time.&lt;/p&gt;

&lt;p&gt;Happy Coding! 🤓&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thumbnail designed with &lt;a href="https://www.figma.com/" rel="noopener noreferrer"&gt;Figma&lt;/a&gt;&lt;/em&gt;  &lt;/p&gt;

</description>
      <category>react</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Shape Up — A Workflow That Actually Empowers Product Teams</title>
      <dc:creator>Gedalya Krycer</dc:creator>
      <pubDate>Mon, 12 Apr 2021 20:12:40 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/shape-up-a-workflow-that-actually-empowers-product-teams-1nl2</link>
      <guid>https://dev.to/gedalyakrycer/shape-up-a-workflow-that-actually-empowers-product-teams-1nl2</guid>
      <description>&lt;h1&gt;
  
  
  TL;DR
&lt;/h1&gt;

&lt;p&gt;This article outlines some of the challenges that development teams can face and how the &lt;em&gt;Shape Up&lt;/em&gt; workflow methodology looks to solve them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Here is an interesting thought...
&lt;/h2&gt;

&lt;p&gt;A project's success might not always be related to how beautiful the design looks or performant the codebase is.&lt;/p&gt;

&lt;h4&gt;
  
  
  Let's consider these examples...
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Can a designer create a user-friendly screen without a clear understanding of the actual problem the customer is facing? &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can a developer give an accurate time estimate without getting a chance to test out a new API they never used? &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can a product manager keep a project on track without being able to see what is completed and what is left to do? &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can a CEO sign off on a new feature without feeling confident that its benefit will be worth the time spent on it?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Often times great ideas and the talented teams executing them succeed when pivotal workflow areas are also successful.&lt;/p&gt;




&lt;h2&gt;
  
  
  Discovering the Shape Up workflow methodology
&lt;/h2&gt;

&lt;p&gt;Recently I was introduced to a process called Shape Up that looks to solve many of the issues mentioned above. &lt;/p&gt;

&lt;p&gt;It was developed by the team at &lt;a href="https://basecamp.com/"&gt;Basecamp&lt;/a&gt;, a company that builds project management software. (Seems fitting.) &lt;/p&gt;

&lt;p&gt;They found it worked so well on shipping (lanching) their own features — they turned it into a book to help others.&lt;/p&gt;

&lt;p&gt;"&lt;em&gt;&lt;a href="https://basecamp.com/shapeup"&gt;Shape Up: Stop Running in Circles and Ship Work that Matters&lt;/a&gt;&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;I just finished reading it and am so excited to start using this at work! &lt;/p&gt;

&lt;p&gt;Below are my key takeaways for each chapter. There is a lot more in the book, so be sure to read it afterward as well!&lt;/p&gt;




&lt;h2&gt;
  
  
  Chapter 1: Introduction
&lt;/h2&gt;

&lt;p&gt;This chapter outlines the common challenges the Basecamp team saw when shipping new product features. It establishes their "why" for formulating &lt;em&gt;Shape Up&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;...the overall structure of the &lt;em&gt;Shape Up&lt;/em&gt; methodology. All of their principles (and book chapters) are divided up into 3 main sections. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Shaping &lt;em&gt;(Ch. 2 – 6)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Betting &lt;em&gt;(Ch. 7 – 9)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Building &lt;em&gt;(Ch. 10 – 15)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These sections made it easier for me to understand where and why stages exist where they do.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/0.3-chapter-01"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 2: Principles of Shaping
&lt;/h2&gt;

&lt;p&gt;A key concept in Shape Up is called &lt;em&gt;Shaping&lt;/em&gt;. This is the process of deciding which problem to solve and figuring out what is needed to solve it. &lt;/p&gt;

&lt;p&gt;The goal is to take an abstract idea and turn it into a well-defined project for the team to build. &lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;...is this &lt;em&gt;shaping&lt;/em&gt; stage is done in private with 1-2 senior team members. It allows them to quickly and freely run through ideas without being distracted by (usually well-meant) input from others.&lt;/p&gt;

&lt;p&gt;The coming chapters will explain in-depth the properties that make &lt;em&gt;shaping&lt;/em&gt; process successful. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/1.1-chapter-02"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 3: Set Boundaries
&lt;/h2&gt;

&lt;p&gt;When &lt;em&gt;shaping&lt;/em&gt; an idea, one of the first things done is to set &lt;em&gt;boundaries&lt;/em&gt; on it. This helps clarify what the project should be about and where it should stop. &lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;...was one of the boundaries called &lt;em&gt;setting an appetite&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is where the product team selects a pre-determined timeframe called a &lt;em&gt;cycle&lt;/em&gt; and then designs a realistic solution that can be executed within it. Once the &lt;em&gt;cycle&lt;/em&gt; ends, whatever work is done must be shipped or everything is scrapped. &lt;/p&gt;

&lt;p&gt;Contrast this with creating a "perfect" design first and then estimating it afterward. Sure it looks great, but it might take 6 months to actually ship.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/1.2-chapter-03"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 4: Find the Elements
&lt;/h2&gt;

&lt;p&gt;Next, the person(s) shaping will conceptualize what to build. &lt;/p&gt;

&lt;p&gt;For example, if the goal is to "add an auto-pay option", this is where they will decide what screen it should be accessed on.&lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;...was the emphasis on not trying to solve design problems at this stage. &lt;/p&gt;

&lt;p&gt;Building a wireframe now would only slow the brainstorming down and take choices away from the designer later on. Instead, it was recommended to draw sketches with a &lt;em&gt;fat marker&lt;/em&gt; which are visual, but not overly specific. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/1.3-chapter-04"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 5: Risks and Rabbit Holes
&lt;/h2&gt;

&lt;p&gt;After a tangible direction is &lt;em&gt;shaped&lt;/em&gt;, it is vital to identify as many potential issues as possible. &lt;/p&gt;

&lt;h4&gt;
  
  
  Some potential issues posed in the book...
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Does this require new technical work we’ve never done before?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we making assumptions about how the parts fit together?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we assuming a design solution exists that we couldn’t come up with ourselves?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is there a hard decision we should settle in advance so it doesn’t trip up the team?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;...is how unresolved core questions are not passed down to the design or development team. &lt;/p&gt;

&lt;p&gt;As much as possible the approach is worked out in the shaping process, so there are minimal unknowns. If there is an obvious grey area, it doesn't make it into the &lt;em&gt;cycle&lt;/em&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/1.4-chapter-05"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 6: Write the Pitch
&lt;/h2&gt;

&lt;p&gt;Now that the solution has been &lt;em&gt;shaped&lt;/em&gt; it is time to pull all of the information into a concise &lt;em&gt;pitch&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Included sections...&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Problem&lt;/li&gt;
&lt;li&gt;Appetite&lt;/li&gt;
&lt;li&gt;Solution&lt;/li&gt;
&lt;li&gt;Rabbit holes&lt;/li&gt;
&lt;li&gt;No-goes&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;...is how &lt;em&gt;the Pitch&lt;/em&gt; puts all the cards on the table. &lt;/p&gt;

&lt;p&gt;It is advised to clearly define the problem, in addition to the solution. A well-defined problem will give context to why the proposed solution is the right one.  &lt;/p&gt;

&lt;p&gt;Any potential issues are also highlighted so well-informed decisions can be made. &lt;/p&gt;

&lt;p&gt;This also includes specific features that should &lt;strong&gt;&lt;em&gt;not&lt;/em&gt;&lt;/strong&gt; be built as part of this project. &lt;/p&gt;

&lt;p&gt;I love how the goal is not about building the ultimate project, but rather the most realistic and therefore impactful one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/1.5-chapter-06"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 7: Bets, Not Backlogs
&lt;/h2&gt;

&lt;p&gt;Unlike an Agile model, there isn't some large central list of feature requests that get constantly added to and reprioritized. &lt;/p&gt;

&lt;p&gt;Instead, key stakeholders only decide or &lt;em&gt;bet&lt;/em&gt; on a few &lt;em&gt;pitches&lt;/em&gt; for one &lt;em&gt;cycle&lt;/em&gt; at a time. &lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;... were &lt;em&gt;pitches&lt;/em&gt; that are not selected for a &lt;em&gt;cycle&lt;/em&gt;, are also not preserved in an official way.&lt;/p&gt;

&lt;p&gt;By not tracking &lt;em&gt;pitches&lt;/em&gt; officially, there isn't an overwhelming list of features to consider when it is time to plan a &lt;em&gt;cycle&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Also, &lt;em&gt;pitches&lt;/em&gt; that were not picked could usually stand more &lt;em&gt;shaping&lt;/em&gt;. An individual team member could always re-work it and re-present it for a later &lt;em&gt;cycle&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/2.1-chapter-07"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 8: The Betting Table
&lt;/h2&gt;

&lt;p&gt;The key decision-makers (CEO, CTO, Product Manager) will meet before a &lt;em&gt;cycle&lt;/em&gt; and determine what should be worked on. They place &lt;em&gt;bets&lt;/em&gt; on &lt;em&gt;pitches&lt;/em&gt; they feel are worth the risk and time investment.&lt;/p&gt;

&lt;p&gt;This meeting is very focused and productive. Key areas are predefined, which gives this leadership team parameters to place their &lt;em&gt;bets&lt;/em&gt; on. This gives them confidence.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Cycles&lt;/em&gt; are usually only 6-weeks long. (2-weeks for really small projects.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In between &lt;em&gt;cycles&lt;/em&gt; there is a 2-week &lt;em&gt;cool down&lt;/em&gt; period to plan the next &lt;em&gt;cycle&lt;/em&gt;, fix bugs, and work on misc projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The team building the project is usually a designer, 1-2 programmers, and sometimes a QA specialist.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the &lt;em&gt;cycle&lt;/em&gt; is done a &lt;em&gt;circuit breaker&lt;/em&gt; happens. That means if the project isn't finished, the deadline can't be extended and the project is scrapped. (In most cases.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;...because there is a real belief (bet) that the &lt;em&gt;pitch&lt;/em&gt; is worth building, leadership will let the product team focus fully on it.&lt;/p&gt;

&lt;p&gt;In other settings, a programmer might work on 4-5 different projects in a day. But in this setting, if the project doesn't get done in the 6-week &lt;em&gt;cycle&lt;/em&gt;, that is it. The investment would be lost. &lt;/p&gt;

&lt;p&gt;With Shape Up, product teams are given the space to focus on just the project(s) dedicated in the given &lt;em&gt;cycle&lt;/em&gt;. This uninterrupted focus sets them up for success.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/2.2-chapter-08"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 9: Place Your Bets
&lt;/h2&gt;

&lt;p&gt;In addition to the parameters described above, leadership takes into account what they are actually building. Is it adding a feature to an existing product or starting from scratch?&lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;...when building a new product the standard stages change, but the core principles of &lt;em&gt;shaping&lt;/em&gt; and &lt;em&gt;cycles&lt;/em&gt; stay true. &lt;/p&gt;

&lt;p&gt;Stages for new products are defined as &lt;strong&gt;&lt;em&gt;R&amp;amp;D&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;Production&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;Cleanup&lt;/em&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;For example, in the R&amp;amp;D stage, the &lt;em&gt;shaping&lt;/em&gt; and &lt;em&gt;build&lt;/em&gt; phases are typically carried out by only the senior members of the company. &lt;/p&gt;

&lt;p&gt;Work done during an R&amp;amp;D &lt;em&gt;cycle&lt;/em&gt; is not to ship, but to validate assumptions. If at the end of the &lt;em&gt;cycle&lt;/em&gt; the leadership team confirms that feature A didn't pan out, then that is still a win. It means that the product team should probably focus on feature B later on. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/2.3-chapter-09"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 10: Hand Over Responsibility
&lt;/h2&gt;

&lt;p&gt;Now that the &lt;em&gt;pitch(s)&lt;/em&gt; has been approved, the &lt;em&gt;cycle&lt;/em&gt; can begin! Product managers release the details to the designers and developers to start building. &lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;...a lot!! &lt;/p&gt;

&lt;p&gt;This is a short chapter, but probably one of the most impactful for me personally. &lt;/p&gt;

&lt;p&gt;Coming from an agency background, every minute spent on a project needs to be tracked against a pre-defined budget.&lt;/p&gt;

&lt;p&gt;I'd often feel guilty for spending time getting oriented at the beginning instead of jumping straight to InDesign or Figma. &lt;/p&gt;

&lt;p&gt;In this chapter, it says that the first few days are expected for work to not looks like "work". Managers understand that the team needs to take some time to try solutions out, before jumping into "real production". &lt;/p&gt;

&lt;p&gt;Specific tasks are also not given to the team. Rather they have the freedom and responsibility to tackle the project as they see fit. (More on that later.) &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/3.1-chapter-10"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 11: Get One Piece Done
&lt;/h2&gt;

&lt;p&gt;To help make meaningful progress, it is advised to work on one full slice of the project at a time. &lt;/p&gt;

&lt;p&gt;What this &lt;strong&gt;&lt;em&gt;doesn't&lt;/em&gt;&lt;/strong&gt; look like...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Working on sub-features A, B &amp;amp; C in order and starting with the design, then development, then QA, and then presenting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Working on just sub-feature A, but still starting with the design, then development, then QA, and then presenting.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, the designer should rough out the core HTML elements needed and the developer can connect them to the database. &lt;/p&gt;

&lt;p&gt;If they see the very rough version works, they can show it to their manager. If it looks good then they can really flesh out the design and code. &lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;...these pieces should be small and related to the core feature. That way a simplified, but technically working iteration can be done and validated in a few days. &lt;/p&gt;

&lt;p&gt;Because it is also a "core" aspect of the project, future pieces will be informed by it and time therefore saved.    &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/3.2-chapter-11"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 12: Map the Scopes
&lt;/h2&gt;

&lt;p&gt;The pieces of the project are actually given a more official name called &lt;em&gt;scopes&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;A &lt;em&gt;scope&lt;/em&gt; is a collection of tasks that allows a meaningful part of the feature to be fully completed. The tasks inside it are not role-specific (design vs development), but rather structure-specific. &lt;/p&gt;

&lt;p&gt;For example, a project to add an auto-pay feature might include a &lt;em&gt;scope&lt;/em&gt; to build just the confirmation email on payment. The tasks within it would include everything needed to finish it: designing the layout, writing microcopy, coding the HTML, and connecting it to the mailing server.  &lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;...was that scopes grow naturally over the course of the &lt;em&gt;cycle&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;I found this to be true in many projects in the past. Despite my best efforts to map out tasks ahead of time — new ones pop up as production progressed. &lt;/p&gt;

&lt;p&gt;I love how Shape Up is so open to this. It gives more freedom to the designer &amp;amp; developer to create their own tasks as needed. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/3.3-chapter-12"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 13: Show progress
&lt;/h2&gt;

&lt;p&gt;Speaking of constantly adding tasks to scopes... How does a manager tell when something is actually close to being done? &lt;/p&gt;

&lt;p&gt;The concept of &lt;em&gt;the hill&lt;/em&gt; is used to visualize where a given project's progress is really at. &lt;/p&gt;

&lt;p&gt;Imagine a literal hill with an up-slope on the left and a down-slope on the right. &lt;/p&gt;

&lt;p&gt;The left side of the hill represents the "unknowns". Any scope that requires research on how to execute it will be more to the left. The further up the hill, the clearer the solution is to the team.&lt;/p&gt;

&lt;p&gt;The right side represents execution. The team knows what to do to make a scope happen, but just needs to actually design/code it. &lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;There is a wonderful example given in this chapter of how the hill relates to cooking. Highly recommend reviewing it. &lt;/p&gt;

&lt;p&gt;This chapter also illustrates why the hill enables managers to see possible scopes that "stuck". If it is lingering on the left side for a week or two, then it becomes apparent that some support around it might be helpful. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/3.4-chapter-13"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 14: Deciding When to Stop
&lt;/h2&gt;

&lt;p&gt;So this is an age-old question...when should we stop working on a feature? We know already that the project is done when the &lt;em&gt;cycle&lt;/em&gt; ends. But is it really worth stopping? Is the result good enough?&lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;...of the many great points discussed the &lt;em&gt;baseline&lt;/em&gt; made a lot of sense to me. &lt;/p&gt;

&lt;p&gt;Don't compare what the feature could be if we threw more time and talent at it. That would be the &lt;em&gt;ideal&lt;/em&gt; product. &lt;/p&gt;

&lt;p&gt;Instead compare it to the current product that the customers are using. That is the &lt;em&gt;baseline&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If shipped in its current state, would the feature improve their experience in a real way? (Not perfect, but better than before.) &lt;/p&gt;

&lt;p&gt;If the answer is yes, then that is a win. &lt;/p&gt;

&lt;p&gt;This mindset helps the team cut out extra pieces and just focus on the 1-2 core parts that will directly help the customer. It is better to execute the core items really well than 5 things "ok" because of not enough time. &lt;/p&gt;

&lt;p&gt;More additions can always be &lt;em&gt;shaped&lt;/em&gt; and added overtime in future &lt;em&gt;cycles&lt;/em&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/3.5-chapter-14"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chapter 15: Move On
&lt;/h2&gt;

&lt;p&gt;That awesome (maybe slightly terrifying) moment comes and the feature is shipped! Now what? &lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 What stood out to me...
&lt;/h3&gt;

&lt;p&gt;...is how Shape Up sticks to its principles even after launch.&lt;/p&gt;

&lt;p&gt;There will probably be a lot of post-launch feedback, both negative and positive. But it is important to remember that all new features have to be &lt;em&gt;shaped&lt;/em&gt; first. &lt;/p&gt;

&lt;p&gt;Just because it sounds like a good or even urgent addition, it needs to be weighed against the pros and cons of everything else. &lt;/p&gt;

&lt;p&gt;Staying intentional will keep the team on track, morale high, and features of high quality over time. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://basecamp.com/shapeup/3.6-chapter-15"&gt;📖 Read more...&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;I hope this summary of key takeaways has piqued your interest in reading the full book.  It is really well written and has great examples and illustrations to help highlight their points. Plus it is free and online. :) &lt;/p&gt;

&lt;p&gt;"&lt;em&gt;&lt;a href="https://basecamp.com/shapeup"&gt;Shape Up: Stop Running in Circles and Ship Work that Matters&lt;/a&gt;&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;But, let me know your thoughts! Have you used Shape Up before? If you did, how was your experience? What other workflow methodologies have you used and found successful? &lt;/p&gt;

&lt;p&gt;Until next, happy coding! 🤓&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thumbnail designed with &lt;a href="https://www.adobe.com/products/photoshop.html"&gt;Adobe Photoshop&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>programming</category>
      <category>webdev</category>
      <category>development</category>
    </item>
  </channel>
</rss>
