<?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: Kirill Inoz</title>
    <description>The latest articles on DEV Community by Kirill Inoz (@kirillinoz).</description>
    <link>https://dev.to/kirillinoz</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%2F554260%2Ff09de193-f8cb-462a-be40-3aef573d4b1e.png</url>
      <title>DEV Community: Kirill Inoz</title>
      <link>https://dev.to/kirillinoz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kirillinoz"/>
    <language>en</language>
    <item>
      <title>My First Experience with Three.js</title>
      <dc:creator>Kirill Inoz</dc:creator>
      <pubDate>Tue, 22 Nov 2022 12:35:31 +0000</pubDate>
      <link>https://dev.to/kirillinoz/my-first-experience-with-threejs-15d8</link>
      <guid>https://dev.to/kirillinoz/my-first-experience-with-threejs-15d8</guid>
      <description>&lt;p&gt;I was interested in Three.js for a long time. It was back in February when I saw &lt;a href="https://bruno-simon.com/" rel="noopener noreferrer"&gt;Bruno Simon's 3D portfolio&lt;/a&gt;, where you drift through his projects and other information on a car. You should check it out afterwards if you haven't. &lt;strong&gt;It's amazing&lt;/strong&gt;. At that time, I just got into learning Vue and I wanted to concentrate on getting more familiar with it than to start learning a new framework.&lt;/p&gt;

&lt;p&gt;So a few weeks ago, I finally had time to get into Three.js. But on its own, it looked very complicated. So I checked out &lt;strong&gt;Trois.js&lt;/strong&gt;. It implements Three.js into a more familiar environment of Vue.js. After some experiments, I got into brainstorming ideas. I've never done a form before, so I decided to go with this idea, but using Three.js make it more interesting for people to fill out.&lt;/p&gt;

&lt;p&gt;With the goal set, I warmed up to the idea of having a Mystery Box which would have a form element on each side and when you fill out one side it would go to the other, until you've completed it and the box would open revealing something interesting. I had to scrap this idea after understanding that it would be pretty difficult to project a 2D element on a 3D element in the way that would look good. But I decided to stick to this topic and here's what I did.&lt;/p&gt;

&lt;p&gt;After using my favourite research buddy &lt;em&gt;Google&lt;/em&gt;, I found a Lucky Block model on the internet which I decided to implement beside my form. And let the camera rotate around the z-axis of the block, but to make it more interesting, I added some variables which would multiply its rotating speed by looking at how many form fields were filled out.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;GltfModel&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"../../assets/LuckyBlock.glb"&lt;/span&gt; &lt;span class="na"&gt;:visible=&lt;/span&gt;&lt;span class="s"&gt;"LBvisible"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;LBvisible&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="nf"&gt;mounted&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setInterval&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To not waste any time designing a form, as the main target of the project was getting more familiar with Three.js, I found an existing form design on Figma (&lt;a href="https://www.figma.com/community/file/992788557716887114" rel="noopener noreferrer"&gt;The Perfect Input Field Kit&lt;/a&gt;) which I then implemented into the website.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1632751241345%2FIlAPruIX4.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1632751241345%2FIlAPruIX4.png" alt="One.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Afterwards, I assigned an event (&lt;em&gt;keydown&lt;/em&gt; for typing inputs and &lt;em&gt;change&lt;/em&gt; for selection inputs) to each input element in the form. Like that, I could check if the field was filled or not and speed up the rotation of the block accordingly.&lt;/p&gt;

&lt;p&gt;Now the only thing was to add a reward that would appear out of the block. I decided to go with a cake model I found on the web. I added a simple animation which would:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Shrink the block (aka zoom out the camera)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Replace the block with the cake&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enlarge the block (aka zoom in the camera)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's how it works:&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="nf"&gt;onSubmit&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;zoomOutInterval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Enlarge the distance between the object and the camera&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="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="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;zoomOutInterval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;// Set the rotation speed of the camera back to normal&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="c1"&gt;// Hide the Lucky Block&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LBvisible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="nf"&gt;zoomIn&lt;/span&gt;&lt;span class="p"&gt;()&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;zoomIn&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;zoomInInterval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="c1"&gt;// Shrink the distance between the object and the camera&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;9&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="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;zoomInInterval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c1"&gt;// Correct the distance&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&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="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Besides the block, the form disappears as well. Instead, you can see a little message which thanks the user for filling out the form, nothing extraordinary.&lt;/p&gt;

