<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vaishnav </title>
    <description>The latest articles on DEV Community by Vaishnav  (@vaishnavs).</description>
    <link>https://dev.to/vaishnavs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F372443%2Fd392ea67-649f-4e17-9c1e-215aed05de83.jpeg</url>
      <title>DEV Community: Vaishnav </title>
      <link>https://dev.to/vaishnavs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vaishnavs"/>
    <language>en</language>
    <item>
      <title>Syntax highlight with Shiki and Adding Copy Functionality to Codeblocks</title>
      <dc:creator>Vaishnav </dc:creator>
      <pubDate>Sun, 22 Dec 2024 06:00:36 +0000</pubDate>
      <link>https://dev.to/vaishnavs/syntax-highlight-with-shiki-and-adding-copy-functionality-to-codeblocks-26el</link>
      <guid>https://dev.to/vaishnavs/syntax-highlight-with-shiki-and-adding-copy-functionality-to-codeblocks-26el</guid>
      <description>&lt;p&gt;Recently, I decided to add a code snippets section to my website. I realized two key features would greatly improve the user experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better syntax highlighting&lt;/li&gt;
&lt;li&gt;A copy code block button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's walk through how to implement these features step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing Syntax Highlighting
&lt;/h2&gt;

&lt;p&gt;First, let's look at our current setup. We're using MDX with next-mdx-remote to render our content. Here's the basic structure of our MDX processing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contentPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;matter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mdxSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;mdxOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mdx&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;remarkPlugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;remarkGfm&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;rehypePlugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="nx"&gt;rehypeSlug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;rehypeAutolinkHeadings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;anchor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;rehypePrettyCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;shikiOptions&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;rehypeAccessibleEmojis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code reads the content file, processes it with various plugins, and prepares it for rendering. The key plugin for our syntax highlighting is rehypePrettyCode. rehype-pretty-code is a Rehype plugin powered by the shiki syntax highlighter that provides beautiful code blocks for Markdown or MDX. It works on both the server at build-time (avoiding runtime syntax highlighting) and on the client for dynamic highlighting.&lt;/p&gt;

&lt;p&gt;To use a specific theme, we can configure shikiOptions like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shikiOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;catppuccin-latte&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm using the "catppuccin-latte" theme, but you can explore more themes at &lt;a href="https://shiki.style/themes" rel="noopener noreferrer"&gt;https://shiki.style/themes&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding copy button to codeblocks
&lt;/h2&gt;

&lt;p&gt;Now that we have syntax highlighting working, let's add a copy button to our code blocks. Instead of creating a new custom component for each code block in our MDX files, we'll modify how the code blocks are rendered on the UI. Here's how a code block typically looks in the DOM:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1so0dqcdvydkx03cv71h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1so0dqcdvydkx03cv71h.png" alt="Codeblock DOM Node" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We'll create a custom Figure component that will be used by MDXRemote to render these elements. This approach doesn't require importing the component in each MDX file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Figure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;rest&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;figureRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isReactElement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isValidElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;childArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Children&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;figCaptionChild&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;childArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;isReactElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;figcaption&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;preChild&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;childArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;isReactElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pre&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleCopyClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;codeBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;figureRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;codeBlock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;codeNode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;codeBlock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;code&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;codeNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clipboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;codeNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;figure&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;figureRef&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;rest&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;figCaptionChild&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isValidElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;figCaptionChild&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FigureCaption&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;figCaptionChild&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;handleCopyClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleCopyClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;preChild&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This component does the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Finds the figcaption and pre elements among its children&lt;/li&gt;
&lt;li&gt;Implements a handleCopyClick function to copy the code content&lt;/li&gt;
&lt;li&gt;Renders a custom FigureCaption component with the copy button
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FigureCaption&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleCopyClick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;rest&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isCopied&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsCopied&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setIsCopied&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;handleCopyClick&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setIsCopied&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;figcaption&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;rest&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex items-center justify-between"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isCopied&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;CopiedSVG&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;CopySVG&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;figcaption&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usages
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MDXRemote&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next-mdx-remote&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Figure&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Figure&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MDXComponents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...other components&lt;/span&gt;
  &lt;span class="na"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Figure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RenderContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MDXRemote&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;snippet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;MDXComponents&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally rendered codeblock will look like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qhs1f93zuo6vbtub289.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qhs1f93zuo6vbtub289.png" alt="Final Codeblock" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.vaishnavs.xyz/blog/syntax-highlight-with-shiki#implementing-syntax-highlighting" rel="noopener noreferrer"&gt;Try demo here&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Currency Converter | Javascript Build</title>
      <dc:creator>Vaishnav </dc:creator>
      <pubDate>Sat, 02 Jan 2021 12:52:38 +0000</pubDate>
      <link>https://dev.to/vaishnavs/currency-converter-javascript-build-1ia</link>
      <guid>https://dev.to/vaishnavs/currency-converter-javascript-build-1ia</guid>
      <description>&lt;h3&gt;
  
  
  3rd Project for Javascript Build.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X0F0gNVb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i62wdoc7eq9bdsj2sdtf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X0F0gNVb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i62wdoc7eq9bdsj2sdtf.jpg" alt="Converter Mockup" width="880" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;a href="https://vaishnavme.github.io/builds-Javascript/Currency-Converter/"&gt;Live Demo&lt;/a&gt;
