{"componentChunkName":"component---src-templates-post-js","path":"/create-red-block-button-react","result":{"data":{"markdownRemark":{"html":"<p>As we continue to build out these components we need a couple of buttons. So we will build our \"Primary Button\"</p>\n<p>In the components folder create a folder called <code class=\"language-text\">buttons</code>. Then create a <code class=\"language-text\">RedBlockButton.js</code> component and add the following:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n<span class=\"token keyword\">import</span> PropTypes <span class=\"token keyword\">from</span> <span class=\"token string\">\"prop-types\"</span>\n<span class=\"token keyword\">import</span> styled<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> keyframes <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"styled-components\"</span>\n<span class=\"token keyword\">import</span> loading <span class=\"token keyword\">from</span> <span class=\"token string\">\"../../assets/loop.svg\"</span>\n\n<span class=\"token keyword\">const</span> rotate <span class=\"token operator\">=</span> keyframes<span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  from {\n\t  transform: rotate(0deg);\n  }\n  to {\n\t  transform: rotate(360deg);\n  }\n</span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> ImageStyles <span class=\"token operator\">=</span> styled<span class=\"token punctuation\">.</span>img<span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  display: inline-block;\n  animation: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>rotate<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> 2s infinite linear;\n</span><span class=\"token template-punctuation string\">`</span></span>\n\n<span class=\"token keyword\">const</span> BlueBlockButton <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  className <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n  onClick<span class=\"token punctuation\">,</span>\n  children<span class=\"token punctuation\">,</span>\n  disabled <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n  isLoading<span class=\"token punctuation\">,</span>\n  large<span class=\"token punctuation\">,</span>\n  long<span class=\"token punctuation\">,</span>\n  <span class=\"token operator\">...</span>props\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>button\n      <span class=\"token comment\">/* eslint-disable no-template-curly-in-string*/</span>\n      className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>className<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> cursor-pointer bg-blue-lightest text-blue-darkest focus:outline-none font-display rounded-px px-16 py-2 hover:bg-transparent hover:border hover:border-blue-darkest</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span>\n      onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>onClick<span class=\"token punctuation\">}</span>\n      disabled<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>disabled<span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span>props<span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">></span>\n      <span class=\"token punctuation\">{</span>isLoading <span class=\"token operator\">?</span> <span class=\"token operator\">&lt;</span>ImageStyles src<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>loading<span class=\"token punctuation\">}</span> alt<span class=\"token operator\">=</span><span class=\"token string\">\"loading...\"</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span> <span class=\"token operator\">:</span> children<span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">const</span> propTypes <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  className<span class=\"token operator\">:</span> PropTypes<span class=\"token punctuation\">.</span>string<span class=\"token punctuation\">,</span>\n  onClick<span class=\"token operator\">:</span> PropTypes<span class=\"token punctuation\">.</span>func<span class=\"token punctuation\">,</span>\n  children<span class=\"token operator\">:</span> PropTypes<span class=\"token punctuation\">.</span>string<span class=\"token punctuation\">,</span>\n  disabled<span class=\"token operator\">:</span> PropTypes<span class=\"token punctuation\">.</span>bool<span class=\"token punctuation\">,</span>\n  large<span class=\"token operator\">:</span> PropTypes<span class=\"token punctuation\">.</span>bool<span class=\"token punctuation\">,</span>\n  long<span class=\"token operator\">:</span> PropTypes<span class=\"token punctuation\">.</span>bool<span class=\"token punctuation\">,</span>\n  isLoading<span class=\"token operator\">:</span> PropTypes<span class=\"token punctuation\">.</span>bool<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span>\nBlueBlockButton<span class=\"token punctuation\">.</span>propTypes <span class=\"token operator\">=</span> propTypes\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> BlueBlockButton</code></pre></div>\n<p>🧁 Generally buttons have a spinner inside them to allow you to accept a signal that after you click on it that it is loading after making a call to an API or something. That is why we use StyledComponents and a basic CSS animation to get the icon to spin.</p>\n<p>🧁 Then we have a couple of Props and events passed into the button.</p>\n<p>🧁 Now we have a ternary operator to see if the <code class=\"language-text\">isLoading</code> prop is true, if so render the Loading spinner. If not render the children in the button.</p>\n<p>Once you're done it should look like this:</p>\n<p><img src=\"/uploads/redblock.png\" alt=\"redblock-component\"></p>\n<p>Now it is really easy to pull something out of Bootstrap or your fav library. However, I've found this a lot easier in cases when a designer has custom button button designs. It takes longer to find the necessary CSS class to override than to just write HTML and JavaScript to create things.</p>","frontmatter":{"date":"July 16, 2020","path":"/create-red-block-button-react","title":"Create Red Block Button","postnumber":38}}},"pageContext":{"previous":{"node":{"frontmatter":{"path":"/create-red-outline-button-react","postnumber":39}}},"next":{"node":{"frontmatter":{"path":"/create-typography-components-react","postnumber":37}}}}},"staticQueryHashes":["3207677222","3649515864","63159454"]}