&lt;p&gt;I still have some issues with the loading time for my models, which take approximately 2-3 minutes (differentiates upon the internet connection) to load. So besides the link to the website, I'll also leave a little clip which shows all the possible interactions with this website, so you don't have to wait an eternity. 😅&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/aYQQ_VDS7tI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can check out the website here 👉 &lt;a href="//luckyform.netlify.app"&gt;Lucky Form&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check out the code here 👉 &lt;a href="https://github.com/kirillinoz/lucky-form-threejs" rel="noopener noreferrer"&gt;Lucky Form (Code)&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finally, I just want to add that I really like this technology and I see myself using it in the future, especially for projects where 3D models are necessary. Although this technology is still fairly new and there are not a lot of good tutorials on the internet, the &lt;a href="https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; is clear and helpful.&lt;/p&gt;

&lt;p&gt;Thanks for reading! ♥&lt;/p&gt;




&lt;p&gt;If you like this article, consider following me on &lt;a href="https://twitter.com/Inkuantum" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;. I post tips around web development and progress on my projects. If you have any questions, my DMs on Twitter are always open.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>threejs</category>
      <category>vue</category>
    </item>
    <item>
      <title>My 100DaysOfCode in a nutshell 🥜</title>
      <dc:creator>Kirill Inoz</dc:creator>
      <pubDate>Thu, 15 Jul 2021 13:28:35 +0000</pubDate>
      <link>https://dev.to/kirillinoz/my-100daysofcode-in-a-nutshell-17mn</link>
      <guid>https://dev.to/kirillinoz/my-100daysofcode-in-a-nutshell-17mn</guid>
      <description>&lt;p&gt;At the end of November 2020, I became more active on Twitter. I started to follow more content creators and just great people who gave me insides and tips about a fairly new domain for me called web development. This was the time when I also found the 100DaysOfCode challenge. Although I saw a lot of great projects people were working on as part of this challenge, I still didn't want to participate in it. The main excuse was lack of time, which was caused by school (so I thought at that time). But with a new lockdown announced at the start of December and a new course by &lt;a href="https://twitter.com/florinpop1705"&gt;Florin Pop&lt;/a&gt; and &lt;a href="https://twitter.com/traversymedia"&gt;Brad Traversy&lt;/a&gt; all the stars aligned for me to start with this challenge.&lt;/p&gt;

&lt;p&gt;So this is "My 100DaysOfCode in a nutshell 🥜".&lt;/p&gt;

&lt;h3&gt;
  
  
  From Day 1 to Day 50
&lt;/h3&gt;

&lt;p&gt;The challenge began on December 4th when I started with the course "50ProjectsIn50Days". This course is made by the people I mentioned above and is oriented to practising the fundamentals of HTML, CSS and JavaScript. I found this very useful as I was lacking experience, especially in the JavaScript sector. Another beauty of this course was its perfect match to the 100DaysOfCode challenge, as I wouldn't need to plan anything for the first half of my challenge.&lt;/p&gt;

&lt;p&gt;So that's what I did. I followed this course and worked every day on a new project. Most of the projects took me about 20-30 minutes to complete. But I didn't stop there...&lt;/p&gt;

&lt;p&gt;Another blessing of this course was the creative part. Because the projects are so small, you have enough possibilities and time to customize your projects. I took another 20-30 minutes for customizations. I tried to keep them simple but also useful in the context of the current project. Sometimes it was a design change, other times an additional functionality, I tried everything.&lt;/p&gt;

&lt;p&gt;After finishing this course, I was confident enough to try out a framework. I chose Vue.&lt;/p&gt;

&lt;h3&gt;
  
  
  From Day 51 to Day 61
&lt;/h3&gt;

&lt;p&gt;To be honest, it wasn't my first encounter with Vue. But it was the first time that I was building a fully fledged web application with this framework.&lt;/p&gt;

&lt;p&gt;I decided to build a weather application, as I wanted to try to incorporate some kind of Rest API into my app. To make it more interesting and different from other weather applications, I saw out there, I decided to use glassmorphism as the main design theme. I read a lot about it in the past and found some great websites which made it easier to create glass panels with CSS.&lt;/p&gt;

&lt;p&gt;I didn't have any big problems building it and in just 10 days of code I finished it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you want to find out more about glassmorphism and why you should use it, check out my blog post 👉 &lt;a href="https://dev.to/inkuantum/glassmorphism-what-s-so-interesting-about-it-4fb0"&gt;Glassmorphism - what's so interesting about it?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  From Day 62 to Day 68
&lt;/h3&gt;

&lt;p&gt;The next project I wanted to do was an e-commerce type of application. As product, I decided to go with fast food like sandwiches and additional drinks, deserts etc. The project consists of a landing page, menu and sandwich builder.&lt;/p&gt;

