<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Tolu's Blog]]></title><description><![CDATA[Frontend Developer.]]></description><link>https://blog.toluadegboyega.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1631486962977/Ey4cOHxSE.png</url><title>Tolu&apos;s Blog</title><link>https://blog.toluadegboyega.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Apr 2026 08:31:07 GMT</lastBuildDate><atom:link href="https://blog.toluadegboyega.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Improving SEO with Vue-Meta]]></title><description><![CDATA[Welcome to the second part of the two-part series, Improving SEO: A Tale of Two Libraries. Search Engine Optimization (SEO) is paramount in getting your website noticed in the competitive landscape of the internet. Optimizing your website for search ...]]></description><link>https://blog.toluadegboyega.dev/improving-seo-with-vue-meta</link><guid isPermaLink="true">https://blog.toluadegboyega.dev/improving-seo-with-vue-meta</guid><category><![CDATA[SEO]]></category><category><![CDATA[Vue.js]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Vue Meta]]></category><dc:creator><![CDATA[Tolu Adegboyega]]></dc:creator><pubDate>Tue, 10 Oct 2023 10:02:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1696274225680/1d05ccbd-0213-4997-951a-ffd853e95dc4.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Welcome to the second part of the two-part series, <a target="_blank" href="https://blog.toluadegboyega.dev/series/optimizing-seo-react-vue"><strong>Improving SEO: A Tale of Two Libraries</strong></a><strong>.</strong> Search Engine Optimization (SEO) is paramount in getting your website noticed in the competitive landscape of the internet. Optimizing your website for search engines not only increases visibility but also drives organic traffic. However, improving SEO in Single Page Applications (SPAs), like those built with Vue, can be particularly challenging due to their dynamic nature. Vue-Meta is a great tool that can help to overcome these challenges.</p>
<h2 id="heading-what-is-vue-meta">What is Vue-Meta?</h2>
<p>Vue-Meta is a JavaScript library that enables you to dynamically manage the content of the document head. To put it simply, it gives you the ability to manage the <code>&lt;head&gt;</code> of your HTML document in Vue apps. Because search engines like Google significantly rely on the data in the <code>&lt;head&gt;</code> section to comprehend and rank your web pages, this control is crucial for SEO.</p>
<h2 id="heading-why-vue-meta-for-seo">Why Vue-Meta for SEO?</h2>
<p>Vue-Meta provides a robust toolkit for optimizing your website's SEO performance. It offers a wide range of features related to SEO, and in this section, we'll focus on the following key aspects:</p>
<ul>
<li><p><strong>Title and Meta Tags - The Foundation of SEO:</strong> Proper management of title and meta tags is fundamental in SEO. These tags are a vital component of any SEO plan because they serve as the first link between your site and search engines. Vue-Meta gives you the ability to dynamically set and change title tags for each page in your Vue app.</p>
</li>
<li><p><strong>Open Graph and Twitter Cards:</strong> When users share content on social media platforms, they expect it to look good. Open Graph and Twitter Card metadata allow you to define the image, name, and description that appears in social media preview formats. With Vue-Meta, you can set up metadata for Open Graph and Twitter Cards for each page in your Vue app.</p>
</li>
</ul>
<h2 id="heading-setting-up-vue-meta">Setting Up Vue-Meta</h2>
<h3 id="heading-installation">Installation</h3>
<p>Start by installing <code>vue-meta</code> using npm or yarn.</p>
<pre><code class="lang-bash">npm install vue-meta
<span class="hljs-comment"># or</span>
yarn add vue-meta
</code></pre>
<h3 id="heading-integration-with-vue-application">Integration with Vue Application</h3>
<p>In your main.js or the entry point file for your Vue application:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> Vue <span class="hljs-keyword">from</span> <span class="hljs-string">'vue'</span>;
<span class="hljs-keyword">import</span> VueMeta <span class="hljs-keyword">from</span> <span class="hljs-string">'vue-meta'</span>;
<span class="hljs-keyword">import</span> App <span class="hljs-keyword">from</span> <span class="hljs-string">'./App.vue'</span>; 

Vue.use(VueMeta);

<span class="hljs-keyword">new</span> Vue({
  <span class="hljs-attr">render</span>: <span class="hljs-function">(<span class="hljs-params">h</span>) =&gt;</span> h(App),
}).$mount(<span class="hljs-string">'#app'</span>);
</code></pre>
<h2 id="heading-using-vue-meta-across-different-pages"><strong>Using Vue-Meta Across Different Pages</strong></h2>
<p>Now that <code>vue-meta</code> is up and running, let’s take a closer look at how it can be used across different pages of your app.</p>
<h3 id="heading-updating-tags-titles-and-descriptions">Updating Tags, Titles, and Descriptions</h3>
<p>Within your component, <code>vue-meta</code> can be used to set and update different document head elements. For example, you can set and update the following title and meta description:</p>
<pre><code class="lang-javascript">&lt;template&gt;
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">main</span>&gt;</span>
     <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>This is the home page 🏡 <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">main</span>&gt;</span></span>
&lt;/template&gt;

<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
    <span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> {
      <span class="hljs-attr">metaInfo</span>: {
        <span class="hljs-attr">title</span>: <span class="hljs-string">'Home Page Title'</span>,
        <span class="hljs-attr">meta</span>: [
          {
            <span class="hljs-attr">name</span>: <span class="hljs-string">'description'</span>,
            <span class="hljs-attr">content</span>: <span class="hljs-string">'This is the home page description.'</span>,
          },
        ],
      },
    };
  </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></span>
</code></pre>
<h3 id="heading-implementing-open-graph-and-twitter-cards">Implementing Open Graph and Twitter Cards</h3>
<p>You can add specific metadata tags to create Open Graph and Twitter Cards with Vue-Meta:</p>
<pre><code class="lang-javascript">&lt;template&gt;
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">main</span>&gt;</span>
     <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>This is the about page 🕵🏾‍♀️ <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">main</span>&gt;</span></span>
&lt;/template&gt;

<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
    <span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> {
      <span class="hljs-attr">metaInfo</span>: {
        <span class="hljs-attr">meta</span>: [
          {
            <span class="hljs-attr">property</span>: <span class="hljs-string">'og:title'</span>,
            <span class="hljs-attr">content</span>: <span class="hljs-string">'About Page Title'</span>,
          },
          {
            <span class="hljs-attr">property</span>: <span class="hljs-string">'og:description'</span>,
            <span class="hljs-attr">content</span>: <span class="hljs-string">'This is the about page description.'</span>,
          },
          {
            <span class="hljs-attr">property</span>: <span class="hljs-string">'og:image'</span>,
            <span class="hljs-attr">content</span>: <span class="hljs-string">'https://example.com/about-page-image.jpg'</span>,
          },
          {
            <span class="hljs-attr">name</span>: <span class="hljs-string">'twitter:card'</span>,
            <span class="hljs-attr">content</span>: <span class="hljs-string">'summary_large_image'</span>,
          },
          {
            <span class="hljs-attr">name</span>: <span class="hljs-string">'twitter:title'</span>,
            <span class="hljs-attr">content</span>: <span class="hljs-string">'About Page Title'</span>,
          },
          {
            <span class="hljs-attr">name</span>: <span class="hljs-string">'twitter:description'</span>,
            <span class="hljs-attr">content</span>: <span class="hljs-string">'This is the about page description.'</span>,
          },
          {
            <span class="hljs-attr">name</span>: <span class="hljs-string">'twitter:image'</span>,
            <span class="hljs-attr">content</span>: <span class="hljs-string">'https://example.com/about-page-image.jpg'</span>,
          },
        ],
      },
    };
  </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></span>
