<?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: V</title>
    <description>The latest articles on DEV Community by V (@violetadev).</description>
    <link>https://dev.to/violetadev</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%2F64648%2F3a3c32c6-be1d-41ba-878e-7bac58acd489.jpg</url>
      <title>DEV Community: V</title>
      <link>https://dev.to/violetadev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/violetadev"/>
    <language>en</language>
    <item>
      <title>Finding the Wizard's Pet — KendoReact Free Components Challenge</title>
      <dc:creator>V</dc:creator>
      <pubDate>Sun, 28 Sep 2025 23:39:05 +0000</pubDate>
      <link>https://dev.to/violetadev/wizards-trial-kendoreact-free-components-challenge-2dge</link>
      <guid>https://dev.to/violetadev/wizards-trial-kendoreact-free-components-challenge-2dge</guid>
      <description>&lt;h1&gt;
  
  
  Wizard’s Trial — KendoReact Free Components Challenge
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Live Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;URL: &lt;a href="https://kendo-cyan.vercel.app/" rel="noopener noreferrer"&gt;https://kendo-cyan.vercel.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/violetadev/kendo" rel="noopener noreferrer"&gt;https://github.com/violetadev/kendo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&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%2F6z54gikp5yep5jb9fwm6.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%2F6z54gikp5yep5jb9fwm6.png" alt=" " width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I created a browser-based fantasy RPG mini-game where the player controls a young wizard apprentice who must progress through locations, talk with NPCs, and defeat monsters within a time limit.&lt;/p&gt;

&lt;p&gt;The problem I wanted to solve was: How do you make a simple, story-driven game playable directly in the browser with modern React tooling while keeping the UI consistent?&lt;/p&gt;

&lt;p&gt;The audience is anyone who enjoys casual pixel-art games or interactive storytelling, but the project is also aimed at developers looking to see how KendoReact components can be used beyond dashboards and forms — even in a game-like experience.&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%2Ftv4s7m1lcqu2kzixykam.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%2Ftv4s7m1lcqu2kzixykam.png" alt=" " width="800" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The outcome is a working prototype where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There are several levels with increased difficulty.&lt;/li&gt;
&lt;li&gt;Dialog flows naturally between player and NPCs.&lt;/li&gt;
&lt;li&gt;A fight sequence begins only after dialog is complete, has a timer and a HP bar showing the remaining health of the monster.&lt;/li&gt;
&lt;li&gt;A countdown timer creates urgency.&lt;/li&gt;
&lt;li&gt;Victories are logged, and results can be reviewed later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is styled and laid out using 10 KendoReact free components!&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%2F2rhu61fylovq590kkivi.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%2F2rhu61fylovq590kkivi.png" alt=" " width="800" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  KendoReact Free Components Used (10+)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Animation&lt;/li&gt;
&lt;li&gt;Common Utilities: Typography&lt;/li&gt;
&lt;li&gt;Dialogs: Window&lt;/li&gt;
&lt;li&gt;Dialogs: Dialog&lt;/li&gt;
&lt;li&gt;Progress Bars&lt;/li&gt;
&lt;li&gt;Inputs&lt;/li&gt;
&lt;li&gt;Buttons: Button&lt;/li&gt;
&lt;li&gt;Buttons: Group Button&lt;/li&gt;
&lt;li&gt;Layouts&lt;/li&gt;
&lt;li&gt;Indicators&lt;/li&gt;
&lt;li&gt;Notification&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  KendoReact usage details
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Animation&lt;br&gt;
The animation was mainly used to make the dialogs run smoother, using a push transition to show the next dialog.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Common Utilities: Typography&lt;br&gt;
The most used common utility was the typography, used for every text to give a coherent UI feeling and better readability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dialogs: Window&lt;br&gt;
The Window component was used to create a Hint component to provide instructions and give context to the users.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2F9r3fmzrhkugtknavkw8z.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%2F9r3fmzrhkugtknavkw8z.png" alt=" " width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dialogs: Dialog
The dialog component was used to allow the user to customize their character's name and to handle the game over notification when the user runs out of time.&lt;/li&gt;
&lt;/ol&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%2Fnvwp20z6ucid2me5ynwj.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%2Fnvwp20z6ucid2me5ynwj.png" alt=" " width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Progress bars
The progress bar was used to display the monster's overall health and display the damage the user was inputting. &lt;/li&gt;
&lt;/ol&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%2Ftjlo3p3wrw5wfm4ik29e.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%2Ftjlo3p3wrw5wfm4ik29e.png" alt=" " width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inputs
The input was used in the beginning to input the user's desired nickname for the adventure.&lt;/li&gt;
&lt;/ol&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%2Fbgglbhhjjr9n0196plzh.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%2Fbgglbhhjjr9n0196plzh.png" alt=" " width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buttons: Button
The buttons were used to advance the story and also show hints. It was extensively used for the user to be able to take action on different situation.&lt;/li&gt;
&lt;/ol&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%2Fcuk7ljdoalpbkevs1bdw.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%2Fcuk7ljdoalpbkevs1bdw.png" alt=" " width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buttons: Group Button
The group buttons were used to let the user select their favorite character. &lt;/li&gt;
&lt;/ol&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%2F2pe72si8aowty2ohdskv.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%2F2pe72si8aowty2ohdskv.png" alt=" " width="443" height="758"&gt;&lt;/a&gt;&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%2F1iarr4ej2cbsgkhv0llr.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%2F1iarr4ej2cbsgkhv0llr.png" alt=" " width="478" height="803"&gt;&lt;/a&gt;&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%2F9wbi3pzc7rgy5bink1yh.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%2F9wbi3pzc7rgy5bink1yh.png" alt=" " width="444" height="788"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Layouts
The layout component was used in every screen to help place the elements (characters, location, monsters).&lt;/li&gt;
&lt;/ol&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%2F1bfqvyo4g4m2zittmezb.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%2F1bfqvyo4g4m2zittmezb.png" alt=" " width="800" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Indicators: Loader
The loading indicator was used to load up the application in the beginning of the story.&lt;/li&gt;
&lt;/ol&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%2Fqke634o9ll2pwvazeh6o.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%2Fqke634o9ll2pwvazeh6o.png" alt=" " width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Notification
I used a notification on the Credits screen to show more info about me and where you can find me in Dev.to!&lt;/li&gt;
&lt;/ol&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%2Fjq8a6zlrojrvblmzeh2l.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%2Fjq8a6zlrojrvblmzeh2l.png" alt=" " width="800" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture / How It Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Clicker
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Handles the main click-to-progress mechanic.&lt;/li&gt;
&lt;li&gt;Advances the story or triggers a battle when the user clicks.&lt;/li&gt;
&lt;li&gt;May also be used to interact with objects or NPCs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Story
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Manages the flow of narrative and dialog.&lt;/li&gt;
&lt;li&gt;Coordinates which NPC or character is speaking.&lt;/li&gt;
&lt;li&gt;Controls when the player can interact or when the next event (like a fight) is triggered.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fight
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Handles all combat logic between the player and monsters.&lt;/li&gt;
&lt;li&gt;Manages the fight timer; if the player doesn’t act in time, triggers a game over.&lt;/li&gt;
&lt;li&gt;Handles monster actions and player responses.&lt;/li&gt;
&lt;li&gt;Calls logFight to record the outcome.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  useDialog
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt; Custom hook to manage dialog state and transitions.&lt;/li&gt;
&lt;li&gt;Determines which character or NPC is currently speaking.&lt;/li&gt;
&lt;li&gt;Ensures dialog sequences are completed before allowing progression (e.g., before a fight starts).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CharacterContext
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Provides global state management using React Context.&lt;/li&gt;
&lt;li&gt;Stores the current character, level, username, and fight history.&lt;/li&gt;
&lt;li&gt;Allows any component to access or update character-related data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Background, Character, Monster
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pure rendering components.&lt;/li&gt;
&lt;li&gt;Display the current background, player character, and monster/NPC images and animations with the help of KendoReact.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  State Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Global State (CharacterContext)
&lt;/h3&gt;