&lt;p&gt;To make the sandwich builder more authentic and realistic, I went on the Subway page and looked up ingredients they use in their sandwiches. When constructing your perfect sandwich, you're limited on how many ingredients you're able to choose. This is because a lot of companies do that to not run into any financial problems because the sandwich price stays consistent. The menu is split into two parts, the menu itself and a basket where you can see what products you have already selected.&lt;/p&gt;

&lt;p&gt;This was pretty much it. In the end, I never published the project as I didn't like how the design turned out.&lt;/p&gt;

&lt;h3&gt;
  
  
  From Day 69 to Day 71
&lt;/h3&gt;

&lt;p&gt;After the blow with Empare (that's what the last project was called), I decided to uplift my UI and CSS skills. I read more about design and followed more accounts which posted about it on Twitter. For a long time, I've been following &lt;a href="https://twitter.com/Prathkum"&gt;Pratham&lt;/a&gt; and &lt;a href="https://twitter.com/jh3yy"&gt;Jay&lt;/a&gt; on Twitter, who post beautiful CSS art. That's when I decided to try it out myself.&lt;/p&gt;

&lt;p&gt;There is not a lot to say about it except that it seemed more difficult than it actually was. Then I wrote a full breakdown of this project and published it on Hashnode and DevTo. It was my first blog post that really took off and received a lot of attention.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you want to find out more about this project, check out my blog post 👉 &lt;a href="https://dev.to/inkuantum/ukulele-with-css-1e12"&gt;Ukulele with CSS&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  From Day 72 to Day 90
&lt;/h3&gt;

&lt;p&gt;Besides ukulele, for which I created a CSS art, I have another passion which is football. For a long time, I wanted to create &lt;a href="http://www.higherlowergame.com/"&gt;The Higher Lower Game&lt;/a&gt; clone, but with footballers and their goals. The problem then was that I didn't know how to get the information (such as footballer's names, goals, etc.) and how to set up the backend. At this point of time, I already knew how to get the first one done and that's what I've directly taken care of as well as the frontend. The backend was completely new to me, so I decided to take &lt;a href="https://www.udemy.com/course/the-complete-nodejs-developer-course-2/"&gt;The Complete Node.js Developer Course&lt;/a&gt; on the side while working on the other things for this project. I learned about Node.js and Express that allowed me to finish this project.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you want to find out how I got the information on footballers for this project, check out my blog post 👉 &lt;a href="https://dev.to/inkuantum/web-scraping-with-puppeteer-kj7"&gt;Web Scraping with Puppeteer&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  From Day 91 to Day 100
&lt;/h3&gt;

&lt;p&gt;The last but not least is my current project - Circlist. It's a web app that allows you to gather people, you interact the most on Twitter with, in one or multiple lists. This isn't my first take on the Twitter API, but surely the biggest. The project nears its first beta-testing and likewise its final release. I already finished the application. The last thing to do is the landing page, which will take some time to design and then to build. So certainly not one I could complete in the last 10 days and which goes beyond this challenge.&lt;/p&gt;

&lt;p&gt;So that was "My 100DaysOfCode in a nutshell 🥜". Thanks for reading and have an amazing day! ♥&lt;/p&gt;

&lt;h3&gt;
  
  
  Where can I find these projects?
&lt;/h3&gt;

&lt;p&gt;50Projects50Days | &lt;a href="https://github.com/Inkuantum/50-projects-in-50-days"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Holo Weather | &lt;a href="https://holo-weather.netlify.app/"&gt;Website&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/Inkuantum/holo-weather"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Empare | Never published&lt;/p&gt;

&lt;p&gt;Ukulele | &lt;a href="https://ukulele-css.netlify.app/"&gt;Website&lt;/a&gt;, &lt;a href="https://codepen.io/inkuantum/pen/XWpKNOz"&gt;CodePen&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/Inkuantum/ukulele-css"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FootGuess | &lt;a href="https://soccerstatues.com/"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Circlist | Currently in works 🚧&lt;/p&gt;