</code></pre>
<p>It’s important to test and troubleshoot after you’ve implemented <code>vue-meta</code>. You can do this using browser developer tools and SEO testing tools to make sure your metadata is set correctly.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Vue-Meta is an effective solution for managing the document head of your Vue app. You can manage titles, descriptions, Open Graph, and Twitter Cards by effectively utilising it across many pages, which will improve your SEO and social media presence through improved content sharing on social platforms.</p>
<p><em>Thank you for reading and I hope you found this post helpful. 💫</em></p>
]]></content:encoded></item><item><title><![CDATA[Improving SEO with React Helmet Async]]></title><description><![CDATA[Search Engine Optimization (SEO) is paramount in getting your website noticed in the competitive landscape of the internet. Optimizing your website for search engines not only increases visibility but also drives organic traffic. However, improving S...]]></description><link>https://blog.toluadegboyega.dev/improving-seo-with-react-helmet-async</link><guid isPermaLink="true">https://blog.toluadegboyega.dev/improving-seo-with-react-helmet-async</guid><category><![CDATA[SEO]]></category><category><![CDATA[React]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[react-helmet]]></category><dc:creator><![CDATA[Tolu Adegboyega]]></dc:creator><pubDate>Tue, 03 Oct 2023 10:02:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1696274214274/23289985-4a90-420d-b648-e0ab8e3fb81f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Search Engine Optimization (SEO) is paramount in getting your website noticed in the competitive landscape of the internet. Optimizing your website for search engines not only increases visibility but also drives organic traffic. However, improving SEO in Single Page Applications (SPAs), like those built with React, can be particularly challenging due to their dynamic nature. React Helmet Async is a great tool that can help to overcome these challenges. This article is the first in a two-part series, <a target="_blank" href="https://blog.toluadegboyega.dev/series/optimizing-seo-react-vue"><strong>Improving SEO: A Tale of Two Libraries</strong></a><strong>.</strong></p>
<h2 id="heading-what-is-react-helmet-async">What is React Helmet Async?</h2>
<p>React Helmet Async is a JavaScript library that enables you to dynamically manage the content of the document head. To put it simply, it gives you the ability to manage the <code>&lt;head&gt;</code> of your HTML document in React apps. Because search engines like Google significantly rely on the data in the <code>&lt;head&gt;</code> section to comprehend and rank your web pages, this control is crucial for SEO.</p>
<h2 id="heading-why-react-helmet-async-for-seo">Why React Helmet Async for SEO?</h2>
<p>React Helmet Async provides a robust toolkit for optimizing your website's SEO performance. It offers a wide range of features related to SEO, and in this section, we'll focus on the following key aspects:</p>
<ul>
<li><p><strong>Title and Meta Tags - The Foundation of SEO:</strong> Proper management of title and meta tags is fundamental in SEO. These tags are a vital component of any SEO plan because they serve as the first link between your site and search engines. React Helmet Async gives you the ability to dynamically set and change title tags for each page in your React app.</p>
</li>
<li><p><strong>Open Graph and Twitter Cards:</strong> When users share content on social media platforms, they expect it to look good. Open Graph and Twitter Card metadata allow you to define the image, name, and description that appears in social media preview formats. With React Helmet Async, you can set up metadata for Open Graph and Twitter Cards for each page in your React app.</p>
</li>
</ul>
<h2 id="heading-setting-up-react-helmet-async">Setting Up React Helmet Async</h2>
<h3 id="heading-installation">Installation</h3>
<p>Start by installing <code>react-helmet-async</code> using npm or yarn.</p>
<pre><code class="lang-bash">npm install react-helmet-async
<span class="hljs-comment"># or</span>
yarn add react-helmet-async
</code></pre>
<h3 id="heading-wrapping-your-application-with-helmetprovider">Wrapping Your Application with <code>HelmetProvider</code></h3>
<p>In your root component (e.g. App.js), wrap your entire React application with the <code>HelmetProvider</code>.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;
<span class="hljs-keyword">import</span> { HelmetProvider } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-helmet-async'</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">HelmetProvider</span>&gt;</span>
      {/* Your entire React application */}
    <span class="hljs-tag">&lt;/<span class="hljs-name">HelmetProvider</span>&gt;</span></span>
  );
}
</code></pre>
<h2 id="heading-using-react-helmet-async-across-different-pages"><strong>Using</strong> React Helmet Async across Different Pages</h2>
<p>Now that <code>react-helmet-async</code> is up and running, let’s take a closer look at how it can be used across different pages of your app.</p>
<h3 id="heading-importing-helmet">Importing <code>Helmet</code></h3>
<p>In each component where the document head is to be changed, import <code>Helmet</code></p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;
<span class="hljs-keyword">import</span> { Helmet } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-helmet-async'</span>;
</code></pre>
<h3 id="heading-updating-tags-titles-and-descriptions">Updating Tags, Titles, and Descriptions</h3>
<p><code>Helmet</code> can be used to set and update different document head elements within your component. For example, you can set and update the following title and meta description:</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">HomePage</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">main</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">Helmet</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Home Page's Title<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"description"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"This is the home page's description."</span> /&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">Helmet</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>This is the home page 🏡 <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">main</span>&gt;</span></span>
  );
}
</code></pre>
<h3 id="heading-implementing-open-graph-and-twitter-cards">Implementing Open Graph and Twitter Cards</h3>
<p>Specific metadata tags can be added to the Helmet component to create Open Graph and Twitter cards.</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">AboutPage</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">main</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">Helmet</span>&gt;</span>
        // Open Graph Tags
        <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">property</span>=<span class="hljs-string">"og:title"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"About Page's Title"</span> /&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">property</span>=<span class="hljs-string">"og:description"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"This is my About Page's Title description."</span> /&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">property</span>=<span class="hljs-string">"og:image"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"https://example.com/about-page-image.jpg"</span> /&gt;</span>

        // Twitter Card Tags
        <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"twitter:card"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"summary_large_image"</span> /&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"twitter:title"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"About Page's Title"</span> /&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"twitter:description"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"This is my About Page's Title description."</span> /&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"twitter:image"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"https://example.com/about-page-image.jpg"</span> /&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">Helmet</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>This is the about page 🕵🏾‍♀️<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">main</span>&gt;</span></span>
  );
}
</code></pre>
<p>It’s important to test and troubleshoot after you’ve implemented <code>react-helmet-async</code>. You can do this using browser developer tools and SEO testing tools to make sure your metadata is set correctly.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>React Helmet Async is an effective solution for managing the document head of your React app. You can manage titles, descriptions, Open Graph, and Twitter Cards by effectively utilising it across many pages, which will improve your SEO and social media presence through improved content sharing on social platforms.</p>
<p><em>Thank you for reading and I hope you found this post helpful. 💫</em></p>
]]></content:encoded></item><item><title><![CDATA[GreenSock Animation Platform (GSAP) x Vue]]></title><description><![CDATA[Animation is one of the most important aspects of modern web design. It is a functional and effective way to improve user experience. While CSS (I wrote about getting started with CSS animation in a previous post) is very useful in creating cool anim...]]></description><link>https://blog.toluadegboyega.dev/greensock-animation-platform-gsap-x-vue</link><guid isPermaLink="true">https://blog.toluadegboyega.dev/greensock-animation-platform-gsap-x-vue</guid><category><![CDATA[Frontend Development]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[animation]]></category><category><![CDATA[Vue.js]]></category><dc:creator><![CDATA[Tolu Adegboyega]]></dc:creator><pubDate>Wed, 20 Jul 2022 10:07:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1658010082310/LPHBt1g3l.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Animation is one of the most important aspects of modern web design. It is a functional and effective way to improve user experience. While CSS (I wrote about <a target="_blank" href="https://blog.toluadegboyega.dev/getting-started-with-css-animation">getting started with CSS animation</a> in a previous post) is very useful in creating cool animations, it can get really exhausting and time-consuming to create complex ones. This is where JavaScript comes in. </p>
<p>In this post we'll be focusing on how to get started with animating interfaces using a JavaScript library called GSAP in our Vue app.</p>
<h1 id="heading-what-is-gsap">What is GSAP?</h1>
<p>GreenSock Animation Platform (GSAP) is a powerful, robust, high-speed and lightweight JavaScript library that can be used to create performant and engaging animations. It animates anything JavaScript can touch which includes CSS properties and SVGs while working around browser inconsistencies. </p>
<p>Need I say more? 😏</p>
<h1 id="heading-setup">Setup</h1>
<p>The first step to using GSAP in your Vue app is by including it in your project. While there are a number of ways to do this, I prefer to install GSAP using NPM or Yarn. You can check out the other installation methods in the GSAP docs <a target="_blank" href="https://greensock.com/docs/v3/Installation">here</a>.</p>
<p>For npm installation, in your terminal, type the following command:</p>
<pre><code><span class="hljs-built_in">npm</span> install gsap
</code></pre><p>For yarn installation, type the following command:</p>
<pre><code>yarn <span class="hljs-keyword">add</span> gsap
</code></pre><p>At the top of the file you want to use GSAP in, import GSAP by adding this:</p>
<pre><code><span class="hljs-keyword">import</span> { <span class="hljs-title">gsap</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">'gsap'</span>;
</code></pre><p>Now you're ready to use GSAP. 🥳</p>
<h1 id="heading-gsap-concepts">GSAP Concepts</h1>
<p>We'll be focusing on a number of concepts that are fundamental to creating animations with GSAP and they are:</p>
<ul>
<li><p>Tween</p>
</li>
<li><p>Timeline</p>
</li>
<li><p>Plugins </p>
</li>
</ul>
<h2 id="heading-tween">Tween</h2>
<p>A Tween, simply put, is what does all the animation work. It is a single movement in an animation caused by a change in properties. It is similar to keyframes in CSS. It follows this syntax:</p>
<pre><code>gsap.method(<span class="hljs-string">'element'</span>, duration, vars)
</code></pre><ol>
<li><p>method: This refers to the GSAP method you'd like to Tween with.</p>
</li>
<li><p>element: This is the element that we want to animate. It can be a simple variable or an array if we want to animate multiple elements.</p>
</li>
<li><p>duration: This represents the duration of the animation, it is defined in seconds.</p>
</li>
<li><p>vars: This is an object with key/value pairs of different properties that we want to change over the duration. They can be CSS properties, but it's important to note that they should be written in in camelCase format. That is, <code>padding-bottom</code> as <code>paddingBottom</code>. </p>
</li>
</ol>
<h3 id="heading-exploring-gsap-methods">Exploring GSAP methods</h3>
<p>Methods are used to define the start and final values of an animation.There are numerous methods to create animations using GSAP. We’ll be focusing on some of the common ones such as <code>gsap.to()</code>, <code>gsap.from()</code> and <code>gsap.fromTo()</code>.</p>
<p><strong>gsap.to()</strong></p>
<p>This method animates the element from their current/default values <strong>to</strong> the values specified in the object parameter (vars). </p>
<pre><code>  <span class="hljs-selector-tag">gsap</span><span class="hljs-selector-class">.to</span>(<span class="hljs-string">'.block'</span>, <span class="hljs-number">3</span>, {
     <span class="hljs-attribute">x</span>: <span class="hljs-number">200</span>,
     <span class="hljs-attribute">borderRadius</span>: <span class="hljs-string">'50%'</span>,
     <span class="hljs-attribute">backgroundColor</span>: <span class="hljs-string">'orange'</span>,  
  });
</code></pre><p>The above code will move an element with the class name <code>block</code> 200px along its x-axis, using the CSS property <code>translateX</code> which is being represented simply here by <code>x</code>, in three(3) seconds while updating its other CSS properties to have a <code>border-radius</code> of 50% and a <code>background-color</code> of orange.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/ToluAdegboyega/pen/ZExLoPE">https://codepen.io/ToluAdegboyega/pen/ZExLoPE</a></div>
<p><strong>gsap.from()</strong></p>
<p>This method animates the element <strong>from</strong> the values specified in the object parameter (vars) to the current/default values. It acts as the reverse of the <strong>to</strong> method.</p>
<pre><code>  <span class="hljs-selector-tag">gsap</span><span class="hljs-selector-class">.from</span>(<span class="hljs-string">'.circle'</span>, <span class="hljs-number">3</span>, {
     <span class="hljs-attribute">y</span>: <span class="hljs-number">200</span>,
     <span class="hljs-attribute">borderRadius</span>: <span class="hljs-string">'50%'</span>,
     <span class="hljs-attribute">backgroundColor</span>: <span class="hljs-string">'orange'</span>,  
  });
</code></pre><p>The above code will animate an element with the class name <code>circle</code> along its y-axis from having a <code>border-radius</code> of 50% and a <code>background-color</code> of orange to its default values.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/ToluAdegboyega/pen/LYdxrLe">https://codepen.io/ToluAdegboyega/pen/LYdxrLe</a></div>
<p><strong>gsap.fromTo()</strong></p>
<p>This method allows you to specify both the starting and final values. This is done by using two objects which represent these values respectively. It is a combination of both the <code>from()</code> and <code>to()</code> methods.</p>
<pre><code>  <span class="hljs-selector-tag">gsap</span><span class="hljs-selector-class">.fromTo</span>(<span class="hljs-string">'.block-circle'</span>, <span class="hljs-number">3</span>, {
      <span class="hljs-attribute">borderRadius</span>: <span class="hljs-string">'8px'</span>,
      <span class="hljs-attribute">backgroundColor</span>: <span class="hljs-string">'purple'</span>,
    },
    {
      <span class="hljs-attribute">borderRadius</span>: <span class="hljs-string">'50%'</span>,
      <span class="hljs-attribute">backgroundColor</span>: <span class="hljs-string">'orange'</span>,  
    }
  );
</code></pre><p>The above code will animate an element with the class name <code>block-circle</code> from having a <code>border-radius</code> of 8px and a <code>background-color</code> of purple to a <code>border-radius</code> of 50% and a <code>background-color</code> of orange.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/ToluAdegboyega/pen/VwXPdVE">https://codepen.io/ToluAdegboyega/pen/VwXPdVE</a></div>
<h3 id="heading-exploring-gsap-vars-properties">Exploring GSAP vars properties</h3>
<p>It is also important to note that other than CSS properties, there are other properties that can go inside the vars object parameter and some of them are:</p>
<ul>
<li><p>delay: The amount of delay in seconds before the animation should begin.</p>
</li>
<li><p>paused: This is a Boolean and if true, the animation will pause itself immediately upon creation.</p>
</li>
<li><p>repeat:    The number of times that the animation should repeat after it plays for the first time.</p>
</li>
<li><p>yoyo: This is a Boolean and if true, the tween appears to go back and forth (forward then backward).</p>
</li>
</ul>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/ToluAdegboyega/pen/wvmgxpo">https://codepen.io/ToluAdegboyega/pen/wvmgxpo</a></div>
<h2 id="heading-timeline">Timeline</h2>
<p>A Timeline is a container for multiple Tweens. Timeline lets you chain Tweens together. With a Timeline, all the Tweens are executed by default one after the other, unless set otherwise, with no need to use delays on the individual Tweens. Making use of Timeline is an easier method as using delays for sequencing could make your animation harder to maintain, especially in more complex animations. </p>
<blockquote>
<p>A Timeline is a powerful sequencing tool that acts as a container for tweens and other timelines, making it     simple to control them as a whole and precisely manage their timing. Without Timelines, building complex sequences would be far more cumbersome because you'd need to use a delay for every animation. - <a target="_blank" href="https://greensock.com/docs/v3/GSAP/Timeline">GSAP Timeline Docs</a></p>
</blockquote>
<p>A Timeline can be created using the following format:</p>
<pre><code>const timeline <span class="hljs-operator">=</span> gsap.timeline();

timeline
.from(<span class="hljs-string">'element'</span>, {})
.to(<span class="hljs-string">'element'</span>, {});
</code></pre><div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/ToluAdegboyega/pen/QWmdBzO">https://codepen.io/ToluAdegboyega/pen/QWmdBzO</a></div>
<h2 id="heading-plugins">Plugins</h2>
<p>GSAP makes available plugins that can be used to create complex and exciting animations with a few lines of intuitive code. Some of the most popular GSAP plugins include: ScrollTrigger, DrawSVGPlugin, and MorphSVGPlugin amongst others. For a full list of official GSAP plugins, check out the <a target="_blank" href="https://greensock.com/gsap-plugins/">plugins page</a>.</p>
<p>In order to make use of a GSAP plugin, you will need to register it to the GSAP core by using the format below at the top of the file you want to use the plugin:</p>
<pre><code><span class="hljs-keyword">import</span> { <span class="hljs-title">PluginName</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">'gsap/PluginName'</span>;

gsap.registerPlugin(PluginName);
</code></pre><h3 id="heading-scrolltrigger">ScrollTrigger</h3>
<p>In this post we'll be focusing on a powerful GSAP plugin called ScrollTrigger. ScrollTrigger can be used to create amazing scroll-based animations with minimal code. It can also be used to trigger anything scroll-related.</p>
<p>The below code is used to register the ScrollTrigger plugin:</p>
<pre><code><span class="hljs-keyword">import</span> { <span class="hljs-title">ScrollTrigger</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">'gsap/ScrollTrigger'</span>;

gsap.registerPlugin(ScrollTrigger);
</code></pre><pre><code><span class="hljs-selector-tag">gsap</span><span class="hljs-selector-class">.to</span>(<span class="hljs-string">'element'</span>, {
  <span class="hljs-attribute">x</span>: <span class="hljs-number">200</span>,
  <span class="hljs-attribute">scrollTrigger</span>: <span class="hljs-string">'element'</span>,
})
</code></pre><p>The above code animates an element 200px on the x-axis when the element is in view once.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/ToluAdegboyega/pen/PoRpyPe">https://codepen.io/ToluAdegboyega/pen/PoRpyPe</a></div>
<p>The ScrollTrigger plugin can be used to create a custom scroll bar like the example below amongst other mind-blowing animations.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/ToluAdegboyega/pen/wvmJYxZ">https://codepen.io/ToluAdegboyega/pen/wvmJYxZ</a></div>
<h2 id="heading-conclusion">Conclusion</h2>
<p>In this post, we’ve covered how to get started with using GSAP to create stunning animations in your Vue app. </p>
<p>While GSAP has so many useful features, it can be intimidating to get started, but once you’ve the understood the basics, you'll be creating complex animations in no time.</p>
<p>GSAP has quite an extensive and accessible <a target="_blank" href="https://greensock.com/get-started">documentation</a> that covers features not mentioned in this post and very active <a target="_blank" href="https://greensock.com/forums/">forums</a> that I have personally benefitted from!</p>
<p><em>Thank you for reading and I hope you found this post helpful. 💫</em></p>
]]></content:encoded></item><item><title><![CDATA[Decision Making in JavaScript]]></title><description><![CDATA[When writing code, we often need to handle different decisions and execute specific actions based on certain conditions. For example, if the time is between 6am and 12noon, display 'Good Morning!'.
Conditional statements help to achieve this. In this...]]></description><link>https://blog.toluadegboyega.dev/decision-making-in-javascript</link><guid isPermaLink="true">https://blog.toluadegboyega.dev/decision-making-in-javascript</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Tolu Adegboyega]]></dc:creator><pubDate>Tue, 16 Nov 2021 10:45:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636822219690/uLRltt9bk.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When writing code, we often need to handle different decisions and execute specific actions based on certain conditions. For example, if the time is between 6am and 12noon, display 'Good Morning!'.</p>
<p>Conditional statements help to achieve this. In this post, we'll be exploring the different types of conditional statements and logical operators in JavaScript.</p>
<h2 id="ifelse-statements">If...else Statements</h2>
<p>The <code>if</code> statement executes a block of code if a specified condition is met—that is, the condition in the parentheses evaluates to <code>true</code>.</p>
<pre><code><span class="hljs-keyword">const</span> time = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>().getHours();
<span class="hljs-comment">// the above gets the time in a 24-Hour format</span>

<span class="hljs-keyword">if</span> ( time &lt; <span class="hljs-number">18</span> ) {
   <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Good Day 🙂'</span>);
}
</code></pre><p>The <code>else</code> statement executes a block of code if a specified condition is not met—that is, the condition evaluates to <code>false</code>.</p>
<pre><code><span class="hljs-keyword">if</span> ( <span class="hljs-type">time</span> &lt; <span class="hljs-number">18</span> ) {
   console.log(<span class="hljs-string">'Good Day 🙂'</span>);
} <span class="hljs-keyword">else</span> {
   console.log(<span class="hljs-string">'Good Evening 🌚'</span>);
}
</code></pre><p>The <code>else if</code> statement is used to specify some new condition(s) if the first condition evaluates to false. There can be as many  <code>else if</code> statements as necessary.  A default <code>else</code> statement can be optionally added after the <code>else if</code> statement(s) to run if none of the conditionals evaluate to <code>true</code>.</p>
<pre><code><span class="hljs-keyword">if</span> ( <span class="hljs-type">time</span> &lt;  <span class="hljs-number">12</span> ) {
   console.log(<span class="hljs-string">'Good Morning! 🌞'</span>);
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> ( <span class="hljs-type">time</span> &lt; <span class="hljs-number">18</span> )  {
   console.log(<span class="hljs-string">'Good Day 🙂'</span>);
} <span class="hljs-keyword">else</span> {
   console.log(<span class="hljs-string">'Good Evening 🌚'</span>);
}
</code></pre><p>The syntax of an <code>if...else</code> statement is:</p>
<pre><code><span class="hljs-keyword">if</span> ( conditionOne ) {
  // block <span class="hljs-keyword">of</span> code <span class="hljs-keyword">to</span> be executed <span class="hljs-keyword">if</span> conditionOne <span class="hljs-keyword">is</span> <span class="hljs-keyword">true</span>
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (conditionTwo ) {
  // block <span class="hljs-keyword">of</span> code <span class="hljs-keyword">to</span> be executed <span class="hljs-keyword">if</span> conditionOne <span class="hljs-keyword">is</span> <span class="hljs-keyword">false</span> <span class="hljs-keyword">and</span> conditionTwo <span class="hljs-keyword">is</span> <span class="hljs-keyword">true</span>
} <span class="hljs-keyword">else</span> {
  // block <span class="hljs-keyword">of</span> code <span class="hljs-keyword">to</span> be executed <span class="hljs-keyword">if</span> conditionOne <span class="hljs-keyword">is</span> <span class="hljs-keyword">false</span> <span class="hljs-keyword">and</span> conditionTwo <span class="hljs-keyword">is</span> <span class="hljs-keyword">false</span>
}
</code></pre><h2 id="switch-statements">Switch Statements</h2>
<p>A <code>switch</code> statement has an expression which is compared with values of each <code>case</code> clause and if a match is found, the code associated with the <code>case</code> is executed. The <code>break</code> keyword indicates the end of a <code>case</code>. If no <code>case</code> matches but a <code>default</code> clause is included, the code inside the <code>default</code> will be executed.</p>
<pre><code><span class="hljs-keyword">switch</span> (expression) {
    <span class="hljs-keyword">case</span> value1:
        <span class="hljs-comment">// code to be executed</span>
        <span class="hljs-keyword">break</span>;
    <span class="hljs-keyword">case</span> value2:
        <span class="hljs-comment">// code to be executed</span>
        <span class="hljs-keyword">break</span>;
    <span class="hljs-keyword">default</span>:
        <span class="hljs-comment">// default code to be executed</span>
        <span class="hljs-keyword">break</span>;
}
</code></pre><p><code>switch</code> statements can be used as an alternative to <code>if... else</code> statements especially if there are many conditions with a precise value to execute. It is considered a more concise way of writing conditionals.</p>
<pre><code><span class="hljs-keyword">const</span> season = <span class="hljs-string">'harmattan'</span>;

<span class="hljs-keyword">switch</span> (season) {
    <span class="hljs-keyword">case</span> <span class="hljs-string">'rainy'</span>:
        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Ready your umbrellas.'</span>);
        <span class="hljs-keyword">break</span>;
    <span class="hljs-keyword">case</span> <span class="hljs-string">'harmattan'</span>:
        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Dusty 😷'</span>);
        <span class="hljs-keyword">break</span>;
    <span class="hljs-keyword">case</span> <span class="hljs-string">'dry'</span>:
        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Put on the air conditioner.'</span>);
        <span class="hljs-keyword">break</span>;
    <span class="hljs-keyword">default</span>:
        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Climate change is real.'</span>);
}

<span class="hljs-comment">//Output: Dusty 😷</span>
</code></pre><h2 id="ternary-operators">Ternary Operators</h2>
<p>The ternary or conditional operator tests a condition and returns one value if it is <code>true</code>, and another if it is <code>false</code>. The ternary operator is usually used as a shortcut for the <code>if</code> statement.</p>
<p>Syntax:</p>
<pre><code>condition ? expressionOne : expressionTwo;
</code></pre><p>If the condition before the <code>?</code> evaluates to <code>true</code>, execute the code in expressionOne. If the condition evaluates to <code>false</code>, execute the code in expressionTwo.</p>
<pre><code><span class="hljs-keyword">const</span> score = <span class="hljs-number">85</span>;

score &gt; <span class="hljs-number">50</span> ? <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Good job 🎉'</span>) : <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Try again ☹'</span>);

<span class="hljs-comment">// Output: Good job 🎉</span>
</code></pre><h2 id="logical-operators">Logical Operators</h2>
<p>Logical operators are used to compare values and the result of the comparison is either <code>true</code> or <code>false</code>. There are three types of logical operators. </p>
<p>They are—AND <code>&amp;&amp;</code>, OR <code>||</code>, and NOT <code>!</code>.</p>
<p>The AND <code>&amp;&amp;</code> operator returns <code>true</code> if the operands to the left and right evaluate to be <code>true</code>.</p>
<pre><code><span class="hljs-number">2</span> <span class="hljs-string">&gt;</span> <span class="hljs-number">1</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-number">1</span> <span class="hljs-string">&lt;</span> <span class="hljs-number">2</span><span class="hljs-string">;</span> <span class="hljs-string">//</span> <span class="hljs-literal">true</span>
<span class="hljs-literal">true</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-literal">true</span><span class="hljs-string">;</span> <span class="hljs-string">//</span> <span class="hljs-literal">true</span>

<span class="hljs-number">1</span> <span class="hljs-string">&gt;</span> <span class="hljs-number">2</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-number">2</span> <span class="hljs-string">&gt;</span> <span class="hljs-number">1</span><span class="hljs-string">;</span> <span class="hljs-string">//</span> <span class="hljs-literal">false</span>
<span class="hljs-literal">false</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-literal">true</span><span class="hljs-string">;</span> <span class="hljs-string">//</span> <span class="hljs-literal">false</span>
</code></pre><p>The OR <code>||</code> operator will return <code>true</code> if one of the operands is <code>true</code>.</p>
<pre><code><span class="hljs-number">2</span> <span class="hljs-string">&gt;</span> <span class="hljs-number">1</span> <span class="hljs-string">||</span> <span class="hljs-number">1</span> <span class="hljs-string">&lt;</span> <span class="hljs-number">2</span><span class="hljs-string">;</span> <span class="hljs-string">//</span> <span class="hljs-literal">true</span>
<span class="hljs-literal">true</span> <span class="hljs-string">||</span> <span class="hljs-literal">true</span><span class="hljs-string">;</span> <span class="hljs-string">//</span> <span class="hljs-literal">true</span>

<span class="hljs-number">1</span> <span class="hljs-string">&gt;</span> <span class="hljs-number">2</span> <span class="hljs-string">||</span> <span class="hljs-number">2</span> <span class="hljs-string">&gt;</span> <span class="hljs-number">1</span><span class="hljs-string">;</span> <span class="hljs-string">//</span> <span class="hljs-literal">true</span>
<span class="hljs-literal">false</span> <span class="hljs-string">||</span> <span class="hljs-literal">true</span><span class="hljs-string">;</span> <span class="hljs-string">//</span> <span class="hljs-literal">true</span>
</code></pre><p>The NOT <code>!</code> operator reverses the value of a Boolean.</p>
<pre><code><span class="hljs-number">2</span> <span class="hljs-string">&gt;</span> <span class="hljs-number">1</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-number">1</span> <span class="hljs-string">&lt;</span> <span class="hljs-number">2</span><span class="hljs-string">;</span> <span class="hljs-string">//</span> <span class="hljs-literal">true</span>

<span class="hljs-type">!(2</span> <span class="hljs-string">&gt;</span> <span class="hljs-number">1</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-number">1</span> <span class="hljs-string">&lt;</span> <span class="hljs-number">2</span><span class="hljs-string">);</span> <span class="hljs-string">//</span> <span class="hljs-literal">false</span>
<span class="hljs-type">!(true);</span> <span class="hljs-string">//</span> <span class="hljs-literal">false</span>
</code></pre><p>Logical operators can be used together with <code>if...else</code> statements.</p>
<pre><code><span class="hljs-keyword">const</span> age = <span class="hljs-number">20</span>;
<span class="hljs-keyword">const</span> emptyAccountBalance = <span class="hljs-literal">false</span>;

<span class="hljs-keyword">if</span> (age &gt;= <span class="hljs-number">15</span> &amp;&amp; emptyAccountBalance ) {
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Can buy alcohol.'</span>);
} <span class="hljs-keyword">else</span> {
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Cannot buy alcohol.'</span>);
}

<span class="hljs-comment">// Output: Cannot buy alcohol.</span>
</code></pre><pre><code><span class="hljs-keyword">const</span> age = <span class="hljs-number">20</span>;
<span class="hljs-keyword">const</span> emptyAccountBalance = <span class="hljs-literal">false</span>;

<span class="hljs-keyword">if</span> (age &gt;= <span class="hljs-number">15</span> || emptyAccountBalance ) {
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Can buy alcohol.'</span>);
} <span class="hljs-keyword">else</span> {
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Cannot buy alcohol.'</span>);
}

<span class="hljs-comment">// Output: Can buy alcohol.</span>
</code></pre><pre><code><span class="hljs-keyword">const</span> age = <span class="hljs-number">20</span>;
<span class="hljs-keyword">const</span> emptyAccountBalance = <span class="hljs-literal">false</span>;

<span class="hljs-keyword">if</span> (age &gt;= <span class="hljs-number">15</span> &amp;&amp; !emptyAccountBalance ) {
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Can buy alcohol.'</span>);
} <span class="hljs-keyword">else</span> {
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Cannot buy alcohol.'</span>);
}

<span class="hljs-comment">// Output: Can buy alcohol.</span>
</code></pre><h2 id="conclusion">Conclusion</h2>
<p>Decision-making in programming is as important as it is in our day-to-day lives. Conditional statements provide us with logic for executing blocks of code based on different conditions in order to obtain the desired output. </p>
<p><em>Thank you for reading and I hope you found this post helpful. 💫</em></p>
]]></content:encoded></item><item><title><![CDATA[A Beginner's Guide to Open Source]]></title><description><![CDATA[Contributing to open source can be daunting for a lot of people, at least I know it was for me. Although I wanted to contribute to open source, I was not sure how to go about it. I finally took the plunge during Hacktoberfest 2021 and made my first o...]]></description><link>https://blog.toluadegboyega.dev/a-beginners-guide-to-open-source</link><guid isPermaLink="true">https://blog.toluadegboyega.dev/a-beginners-guide-to-open-source</guid><category><![CDATA[Open Source]]></category><category><![CDATA[General Programming]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[learning]]></category><dc:creator><![CDATA[Tolu Adegboyega]]></dc:creator><pubDate>Tue, 19 Oct 2021 10:07:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1634408980468/X-zoF1a3k.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Contributing to open source can be daunting for a lot of people, at least I know it was for me. Although I wanted to contribute to open source, I was not sure how to go about it. I finally took the plunge during Hacktoberfest 2021 and made my first open source contribution, and you can too.</em></p>
<h2 id="what-even-is-open-source">What even is Open Source? 🤔</h2>
<p>Open Source Software(OSS) is software with source code that anyone can inspect, modify, enhance and distribute under a <a target="_blank" href="https://opensource.org/licenses/alphabetical">license</a>. A lot of the technologies that we use today, such as Android, Firefox, Git, Linux, TypeScript and VLC media player are built on OSS. </p>
<p>Open source code is usually developed and maintained collaboratively by a community of its users. Although the primary goal of open source projects is to create valuable and accessible open source software, it is also beneficial to its contributors. Benefits of contributing to open source include:</p>
<ul>
<li><p>Honing one's technical skills by getting the opportunity to work on real-world projects.</p>
</li>
<li><p>Improving soft skills such as communication and giving/receiving feedback.</p>
</li>
<li><p>Meeting new people and expanding your network. </p>
</li>
</ul>
<h2 id="and-hacktoberfest">…and Hacktoberfest? 🧐</h2>
<p>Chances are that you've seen the word 'Hacktoberfest' come up a lot especially in the month of October. While contributions to open source can be made any time, Hacktoberfest is a month-long celebration of open source hosted by <a target="_blank" href="https://hacktoberfest.digitalocean.com">DigitalOcean</a>. Hacktoberfest aims to promote, celebrate and encourage people to contribute to open source. It is a great time to get started with open source contributions.</p>
<p>To participate, sign up on the official <a target="_blank" href="https://hacktoberfest.digitalocean.com/register">Hacktoberfest</a>  website between October 1st and October 31st. This ensures that your contributions count. A participant has to make four(4) valid pull requests in participating GitHub or GitLab repositories. Participating repositories are labelled <code>hacktoberfest</code>, alternatively, merged pull requests can also be labelled <code>hacktoberfest-accepted</code> to participate. Once these 4 pull requests are merged into the repositories and pass the fourteen(14) day review period, a participant is eligible to win swags which include, a T-shirt and limited edition stickers or could choose to plant a tree!</p>
<p><img src="https://media.giphy.com/media/rs6lhzZjX3U98K2AmB/giphy.gif" alt="Wow" /></p>
<h2 id="finding-projects-to-contribute-to">Finding Projects to Contribute To</h2>
<p>This is where it might get a little intimidating at first as a lot of projects can seem complex. Do not fret, there are a number of ways to find projects that are of interest to you and are on your skill level to ease you in.</p>
<ul>
<li><h3 id="developer-communities">Developer Communities</h3>
</li>
</ul>
<p>Developer communities provide a platform for developers to learn, interact, share ideas, support each other, stay up-to-date and grow. These communities can be very beneficial to starting your open source journey.</p>
<p><a target="_blank" href="https://www.womenwhocode.com/frontend">Women Who Code Frontend</a> started a dedicated study group <a target="_blank" href="https://github.com/frontendstudygroup/frontendstudygroup.github.io">project</a> to learn about front end technologies as well as how to collaborate on an open source project. </p>
<p>This was my first open source contribution. The community has been super open(pun fully intended 😏), helpful and supportive. In addition to creating the study group project, a blog has also been created and webinars organized weekly through out the month of October to discuss open source! I honestly couldn't have asked for a better first contribution as it helped boost my confidence to further participate.</p>
<ul>
<li><h3 id="social-media-and-online-resources">Social Media and Online Resources</h3>
</li>
</ul>
<p>For my second contribution, while browsing through the hacktoberfest hashtag on Twitter, I saw several tweets calling for contributors to open source repositories. I soon found one that aligned with my interest. </p>
<p>Subsequent contributions have come from goodfirstissues.com, this is a website that aggregates beginner-friendly, open source repositories looking for help.  You can filter according to language, label and repository, making it even easier to find issues to work on. </p>
<p>Other websites to find repositories to contribute to include:</p>
<ul>
<li>codetriage.com</li>
<li><a target="_blank" href="https://goodfirstissue.dev/">goodfirstissue.dev</a> </li>
<li><p>up-for-grabs.net</p>
</li>
<li><h3 id="github">GitHub</h3>
</li>
</ul>
<p>GitHub is a great way to find open source projects to work on. You can take advantage of GitHub's advanced search feature and prefixes to improve your search.</p>
<p>Search can be filtered based on many factors such as issue label, language, number of forks and so on. Labels to search for as a beginner include <code>help-wanted</code> , <code>first-timers-only</code> or <code>good-first-bug</code>.</p>
<h2 id="contributing-to-your-first-project">Contributing to Your First Project</h2>
<p>Contributing to open source is not limited to writing code. You can contribute by improving the documentation, opening issues, or labeling pull requests. </p>
<p>Most projects will have guidelines specific to the project. These can usually be found in the <code>README.md</code> or <code>CONTRIBUTING.md</code> file. Make sure to read the whole document thoroughly and be sure that you're following guidelines that project maintainers have specified.</p>
<p>After choosing an open source project to work on, there are a few ways you can decide on what you would like to contribute to the project. You can work on pre-existing issues which can be found under the <code>Issues</code> tab on GitHub. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1634422178169/f0ge7_a9i.png" alt="20211016_230829.png" /></p>
<p>If you find an issue that you're interested in, it is best to comment on the issue outlining how you'd go about implementing a solution. In some cases, you can ask to be assigned the issue. It is important to be polite in your communication.</p>
<p>You can also create a new issue based on a bug you've noticed or a feature you think needs to be 
implemented or improved upon. Keep in mind that the decision to approve your new issue is ultimately at the discretion of the project maintainer. </p>
<p>Now that you've decided on an issue to work one, you can start the process of contributing.</p>
<ul>
<li><h3 id="fork-the-repository">Fork the Repository</h3>
</li>
</ul>
<p>This will make a copy of the original repository. That means you can make any changes you want to the forked repository, without affecting the original one.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1634421977146/Xw6TSJpOu.png" alt="20211016_230538.png" /></p>
<p>Once you click the <code>Fork</code> button, GitHub will redirect you to your copy of the original repo.</p>
<ul>
<li><h3 id="clone-your-forked-repository">Clone your Forked Repository</h3>
</li>
</ul>
<p>Click the <code>Code</code> button and copy the URL that's provided. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1634424486114/FVmRVnT_N.png" alt="20211016_234631.png" /></p>
<p>On your local machine, run the following Git command:</p>
<pre><code>git clone https://github.com/<span class="hljs-tag">&lt;<span class="hljs-name">your_profile_name</span>&gt;</span>/<span class="hljs-tag">&lt;<span class="hljs-name">repo_name</span>&gt;</span>.git
</code></pre><p>This clones the repository on your machine so you can work on it. You can then open the repository in your code editor.</p>
<ul>
<li><h3 id="create-a-branch">Create a Branch</h3>
</li>
</ul>
<p>Before you start working, create a separate branch that will hold all the code that you add or edit.</p>
<p>You can create a branch by running the following Git command:</p>
<pre><code>git checkout -b <span class="hljs-tag">&lt;<span class="hljs-name">branch_name</span>&gt;</span>
</code></pre><ul>
<li><h3 id="make-changes">Make Changes</h3>
</li>
</ul>
<p>Now you can make code changes, update the documentation, organize the files, or anything else!
All contributions are important and valuable.</p>
<ul>
<li><h3 id="commit-and-push-your-changes">Commit and Push your Changes</h3>
</li>
</ul>
<p>Once you are satisfied with your code, you can commit and push your changes to GitHub.</p>
<pre><code>git <span class="hljs-keyword">add</span> .
git <span class="hljs-keyword">commit</span> -m <span class="hljs-string">'commit message'</span>
git push -u origin &lt;your_branch_name&gt;
</code></pre><ul>
<li><h3 id="create-a-pull-request">Create a Pull Request</h3>
</li>
</ul>
<p>Click on the <code>New pull request</code> button under the <code>Pull requests</code> tab in your forked repository on the GitHub. GitHub will automatically compare your changes to the original repository. You will also be shown a text editor. Fill this in with the relevant information needed to understand the work you've just done. Click the <code>Create pull request</code> button. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1634477884110/5CG292APWN.png" alt="20211017_143633.png" /></p>
<p>Voila! You have made changes and just created a pull request. 👏🏾</p>
<ul>
<li><h3 id="what-next">What Next?</h3>
</li>
</ul>
<p>Wait for the project maintainer(s) to review your changes. Upon review, you may be requested to make changes to the work you've done. If all goes well, your pull request will be approved and the project maintainer(s) will merge your contributions into the codebase. You'll officially become an open source contributor! 🎉</p>
<h2 id="conclusion">Conclusion</h2>
<p>Open source contribution for me has been an amazing and rewarding learning experience. I hope this post helps to give a better understanding of open source and inspires you to get involved. It might take a few tries to fully put your skills to use, but there is a place for everyone willing to contribute to open source. </p>
<p>Looking forward to making more contributions!</p>
]]></content:encoded></item><item><title><![CDATA[Getting Started with CSS Animation]]></title><description><![CDATA[Animation adds personality and flair to interfaces, it is an effective and fun way to draw the attention of users and captivate them. The CSS animation property allows us to animate an element from one style to another style. It is flexible and dynam...]]></description><link>https://blog.toluadegboyega.dev/getting-started-with-css-animation</link><guid isPermaLink="true">https://blog.toluadegboyega.dev/getting-started-with-css-animation</guid><category><![CDATA[Frontend Development]]></category><category><![CDATA[CSS]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Tolu Adegboyega]]></dc:creator><pubDate>Wed, 15 Sep 2021 11:05:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1631485077543/LZZXk4S5I.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Animation adds personality and flair to interfaces, it is an effective and fun way to draw the attention of users and captivate them. The CSS animation property allows us to animate an element from one style to another style. It is flexible and dynamic. </p>
<p>CSS animation is made up of two parts:</p>
<ul>
<li><p>Keyframes.</p>
</li>
<li><p>Animation properties.</p>
</li>
</ul>
<h3 id="keyframes">Keyframes</h3>
<p>Keyframes is used to define how an animation will work. It executes the animation in a sequential manner. Interfaces with multiple animations may have multiple keyframes. </p>
<pre><code><span class="hljs-keyword">@keyframes</span> movingBall {
  0% { 
    <span class="hljs-attribute">left</span>: <span class="hljs-number">0px</span>;
  } 
  25% { 
    <span class="hljs-attribute">background</span>: orange;
    <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">0</span>;
  } 
  75% { 
    <span class="hljs-attribute">background</span>: maroon;
  } 
  100% { 
    <span class="hljs-attribute">background</span>: pink;
    <span class="hljs-attribute">left</span>: <span class="hljs-number">300px</span>;
  } 
}
</code></pre><p>In the code example above, <code>movingBall</code>  is the name of the animation. Each stage of the animation is represented as a percentage. Where 0% is the start and 100% is the final stage with intermediate stages in between. Also included are the style properties for the various stages.</p>
<h3 id="animation-properties">Animation Properties</h3>
<p>After defining <code>@keyframes</code>, the animation properties must be added in order for the animation to work. This binds <code>movingBall</code> to an element. The two basic properties we use are the <code>animation-name</code> and <code>animation-duration</code> properties.</p>
<p>The <code>animation-name</code> is the name of the animation created in keyframes and <code>animation-duration</code> specifies the duration of the animation, it is defined in seconds. </p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/ToluAdegboyega/pen/KKqqVzz">https://codepen.io/ToluAdegboyega/pen/KKqqVzz</a></div>
<p>Apart from the <code>animation-name</code> and <code>animation-duration</code> properties, there are other important properties as well. They include: </p>
<p><code>animation-timing-function</code> : This property defines the pace of the animation. The animation-timing-function property can have the following values: </p>
<ul>
<li><code>ease</code> - The animation starts slowly, then fast, then ends slowly again. This is the default value.</li>
<li><code>linear</code>- The animation maintains the same speed from start to end.</li>
<li><code>ease-in</code> - The animation has a slow start.</li>
<li><code>ease-out</code> - The animation has a slow end.</li>
<li><code>ease-in-out</code> - The animation has a slow start and end.</li>
</ul>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/ToluAdegboyega/pen/LYLLNjY">https://codepen.io/ToluAdegboyega/pen/LYLLNjY</a></div>
<p><br /></p>
<p><code>animation-iteration-count</code> : This property defines the number of times an animation should run. It takes in a number value. The default value is 1. A value of <code>infinite</code> repeats the animation infinitely which means the animation keeps on running forever.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/ToluAdegboyega/pen/WNOOwZd">https://codepen.io/ToluAdegboyega/pen/WNOOwZd</a></div>
<p><br /></p>
<p><code>animation-direction</code> :  This property defines the direction of the animation. The animation-direction property can take any one of these values: </p>
<ul>
<li><code>normal</code> - The animation is played forward. This is the default value.</li>
<li><code>reverse</code> - The animation is played in the reverse direction, that is, backwards.</li>
<li><code>alternate</code> - The animation is first played in the forward direction and then in the backward direction.</li>
<li><code>alternate-reverse</code> - The animation is first played in the backward direction and then in the forward direction.</li>
</ul>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/ToluAdegboyega/pen/YzQQqYq">https://codepen.io/ToluAdegboyega/pen/YzQQqYq</a></div>
<p><br /></p>
<p><code>animation-delay</code> :  This property specifies the delay before starting the animation. It is defined in seconds.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/ToluAdegboyega/pen/jOwwqYx">https://codepen.io/ToluAdegboyega/pen/jOwwqYx</a></div>
<p><br /></p>
<p><code>animation-fill-mode</code> : This property specifies what values are applied by the animation before and after executing. The animation-fill-mode property can have the following values:</p>
<ul>
<li><code>none</code> - No style is applied to the animation before or after it executes. This is the default value.</li>
<li><code>forwards</code> - The element will retain the same animation properties of the last keyframe after the animation completes.</li>
<li><code>backwards</code> - The element will retain the same animation properties of the first keyframe after the animation completes.</li>
<li><code>both</code> - The animation will follow the rules for both forwards and backwards.</li>
</ul>
<p><br /></p>
<p><code>animation-play-state</code> :  This property allows you to play or pause the animation.</p>
<h3 id="animation-shorthand">Animation Shorthand</h3>
<p>The <code>animation</code> shorthand CSS property applies an animation between styles. It is a shorthand for animation-name, animation-duration, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, animation-fill-mode, and animation-play-state.</p>
<pre><code><span class="hljs-selector-tag">animation</span>: <span class="hljs-selector-attr">[animation-name]</span> <span class="hljs-selector-attr">[animation-duration]</span> <span class="hljs-selector-attr">[animation-timing-function]</span>
<span class="hljs-selector-attr">[animation-delay]</span> <span class="hljs-selector-attr">[animation-iteration-count]</span> <span class="hljs-selector-attr">[animation-direction]</span>
<span class="hljs-selector-attr">[animation-fill-mode]</span> <span class="hljs-selector-attr">[animation-play-state]</span>;
</code></pre><div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/ToluAdegboyega/pen/QWggNQm">https://codepen.io/ToluAdegboyega/pen/QWggNQm</a></div>
<p><br /></p>
<h3 id="wrapping-up">Wrapping Up</h3>
<p>CSS animation can go a very long way in creating a more enjoyable experience for users, and the possibilities of animations that can be created are endless.</p>
<p>It is important to note that while there are a lot of animatable CSS properties, not all CSS properties can be animated as at writing this post. <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animated_properties">Here is a comprehensive list of CSS properties that can be animated</a>. </p>
<p><br /></p>
<blockquote>
<p>Thank you for reading and I hope you found this post helpful. 💫</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[Beyond Divs: Semantic HTML]]></title><description><![CDATA[A good number of websites are built with code written like the snippet below—and while this might 'get the job done', it is much more beneficial to write well structured, semantic HTML. 
    <div id="header">
        <div class="header-main">Welcome ...]]></description><link>https://blog.toluadegboyega.dev/beyond-divs-semantic-html</link><guid isPermaLink="true">https://blog.toluadegboyega.dev/beyond-divs-semantic-html</guid><category><![CDATA[Frontend Development]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[best practices]]></category><category><![CDATA[HTML5]]></category><dc:creator><![CDATA[Tolu Adegboyega]]></dc:creator><pubDate>Mon, 16 Aug 2021 11:01:38 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1628332562138/aB1jPT70Z2.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A good number of websites are built with code written like the snippet below—and while this might 'get the job done', it is much more beneficial to write well structured, semantic HTML. </p>