&lt;p&gt;Stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current character selection and info.&lt;/li&gt;
&lt;li&gt;Current level.&lt;/li&gt;
&lt;li&gt;Username.&lt;/li&gt;
&lt;li&gt;Fight history (array of fight results, e.g., win/loss, score, time).&lt;/li&gt;
&lt;li&gt;Accessible throughout the app for consistent state.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Local State (Fight)
&lt;/h3&gt;

&lt;p&gt;Manages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether the fight has started.&lt;/li&gt;
&lt;li&gt;Timer countdown for player actions.&lt;/li&gt;
&lt;li&gt;Game-over state (if the timer runs out or the player loses).&lt;/li&gt;
&lt;li&gt;Defeat flag (if the player loses the fight).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data Flow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dialog Sequence
&lt;/h3&gt;

&lt;p&gt;The useDialog hook manages dialog between the main character and NPCs. Both sides’ dialogs are calculated and displayed in sequence. The player cannot proceed (e.g., to a fight) until the dialog is complete.&lt;/p&gt;

&lt;h3&gt;
  
  
  Progression to Fight
&lt;/h3&gt;

&lt;p&gt;After dialog, the Clicker or Story module triggers the Fight module.&lt;br&gt;
The fight timer starts, and the player must act before it runs out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fight Outcome
&lt;/h3&gt;

&lt;p&gt;If the player defeats the monster, logFight is called.&lt;br&gt;
The fight result (win/loss, score, etc.) is saved to the global fight history array in CharacterContext.&lt;/p&gt;

&lt;h3&gt;
  
  
  Game Over / Retry
&lt;/h3&gt;

&lt;p&gt;If the timer runs out or the player loses, a game-over state is triggered.&lt;br&gt;
The player can retry the fight, which resets the local fight state and timer.&lt;/p&gt;

&lt;h3&gt;
  
  
  End of Game
&lt;/h3&gt;

&lt;p&gt;At the end of the game or story, the fight history array is used to display a summary of the player’s performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup &amp;amp; Run Locally
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone git@github.com:violetadev/kendo.git
cd kendo
npm install
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>devchallenge</category>
      <category>kendoreactchallenge</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>My Hacktober Journey as a Contributor</title>
      <dc:creator>V</dc:creator>
      <pubDate>Tue, 29 Oct 2024 11:13:33 +0000</pubDate>
      <link>https://dev.to/violetadev/my-hacktober-journey-as-a-contributor-5193</link>
      <guid>https://dev.to/violetadev/my-hacktober-journey-as-a-contributor-5193</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest"&gt;2024 Hacktoberfest Writing challenge&lt;/a&gt;: Maintainer Experience&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hacktoberfest has been an incredible ride! As a maintainer of the &lt;br&gt;
&lt;a href="https://responsively.app/" rel="noopener noreferrer"&gt;Responsively App&lt;/a&gt;, I’ve had the privilege of witnessing developers come together to support and improve our &lt;a href="https://github.com/responsively-org/responsively-app" rel="noopener noreferrer"&gt;open-source project&lt;/a&gt;. Seeing the growth in contributions this year has been both surprising and inspiring. It’s been a chance for us to engage with developers who are as excited about improving Responsively as we are.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why I Participate in Hacktoberfest
&lt;/h3&gt;

&lt;p&gt;Participating in Hacktoberfest energizes our community and introduces Responsively App to new developers. It allowed me to reconnect with what makes open source so impactful—seeing people from different backgrounds contribute unique solutions and ideas to enhance our efforts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Highs and Lows of This Year
&lt;/h3&gt;

&lt;p&gt;One of the most rewarding aspects has been the influx of contributions that tackle issues we hadn’t fully considered. A lot of people helped improve our &lt;a href="https://github.com/responsively-org/website" rel="noopener noreferrer"&gt;official website&lt;/a&gt;, which needed some attention to make it better for smaller screens and fix some bugs we had. One of the challenges I faced was balancing the review process, as not every submission aligns with our roadmap and I wish I have seen more contributions on our &lt;a href="https://github.com/responsively-org/responsively-app" rel="noopener noreferrer"&gt;app&lt;/a&gt; than just on the website. Reviewing and guiding contributors took time but was worth it for the insights gained.&lt;/p&gt;

&lt;h3&gt;
  
  
  Surprising Moments
&lt;/h3&gt;

&lt;p&gt;This year, I was surprised by the level of curiosity and dedication from first-time contributors. Many of them reached out with thoughtful questions and even went above and beyond in crafting their pull requests. Seeing the commitment from new developers reassures me that open source is in good hands, and it's rewarding to provide a platform where they can gain confidence and refine their skills.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thank You to the Contributors
&lt;/h3&gt;

&lt;p&gt;A huge thanks to everyone who contributed to Responsively this Hacktoberfest! Your enthusiasm, patience, and passion are what keep projects like Responsively moving forward. Every PR, suggestion, and question contributes to a stronger Responsively community.&lt;/p&gt;

&lt;p&gt;Here’s to many more Hacktoberfests, building and growing together! 🌍&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Make Your First Open-Source Impact with Responsively On HacktoberFest</title>
      <dc:creator>V</dc:creator>
      <pubDate>Sat, 12 Oct 2024 18:01:00 +0000</pubDate>
      <link>https://dev.to/violetadev/make-your-first-open-source-impact-with-responsively-on-hacktoberfest-4pob</link>
      <guid>https://dev.to/violetadev/make-your-first-open-source-impact-with-responsively-on-hacktoberfest-4pob</guid>
      <description>&lt;h2&gt;
  
  
  Responsively App
&lt;/h2&gt;

&lt;p&gt;Responsively is a versatile tool designed to simplify the workflow of developers and designers by enabling real-time previews and testing of web applications across various devices. You can read more and see a preview of its features &lt;a href="https://dev.to/violetadev/develop-responsive-apps-easily-with-responsively-app-12hc"&gt;in this post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Must Reads Before Starting
&lt;/h2&gt;

&lt;p&gt;Before diving in, grab your coffee (or beverage of preference) and check out these key resources to get started:&lt;/p&gt;

&lt;p&gt;1) &lt;a href="https://hacktoberfest.com/participation/" rel="noopener noreferrer"&gt;HacktoberFest Participation Guideline&lt;/a&gt;&lt;br&gt;
2) &lt;a href="https://github.com/responsively-org/responsively-app/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Responsively's Contributors Guidelines&lt;/a&gt;&lt;br&gt;
3) &lt;a href="https://docs.github.com/en/get-started/exploring-projects-on-github/contributing-to-a-project" rel="noopener noreferrer"&gt;How to contribute to a project you don't own&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;In the &lt;a href="https://github.com/responsively-org/responsively-app" rel="noopener noreferrer"&gt;Responsively App repository&lt;/a&gt;, you’ll find &lt;a href="https://github.com/responsively-org/responsively-app/issues" rel="noopener noreferrer"&gt;open issues&lt;/a&gt; to work on. Browse through and pick one that interests you. There's no need to assign it to yourself—just drop a comment when you start working on it, letting others know you're on it to avoid overlap.&lt;/p&gt;

&lt;p&gt;When submitting a pull request, don’t forget to link it to the relevant issue by mentioning the issue number. The more details you provide about what you fixed, how you fixed it, and how to test it, the better!&lt;/p&gt;

&lt;p&gt;Please stay attentive to any feedback we might provide during the review process. Letting your pull request go stale could lead to merge conflicts or lost context down the line, which would be a shame after all the effort you put in.&lt;/p&gt;