&lt;p&gt;In case you want to try out 100DaysOfCode for yourself, you'll find out more information on the following website (&lt;a href="https://www.100daysofcode.com/"&gt;https://www.100daysofcode.com/&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;If you liked this article, consider following me on &lt;a href="https://twitter.com/Inkuantum"&gt;Twitter&lt;/a&gt;. I post tips around web development and progress on my projects. If you have any questions, my DMs on Twitter are always open.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iAANgteX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1626339263324/PrLP627fE.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iAANgteX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1626339263324/PrLP627fE.png" alt="buymecookie.png" width="290" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>javascript</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>Mario with CSS 🎨</title>
      <dc:creator>Kirill Inoz</dc:creator>
      <pubDate>Thu, 01 Jul 2021 14:24:45 +0000</pubDate>
      <link>https://dev.to/kirillinoz/mario-with-css-38o1</link>
      <guid>https://dev.to/kirillinoz/mario-with-css-38o1</guid>
      <description>&lt;p&gt;Without doubt, one of the most iconic characters in video game history is Mario. First he appeared in Donkey Kong (1981) before receiving his own game just four years later. This game became a massive success, so I'm pretty sure that you've seen, heard or even played it. Although it came out a long time before I was born, I still played it a couple of times. And is there any better way to pay homage to a legendary game than creating a CSS art for it?&lt;/p&gt;

&lt;h4&gt;
  
  
  Preparation
&lt;/h4&gt;

&lt;p&gt;First, I came up with the script for the animation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mario is standing on a platform. He's approached by Goomba. When Goomba touches him, Mario dies in his iconic way (move up and then drop down). Whole animation loops and starts from the beginning.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As with my last CSS art, I had to find a template to orientate myself. Last time it was my ukulele. I don't have any Mario merchandise lying around, so I went on the internet. I found original sprites of Mario's animation, so I decided to use these as well as sprites for Goomba's animation.&lt;/p&gt;

&lt;p&gt;Now it was clear, I had to create two images of Goomba, two images of Mario as well as an image of a platform, so five images in total.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pixel Art
&lt;/h4&gt;

&lt;p&gt;The game which comes from 1985 isn't unexpected to be made using pixel art, so I went for this approach for my CSS art as well. The best way to create pixel art in CSS is using box shadows. Although it's the best choice, it's not the easiest one if you have to do it by hand. You'll need to fill out box shadows for every pixel and filling out 16x16 fields could be pretty intimidating and boring.&lt;/p&gt;

&lt;p&gt;Luckily, there is a great website called &lt;a href="https://www.pixelartcss.com/"&gt;Pixel Art to CSS&lt;/a&gt; which takes all the dirty work away and only leaves you with the creative process.&lt;/p&gt;

&lt;p&gt;After drawing the characters and frames for their animation, I exported them as key frames into the project. I tried to do the same with the ground, but its size in comparison to the characters was too big, so I went with key frames for the ground as well. But because it had only one frame, it didn't make any difference visually. The scale was now fixed, so I counted that as a win.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qHD3oUWq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1624719486042/ay0egqHsE.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qHD3oUWq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1624719486042/ay0egqHsE.png" alt="sprites.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Placement and Animation
&lt;/h4&gt;

&lt;p&gt;Now the only thing left to do was placing our elements and animating them. For every element, I created a div to which I assigned the specific CSS class. I placed them on the screen like this using absolute position, as it was the easiest choice in this situation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f2d_ZhXB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1624720280294/mMyYxHiKN.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f2d_ZhXB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1624720280294/mMyYxHiKN.png" alt="animation.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last but not least are walking animation for Goomba and death animation for Mario. Using key frames, I mapped two points between which Goomba is going to walk (start of the platform and end of the platform). While in between, I timed the point when Goomba slightly touches Mario and that's when Mario's death animation should begin. To create the animation as well as to time it properly, I broke down the animation into three parts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Part One: Mario flies up&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Part Two: Mario falls down&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Part Three: Mario goes back up&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's pretty much it. From this point the animation loops back to beginning and as everyone knows a loop in an animation makes everything two times better.&lt;/p&gt;

&lt;p&gt;You can find the whole animation and code on the dedicated &lt;a href="https://codepen.io/inkuantum/pen/XWRrpMd"&gt;CodePen page&lt;/a&gt; for this project.&lt;/p&gt;

&lt;p&gt;Thanks for reading and have a great day! ♥&lt;/p&gt;




&lt;h6&gt;
  
  
  If you liked this article, consider following me on &lt;a href="https://twitter.com/Inkuantum"&gt;Twitter&lt;/a&gt;. I post tips around web development and progress on my projects. If you have any questions, my DMs on Twitter are always open.
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/inkuantum"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--osKLM-Ru--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1621926138327/Rpn-M4czP.png" alt="scrnli_25-05-2021_08-56-16.png" width="254" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>animation</category>
    </item>
    <item>
      <title>Web Scraping with Puppeteer 🎭</title>
      <dc:creator>Kirill Inoz</dc:creator>
      <pubDate>Thu, 27 May 2021 13:08:15 +0000</pubDate>
      <link>https://dev.to/kirillinoz/web-scraping-with-puppeteer-kj7</link>
      <guid>https://dev.to/kirillinoz/web-scraping-with-puppeteer-kj7</guid>
      <description>&lt;p&gt;Internet is a wide place full of information. Here you can find everything from cute kitten videos up to scientific researches. This information isn't only useful to us, but it could become vital for our websites and applications.&lt;/p&gt;