&lt;/h1&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/vaishnavme"&gt;
        vaishnavme
      &lt;/a&gt; / &lt;a href="https://github.com/vaishnavme/builds-Javascript"&gt;
        builds-Javascript
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Vanilla Javascript Projects
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  learnings
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Special way to work with promises &lt;b&gt;&lt;a href="https://javascript.info/async-await"&gt;Async/Await&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adding option to &lt;code&gt;HTML select&lt;/code&gt; using Javascript.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you built your version of them please tag me, I would love to try them out.&lt;/p&gt;

&lt;p&gt;Find any bugs or have any suggestion please Write to me.&lt;/p&gt;

&lt;h4&gt;
  
  
  Let's Connect 😄
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/vaishnav-chandurkar/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gYVrQ85t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.shields.io/badge/linkedin%2520-%25230077B5.svg%3F%26style%3Dfor-the-badge%26logo%3Dlinkedin%26logoColor%3Dwhite" width="107" height="28"&gt;&lt;/a&gt;&lt;a href="https://dev.to/vaishnavme"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A0mL1ZsE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.shields.io/badge/DEV-black.svg%3Fstyle%3Dfor-the-badge" alt="Generic badge" width="48" height="28"&gt;&lt;/a&gt;&lt;a href="https://twitter.com/vaishnav21_?s=09"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g6QQSNPo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.shields.io/badge/Twitter%2520-%25231DA1F2.svg%3F%26style%3Dfor-the-badge%26logo%3DTwitter%26logoColor%3Dwhite" width="100" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>100daysofcode</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Cash Register Manager | Javascript Build</title>
      <dc:creator>Vaishnav </dc:creator>
      <pubDate>Tue, 29 Dec 2020 10:13:59 +0000</pubDate>
      <link>https://dev.to/vaishnavs/cash-register-manager-javascript-build-3mac</link>
      <guid>https://dev.to/vaishnavs/cash-register-manager-javascript-build-3mac</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I'm trying to build various tools that helps us daily.&lt;br&gt;
So, In any local store you can find Cash Register and I built it using Vanilla JavaScript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Cash Register Manager
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyt1v26dktbfvnxqij49s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyt1v26dktbfvnxqij49s.jpg" alt="Cash Register Mockup"&gt;&lt;/a&gt;&lt;br&gt;
&lt;small&gt;This is first time I'm creating Mockup&lt;/small&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  &lt;a href="https://vaishnavme.github.io/builds-Javascript/Cash-Register/" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt;
&lt;/h1&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/vaishnavme" rel="noopener noreferrer"&gt;
        vaishnavme
      &lt;/a&gt; / &lt;a href="https://github.com/vaishnavme/builds-Javascript" rel="noopener noreferrer"&gt;
        builds-Javascript
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Vanilla Javascript Projects
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I'm going to create series of post, with about Simple JavaScript apps. All of them are Open Source.&lt;/p&gt;

&lt;p&gt;If you built your version of them please tag me, I would love to try them out.&lt;/p&gt;

&lt;p&gt;Find any bugs or have any suggestion please Write to me.&lt;/p&gt;