&lt;h2&gt;
  
  
  My experience as a Maintainer
&lt;/h2&gt;

&lt;p&gt;I really love this project; it's something I use both at work and in my personal projects—not only for development but also to execute manual tests, ensuring the quality of my frontend deliveries. It's become an indispensable tool in my workflow as a frontend engineer.&lt;/p&gt;

&lt;p&gt;What excites me most about Responsively is that it's built with ReactJS, TypeScript, and Electron—a stack that's familiar to many in the frontend community. This makes it a perfect project for those looking to contribute to open-source, especially for developers eager to dive into modern frontend technologies.&lt;/p&gt;

&lt;p&gt;Being part of an open-source community like this not only strengthens my technical skills but also reinforces the values of collaboration and giving back to the developer community.&lt;/p&gt;

&lt;p&gt;I hope to see your contributions soon and don't forget to drop by the &lt;a href="https://responsively.app/join-discord" rel="noopener noreferrer"&gt;discord&lt;/a&gt; to say hello!&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>devchallenge</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Develop Responsive Apps easily with Responsively App</title>
      <dc:creator>V</dc:creator>
      <pubDate>Sun, 15 Sep 2024 17:03:29 +0000</pubDate>
      <link>https://dev.to/violetadev/develop-responsive-apps-easily-with-responsively-app-12hc</link>
      <guid>https://dev.to/violetadev/develop-responsive-apps-easily-with-responsively-app-12hc</guid>
      <description>&lt;h2&gt;
  
  
  Exploring &lt;a href="https://responsively.app/" rel="noopener noreferrer"&gt;Responsively App&lt;/a&gt;: A Powerful Tool for Web Development
&lt;/h2&gt;

&lt;p&gt;I want to tell you about an open source app I have been contributing to in the past few months. &lt;/p&gt;

&lt;p&gt;Responsively is a versatile tool designed to simplify the workflow of developers and designers by enabling real-time previews and testing of web applications across various devices. Below, we explore some of its key features that make it an essential tool for responsive web development.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Device Suites for Real-Time Visualization
&lt;/h3&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%2Fym7f7esmjx13vmae87bn.gif" 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%2Fym7f7esmjx13vmae87bn.gif" alt="Custom suite to group up your devices" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the standout features of Responsively is the ability to create and select different device suites, which allow you to visualize how your web app or website looks on multiple devices at once. Whether it's a mobile phone, tablet, or desktop, this feature makes it easy to test responsiveness across a variety of screen sizes, ensuring that your site looks and performs optimally regardless of the device. You can instantly switch between pre-configured device suites or customize them according to your needs, providing complete control over your testing environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Synchronized Scrolling and Navigation
&lt;/h3&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%2Frysr2nx5r8s7clbf4f39.gif" 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%2Frysr2nx5r8s7clbf4f39.gif" alt="Mirroring devices so you can check behaviour all at once" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To make the testing process even more seamless, Responsively offers synchronized scrolling and navigation. As you interact with your web app on one device, all other displayed devices will mirror your actions in real time. Whether you're navigating through pages or testing interactive elements, this feature saves time and effort by allowing you to see how changes affect all devices simultaneously. It's a powerful way to ensure uniform behavior and design consistency across different platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Device Manager for Customization and Flexibility
&lt;/h3&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%2Fqjcxu2rzrdccaplr4c8c.gif" 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%2Fqjcxu2rzrdccaplr4c8c.gif" alt="A device manager to add, edit and remove devices and suites" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Device Manager&lt;/strong&gt; is another robust feature that adds flexibility to your workflow. You can create customized device suites, which are groups of devices that you can display on the main screen for testing. This manager not only allows you to add, edit, and remove devices but also group them into suites for specific projects or testing requirements. Additionally, the import/export feature enables users to save their custom device setups and share them with others, making it a collaborative tool for teams working on the same project.&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%2F89tpwtebxhsgnk0bcx6q.gif" 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%2F89tpwtebxhsgnk0bcx6q.gif" alt="Import/Export capabilities to share your suites" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Developer Tools for Enhanced Testing
&lt;/h3&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%2F2filfihybq6qn5rorzcn.gif" 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%2F2filfihybq6qn5rorzcn.gif" alt="Detailed view of the device" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On each displayed screen, Responsively offers a range of developer tools that provide extensive control over how you interact with your web app during testing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Screenshot&lt;/strong&gt; and &lt;strong&gt;full-page screenshot&lt;/strong&gt; options to capture the current state of the web app on different devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device rotation&lt;/strong&gt;, so you can easily test both portrait and landscape modes.&lt;/li&gt;
&lt;li&gt;Built-in &lt;strong&gt;DevTools&lt;/strong&gt; for debugging and performance analysis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules with draggable lines&lt;/strong&gt;, allowing you to set visual guidelines for checking layouts and alignment.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;different color needs visualizer&lt;/strong&gt; that helps simulate how users with various color vision deficiencies might experience your site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BrowserStack integration&lt;/strong&gt; for logged-in users, enabling even more extensive cross-device and browser testing in the cloud.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Customizable Settings for a Tailored Experience
&lt;/h3&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%2Fg8nzhas196izbojxvjed.jpg" 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%2Fg8nzhas196izbojxvjed.jpg" alt="Customizable Settings" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Responsively also offers a wide range of customization options through its settings. For example, you can switch between &lt;strong&gt;light and dark mode&lt;/strong&gt; depending on your preference or environment. You can also create &lt;strong&gt;bookmarks&lt;/strong&gt; for frequently accessed web pages, making it easier to switch between projects and test cases. These additional features contribute to a more personalized and efficient development experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Download
&lt;/h2&gt;

&lt;p&gt;Downloading and using Responsively is 100% free. You don't need an account to start using it and it is available for Windows, MacOS and Linux. &lt;/p&gt;

&lt;p&gt;The installation process is straightforward, and you can begin testing your web projects across multiple devices in seconds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://responsively.app/download" rel="noopener noreferrer"&gt;Download Responsively here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source and Community-Powered
&lt;/h2&gt;

&lt;p&gt;Responsively is an open-source project, maintained and improved by a passionate community of developers, designers, and contributors from around the world. It's designed to help fellow developers streamline their responsive web development workflows. &lt;/p&gt;

&lt;p&gt;By being open-source, Responsively encourages anyone to contribute to the project, whether through code contributions, bug reports, or feature suggestions. This project thrives on collaboration, and we invite you to join us in building a better tool for the web development community.&lt;/p&gt;

&lt;p&gt;You can check out the &lt;strong&gt;&lt;a href="https://github.com/responsively-org/responsively-app" rel="noopener noreferrer"&gt;source code on GitHub&lt;/a&gt;&lt;/strong&gt;, contribute, or simply show your support by giving it a star ⭐️ to our repository.&lt;/p&gt;

&lt;p&gt;Please make sure to check our &lt;a href="http://localhost:3000/sponsor" rel="noopener noreferrer"&gt;Sponsors&lt;/a&gt; page to find out more about all the wonderful companies and people that support this project.&lt;/p&gt;