&lt;p&gt;There are a few ways to access the necessary data, Rest APIs, public databases and web scraping. Puppeteer is an awesome tool for getting the last one done. In this post, I want to help you discover this tool for yourself and show you what it's capable of.&lt;/p&gt;

&lt;p&gt;Let's get the first question out of the way.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's what the official documentation says. Complicated isn't it? In simpler terms, we're dealing with an invisible browser which is controlled via code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Show me the way!
&lt;/h3&gt;

&lt;p&gt;After installing the Puppeteer NPM package, you'll have to write some code and show Puppeteer where and which information you would like to get.&lt;/p&gt;

&lt;p&gt;Note that most of Puppeteer's methods are asynchronous, so you'll have to use an &lt;strong&gt;async function&lt;/strong&gt; or &lt;strong&gt;then method&lt;/strong&gt;. For upcoming examples, I'll stick to the first one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let's get some data!
&lt;/h3&gt;

&lt;p&gt;I think that the best method to learn something new is by practicing. So let's take an example for web scraping with Puppeteer and break it down. I'll try to explain every step as best as I can. But if you're stuck or you want to find out more about a specific method, I encourage you to check out the official &lt;a href="https://pptr.dev/"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For starters, we need to check if the website allows web scraping at all. For this, we will check if the website contains a &lt;strong&gt;robot.txt&lt;/strong&gt; file. If not, we are good to go. Otherwise, you'll see which restrictions are placed by the owner of the website.&lt;/p&gt;

&lt;p&gt;In this example we will be scraping some data from the official &lt;a href="https://www.premierleague.com/stats/top/players/goals"&gt;English Premier League&lt;/a&gt; website, to be more precise, a table of football players and their total amount of goals per season.&lt;/p&gt;

&lt;p&gt;With the following code we will launch our browser with a predefined viewport. And navigate to the website while leaving some time for all components to load at the end of the code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: websites may differ according to the client's viewport that's why it's important to predefine it.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&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;viewport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;defaultViewport&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;width&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1430&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;height&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;979&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;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;viewport&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;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;newPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.premierleague.com/stats/top/players/goals&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;waitForTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let's scrape the table we're seeing on the website. For that, we will use &lt;strong&gt;$$eval&lt;/strong&gt; to find all the table components using HTML elements as the selector and then getting the &lt;strong&gt;innerText&lt;/strong&gt; in each of the selected elements.&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="c1"&gt;//'tbody tr td' - selector&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;tableEls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$$eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tbody tr td&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tds&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;tds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;td&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;td&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;
&lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we just have an array filled up with all the strings that we could find in the table. We have empty strings and unnecessary spacing. We should also split this array into smaller arrays containing the data for each individual player and then create an object out of each array to make it easier to read and access for the front-end.&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="c1"&gt;//Modifications&lt;/span&gt;
&lt;span class="nx"&gt;tableEls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tableEls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nx"&gt;tableEls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tableEls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;tableEls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;chunkArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tableEls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;tableEls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tableEls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;//Final Arr To Save&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;seasonData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="c1"&gt;//Create an object&lt;/span&gt;
&lt;span class="nx"&gt;tableEls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&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;let&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nextID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;team&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;goals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;nextID&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
    &lt;span class="nx"&gt;seasonData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Close the browser at the end of your session&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Let's get some images!
&lt;/h3&gt;

&lt;p&gt;Now that we've collected our data about each and every footballer in the table, we could also use some images of each football player. The website, we were currently on, doesn't provide us with any photos, so let's start a new session and go to the well-known website which finds billions of photos across the whole internet. I'm talking about &lt;strong&gt;Google Images&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;First, we start a new session and open a new page. Then we use the array &lt;strong&gt;seasonData&lt;/strong&gt; to get the name of each footballer. The name needs some adjustment because we will pass it into an URL and any space has to be replaced with &lt;strong&gt;+&lt;/strong&gt;. Afterwards we will need to select the first image on the page. This can be done using &lt;strong&gt;XPath&lt;/strong&gt; which gives the shortest unique path to every element on a website. Then we select our element and get the image URL. In the end, we should add it as a property to our player object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;seasonData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;seasonData&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&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;search&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;+&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://www.google.com/search?tbm=isch&amp;amp;q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;imageSelect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;//*[@id="islrg"]/div[1]/div[1]/a[1]/div[1]/img&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;waitForXPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageSelect&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;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageSelect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;imageSrc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;imageURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;imageSrc&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now using Node's file system we can save our &lt;strong&gt;seasonData&lt;/strong&gt; array to a JSON file, pass the data to the front-end or create a Rest API.&lt;/p&gt;