&lt;h4&gt;
  
  
  Let's Connect 😄
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/vaishnavme" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FGithub-black.svg%3Fstyle%3Dfor-the-badge" alt="Generic badge"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/vaishnavme"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FDEV-black.svg%3Fstyle%3Dfor-the-badge" alt="Generic badge"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/vaishnav21_?s=09" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FTwitter-blue.svg%3Fstyle%3Dfor-the-badge" alt="Generic badge"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>100daysofcode</category>
      <category>webdev</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Storing theme state in localStorage</title>
      <dc:creator>Vaishnav </dc:creator>
      <pubDate>Sat, 26 Dec 2020 15:18:12 +0000</pubDate>
      <link>https://dev.to/vaishnavs/storing-theme-state-in-localstorage-ee5</link>
      <guid>https://dev.to/vaishnavs/storing-theme-state-in-localstorage-ee5</guid>
      <description>&lt;p&gt;Creating Dark-Light mode for website and storing user preferred theme state to local storage. &lt;/p&gt;

&lt;p&gt;So, Earlier I wrote a post about creating Dark-Light mode theme for website. Explaining how it work, way to create it.&lt;br&gt;
But, Problem with that code is when you refresh or if site have multiple pages and you go to another page, theme revert back to it's default theme. &lt;em&gt;We don't want that&lt;/em&gt; .&lt;/p&gt;
&lt;h1&gt;
  
  
  Let's Solve this problem
&lt;/h1&gt;



&lt;p&gt;I tweak original code. &lt;/p&gt;
&lt;h3&gt;
  
  
  Our HTML
&lt;/h3&gt;