&lt;p&gt;Together, we're building a tool that makes responsive web design and testing faster, easier, and more efficient for everyone.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>frontend</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Matching Technonauts! Networking App with Nylas</title>
      <dc:creator>V</dc:creator>
      <pubDate>Sun, 01 Sep 2024 21:11:59 +0000</pubDate>
      <link>https://dev.to/violetadev/matching-technonauts-networking-app-with-nylas-1781</link>
      <guid>https://dev.to/violetadev/matching-technonauts-networking-app-with-nylas-1781</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/nylas"&gt;Nylas Challenge&lt;/a&gt;: AI Expedition &amp;amp; Galaxy Brain&lt;/em&gt;&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%2F5vqkxbhhdtn7a6886cg0.gif" 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%2F5vqkxbhhdtn7a6886cg0.gif" alt="User Page" width="710" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Members:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.violeta.dev" rel="noopener noreferrer"&gt;Violeta&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Technologies
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Nylas API&lt;/li&gt;
&lt;li&gt;Chat GPT&lt;/li&gt;
&lt;li&gt;Firebase&lt;/li&gt;
&lt;li&gt;Emotion&lt;/li&gt;
&lt;li&gt;Material UI&lt;/li&gt;
&lt;li&gt;Next.JS&lt;/li&gt;
&lt;li&gt;Node.JS&lt;/li&gt;
&lt;li&gt;WebSockets&lt;/li&gt;
&lt;li&gt;Accessibility&lt;/li&gt;
&lt;li&gt;Vercel&lt;/li&gt;
&lt;li&gt;Glitch.IO&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it out here:&lt;br&gt;
&lt;a href="https://nylas-hackathon-nextjs.vercel.app/login" rel="noopener noreferrer"&gt;User&lt;/a&gt;&lt;br&gt;
&lt;a href="https://nylas-hackathon-nextjs.vercel.app/admin" rel="noopener noreferrer"&gt;Admin&lt;/a&gt;&lt;br&gt;
Note: For the admin you can use these credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;violetadevnylashackathon@gmail.com
123456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I Built and Why
&lt;/h2&gt;

&lt;p&gt;I built a Random Meeting Matcher tool, designed to facilitate spontaneous connections between remote team members. &lt;/p&gt;

&lt;p&gt;In a traditional office setting, casual conversations—like those over coffee—help foster relationships and build camaraderie. However, in a remote work environment, these serendipitous moments are much harder to come by. This tool aims to bridge that gap by allowing an admin to create scheduled "dates" where team members can queue up and get randomly matched with a colleague for a quick virtual meeting. The motivation behind this project stems from my experience working in a remote company, where I noticed the lack of informal interactions that typically happen in an office setting. &lt;/p&gt;

&lt;p&gt;This tool provides an easy and automated way to recreate those coffee chat moments virtually, helping to maintain the social fabric of the team.&lt;/p&gt;

&lt;p&gt;Of course, this could be use in any other context where you want to randomly match two people! This is just a specific use case of the tool I have built.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;You can review the full codebase on GitHub:&lt;br&gt;
&lt;a href="https://github.com/violetadev/nylas-hackathon-nextjs" rel="noopener noreferrer"&gt;App &amp;amp; Back Office&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/violetadev/nylas-hackathon-websockets" rel="noopener noreferrer"&gt;Websockets Server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is open-source and licensed under the MIT License, ensuring that others can freely use and adapt the tool for their own remote teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Journey
&lt;/h2&gt;

&lt;p&gt;I leveraged Nylas' API to handle the creation of calendar events, sign up participants as contacts, and create meeting links, which was crucial for automating the process of setting up virtual meetings. Through this project, I deepened my understanding of integrating third-party APIs into a full-stack application with NextJS and Websockets (I usually focus more in the Frontend part!), particularly in managing user authentication, calendar integrations, and real-time WebSocket connections.&lt;br&gt;
I'm particularly proud of how seamless the user experience turned out, from queueing up to being matched and receiving an invite—all without requiring any manual intervention from the admin. This project not only solved a real problem I've experienced but also provided an opportunity to explore and utilize the powerful capabilities of the Nylas platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Image Gallery
&lt;/h2&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%2Fft6seulkfq8kzoh8l6po.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%2Fft6seulkfq8kzoh8l6po.png" alt="Hackathon Screen 1" width="800" height="400"&gt;&lt;/a&gt;&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%2Fmerpbe7c2giktkhpjno3.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%2Fmerpbe7c2giktkhpjno3.png" alt="Hackathon Screen 2" width="800" height="690"&gt;&lt;/a&gt;&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%2Fy1qhu8i4jmc18qeveo2v.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%2Fy1qhu8i4jmc18qeveo2v.png" alt="Hackathon Screen 3" width="800" height="633"&gt;&lt;/a&gt;&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%2F183rfsij1xcibx50r9e9.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%2F183rfsij1xcibx50r9e9.png" alt="Hackathon Screen 4" width="800" height="681"&gt;&lt;/a&gt;&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%2Fwkmnjz131e0e3x3mb7vi.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%2Fwkmnjz131e0e3x3mb7vi.png" alt="Hackathon Screen 5" width="800" height="686"&gt;&lt;/a&gt;&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%2Fnp3931g7yepcqfjruyes.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%2Fnp3931g7yepcqfjruyes.png" alt="Hackathon Screen 6" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Credits for the video background &lt;a href="https://www.vecteezy.com/video/2016656-minimal-stars-motion-loop-background-for-project-overlay" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>nylaschallenge</category>
      <category>api</category>
      <category>ai</category>
    </item>
    <item>
      <title>Atomic Design: UI Kit Strategy</title>
      <dc:creator>V</dc:creator>
      <pubDate>Tue, 30 Jul 2024 20:39:33 +0000</pubDate>
      <link>https://dev.to/violetadev/atomic-design-ui-kit-strategy-4ogn</link>
      <guid>https://dev.to/violetadev/atomic-design-ui-kit-strategy-4ogn</guid>
      <description>&lt;h2&gt;
  
  
  The Concept of Atomic Design applied to a frontend package
&lt;/h2&gt;

&lt;h2&gt;
  
  
  What is Atomic Design
&lt;/h2&gt;

&lt;p&gt;Atomic Design is a methodology for creating design systems in a hierarchical structure, starting from the simplest elements (atoms) to more complex structures (molecules and organisms). &lt;/p&gt;

&lt;p&gt;This approach allows designers to build consistent, scalable, and reusable components for user interfaces. By treating parts of the UI as part of a larger whole, Atomic Design streamlines the development process, ensuring a more efficient and cohesive design system that can be easily maintained and scaled over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Access components from different packages shared within the T&amp;amp;I team&lt;/li&gt;
&lt;li&gt;Focus on enhancing the overall quality and maintainability when adding new features&lt;/li&gt;
&lt;li&gt;Add new code without degrading the existing code base &lt;/li&gt;
&lt;li&gt;Allow easy migration and refactoring of features whenever needed&lt;/li&gt;
&lt;li&gt;Creating complex components will be easier since we will have common building blocks in place from the start&lt;/li&gt;
&lt;li&gt;Once the library starts growing, creating new interfaces can be as simple as combining existing elements&lt;/li&gt;
&lt;li&gt;Existing components become a guide for how we build, keeping the code clean and consistent&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Within the team, we all need to understand what is an atom/molecule/organism in order to keep the library consistent and clean&lt;/li&gt;
&lt;li&gt;Communication with the design and product team is crucial to make the best out of the library and standardize user experience&lt;/li&gt;
&lt;li&gt;Overhead and over-engineering could be an issue if we add code that will end up not being reused in the future&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Definition and examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Atoms
&lt;/h3&gt;

&lt;p&gt;Atoms are components that can’t be broken down into smaller components. For example: buttons, dividers, links.&lt;br&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%2Fufiw7ss3oiscdiiscnv2.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%2Fufiw7ss3oiscdiiscnv2.png" alt=" " width="750" height="100"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mui.com/material-ui/" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Molecules
&lt;/h3&gt;

&lt;p&gt;Molecules can be formed by many different atoms. For example, a button with a loading icon.&lt;br&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%2Fgwok8qfveaabbooeskp5.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%2Fgwok8qfveaabbooeskp5.png" alt=" " width="94" height="108"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mui.com/material-ui/" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Organisms
&lt;/h3&gt;