&lt;h3&gt;
  
  
  More possibilities
&lt;/h3&gt;

&lt;p&gt;This example is just the tip of the iceberg. You can do other things with the Puppeteer library such as interact with elements, take screenshots and more. If you want to find out more about it, check out the official &lt;a href="https://pptr.dev/"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I hope I could waken interest in you to learn more about this awesome JavaScript library.&lt;/p&gt;

&lt;p&gt;Thank you for your time! ❤&lt;/p&gt;




&lt;h6&gt;
  
  
  If you liked this article, consider following me on &lt;a href="https://twitter.com/Inkuantum"&gt;Twitter&lt;/a&gt;. I post tips around web development and progress on my projects. If you have any questions, my DMs on Twitter are always open.
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/inkuantum"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--osKLM-Ru--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1621926138327/Rpn-M4czP.png" alt="scrnli_25-05-2021_08-56-16.png" width="254" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>puppeteer</category>
      <category>data</category>
    </item>
    <item>
      <title>Ukulele with CSS 🎨</title>
      <dc:creator>Kirill Inoz</dc:creator>
      <pubDate>Thu, 08 Apr 2021 11:32:44 +0000</pubDate>
      <link>https://dev.to/kirillinoz/ukulele-with-css-1e12</link>
      <guid>https://dev.to/kirillinoz/ukulele-with-css-1e12</guid>
      <description>&lt;p&gt;If you follow me on Twitter, you would probably know that I'm passionately learning to play ukulele. I always loved to listen to music but I was never interested in learning to play an instrument or even thinking of creating my own music. But that changed in the recent years and now I'm a proud owner of an ukulele.&lt;/p&gt;

&lt;p&gt;Another thing that I really wanted to try out for a long time is CSS art. I saw a lot of beautiful art pieces on Twitter and they really inspired me to create my own. That's how I combined programming and music in this art piece.&lt;/p&gt;

&lt;h1&gt;
  
  
  HTML &amp;amp; CSS
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Body
&lt;/h3&gt;

&lt;p&gt;First I created the body of the ukulele using a div and pseudo-elements (after and before).&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Bridge &amp;amp; Saddle
&lt;/h3&gt;

&lt;p&gt;Before adding the neck, I've added a bridge at the bottom of the body. Using a pseudo-element I also added a saddle on top of the bridge where the strings are going to end.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Neck
&lt;/h3&gt;

&lt;p&gt;Up next we have the neck of ukulele. It's a simple rectangular div.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Headstock
&lt;/h3&gt;

&lt;p&gt;After creating the neck it was time to put the headstock on top. In this case the pseudo elements are just purple circles which give ukulele's headstock an interesting shape.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Tuning pegs
&lt;/h3&gt;

&lt;p&gt;Now it was time to add the other end called turning pegs where the strings are going to be attached. I decided to split them into two rows with a pair in each row. Like that I could position them relative to each other.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Turners
&lt;/h3&gt;

&lt;p&gt;With the same method as mentioned before, I added the turners themselves.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Strings
&lt;/h3&gt;

&lt;p&gt;Now let's add the most important part the strings. Again positioned relative to each other but absolute in the global container. These are positioned exactly between the saddle and the nut.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Nut
&lt;/h3&gt;

&lt;p&gt;Not a lot to say about the nut, just a div positioned absolute in the global container.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Rest of the strings
&lt;/h3&gt;

&lt;p&gt;The part that took me the longest, I reckon. These are placed in a separate container. In this container they are placed absolute and under a specific angle, so they barely touch the pegs.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Frets
&lt;/h3&gt;

&lt;p&gt;A lot of divs positioned relative to each other and absolute in the global container.&lt;/p&gt;

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

&lt;h1&gt;
  
  
  Animation and Audio
&lt;/h1&gt;

&lt;p&gt;Now let's bring the whole thing to life with some animations and sounds. At first I wanted to make the strings realistic that means the animation would start at the point of interaction. But that would be too much effort for a project like this. So I went with a very simple animation in which the string would just move from side to side but get less momentum.&lt;/p&gt;