&lt;p&gt;Simple tiny HTML code.&lt;br&gt;
&lt;code&gt;&amp;lt;a type="button" class="nav-item theme" id="theme-toggle"&amp;gt;🌚&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Now the CSS
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Default Light theme color pallet
:root {
    --bg-color: #ffffff; 
    --bg-light: #e3fdfd;

    --font-color:#1f2933;   
    --font-light: #000000;
}
// Dark theme color pallet
body.dark-theme {
    --bg-color: #111216; 
    --bg-light: #24252c;

    --font-color: #9999b3;   
    --font-light: #fff;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  The JavaScript part
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const themeToggle = document.querySelector("#theme-toggle");

const currentTheme = localStorage.getItem("theme");
const pageTheme = document.body;

let isDark = true

if (currentTheme == "dark") {
  pageTheme.classList.add("dark-theme");
  themeToggle.innerText="🌞";
} else {
    themeToggle.innerText = "🌚"
}

function themeMode() {
    isDark = !isDark;
    isDark ? themeToggle.innerText = "🌚" : themeToggle.innerText = "🌞";
    pageTheme.classList.toggle("dark-theme");

    let theme = "light";
    if (pageTheme.classList.contains("dark-theme")) {
      theme = "dark";
    }
    localStorage.setItem("theme", theme);
}

themeToggle.addEventListener("click", themeMode)

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

&lt;/div&gt;

&lt;h3&gt;
  
  
  What is localStorage?
&lt;/h3&gt;

&lt;p&gt;The localStorage properties allow to save key/value pairs in a web browser. The localStorage property is read-only.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;h5&gt;
  
  
  For storing data to localStorage.
&lt;/h5&gt;

&lt;p&gt;&lt;code&gt;localStorage.setItem("key", "value");&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;
  
  
  For reading data from localStorage.
&lt;/h5&gt;

&lt;p&gt;&lt;code&gt;var lastname = localStorage.getItem("key");&lt;/code&gt;&lt;br&gt;
Learn more about &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage"&gt;localStorage&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  What is toggle?
&lt;/h3&gt;

&lt;p&gt;toggle is method of DOMTokenList() interface.&lt;br&gt;
It remove token from token list and return false.&lt;br&gt;
If token doesn't exist, then it add token and return true.&lt;/p&gt;
&lt;h3&gt;
  
  
  What's happening here?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;By default our theme is Light.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This part of code check if user already changed theme or has seleted theme, by getting theme data from localStorage.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const currentTheme = localStorage.getItem("theme");
if (currentTheme == "dark") {
  pageTheme.classList.add("dark-theme");
  themeToggle.innerText="🌞";
} else {
    themeToggle.innerText = "🌚"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;themeToggle.innerText&lt;/code&gt; is our button. We are changing emoji if it's Light Mode then emoji is Moon🌚. and if it's Dark Mode then emoji is Sun🌞.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When we click our button to change theme, it add &lt;code&gt;dark-theme&lt;/code&gt; class to &lt;code&gt;body&lt;/code&gt; tag. Dark theme color pallet is applied to site.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It set's current theme to localStorage, using &lt;code&gt;localStorage.setItem("theme", theme);&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Here's pen&lt;/p&gt;

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

</description>
    </item>
    <item>
      <title>Zen Music Player | Javascript Build</title>
      <dc:creator>Vaishnav </dc:creator>
      <pubDate>Sun, 13 Dec 2020 06:33:03 +0000</pubDate>
      <link>https://dev.to/vaishnavs/zen-beats-player-3b8m</link>
      <guid>https://dev.to/vaishnavs/zen-beats-player-3b8m</guid>
      <description>&lt;p&gt;Hey Everyone, I started with Project based learning. Idea is to build project, at every step of your learning. &lt;/p&gt;




&lt;blockquote&gt;
&lt;h3&gt;
  
  
  I set myself goal:
&lt;/h3&gt;

&lt;p&gt;For every weekend, I try working on new project or write a blog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This weekend I bulit Music Player using Vanilla Javascript. This is how it turns out...&lt;/p&gt;




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

&lt;p&gt;&lt;a href="https://zenbeats.netlify.app" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt; &lt;br&gt;
&lt;a href="https://github.com/vaishnavme/Zen-lofi-beats-player" rel="noopener noreferrer"&gt;Source Code&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Give it try...&lt;br&gt;
If you made your version of Record player do tag me. I love to see your version.&lt;br&gt;
It would really great to hear your Feedback and Suggestions 😃. &lt;/p&gt;

&lt;h4&gt;
  
  
  Let's Connect 😄
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/vaishnavme" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FGithub-black.svg%3Fstyle%3Dfor-the-badge" alt="Generic badge"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/vaishnavme"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FDEV-black.svg%3Fstyle%3Dfor-the-badge" alt="Generic badge"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/vaishnav21_?s=09" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FTwitter-blue.svg%3Fstyle%3Dfor-the-badge" alt="Generic badge"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>css</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Simple Dark-Light theme with VanillaJs</title>
      <dc:creator>Vaishnav </dc:creator>
      <pubDate>Wed, 09 Dec 2020 12:59:34 +0000</pubDate>
      <link>https://dev.to/vaishnavs/simple-dark-light-toggle-with-vanillajs-2cbj</link>
      <guid>https://dev.to/vaishnavs/simple-dark-light-toggle-with-vanillajs-2cbj</guid>
      <description>&lt;p&gt;Dark mode designs and functionality that enable to toggle between Dark and Light theme is trending UI/UX Design🔥. So, here's the guide to create Simple dark-light toggle.&lt;br&gt;
I wanted this to be simple so I didn't create any fancy toggle switch just use simple button.&lt;br&gt;
&lt;small&gt;Codepen at end.🤖&lt;/small&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Let's Start with HTML
&lt;/h3&gt;

&lt;p&gt;I'm using list for navbar elements, so&lt;br&gt;
&lt;code&gt;&amp;lt;li class="nav-item" id="toggle"&amp;gt;🌞&amp;lt;/li&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and we are done with HTML. let's do CSS&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// by default dark theme

:root {
    --bg-color: #171923;
    --bg-light: #232535;
    --font-color: #c5cddb;
    --font-light: #ffffff;
}

// light theme colors

.lightMode {
  --bg-color: #E8E6DC;
  --bg-light: #DCDACA;
  --font-color: #3D3D3D;
  --font-light: #202020;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;lightMode&lt;/code&gt; is class which would be added to body using js.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Part - Javascript
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const toggle = document.querySelector("#toggle");
toggle.addEventListener("click", modeSwitch);

let isLight = true;

function modeSwitch() {
  isLight = !isLight;
  isLight ? toggle.innerText = "🌞" : toggle.innerText = "🌚";
  var rootElement = document.body;
  rootElement.classList.toggle("lightMode");
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;b&gt;What is toggle?&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;toggle is method of &lt;code&gt;DOMTokenList() interface.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;It remove token from token list and return false.&lt;/li&gt;
&lt;li&gt;If token doesn't exist, then it add token and return true.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;What is happening?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;When we click on toggle button, event listener respond to it and call &lt;code&gt;modeSwitch()&lt;/code&gt; function. In &lt;code&gt;modeSwitch()&lt;/code&gt; function, class &lt;code&gt;lightMode&lt;/code&gt; is added to body activating &lt;code&gt;lightMode&lt;/code&gt; color schema. &lt;/p&gt;




&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/vaishnav21/embed/YzGGZYe?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;br&gt;
Contribution &lt;a class="mentioned-user" href="https://dev.to/casiimir"&gt;@casiimir&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are different ways to crate dark-light mode toggle. This one simple way I found out to explain how it work. &lt;br&gt;
Love to here your suggestions and feedback🤩.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>html</category>
      <category>css</category>
    </item>
    <item>
      <title>Embed Dev.to blog post with vanilla-JS</title>
      <dc:creator>Vaishnav </dc:creator>
      <pubDate>Sat, 05 Dec 2020 06:43:43 +0000</pubDate>
      <link>https://dev.to/vaishnavs/embed-dev-to-blog-post-with-vanilla-js-11fj</link>
      <guid>https://dev.to/vaishnavs/embed-dev-to-blog-post-with-vanilla-js-11fj</guid>
      <description>&lt;p&gt;Easiest guide to embed Dev.to blog post to your personal website using Javascript.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Recently, I started writing blog and also working on my portfolio. Portfolio is best way to showcase your Project, Technical blogs and more.. &lt;br&gt;
I'm working on portfolio site and hosting it using Github and Netlify. &lt;strong&gt;No Framework&lt;/strong&gt;&lt;br&gt;
It's static site, and I didn't want to manually update HTML every time I write blog, So here's solution I find out.&lt;br&gt;
&lt;em&gt;&lt;small&gt;Codepen at the end&lt;/small&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Let's Start 🤘
&lt;/h2&gt;

&lt;p&gt;First thing I need is API to get data from Dev.to, I googled little bit and find the API.&lt;br&gt;
&lt;code&gt;https://dev.to/api/articles?username=&lt;/code&gt;&lt;br&gt;
We don't need to give any other &lt;em&gt;key:value&lt;/em&gt; just your username.&lt;/p&gt;
&lt;h4&gt;
  
  
  Here's the HTML
&lt;/h4&gt;

&lt;p&gt;&lt;small&gt;clean simple and small&lt;/small&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flwii1wzw1abpsq2gzg5t.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flwii1wzw1abpsq2gzg5t.jpeg" alt="HTML syntex"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h4&gt;
  
  
  Working with JS
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Initial Declaration&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqwnnibavgtjo0qxitpwd.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqwnnibavgtjo0qxitpwd.jpeg" alt="Initial Decleration"&gt;&lt;/a&gt;&lt;br&gt;
&lt;code&gt;blogPos&lt;/code&gt; is div where we want to show all our blog data.&lt;br&gt;
You should assign your Dev.to &lt;code&gt;username&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creating helper functions&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;We are going to create few HTML elements using javascript. To create element we have method &lt;code&gt;document.createElement()&lt;/code&gt;. &lt;br&gt;
&lt;code&gt;createNode()&lt;/code&gt;- creating element.&lt;br&gt;
&lt;code&gt;append()&lt;/code&gt;- append element.&lt;br&gt;
It's not necessary to create this function, I create them to make code simpler.&lt;br&gt;
Create ul for list of elements.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const ul = createNode('ul');
ul.classList.add("blog-feed");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Important Part
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdrbdh2y2a4h3cpq42rli.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdrbdh2y2a4h3cpq42rli.png" alt="js-1"&gt;&lt;/a&gt;&lt;br&gt;
I create &lt;code&gt;buildURL()&lt;/code&gt; function for API url with our username. It is assign to finalURL. This is our &lt;code&gt;buildURL()&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function buildURL(userName) {
  return `${api}username=${userName}`;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now fetch, fetches and we get response in object with series of methods. There are different methods, here we use JSON as we want to handle our data as JSON object.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I use &lt;code&gt;posts.length = 5&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;
Basic: Want to limit number of post we want to show.&lt;br&gt;
Suppose you have 10-15 blog post, the fetch API will get every one of them. You can change how many post you want to show.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;posts.forEach()&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
For every post we are going to create elements. &lt;small&gt; Look,at that clean code🤩 PS: Still room for improvement.&lt;/small&gt;&lt;/p&gt;



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

&lt;p&gt;&lt;code&gt;a.target = 'blank&lt;/code&gt; - to open blog link in new tab.&lt;br&gt;
&lt;code&gt;p.classList.add()&lt;/code&gt; - to add class to p tag.&lt;br&gt;
&lt;code&gt;a.href = post.url&lt;/code&gt; - giving post url link to a:href tag.&lt;br&gt;
&lt;code&gt;a.innerText = 'post.title'&lt;/code&gt; - post title to a tag inner text.&lt;br&gt;
&lt;code&gt;p.innerText = 'post.description'&lt;/code&gt; post description to paragraph.&lt;br&gt;
You can add more thing, like publish date, time, #tags, public reactions. So here I add public reactions.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;small.innerText = '💕 ' + post.public_reactions_count;&lt;/code&gt;&lt;br&gt;
Now appending part,&lt;br&gt;
li &amp;lt;- h2 &amp;lt;- a&lt;br&gt;
li &amp;lt;- p&lt;br&gt;
li &amp;lt;- small and&lt;br&gt;
ul &amp;lt;- li&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;append(h2, a);
append(li, h2);
append(li, p);
append(li, small);
append(ul, li);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;append(blogPos, ul)&lt;/code&gt;&lt;/strong&gt; - Adding this list to div element.&lt;/p&gt;




&lt;p&gt;&lt;small&gt;&lt;strong&gt;One thing&lt;/strong&gt; Always create error handle. I didn't create error handler here.&lt;small&gt;&lt;/small&gt;&lt;/small&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  Here's the pen
&lt;/h2&gt;

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

&lt;p&gt;Hope this article helped you. If you have any suggestions or find any mistake please write to me.😃&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>portfolio</category>
      <category>html</category>
      <category>css</category>
    </item>
    <item>
      <title>Displaying loading animation on Fetch API calls</title>
      <dc:creator>Vaishnav </dc:creator>
      <pubDate>Wed, 02 Dec 2020 08:50:55 +0000</pubDate>
      <link>https://dev.to/vaishnavs/displaying-loading-animation-on-fetch-api-calls-1e5m</link>
      <guid>https://dev.to/vaishnavs/displaying-loading-animation-on-fetch-api-calls-1e5m</guid>
      <description>&lt;p&gt;In web development, one of the most important part is to use REST api. When I start working on api with vanilla JS, I noticed small time difference between call and response. It's good practice to show end user something is happening after his interaction with website.&lt;br&gt;
So here's the guide of showing &lt;strong&gt;&lt;em&gt;loading animation on fetch api calls with vanilla JS.&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Let's get started&lt;/p&gt;
&lt;h4&gt;
  
  
  HTML
&lt;/h4&gt;

&lt;p&gt;Let's start with html.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fo43wzy3o8ay5ltcgugo7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fo43wzy3o8ay5ltcgugo7.jpg" alt="HTML"&gt;&lt;/a&gt;&lt;br&gt;
&lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; to get user input.&lt;br&gt;
&lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;   to submit data.&lt;br&gt;
&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;       to display response.&lt;/p&gt;

&lt;p&gt;We are displaying loading animation using &lt;code&gt;&amp;lt;div id="loading"&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;. This element is hidden by default. We are going to manipulate it, to show or hide it according our requirement.&lt;/p&gt;
&lt;h4&gt;
  
  
  Creating loader animation CSS
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0obq4noz12002n83mjxd.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0obq4noz12002n83mjxd.jpeg" alt="Stylesheet for loader"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Working with Javascript
&lt;/h4&gt;

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

&lt;p&gt;In &lt;code&gt;function displayLoading()&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;loader.className = "display";&lt;/code&gt; this will add &lt;em&gt;display&lt;/em&gt; class to&lt;br&gt;
&lt;code&gt;&amp;lt;div id="#loading"&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;, which turn &lt;code&gt;visibility: visible;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We are using &lt;code&gt;setTimeout&lt;/code&gt; to hide loading animation after 5 second. Sometimes we may get late response, then timeout time should be increased.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, when &lt;code&gt;displayLoading()&lt;/code&gt; called it will display loading animation and when &lt;code&gt;hideLoading()&lt;/code&gt; called it will hide loading animation setting &lt;code&gt;visibility: hidden;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now for remaining JS&lt;br&gt;
This part is straight forward. &lt;code&gt;fetchHandler()&lt;/code&gt; to fetch data from api.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;code&gt;url&lt;/code&gt; I'm using is dummy url which only return 'Testing, you are' for any input.&lt;/em&gt;&lt;/p&gt;

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



&lt;p&gt;Here's the pen.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Hey there, I'm #codenewbie, started documenting my journey of learning. Any suggestions are welcome&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>html</category>
      <category>css</category>
    </item>
  </channel>
</rss>