&lt;p&gt;Complex components made of groups of molecules or a mix of atoms and molecules.&lt;br&gt;
Example: a Tab component with a div attached that displays different content on click.&lt;br&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%2Fsah6ssqlz1ifn90p1yt2.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%2Fsah6ssqlz1ifn90p1yt2.png" alt=" " width="752" height="538"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mui.com/material-ui/" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Templates
&lt;/h3&gt;

&lt;p&gt;Formed by organisms, molecules and atoms that structure content. For example: A profile template page, that can be filled with different information from any user.&lt;br&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%2Fr3sz3x14htu9cvvxya5m.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%2Fr3sz3x14htu9cvvxya5m.png" alt=" " width="800" height="642"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mui.com/store/previews/minimal-dashboard/" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pages
&lt;/h3&gt;

&lt;p&gt;Pages are templates (or groups of molecules, organisms, etc.) filled with real representative content. For example, the profile template we mentioned before, now with the user's data.&lt;br&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%2Ffbepbzbzzp3t1ae1zgi1.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%2Ffbepbzbzzp3t1ae1zgi1.png" alt=" " width="800" height="512"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mui.com/store/previews/minimal-dashboard/" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a UI Kit
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is a UI Kit for:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Making it easier to reuse components within a team's or company's features, cataloging them, and making them accessible for the whole team (including design/product).&lt;/li&gt;
&lt;li&gt;Maintaining and enhancing components (accessibility, testing, performance).&lt;/li&gt;
&lt;li&gt;Keeping our UI consistent, making the user feel more at home when navigating the product.&lt;/li&gt;
&lt;li&gt;Improving our design-development process by speaking one common language and having one common place for our building blocks.&lt;/li&gt;
&lt;li&gt;Internal knowledge of the team, having everything in one place makes it easier for everyone to know what we have and how to maintain it.&lt;/li&gt;
&lt;li&gt;It's more about effective component management and modular development within our existing codebase.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What is a UI Kit not for:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Adding anything related to the design system. Examples: color variables, common design patterns/elements such as typography or input fields.&lt;/li&gt;
&lt;li&gt;Having components with data fetching/handling. Examples: a form submission calls our backend to create a ticket.&lt;/li&gt;
&lt;li&gt;Maintaining and enhancing our components (accessibility, testing, performance).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.headway.io/blog/design-to-code-the-role-of-atomic-design-in-front-end-development" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;br&gt;
&lt;a href="https://hackernoon.com/the-double-edged-sword-of-atomic-design" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/deliveryherotechhub/atomic-design-system-in-frontend-bdbb919290b4" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>frontend</category>
    </item>
    <item>
      <title>LCP Improvements React Guide</title>
      <dc:creator>V</dc:creator>
      <pubDate>Tue, 30 Jul 2024 20:21:16 +0000</pubDate>
      <link>https://dev.to/violetadev/lcp-improvements-react-guide-4obe</link>
      <guid>https://dev.to/violetadev/lcp-improvements-react-guide-4obe</guid>
      <description>&lt;h2&gt;
  
  
  What is LCP?
&lt;/h2&gt;

&lt;p&gt;Largest Contentful Paint (LCP) is a performance metric that measures the time it takes for the largest content element visible in the viewport to fully render on the page. It’s an important user-centric metric for assessing perceived load speed because it marks the point in the page load timeline when the main content has likely loaded and the page is useful to the user. Good LCP performance ensures that a website feels snappy and responsive to users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strategies to improve LCP
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Avoid unnecessary re-renders by:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Correcting the usage of useEffect&lt;/li&gt;
&lt;li&gt;Doing lazy initialization on useState&lt;/li&gt;
&lt;li&gt;Using React.memo or useCallBack&lt;/li&gt;
&lt;li&gt;Avoiding Prop drilling&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Improve loading of resources by:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Doing code splitting/deferring code&lt;/li&gt;
&lt;li&gt;Doing lazy loading of components&lt;/li&gt;
&lt;li&gt;Using srcset for Images&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Clean the code by:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Removing unused code &amp;amp; Tree Shaking&lt;/li&gt;
&lt;li&gt;Removing unnecessary CSS&lt;/li&gt;
&lt;li&gt;Reducing unused exports&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  UseEffect usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  When to use it:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Data Fetching: To fetch data from an API when the component mounts or when a dependency changes.&lt;/li&gt;
&lt;li&gt;Setting Up Subscriptions: To set up subscriptions (e.g., WebSocket connections) and clean them up when the component unmounts.&lt;/li&gt;
&lt;li&gt;Manually Updating the DOM: When you need to perform manual DOM updates that can't be done declaratively.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When to avoid it:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Derived State: Avoid using useEffect to synchronize state that can be derived from props or other state. Use memoization techniques or derived state directly in the component.&lt;/li&gt;
&lt;li&gt;Inline Event Handlers: Do not use useEffect to add event listeners that can be added directly in JSX.&lt;/li&gt;
&lt;li&gt;Rendering Logic: Avoid using useEffect to control rendering logic. Use conditional rendering directly in the JSX.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Lazy Initialization on useState:
&lt;/h3&gt;

&lt;p&gt;Delaying the computation of the initial state value until it is actually needed helps avoid performance hits during the initial render of a component, especially if the computation of the initial state is expensive.&lt;br&gt;
Lazy initialization ensures that this computation is only performed once, when the component is first rendered.&lt;/p&gt;
&lt;h4&gt;
  
  
  How to Implement Lazy Initialization:
&lt;/h4&gt;