&lt;p&gt;For the sounds I took my ukulele and my phone. I recorded each string separately and assigned each audio to each string.&lt;/p&gt;

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

&lt;p&gt;If you want to try out the audio and animation, I made a separate &lt;a href="http://ukulele-css.netlify.app/" rel="noopener noreferrer"&gt;website&lt;/a&gt; for this CSS art (desktop only).&lt;/p&gt;

&lt;p&gt;If you want to use this art (with appropriate reference 😉), feel free to check it out on &lt;a href="https://codepen.io/inkuantum/pen/XWpKNOz" rel="noopener noreferrer"&gt;CodePen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank you for your time! ❤&lt;/p&gt;

&lt;h6&gt;
  
  
  If you liked this article, consider following me on &lt;a href="https://twitter.com/Inkuantum" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;. I post tips and progress on my projects such as this one. If you have any questions, my DMs on Twitter are always open.
&lt;/h6&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>javascript</category>
      <category>cssart</category>
    </item>
    <item>
      <title>Glassmorphism - what's so interesting about it?</title>
      <dc:creator>Kirill Inoz</dc:creator>
      <pubDate>Sun, 28 Feb 2021 14:35:50 +0000</pubDate>
      <link>https://dev.to/kirillinoz/glassmorphism-what-s-so-interesting-about-it-4fb0</link>
      <guid>https://dev.to/kirillinoz/glassmorphism-what-s-so-interesting-about-it-4fb0</guid>
      <description>&lt;p&gt;Design isn't something that stays the same forever. Old trends go, new trends replace them. It's constantly evolving.&lt;/p&gt;

&lt;p&gt;A relatively new trend on the web is &lt;strong&gt;Glassmorphism&lt;/strong&gt;. You can imagine it as taking a glass panel and putting it in front of a background. Give the glass a little bit of colour and a blur effect which result in the background changing completely when you're looking through the glass piece. Now add the information that you want to transmit to your user on top and voilà, you've got yourself a pretty looking glassmorphism UI.&lt;/p&gt;

&lt;p&gt;Is it all about pretty looking? Or is there more to it? Let's find out.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Minimalist design 🐁
&lt;/h3&gt;

&lt;p&gt;Minimalist design took over a while ago. We don't stuff the websites full of information anymore, instead we build in more white space, add more margin and sprinkle in some padding. This way the user doesn't feel attacked or pressured with information which could be very overwhelming.&lt;/p&gt;

&lt;p&gt;Glassmorphism gives you the possibility to do the same by spreading your information on a glass pane, leaving more space in between to see through the glass into an interesting background. &lt;/p&gt;

&lt;h3&gt;
  
  
  2) Focus user's attention 🔎
&lt;/h3&gt;

&lt;p&gt;By spreading your information on the glass pane, it would differentiate itself from your other content. So it can easily catch user's attention.&lt;/p&gt;

&lt;p&gt;The information on the glass pane would stand out even more because of the blur the background receives. The text, images or icons look even more sharpen and clear on a blurred background that's why they would be more attractive for the user than on a plain background.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P9IhzqKR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mfkyft5moj38wclhyhd3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P9IhzqKR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mfkyft5moj38wclhyhd3.png" alt="Alt Text" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Wow effect ✨
&lt;/h3&gt;

&lt;p&gt;Although we talked about some interesting points before which help you provide the information to the user in the best possible way, "pretty looking" could also bring its value to the table. Would a simple circle attract your attention? Probably not, but what about a circle that slowly fades away? Probably yes...&lt;/p&gt;

&lt;p&gt;That's why geometric forms are very beloved by glassmorphism enthusiasts. They are very strict but when you put them behind a glass pane they fade away. You can often see a part of a triangle behind the glass pane and a part stretching out of it. This gives the whole thing an antithesis of strict and lenient which gives it this &lt;strong&gt;Wow effect&lt;/strong&gt; ✨.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e62IXB9N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ltgfzr9b0wgk1w48mbsy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e62IXB9N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ltgfzr9b0wgk1w48mbsy.png" alt="Alt Text" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to create a glassmorphism design?
&lt;/h3&gt;

&lt;p&gt;I could share a code snippet right here of the CSS. But there are plenty of websites which help you generate a glassmorphism design which suits you the best. Here are some resources:&lt;/p&gt;

&lt;p&gt;▶ &lt;a href="https://glassmorphism.com/"&gt;Glassmorphism CSS Generator&lt;/a&gt;&lt;br&gt;
▶ &lt;a href="https://mdbootstrap.com/docs/standard/tools/design/masks/"&gt;CSS Masks &amp;amp; Glassmorphism Generator&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  ------------
&lt;/h6&gt;