<pre><code>    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"header"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"header-main"</span>&gt;</span>Welcome to my website!<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"header-text"</span>&gt;</span>Introduction<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"nav"</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/"</span>&gt;</span>Home<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/about"</span>&gt;</span>About<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/contact"</span>&gt;</span>Contact<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"article"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"article-header"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"article-header-title"</span>&gt;</span>Title<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"article-header-subtitle"</span>&gt;</span>Subtitle<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"article-section"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"article-section-text"</span>&gt;</span>Theory<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"article-footer"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"article-footer-text"</span>&gt;</span>Author Information<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"main-side"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"main-side-heading"</span>&gt;</span>Get To Know Us Better<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"main-side-section"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"main-side-section-text"</span>&gt;</span>Partners<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"main-footer"</span>&gt;</span>
        ...
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre><h3 id="what-is-semantic-html">What is Semantic HTML?</h3>
<p>Semantic simply refers to the correct meaning of words. </p>
<p>Semantic HTML, also referred to as semantic markup, therefore is HTML code that uses tags whose names convey their meaning and describe the content inside them. Its description is clear to the browser, developer and anyone else reading it. </p>
<p>Non-semantic tags such as the <code>&lt;div&gt;</code>  and <code>&lt;span&gt;</code> tags are generic and do not bear in their names the purpose they are meant to serve. While fine to use in some cases, if a semantic tag is available for a specific use, it is best to use it before resorting to a non-semantic tag. </p>
<h3 id="importance-of-semantic-html">Importance of Semantic HTML</h3>
<p>The benefits of writing semantic markup include: </p>
<ul>
<li><strong>Accessibility </strong></li>
</ul>
<p>If you want your website to be accessible to all, semantic HTML is a must. Visually impaired users rely on screen readers to verbally describe what is on a page, proper use of semantic HTML elements allow these screen readers to communicate your content more accurately. </p>
<ul>
<li><strong>Codebase Maintenance </strong></li>
</ul>
<p>Semantic HTML provides a standardized markup convention. This helps to make code readable when more than one developer might have to work on a codebase. The code is easier to understand and as a result, there is improvement in the work flow. </p>
<ul>
<li><strong>Search Engine Optimization (SEO) </strong></li>
</ul>
<p>Writing semantic code provides a competitive advantage in SEO.  SEO is the technique of optimizing web pages and their content to be easily discoverable by users searching for relevant terms. With the ever-growing number of websites, this is very important. </p>
<p>Search engines consider the content of a semantic tag as important keywords to influence the search rankings of a webpage. </p>
<h3 id="semantic-tags-in-html5">Semantic Tags in HTML5</h3>
<p>Semantic tags such as <code>&lt;form&gt;</code> , <code>&lt;table&gt;</code> and <code>&lt;img&gt;</code> have always existed in HTML. However, HTML5 introduced even more useful semantic tags. Some of the tags are: </p>
<ul>
<li><code>&lt;article&gt;</code> </li>
</ul>
<p>According to the  <a target="_blank" href="https://html.spec.whatwg.org/multipage/sections.html#elementdef-article">HTML5 specification</a> : The article element represents a section of content that forms an independent part of a document or site; for example, a magazine or newspaper article, or a blog entry. </p>
<p>That is, the content inside of an <code>&lt;article&gt;</code> tag should be able to stand alone or be reused outside of your webpage and still make sense. </p>
<ul>
<li><code>&lt;aside&gt;</code></li>
</ul>
<p>The <code>&lt;aside&gt;</code> tag is used for information that is not a part of the primary content of the page, but indirectly related. For example, related links, definitions, author information, or pull quotes. </p>
<p><em>Note: Although, the tag does not automatically render as a sidebar, it is frequently styled as one.</em> </p>
<ul>
<li><code>&lt;footer&gt;</code></li>
</ul>
<p>The <code>&lt;footer&gt;</code> tag is used to identify the footer—bottom part of a page, document, article, or section. </p>
<p>It typically contains information about the author of the section, copyright data or links to related documents. </p>
<ul>
<li><code>&lt;header&gt;</code></li>
</ul>
<p>The <code>&lt;header&gt;</code> tag contains introductory information of the related content. </p>
<p>The <code>&lt;header&gt;</code> tag can be used as a header for the entire page, but can also be used as the header for an article, section or any other piece of content. The <code>&lt;header&gt;</code> tag however cannot be used in the <code>&lt;footer&gt;</code>, <code>&lt;address&gt;</code> or another <code>&lt;header&gt;</code> element. </p>
<ul>
<li><code>&lt;main&gt;</code></li>
</ul>
<p>The <code>&lt;main&gt;</code> tag represents the primary content of the document body. Its content should be unique and expand on the topic of the page. </p>
<p>There cannot be more than one visible <code>&lt;main&gt;</code> element in a single document—others, if present, must be hidden with the  <a target="_blank" href="https://html.spec.whatwg.org/multipage/interaction.html#the-hidden-attribute">hidden attribute</a> . Also, the <code>&lt;main&gt;</code> element must not be placed in the <code>&lt;article&gt;</code>, <code>&lt;aside&gt;</code>, <code>&lt;footer&gt;</code>, <code>&lt;header&gt;</code> or <code>&lt;nav&gt;</code> tags. </p>
<ul>
<li><code>&lt;nav&gt;</code></li>
</ul>
<p>The <code>&lt;nav&gt;</code> tag contains the major block of navigation links and details such as table of contents and menu for the current or another page. </p>
<p>It is not necessary to place all the page's links within this tag. For a secondary menu, a <code>&lt;section&gt;</code> tag can be used. </p>
<ul>
<li><code>&lt;section&gt;</code> </li>
</ul>
<p>The <code>&lt;section&gt;</code> tag is used to group related content together. It helps to split the page into sections and subsections. </p>
<p>The <code>&lt;section&gt;</code> tag should only be used if there is no other, more specific semantic tag available. It must almost always contain a heading. </p>
<h3 id="conclusion">Conclusion</h3>
<p>A well structured, semantic HTML code should like this: </p>
<pre><code>    <span class="hljs-tag">&lt;<span class="hljs-name">header</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Welcome to my website!<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Introduction<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">header</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">nav</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/"</span>&gt;</span>Home<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/about"</span>&gt;</span>About<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/contact"</span>&gt;</span>Contact<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">article</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">header</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Title<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>Subtitle<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">header</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">section</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">h4</span>&gt;</span>Theory<span class="hljs-tag">&lt;/<span class="hljs-name">h4</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Paragraph 1<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">h5</span>&gt;</span>Subheading<span class="hljs-tag">&lt;/<span class="hljs-name">h5</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Paragraph 2<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">section</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">footer</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">h5</span>&gt;</span>Author Information<span class="hljs-tag">&lt;/<span class="hljs-name">h5</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Paragraph<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">footer</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">article</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">aside</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>Get To Know Us Better<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">section</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">h4</span>&gt;</span>Partners<span class="hljs-tag">&lt;/<span class="hljs-name">h4</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">section</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">section</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">h4</span>&gt;</span>Testimonials<span class="hljs-tag">&lt;/<span class="hljs-name">h4</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">section</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">aside</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">footer</span>&gt;</span>
        ...
    <span class="hljs-tag">&lt;/<span class="hljs-name">footer</span>&gt;</span>