&lt;p&gt;When you pass a function to useState, React will call this function only during the initial render. This ensures that the expensive computation is only done once, and the result is stored as the initial state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const [state, setState] = useState(() =&amp;gt; {
  expensive computation
  return initialValue;
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  React.memo and useCallback
&lt;/h2&gt;

&lt;p&gt;Both React.memo and useCallback are used to optimize React applications by preventing unnecessary re-renders, but they serve different purposes and are used in different scenarios.&lt;/p&gt;

&lt;h3&gt;
  
  
  useCallback
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Purpose: useCallback is used to memoize functions.&lt;/li&gt;
&lt;li&gt;Usage: It returns a memoized version of the callback function that only changes if one of the dependencies has changed. This is useful when passing callbacks to optimized child components that rely on reference equality to prevent unnecessary renders.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const memoizedCallback = useCallback(() =&amp;gt; {
  // callback logic
}, [dependency1, dependency2]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  useMemo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Purpose: useMemo is used to memoize the result of a function.&lt;/li&gt;
&lt;li&gt;Usage: It returns a memoized value that only changes if one of the dependencies has changed. This is useful for optimizing performance by preventing expensive calculations on every render.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const MyComponent = React.memo(({ prop1, prop2 }) =&amp;gt; {
  // Component logic
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Code Splitting
&lt;/h2&gt;

&lt;p&gt;Code splitting is a technique used to break up a large bundle of JavaScript into smaller, more manageable pieces that can be loaded on demand. This helps improve the initial load time of your application by only loading the necessary code for the initial view and deferring the rest until it's needed. You can also use webpack’s configuration to work with chunks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lazy Loading
&lt;/h2&gt;

&lt;p&gt;Lazy loading is a design pattern and optimization technique used to defer the loading of non-critical resources at the time of the page load. Instead, these resources are loaded only when they are needed, such as when they become visible in the viewport or when a user interaction triggers them. This helps improve the performance of web applications by reducing the initial load time and conserving bandwidth.&lt;br&gt;
You can do this by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use React.lazy for lazy loading React components.&lt;/li&gt;
&lt;li&gt;Use the Intersection Observer: Use the Intersection Observer API to lazy load images or other elements as they enter the viewport.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const LazyComponent = React.lazy(() =&amp;gt; import('./LazyComponent'));

function App() {
  return (
    &amp;lt;Suspense fallback={&amp;lt;div&amp;gt;Loading...&amp;lt;/div&amp;gt;}&amp;gt;
      &amp;lt;LazyComponent /&amp;gt;
    &amp;lt;/Suspense&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Use native capabilities
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Images attributes: the srcset attribute allows you to specify multiple image sources for different screen sizes and resolutions. The browser automatically selects the most appropriate image to display based on the device's characteristics. This can significantly improve the Largest Contentful Paint (LCP) by ensuring that the optimal image size is loaded, reducing load times and improving performance. On the other hand, the sizes attribute tells the browser how much space the image will take up, allowing it to choose the best source.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img
  src="images/example-300.jpg"
  srcset="
    images/example-300.jpg 300w,
    images/example-600.jpg 600w,
    images/example-1200.jpg 1200w
  "
  sizes="
    (max-width: 600px) 300px,
    (max-width: 1200px) 600px,
    1200px
  "
  alt="Description of the image"
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Loading attribute: The loading attribute on images and iframes allows for native lazy loading.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src="image.jpg" alt="Example image" loading="lazy"&amp;gt;
&amp;lt;iframe src="https://example.com" loading="lazy"&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Rel property: 
preload: Preloading critical resources can improve LCP by ensuring that key assets are fetched as soon as possible. Preloading CSS and JavaScript files ensures that these assets are available immediately when the browser starts rendering the page. Preloading fonts can prevent delays caused by font loading, which can block text rendering.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;link rel="preload" href="/styles/main.css" as="style"&amp;gt;
&amp;lt;link rel="preload" href="/scripts/main.js" as="script"&amp;gt;
&amp;lt;link rel="preload" href="/fonts/font.woff2" as="font" type="font/woff2" crossorigin="anonymous"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;prefetch: Next Page Resources: Prefetch resources that are needed for the next user interaction to improve the perception of a fast-loading application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;link rel="prefetch" href="/images/next-page-image.jpg"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Script attributes:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Defer the loading of JavaScript that is not critical for the initial render by adding the defer attribute in your script tags. This ensures that the script is executed after the HTML is parsed, preventing it from blocking the rendering process.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script src="script.js" defer&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Async Loading: Allows the script to be fetched in parallel to parsing and executed as soon as it is available, reducing render-blocking behavior.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script src="script.js" async&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>react</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>performance</category>
    </item>
    <item>
      <title>Object Oriented Programming</title>
      <dc:creator>V</dc:creator>
      <pubDate>Tue, 12 Apr 2022 22:11:28 +0000</pubDate>
      <link>https://dev.to/violetadev/object-oriented-programming-270k</link>
      <guid>https://dev.to/violetadev/object-oriented-programming-270k</guid>
      <description>&lt;p&gt;OOP is a programming paradigm (a way of coding) that’s used to organize software into reusable pieces of code through classes and objects. You can think of a class as a template or building block for your code, that contains methods and properties common to certain objects that you can extend to create what you need. &lt;/p&gt;

&lt;p&gt;Here is an example:&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;class&lt;/span&gt; &lt;span class="nc"&gt;Developer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&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;language&lt;/span&gt;&lt;span class="p"&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;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&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;language&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;language&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;getDeveloperProfile&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&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;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; can code in &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;language&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="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FrontendDev&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Developer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&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;language&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;framework&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&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;language&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;framework&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;framework&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;getFramework&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&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="s2"&gt; is a &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;language&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; developer and knows &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;framework&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="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;frontendDeveloper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FrontendDev&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Anna&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Javascript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;React&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;frontendDeveloper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFramework&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Anna is a javascript developer and knows React&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are some basic principles when coding in OOP:&lt;/p&gt;

&lt;h2&gt;
  
  
  Encapsulation
&lt;/h2&gt;

&lt;p&gt;When talking about encapsulation, we refer to grouping up functions and variables that are related in objects. &lt;/p&gt;

&lt;p&gt;Let’s refactor some code into OOP. &lt;br&gt;
Here’s our starting point:&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;bookName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Steppenwolf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bookAuthor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Herman Hesse&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bookYear&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1927&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getBookInfo&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;author&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;year&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="s2"&gt;`The book &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="s2"&gt; was written by &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; in &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;year&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="nf"&gt;getBookInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bookName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bookAuthor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bookYear&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OOP way:&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;book&lt;/span&gt; &lt;span class="o"&gt;=&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Steppenwolf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Herman Hesse&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1927&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;getInfo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&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="s2"&gt;`The book &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="s2"&gt; was written by &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; in &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;year&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="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getInfo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Abstraction
&lt;/h2&gt;

&lt;p&gt;When talking about abstraction in OOP, we refer to exposing the properties and methods that we are actually going to be using and leaving the inner working hidden. This makes the usage of the object much easier and lets you make changes easier.&lt;/p&gt;

&lt;p&gt;For example:&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;class&lt;/span&gt; &lt;span class="nc"&gt;Developer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&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;language&lt;/span&gt;&lt;span class="p"&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;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&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;language&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;language&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;ratePerHour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="c1"&gt;// private variable&lt;/span&gt;
    &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;totalMonthlyHours&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;160&lt;/span&gt; &lt;span class="c1"&gt;// private variable&lt;/span&gt;

    &lt;span class="nf"&gt;getDeveloperProfile&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;salary&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="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;ratePerHour&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="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;totalHours&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&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;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; can code in &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;language&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="nf"&gt;getDeveloperSalary&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;totalSalary&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="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;ratePerHour&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="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;totalMonthlyHours&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`The salary for a developer is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;totalSalary&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;usd per month`&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;In this case, we can’t access totalHours and ratePerHour variables outside of our class, but if we call &lt;code&gt;getDeveloperSalary()&lt;/code&gt; we will get the total amount calculated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inheritance
&lt;/h2&gt;

&lt;p&gt;Inheritance is what allows us to remove repeated code and share properties and methods between objects. &lt;/p&gt;

&lt;p&gt;For example, a button and a div are both html elements (&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement" rel="noopener noreferrer"&gt;HTMLElement&lt;/a&gt;) and the both have a hidden property and a click() method. &lt;/p&gt;

&lt;p&gt;When talking about &lt;a href="https://javascript.info/prototype-inheritance" rel="noopener noreferrer"&gt;prototype inheritance&lt;/a&gt;, we are referring to a javascript feature that allows to add methods and properties, and that can be chained as well (a prototype can have a prototype, and so on).&lt;/p&gt;

&lt;h2&gt;
  
  
  Polymorphism
&lt;/h2&gt;

&lt;p&gt;Polymorphism allows us to overwrite methods and properties from a previous object. For example, let’s imagine for a second that all plants need a 100&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;book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="nx"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amountOfPages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a book has many pages&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;novel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nx"&gt;novel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;novel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amountOfPages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a book has many more pages!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;References:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.educative.io/blog/object-oriented-programming" rel="noopener noreferrer"&gt;https://www.educative.io/blog/object-oriented-programming&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=PFmuCDHHpwk&amp;amp;t=2059s" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=PFmuCDHHpwk&amp;amp;t=2059s&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://frontend.turing.edu/lessons/module-2/oop-1-making-objects-with-constructor-functions-and-classes.html" rel="noopener noreferrer"&gt;https://frontend.turing.edu/lessons/module-2/oop-1-making-objects-with-constructor-functions-and-classes.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.sessionstack.com/how-javascript-works-3-types-of-polymorphism-f10ff4992be1" rel="noopener noreferrer"&gt;https://blog.sessionstack.com/how-javascript-works-3-types-of-polymorphism-f10ff4992be1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://betterprogramming.pub/object-oriented-programming-in-javascript-b3bda28d3e81" rel="noopener noreferrer"&gt;https://betterprogramming.pub/object-oriented-programming-in-javascript-b3bda28d3e81&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Job Hunting (Global, Spain &amp; Europe)</title>
      <dc:creator>V</dc:creator>
      <pubDate>Tue, 08 Mar 2022 16:56:40 +0000</pubDate>
      <link>https://dev.to/violetadev/job-hunting-global-spain-europe-3d26</link>
      <guid>https://dev.to/violetadev/job-hunting-global-spain-europe-3d26</guid>
      <description>&lt;p&gt;I get asked a lot about platforms to look for a job in tech. So here is my reference list:&lt;/p&gt;

&lt;h2&gt;
  
  
  Spain &amp;amp; Europe
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://bcneng.org/" rel="noopener noreferrer"&gt;Bcn Engineering&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trycircular.com/" rel="noopener noreferrer"&gt;TryCircular&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.jobfluent.com/" rel="noopener noreferrer"&gt;JobFluent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://joppy.me/" rel="noopener noreferrer"&gt;Joppy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cord.co/" rel="noopener noreferrer"&gt;Cord&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Global
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://relocate.me/" rel="noopener noreferrer"&gt;Relocate me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.honeypot.io/" rel="noopener noreferrer"&gt;Honeypot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/jobs/get-started" rel="noopener noreferrer"&gt;Stack Overflow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flexjobs.com/" rel="noopener noreferrer"&gt;Flexjobs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.glassdoor.es/Sueldos/index.htm" rel="noopener noreferrer"&gt;Glassdoor&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://angel.co/candidates/overview" rel="noopener noreferrer"&gt;AngelList&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Remote
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://weworkremotely.com/" rel="noopener noreferrer"&gt;We work remotely&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://remote.co/remote-jobs/" rel="noopener noreferrer"&gt;Remote.co&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://powertofly.com/" rel="noopener noreferrer"&gt;Power to fly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://justremote.co/" rel="noopener noreferrer"&gt;Just remote&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More links for remote work: &lt;a href="https://skillcrush.com/blog/sites-finding-remote-work/" rel="noopener noreferrer"&gt;The 25+ Best Sites For Finding Remote Work Online In 2022&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Minorities in Tech
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.hiretechladies.com/" rel="noopener noreferrer"&gt;Hire tech ladies&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.diversifytech.co/" rel="noopener noreferrer"&gt;Diversify Tech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.womenwhocode.com/jobs" rel="noopener noreferrer"&gt;Women Who Code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://techqueria.org/" rel="noopener noreferrer"&gt;Latinx in Tech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blacktechpipeline.com/" rel="noopener noreferrer"&gt;Black Tech Pipeline&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.techdisabilityproject.org/" rel="noopener noreferrer"&gt;Tech Disability Project&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.wearecapable.org/" rel="noopener noreferrer"&gt;Chronically Capable&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://latinasintech.org/" rel="noopener noreferrer"&gt;Latinas in Tech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://outintech.com/" rel="noopener noreferrer"&gt;LGBTQA+ Out in Tech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;... and more! Check out &lt;a href="https://www.diversifytech.co/community" rel="noopener noreferrer"&gt;Diversify's community list here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>spain</category>
      <category>europe</category>
      <category>job</category>
    </item>
    <item>
      <title>Testing react-device-detect with React Testing Library and Jest</title>
      <dc:creator>V</dc:creator>
      <pubDate>Wed, 12 Jan 2022 10:39:17 +0000</pubDate>
      <link>https://dev.to/violetadev/testing-react-device-detect-with-react-testing-library-and-jest-3kn6</link>
      <guid>https://dev.to/violetadev/testing-react-device-detect-with-react-testing-library-and-jest-3kn6</guid>
      <description>&lt;p&gt;I needed to use react-device-detect to change a URL with a &lt;code&gt;https protocol&lt;/code&gt; to &lt;code&gt;webcal protocol&lt;/code&gt; in order to be able to save an &lt;code&gt;ics&lt;/code&gt; file to the calendar app when using Chrome on iOs. The implementation was quite straight forward but I ran with the issue of testing this properly. I needed to mock the user's device and browser detected by react-device-detect. &lt;/p&gt;

&lt;p&gt;I did this by first importing the package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as reactDeviceDetect from 'react-device-detect'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then assigning the value I needed for the functions I'm using in my code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Object.defineProperty(&amp;lt;&amp;lt;theModule&amp;gt;&amp;gt;, '&amp;lt;&amp;lt;the function or value needed&amp;gt;&amp;gt;', { get: () =&amp;gt; '&amp;lt;&amp;lt;the value returned&amp;gt;&amp;gt;' });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will return the desired value whenever your component calls for the specified function.&lt;/p&gt;

&lt;p&gt;In my case, I needed to get &lt;code&gt;true&lt;/code&gt; when calling isIOS and &lt;code&gt;'Chrome'&lt;/code&gt; when calling browserName:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as reactDeviceDetect from 'react-device-detect';

Object.defineProperty(reactDeviceDetect, 'isIOS', { get: () =&amp;gt; true });
Object.defineProperty(reactDeviceDetect, 'browserName', { get: () =&amp;gt; 'Chrome' });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, to check if my protocol change was working properly, I could either check the href of the a tag as in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const calendarLink = getByTestId('calendar-link');

expect(calendarLink.closest('a')).toHaveAttribute(
   'href',
   `/my-calendar.ics`
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or I could fire the click and then check the protocol using the window:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const calendarLink = getByTestId('calendar-link');
fireEvent.click(calendarLink);
await waitFor(() =&amp;gt; {
  expect(window.location.protocol).toBe(
    'webcal:'
  );
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's pretty much it, I hope it helps someone ;)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Frontend Challenges and Project Ideas</title>
      <dc:creator>V</dc:creator>
      <pubDate>Sat, 05 Jun 2021 15:39:29 +0000</pubDate>
      <link>https://dev.to/violetadev/frontend-challenges-and-project-ideas-479d</link>
      <guid>https://dev.to/violetadev/frontend-challenges-and-project-ideas-479d</guid>
      <description>&lt;h2&gt;
  
  
  About this list
&lt;/h2&gt;

&lt;p&gt;I made this list thinking of projects that can be approached in different ways, technologies and features. Because of this, I added a few suggestions of things you can focus on to give you some ideas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is this list for
&lt;/h2&gt;

&lt;p&gt;I have tagged the projects with orientative levels but you can increase or decrease the difficulty very easily. &lt;/p&gt;

&lt;p&gt;This list is for you if you are...&lt;br&gt;
...a junior developer trying to practice their skills.&lt;br&gt;
...learning a new technology and you need a simple project to experiment with.&lt;br&gt;
...lost in tutorial hell and you need a break from watching but you want to keep building up your coding skills.&lt;br&gt;
...building a portfolio to start applying to jobs.&lt;br&gt;
...looking for side projects to do for fun.&lt;/p&gt;

&lt;p&gt;1- &lt;strong&gt;Booking app&lt;/strong&gt; &lt;code&gt;beginner&lt;/code&gt; &lt;code&gt;intermediate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Make an app that displays a calendar with selectable dates. When clicking on a date, a pop up comes up showing available times to make an appointment. The user should be able to add basic information. &lt;br&gt;
&lt;strong&gt;Good for&lt;/strong&gt;: learn how to work with dates, multi step forms, database with users and taken dates/times, testing (react-testing-library, cypress, jest)&lt;/p&gt;




&lt;p&gt;2- &lt;strong&gt;Browser code editor&lt;/strong&gt; &lt;code&gt;intermediate&lt;/code&gt; &lt;code&gt;advanced&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Make a code editor where you can write JS and download the file when you are done. &lt;br&gt;
&lt;strong&gt;Good for&lt;/strong&gt;: Working on your logic mixing html and js, specific css based on conditions, learning how to work with files exports, setting up a project from scratch, testing (react-testing-library, cypress, jest)&lt;br&gt;
&lt;strong&gt;Inspiration&lt;/strong&gt;: &lt;a href="https://codepen.io/kazzkiq/pen/xGXaKR" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;3- &lt;strong&gt;Quote Carousel&lt;/strong&gt; &lt;code&gt;beginner&lt;/code&gt; &lt;code&gt;intermediate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Create a responsive component from scratch that accepts an image, quote and an author, create the component so it accepts different themes (styled components).&lt;br&gt;
&lt;strong&gt;Good for&lt;/strong&gt;: Responsiveness, setting up a project from scratch, excersicing logic, reusable component for future projects, create the component so it accepts different themes (styled components), testing (react-testing-library, cypress, jest).&lt;/p&gt;




&lt;p&gt;4- &lt;strong&gt;Mood app&lt;/strong&gt; &lt;code&gt;intermediate&lt;/code&gt; &lt;code&gt;advanced&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Make an app to track your daily mood, the user should be able to choose the mood of the day from different emojis and add a description. The user should be able to see the history, you can also add a graphic representation of the month. &lt;br&gt;
&lt;strong&gt;Good for&lt;/strong&gt;: State management, persistant data, database, data representation&lt;/p&gt;




&lt;p&gt;5- &lt;strong&gt;Markdown preview&lt;/strong&gt; &lt;code&gt;intermediate&lt;/code&gt; &lt;code&gt;advanced&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Make an app where you can input markdown and see the result. &lt;br&gt;
&lt;strong&gt;Good for&lt;/strong&gt;: Exercising logic, setting up a project from scratch, interpretation of characters on context, dynamic styling, unit testing (jest, jasmine, etc).&lt;/p&gt;




&lt;p&gt;6- &lt;strong&gt;Raffle site&lt;/strong&gt; &lt;code&gt;beginner&lt;/code&gt; &lt;code&gt;intermediate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Make an an app that you can input a product with an image and a title plus a list of participants by email (can be imported through a csv). On a button click, a random winner should be displayed. If you continue clicking the button, another random user should be displayed but not the ones that were already selected.&lt;br&gt;
&lt;strong&gt;Good for&lt;/strong&gt;: CSS practice, setting up a project from scratch, exercising logic, image/file uploading, file handling, testing (react-testing-library, cypress, jest)&lt;br&gt;
&lt;strong&gt;Inspiration&lt;/strong&gt;: &lt;/p&gt;




&lt;p&gt;7- &lt;strong&gt;Stock market trend&lt;/strong&gt; &lt;code&gt;advanced&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Make an app that crawls and displays the top 5 most mentioned stocks on the subreddit &lt;code&gt;/r/stocks&lt;/code&gt;. &lt;br&gt;
&lt;strong&gt;Good for&lt;/strong&gt;: learning about crawlers, data representation, testing (react-testing-library, cypress, jest)&lt;br&gt;
Inspiration: &lt;a href="https://www.reddit.com/r/investing/comments/l3z5jq/i_created_an_algo_that_tracks_the_most_hyped/" rel="noopener noreferrer"&gt;swaggymedia's project&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;8- &lt;strong&gt;Podcast library&lt;/strong&gt; &lt;code&gt;beginner&lt;/code&gt; &lt;code&gt;intermediate&lt;/code&gt; &lt;code&gt;advanced&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Make an app that works as a personal podcast library. The website should have a way to import podcast through RSS feeds, a player and a list of selectable podcasts. When you select one podcast, it should display a page with all the episodes. When you click an episode it should play it on a audio player.&lt;br&gt;
&lt;strong&gt;Good for&lt;/strong&gt;: Working with third parties apis, database, user log in/sign up, RSS feeds, audio player, testing (react-testing-library, cypress, jest)&lt;br&gt;
&lt;strong&gt;Inspiration&lt;/strong&gt;: &lt;a href="https://preview.colorlib.com/#podcast" rel="noopener noreferrer"&gt;Podcast Template&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;9- &lt;strong&gt;Color generator&lt;/strong&gt; &lt;code&gt;beginner&lt;/code&gt; &lt;code&gt;intermediate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Make an app that helps the users get different color palettes for their projects. The user should be able to input a starter HEX color and get matching colors with their HEX codes. The user should be able to save their color palettes and name them.&lt;br&gt;
&lt;strong&gt;Good for&lt;/strong&gt;: logic, setting up a project from scratch, understanding HEX coding, state management, unit testing.&lt;br&gt;
&lt;strong&gt;Inspiration&lt;/strong&gt;: &lt;a href="https://coolors.co/generate" rel="noopener noreferrer"&gt;Coolors&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;10- &lt;strong&gt;Spotify music list&lt;/strong&gt;  &lt;code&gt;beginner&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Make an app that fetches the top 10 songs of each genre  (pop, rock, country, etc) on the user's country. &lt;br&gt;
&lt;strong&gt;Good for&lt;/strong&gt;: Log in implementation, learning how to use .env, state management, responsive ui.&lt;br&gt;
&lt;strong&gt;Inspiration&lt;/strong&gt;: &lt;a href="http://preview.themeforest.net/item/listen-app-angular-8-music-streaming-app/full_screen_preview/25396459?_ga=2.106606923.915591639.1622900833-306105931.1614845305" rel="noopener noreferrer"&gt;Listen App Template&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;11- &lt;strong&gt;Sign up page&lt;/strong&gt;  &lt;code&gt;beginner&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Create a sign up page with a form that has validation, success and error messages.&lt;br&gt;
&lt;strong&gt;Good for&lt;/strong&gt;: learning how to use forms, responsiveness, setting up a project from scratch, event handling.&lt;br&gt;
&lt;strong&gt;Design&lt;/strong&gt;: Free template (&lt;a href="https://colorlib.com/wp/template/colorlib-regform-7/" rel="noopener noreferrer"&gt;https://colorlib.com/wp/template/colorlib-regform-7/&lt;/a&gt;)&lt;/p&gt;




&lt;p&gt;12- &lt;strong&gt;Create a restaurant menu&lt;/strong&gt; &lt;code&gt;beginner&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Create a single page with a restaurant menu that shows the details of each dish on hover.&lt;br&gt;
&lt;strong&gt;Good for&lt;/strong&gt;: exercising css, responsiveness, event handling, html.&lt;br&gt;
&lt;strong&gt;Design&lt;/strong&gt;: &lt;a href="https://www.flipsnack.com/templates/dessert-menu-card-template" rel="noopener noreferrer"&gt;Flipsnack free template&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;13- &lt;strong&gt;User dashboard with news and weather&lt;/strong&gt; &lt;code&gt;intermediate&lt;/code&gt; &lt;code&gt;advanced&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;:  Make an app where the user can input their name and select five news topics they are interested in. The dashboard should display the weather in their location, news from each topic and an image of the day.&lt;br&gt;
&lt;strong&gt;Good for&lt;/strong&gt;: state management, responsiveness, reusable components, multistep forms, setting a project for scratch, testing.&lt;br&gt;
&lt;strong&gt;Design&lt;/strong&gt;: &lt;a href="https://xd.adobe.com/view/19e7e42f-6b0f-46a7-b630-8dd4463e1c4e-4cb4/screen/844a7905-7641-4d31-bcfa-3fe62ae8da2c/specs/" rel="noopener noreferrer"&gt;https://xd.adobe.com/view/19e7e42f-6b0f-46a7-b630-8dd4463e1c4e-4cb4/screen/844a7905-7641-4d31-bcfa-3fe62ae8da2c/specs/&lt;/a&gt;&lt;/p&gt;




</description>
      <category>ideas</category>
      <category>frontend</category>
      <category>projects</category>
      <category>junior</category>
    </item>
  </channel>
</rss>