&lt;h6&gt;
  
  
  The images are from my latest project 👉 &lt;a href="https://holo-weather.netlify.app/"&gt;Holo Weather&lt;/a&gt;
&lt;/h6&gt;

</description>
      <category>webdev</category>
      <category>design</category>
      <category>glassmorphism</category>
    </item>
    <item>
      <title>Creative Followers Count Display - Twitter API 🐦</title>
      <dc:creator>Kirill Inoz</dc:creator>
      <pubDate>Sun, 31 Jan 2021 11:57:08 +0000</pubDate>
      <link>https://dev.to/kirillinoz/creative-followers-count-display-twitter-api-21m6</link>
      <guid>https://dev.to/kirillinoz/creative-followers-count-display-twitter-api-21m6</guid>
      <description>&lt;p&gt;As you might know, Twitter has a large developer community which often makes use of a powerful tool Twitter is providing them with. I'm talking about Twitter API. Just by browsing through Twitter you can find a ton of bots and services which make use of this API. Another popular use-case that you can encounter are follower counts. They can be integrated into name, bio or banner of your profile. But they often look identical and boring - just some plain numbers.&lt;/p&gt;

&lt;p&gt;I was very interested in this type of project but I wanted to do something different, something more interesting.&lt;/p&gt;

&lt;p&gt;That's when I came up with the idea of a moving object which could represent my followers count. By adding some details and a story to it we get:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Gary the Snail who is hungry and wants to get to some food at the end of the road."&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%2F9iroybv5pog6yahs6zet.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%2F9iroybv5pog6yahs6zet.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So... how did I do it? How can you make your own version and what tools do you need?&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Here are the 5 main steps:
&lt;/h3&gt;

&lt;p&gt;1) Get the tokens for your app on &lt;a href="https://developer.twitter.com/" rel="noopener noreferrer"&gt;Twitter's developer page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;2) Use a library/add-on/module for Twitter integration. I've used &lt;a href="https://www.npmjs.com/package/twitter-lite" rel="noopener noreferrer"&gt;Twitter Lite&lt;/a&gt; for NodeJS. But there are also other possibilities.&lt;br&gt;
▶ Setup the authentication and check for the available endpoints (&lt;a href="https://developer.twitter.com/en/docs/api-reference-index" rel="noopener noreferrer"&gt;docs&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;3) Create your design for the banner using photo-editing software, I used Photoshop but you can use paint.net, GIMP, etc. Don't forget to subdivide your design into different layers and export them separately.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example:&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%2F8yb3h01lpw65ls5ch24p.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%2F8yb3h01lpw65ls5ch24p.png" alt="Different Parts"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4) Now it's time to get the followers count, create a single image out of the three above and update the profile banner:&lt;br&gt;
▶ Fetch the follower count using one of the two APIs: &lt;a href="https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-followers-ids" rel="noopener noreferrer"&gt;GET followers/ids&lt;/a&gt; or &lt;a href="https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-users-show" rel="noopener noreferrer"&gt;GET users/show&lt;/a&gt;&lt;br&gt;
▶ Use &lt;a href="https://www.npmjs.com/package/merge-images" rel="noopener noreferrer"&gt;Merge Images&lt;/a&gt; for NodeJS to merge the images in the right place. You'll probably need the scale function to map the moving object on top of the background. Here is a JavaScript example:&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%2Fj5lb33k6xiyxr55vcxsu.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%2Fj5lb33k6xiyxr55vcxsu.png" alt="Code Snippet"&gt;&lt;/a&gt;&lt;br&gt;
▶ To update the profile banner you should use &lt;a href="https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile_banner" rel="noopener noreferrer"&gt;POST account/update_profile_banner&lt;/a&gt; by sending the new Banner as a base64 format.&lt;/p&gt;

&lt;p&gt;5) Using a cron job you can repeat all the steps above in a specific duration you like.&lt;/p&gt;

&lt;p&gt;That's how I integrated a followers count in my profile banner. If you want to see it in action, you can check my &lt;a href="https://twitter.com/Inkuantum" rel="noopener noreferrer"&gt;Twitter profile&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're stuck or you want to use exactly the same version, I uploaded the source code to my &lt;a href="https://github.com/Inkuantum" rel="noopener noreferrer"&gt;GitHub page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This project was inspired by &lt;a href="https://dev.to/radnerus/twitter-api-is-followers-count-mda"&gt;Suren's post&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>node</category>
      <category>twitter</category>
    </item>
  </channel>
</rss>