</code></pre><p>I think that you'd agree with me that this is much more readable than the previous code. </p>
<p>Semantics is a great feature of HTML that all developers should adopt for best practices. </p>
<blockquote>
<p>Thank you for reading and I hope you found this post helpful. 💫</p>
</blockquote>
<p><em>*Cover image credit: https://seekbrevity.com/semantic-markup-important-web-design/</em></p>
]]></content:encoded></item><item><title><![CDATA[Techniversary]]></title><description><![CDATA[You can, you should, and if you are brave enough to start, you will. - Stephen King.

On this day a year ago, I started my first job as a Frontend Developer. 
Le Début
August 2019, I was redeployed to Ibadan, Nigeria for my mandatory service year. I ...]]></description><link>https://blog.toluadegboyega.dev/techniversary</link><guid isPermaLink="true">https://blog.toluadegboyega.dev/techniversary</guid><category><![CDATA[Frontend Development]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[introduction]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Tolu Adegboyega]]></dc:creator><pubDate>Tue, 20 Jul 2021 08:00:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1625936478248/mMzwnsJZ3.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>You can, you should, and if you are brave enough to start, you will. - Stephen King.</p>
</blockquote>
<p>On this day a year ago, I started my first job as a Frontend Developer. </p>
<h3 id="le-debut">Le Début</h3>
<p>August 2019, I was redeployed to Ibadan, Nigeria for my mandatory service year. I reconnected with a former classmate there and while catching up, she mentioned her new interest in tech as a career path—there has been quite a lot of talk about opportunities in tech in recent times and although I've always been interested in the internet and technology in general, I hadn't really considered it as a path for me.</p>
<p>This time though, I was curious. I decided to delve into what these career opportunities were actually about.  After numerous articles, videos and other resources, I had a better understanding. Also, something had caught my eye—Frontend Development. I was quite hesitant because I had a not-so-pleasant experience with a programming course while I was at university, but I liked that this involved bringing amazing designs to life and creating interfaces that people would actually interact with.</p>
<h3 id="self-learning">Self-Learning</h3>
<p>I began to research frontend development pathways and courses, and decided to go for the free ones first. If I ended up not liking it, I really didn't have anything to lose. Also, I was a corps member so I couldn't afford most of the paid courses anyway.</p>
<p> <img src="https://media.giphy.com/media/jPAdK8Nfzzwt2/giphy.gif" alt="Shrug" /> </p>
<p>I started with  <a target="_blank" href="https://www.codecademy.com/">Codecademy</a> and <a target="_blank" href="https://www.freecodecamp.org/">freeCodeCamp</a>. I took courses on coding fundamentals, HTML and CSS. I soon completed my Responsive Web Design Certification.</p>
<p>The next step was to learn JavaScript; which I was quite excited to take on as I had heard a lot about how it wasn't a walk in the park.  This was towards the end of 2019, but things didn't go as planned. Juggling learning and my job at the time wasn't easy, I had to take a break.</p>
<p>Then the pandemic hit. Along with the rest of the world, I was forced to remain at home. I picked up from where I stopped with my JavaScript Algorithm and Data Structures Certification. I also started working on creating my portfolio and other side projects to further hone my skills.</p>
<h3 id="getting-my-first-job">Getting My First Job</h3>
<p>I set up my portfolio, put together a résumé and I was ready to begin applying. I soon discovered that there weren't a lot of entry-level positions or internships for someone who didn't already have a lot of experience. 😔</p>
<p>It was dreary. The end of my service year was also drawing close and I needed to have a plan.</p>
<p>I decided to start applying for the jobs requiring a bajillion years of experience and skills that I wasn't 'qualified' for.  What's the worst that could happen?</p>
<p>About three weeks before the official end of my service year, I applied for a Frontend Developer role I saw on one of the numerous job sites I frequently visited.</p>
<p>I got called for an interview some days later.</p>
<p>Then they wanted to proceed with a technical interview.  This was followed by a coding challenge.</p>
<p>Four days to my passing out ceremony, I was made an offer.</p>
<p> <img src="https://media.giphy.com/media/G96zgIcQn1L2xpmdxi/giphy.gif" alt="Celebration" /></p>
<h3 id="the-road-ahead">The Road Ahead</h3>
<p>Although not without its challenges, my journey has been enlightening. I've met and worked with some of the most brilliant and helpful people in the short time I've been here. I'm genuinely grateful for the opportunity.</p>
<p>I still have a long way to my goals and a major key to achieving them is to keep learning. Either by building, reading, watching or any other way.</p>
<p>And it's one of the reasons I've also started this blog. I hope that by documenting my journey, I can share knowledge and also reinforce mine. 🧡</p>
]]></content:encoded></item></channel></rss>