<?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: Youssef Abdulaziz</title>
    <description>The latest articles on DEV Community by Youssef Abdulaziz (@sem1colons).</description>
    <link>https://dev.to/sem1colons</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%2F823780%2F9217b1b9-637c-4b18-ae7a-254ba0b7f45a.jpeg</url>
      <title>DEV Community: Youssef Abdulaziz</title>
      <link>https://dev.to/sem1colons</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sem1colons"/>
    <language>en</language>
    <item>
      <title>🔥𝗕𝘂𝗶𝗹𝗱𝗶𝗻𝗴 𝗮𝗻 𝗻𝟴𝗻 𝗖𝗹𝗼𝗻𝗲 𝗶𝗻 𝗩𝘂𝗲</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Sat, 30 Aug 2025 13:22:51 +0000</pubDate>
      <link>https://dev.to/sem1colons/-45nm</link>
      <guid>https://dev.to/sem1colons/-45nm</guid>
      <description>&lt;p&gt;Ever thought about how tools like hashtag#𝗻𝟴𝗻 or hashtag#𝗭𝗮𝗽𝗶𝗲𝗿 build their visual automation editors?&lt;/p&gt;

&lt;p&gt;Turns out, with hashtag#Vue it’s easier than you’d think.&lt;/p&gt;

&lt;p&gt;✨ Features:&lt;br&gt;
 • Custom styled nodes (dark mode, Tailwind)&lt;br&gt;
 • Connectable edges&lt;br&gt;
 • Background grid&lt;/p&gt;

&lt;p&gt;This is just the first step toward building your own workflow editor. Add draggable node creation, triggers, and persistence — and you’re halfway to making your own n8n clone in Vue 🚀&lt;/p&gt;

&lt;p&gt;Here’s a minimal flow editor using 𝘃𝘂𝗲–𝗳𝗹𝗼𝘄 :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;VueFlow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useVueFlow&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@vue-flow/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Background&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@vue-flow/background&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@vue-flow/core/dist/style.css&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;nodes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Node 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p-3 text-slate-50 bg-[#342c3e] rounded-md shadow-md&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Node 2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p-3 text-slate-50 bg-[#342c3e] rounded-md shadow-md&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Node 3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p-3 text-slate-50 bg-[#342c3e] rounded-md shadow-md&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;])&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;edges&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;e1-2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;animated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;e1-3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;edge with text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-[500px] h-[500px] mx-auto"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-[500px] h-[500px] rounded-2xl overflow-hidden"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

                        &lt;span class="c"&gt;&amp;lt;!-- Flow Canvas --&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;VueFlow&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"basic-flow dark"&lt;/span&gt; &lt;span class="na"&gt;:nodes=&lt;/span&gt;&lt;span class="s"&gt;"nodes"&lt;/span&gt; &lt;span class="na"&gt;:edges=&lt;/span&gt;&lt;span class="s"&gt;"edges"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;Background&lt;/span&gt; &lt;span class="na"&gt;pattern-color=&lt;/span&gt;&lt;span class="s"&gt;"#7e7e7e"&lt;/span&gt; &lt;span class="na"&gt;:gap=&lt;/span&gt;&lt;span class="s"&gt;"16"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;/VueFlow&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>vue</category>
      <category>webdev</category>
      <category>automation</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Learned Fundamentals of Frontend Architecture</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Sat, 23 Aug 2025 17:12:04 +0000</pubDate>
      <link>https://dev.to/sem1colons/learned-fundamentals-of-frontend-architecture-22c6</link>
      <guid>https://dev.to/sem1colons/learned-fundamentals-of-frontend-architecture-22c6</guid>
      <description>&lt;p&gt;Just wrapped up the Fundamentals of Frontend Architecture course on frontendatscale.com by Maxi Ferreira —and honestly, it flipped the way I think about building frontends.&lt;/p&gt;

&lt;p&gt;Frontend isn’t just components and APIs—it’s architecture:&lt;br&gt;
 🔹 How do you make a codebase scalable as the team grows?&lt;br&gt;
 🔹 How do you balance DX vs performance?&lt;br&gt;
 🔹 How do you make sure your design decisions last longer than the sprint?&lt;/p&gt;

&lt;p&gt;Some of my favorite insights:&lt;br&gt;
 ✨ Thinking in architectural drivers (what really shapes your system)&lt;br&gt;
 ✨ Using the C4 model to visualize architecture clearly&lt;br&gt;
 ✨ Riskstorming before coding—spotting problems early&lt;br&gt;
 ✨ Documenting with ADRs so decisions don’t get lost in Slack threads&lt;/p&gt;

&lt;p&gt;The best part? It made me look at frontend less like “features shipping” and more like designing systems that can evolve.&lt;br&gt;
If you’re a frontend dev aiming to level up to architect thinking, this is 100% worth it. 🔥&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%2F4td1vuqvbbesj67t9tto.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%2F4td1vuqvbbesj67t9tto.png" alt=" " width="282" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>🧠 How defineModel Works in Vue 3 — A Modern Deep Dive</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Thu, 21 Aug 2025 15:25:33 +0000</pubDate>
      <link>https://dev.to/sem1colons/how-definemodel-works-in-vue-3-a-modern-deep-dive-5h5l</link>
      <guid>https://dev.to/sem1colons/how-definemodel-works-in-vue-3-a-modern-deep-dive-5h5l</guid>
      <description>&lt;p&gt;Vue 3.4 introduced a shiny new compiler macro called &lt;code&gt;defineModel&lt;/code&gt;, and it’s one of those features that makes you wonder: &lt;em&gt;why did we ever write &lt;code&gt;props&lt;/code&gt; + &lt;code&gt;emits&lt;/code&gt; manually?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you’ve ever built components that need &lt;code&gt;v-model&lt;/code&gt;, you know the drill: props for &lt;code&gt;modelValue&lt;/code&gt;, an emit for &lt;code&gt;update:modelValue&lt;/code&gt;, and a bit of boilerplate to wire them together. &lt;code&gt;defineModel&lt;/code&gt; takes all of that and turns it into a single, clean line of code.&lt;/p&gt;

&lt;p&gt;Let’s peel back the curtain and see what’s really happening.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ The Simple Example
&lt;/h2&gt;

&lt;p&gt;Here’s a minimal parent + child setup:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App.vue&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
   &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TextInput&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./TextInput.vue&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;textModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;TextInput&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"textModel"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Name: &lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;textModel&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;TextInput.vue&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"modelValue"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. No props. No emits. Just &lt;code&gt;defineModel&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ What Vue Compiles It Into
&lt;/h2&gt;

&lt;p&gt;When you hit save, Vue’s compiler does the heavy lifting. &lt;code&gt;defineModel()&lt;/code&gt; gets expanded into a &lt;code&gt;useModel&lt;/code&gt; call plus generated props + emits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TextInput.vue (source)&lt;/strong&gt; | &lt;strong&gt;Compiled (JS)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"modelValue"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useModel&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;_useModel&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&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;__sfc__&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;TextInput&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;modelValue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;modelModifiers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;emits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;update:modelValue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;expose&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;__expose&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;__expose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// 👇 defineModel turns into useModel&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_useModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;modelValue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;modelValue&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;function&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$setup&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="nf"&gt;_withDirectives&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;_openBlock&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nf"&gt;_createElementBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;onUpdate:modelValue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;$event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$setup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;_vModelText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$setup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔍 Breaking It Down
&lt;/h2&gt;

&lt;p&gt;So what exactly is happening here?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Props &amp;amp; Emits are generated for you:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="nx"&gt;modelModifiers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
   &lt;span class="nx"&gt;emits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;update:modelValue&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;⚡ &lt;code&gt;defineModel&lt;/code&gt; turns into &lt;code&gt;useModel&lt;/code&gt;:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;modelValue&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;This creates a local ref that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reads from &lt;code&gt;props.modelValue&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Emits &lt;code&gt;update:modelValue&lt;/code&gt; when assigned to&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Template reactivity stays clean:&lt;/strong&gt;
The &lt;code&gt;v-model="modelValue"&lt;/code&gt; in your template is just sugar. Under the hood, it compiles into:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="nx"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;$event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$setup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which calls the setter from &lt;code&gt;useModel&lt;/code&gt; and triggers the parent update.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Why This Matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Less boilerplate&lt;/strong&gt; → No more writing &lt;code&gt;props&lt;/code&gt; + &lt;code&gt;emits&lt;/code&gt; manually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleaner mental model&lt;/strong&gt; → Treat your model like a local &lt;code&gt;ref&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type safety&lt;/strong&gt; → Works with TypeScript generics (&lt;code&gt;defineModel&amp;lt;string&amp;gt;()&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple models&lt;/strong&gt; → Add more with &lt;code&gt;defineModel('name')&lt;/code&gt;, &lt;code&gt;defineModel('content')&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 The Mental Model
&lt;/h2&gt;

&lt;p&gt;Think of &lt;code&gt;defineModel&lt;/code&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Parent v-model  ⇄  Child’s local ref (via useModel)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The child sees a normal reactive ref (&lt;code&gt;modelValue&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The parent gets updates automatically, without extra emits.&lt;/li&gt;
&lt;li&gt;Both stay in sync.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Vue’s &lt;code&gt;defineModel&lt;/code&gt; is one of those quality-of-life upgrades that make your codebase cleaner and your brain lighter. Instead of wiring up props and emits by hand, you just declare a reactive ref, and Vue does the rest.&lt;/p&gt;

&lt;p&gt;It’s reactivity the way it should feel: &lt;strong&gt;local when you need it, two-way when you want it.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🚀 How I Conquer New Tools, Frameworks &amp; Software Like a Pro ⚔️💻</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Fri, 06 Jun 2025 20:58:17 +0000</pubDate>
      <link>https://dev.to/sem1colons/how-i-conquer-new-tools-frameworks-software-like-a-pro-3jgd</link>
      <guid>https://dev.to/sem1colons/how-i-conquer-new-tools-frameworks-software-like-a-pro-3jgd</guid>
      <description>&lt;p&gt;As developers, we're constantly bombarded with shiny new frameworks, libraries, tools, and trends. One week it's all about Vue, the next it's Astro, and before you know it, everyone's raving about tRPC or Bun.&lt;/p&gt;

&lt;p&gt;📦 Staying up-to-date can feel like chasing a speeding train... but over time, I've developed a battle-tested strategy to &lt;strong&gt;learn new tech efficiently&lt;/strong&gt; without burning out. Whether it's a hot new JS framework or a powerful dev tool, this is how I level up quickly and &lt;em&gt;actually enjoy&lt;/em&gt; the ride.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 1. Skim the Docs — Understand the "Why"
&lt;/h2&gt;

&lt;p&gt;Before I touch a line of code, I scan the official documentation. I don’t go too deep yet. I'm looking for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What problem does this solve? 🤔&lt;/li&gt;
&lt;li&gt;How is it different from what I already know?&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Example: With Vue, I immediately saw how it tackled reactivity and templating in a super clean, elegant way. I was hooked 💚&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Docs are great for getting the &lt;strong&gt;philosophy&lt;/strong&gt; and &lt;strong&gt;mental model&lt;/strong&gt; of the tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 2. Try the Interactive Tutorial (If Available)
&lt;/h2&gt;

&lt;p&gt;If there’s an interactive playground or guided tutorial (looking at you Vue, Angular, Svelte 🫶), I’m in. These are gold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No setup, no stress&lt;/li&gt;
&lt;li&gt;Learn by doing 🛠️&lt;/li&gt;
&lt;li&gt;Immediate feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This step gives me that quick “aha!” moment 💡 that motivates me to keep going.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎬 3. Watch a Crash Course (Shoutout Traversy Media! 🙌)
&lt;/h2&gt;

&lt;p&gt;Next, I jump into YouTube. And when I say YouTube, I &lt;em&gt;really&lt;/em&gt; mean &lt;a href="https://www.youtube.com/@TraversyMedia" rel="noopener noreferrer"&gt;Traversy Media&lt;/a&gt;. Brad's crash courses are 🔥&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"React Crash Course 2024 - Traversy Media"&lt;br&gt;
"Tailwind CSS in 30 Minutes - Traversy Media"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They’re fast-paced, practical, and cover the essentials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project structure 🏗️&lt;/li&gt;
&lt;li&gt;Syntax and conventions&lt;/li&gt;
&lt;li&gt;Real-world examples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Watching a good crash course feels like upgrading my brain in 45 minutes ⏱️💡&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 4. Build a Tiny Project (or Two)
&lt;/h2&gt;

&lt;p&gt;Time to get my hands dirty.&lt;/p&gt;

&lt;p&gt;I build something small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A weather app ☀️❄️&lt;/li&gt;
&lt;li&gt;A notes app 📝&lt;/li&gt;
&lt;li&gt;A to-do list ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It doesn’t have to be perfect—it just needs to &lt;em&gt;exist&lt;/em&gt;. This is where the real learning kicks in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I run into bugs 🐞&lt;/li&gt;
&lt;li&gt;I read docs deeper 📘&lt;/li&gt;
&lt;li&gt;I get comfortable with the tooling 🛠️&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📚 5. Go Deep — Full Course, Full Docs, All-In Mode
&lt;/h2&gt;

&lt;p&gt;Now I’m ready to commit.&lt;/p&gt;

&lt;p&gt;This is where I:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take a &lt;strong&gt;30h+ Udemy course&lt;/strong&gt; 🧠🎓&lt;/li&gt;
&lt;li&gt;Read the &lt;em&gt;entire&lt;/em&gt; documentation, start to finish 📘✅&lt;/li&gt;
&lt;li&gt;Read articles, Medium posts, and Dev.to tips 📝&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This step transforms me from a hobbyist into someone who could use the tool in production with confidence 💪&lt;/p&gt;




&lt;h2&gt;
  
  
  👥 Bonus: Join the Community
&lt;/h2&gt;

&lt;p&gt;Don't sleep on community learning!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Join Discord servers 🗨️&lt;/li&gt;
&lt;li&gt;Follow Reddit threads 🧵&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s so much value in seeing how others use the same tool, solve weird bugs, or share tips from the trenches 🚧&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;There’s no one-size-fits-all approach to learning something new in tech—but this method has saved me &lt;strong&gt;time&lt;/strong&gt;, &lt;strong&gt;stress&lt;/strong&gt;, and a ton of rabbit holes 🐇🕳️&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;🧭 Skim the docs&lt;/li&gt;
&lt;li&gt;⚡ Do interactive tutorials&lt;/li&gt;
&lt;li&gt;🎬 Watch a crash course (Traversy FTW!)&lt;/li&gt;
&lt;li&gt;🛠️ Build small projects&lt;/li&gt;
&lt;li&gt;📚 Go deep with courses &amp;amp; docs&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Learning something new should feel exciting—not exhausting. So keep shipping, stay curious, and don’t forget to have fun along the way! 🧠✨&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy learning!&lt;/strong&gt; 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>learning</category>
      <category>frontend</category>
      <category>backend</category>
    </item>
    <item>
      <title>Building Headless Components in Vue — The Right Way</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Fri, 30 May 2025 17:04:20 +0000</pubDate>
      <link>https://dev.to/sem1colons/building-headless-components-in-vue-the-right-way-ib1</link>
      <guid>https://dev.to/sem1colons/building-headless-components-in-vue-the-right-way-ib1</guid>
      <description>&lt;p&gt;Reusable UI components often break once you change the design. Solution? Go headless.&lt;/p&gt;

&lt;p&gt;A headless component:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;"Exposes data &amp;amp; logic (but no styling)"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"Lets you plug in any markup/UX you want"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"Keeps behavior testable and DRY"&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: a headless dropdown:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useDropdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isOpen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toggle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toggle&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"toggle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Toggle&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;v-if=&lt;/span&gt;&lt;span class="s"&gt;"isOpen"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;slot&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;"📦 Easy to theme"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"✅ Easier snapshot testing"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"🧠 Decouples logic from layout"&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is what libraries like Radix and Headless UI follow. You can build your own system for any internal tools.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vue</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>The “Good Enough” Refactor Rule for Fast Teams</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Fri, 30 May 2025 15:46:57 +0000</pubDate>
      <link>https://dev.to/sem1colons/the-good-enough-refactor-rule-for-fast-teams-3mpg</link>
      <guid>https://dev.to/sem1colons/the-good-enough-refactor-rule-for-fast-teams-3mpg</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I used to chase perfection — refactor deeply, clean every file, remove every legacy prop.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But on fast-moving teams, that’s a luxury.&lt;/p&gt;

&lt;p&gt;Now I follow a rule I call: “Clean What You Touch.”&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;p&gt;Only refactor the parts you already changed in a PR&lt;/p&gt;

&lt;p&gt;Leave clear TODOs in comments, not Jira&lt;/p&gt;

&lt;p&gt;Propose full refactors during quiet sprints, not delivery weeks&lt;/p&gt;

&lt;p&gt;This keeps tech debt manageable without slowing features.&lt;/p&gt;

&lt;p&gt;It also shows your team you can balance speed and craftsmanship — a signal of seniority that doesn’t need a title.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>webdev</category>
      <category>refactoring</category>
      <category>cleancode</category>
    </item>
    <item>
      <title>The Silent Frontend Bottleneck: Communication Between Modules</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Fri, 30 May 2025 15:38:05 +0000</pubDate>
      <link>https://dev.to/sem1colons/the-silent-frontend-bottleneck-communication-between-modules-4i2j</link>
      <guid>https://dev.to/sem1colons/the-silent-frontend-bottleneck-communication-between-modules-4i2j</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Everyone talks about optimizing load time, but here’s an underrated bottleneck: module communication.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vue’s Composition API gives you tools like provide/inject, stores, and custom composables… but when should you use which?&lt;/p&gt;

&lt;p&gt;My go-to rules:&lt;/p&gt;

&lt;p&gt;If two sibling components talk → shared composable or scoped store&lt;/p&gt;

&lt;p&gt;If parent provides data → props or provide/inject&lt;/p&gt;

&lt;p&gt;If data needs to survive route changes → Pinia/global store&lt;/p&gt;

&lt;p&gt;What kills DX is mixing strategies. I once saw a component that injected data from one parent, pulled another from global store, and passed props to a nested modal — impossible to test.&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%2F27myn66iuttvi8xkb0fe.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%2F27myn66iuttvi8xkb0fe.jpg" alt=" " width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vue</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Typescript enums: not magic, just objects⚡🧠</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Sun, 01 Dec 2024 05:35:19 +0000</pubDate>
      <link>https://dev.to/sem1colons/typescript-enums-not-magic-just-objects-4nio</link>
      <guid>https://dev.to/sem1colons/typescript-enums-not-magic-just-objects-4nio</guid>
      <description>&lt;p&gt;It was my usual 4am 🕓 psycho-dev 🧠 study session, and the topic at hand was &lt;strong&gt;TypeScript&lt;/strong&gt; ⚡. After watching some (1 to 1M) 📺 5-minute videos on YouTube and interrogating ChatGPT 🤖 for a couple of minutes ⏱️, finally... I understood how TypeScript enums translate to JavaScript! 🎉🚀.&lt;/p&gt;




&lt;p&gt;For those who dont know what enums are:&lt;br&gt;
In TypeScript, enums (short for enumerations) are like a toolbox 🧰 of named constants. They help you group related values and assign them easy-to-remember names, making your code more readable and error-resistant 🚀.&lt;/p&gt;
&lt;h4&gt;
  
  
  🛠️ Types of Enums:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Numeric Enums 🔢 =&amp;gt;
Each member gets a number (0, 1, 2…).
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Direction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// 0&lt;/span&gt;
  &lt;span class="nx"&gt;Down&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// 1&lt;/span&gt;
  &lt;span class="nx"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// 2&lt;/span&gt;
  &lt;span class="nx"&gt;Right&lt;/span&gt;   &lt;span class="c1"&gt;// 3&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;String Enums 🔤 =&amp;gt;
Each member has a string value, making debugging easier.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Direction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Up&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UP&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Down&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DOWN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;LEFT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RIGHT&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;ol&gt;
&lt;li&gt;Heterogeneous(mixed) Enums 🎲 =&amp;gt;
Mix numeric and string values (rarely used but possible). &lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  TS enums to JS objects 🔢⇨📦
&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%2Fzkocpc09cueiajzoz96t.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%2Fzkocpc09cueiajzoz96t.png" alt="Ts enum to Js object" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's near 5:30am now and I finally get it! I finally understand how this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Direction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// 0&lt;/span&gt;
  &lt;span class="nx"&gt;Down&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// 1&lt;/span&gt;
  &lt;span class="nx"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// 2&lt;/span&gt;
  &lt;span class="nx"&gt;Right&lt;/span&gt;   &lt;span class="c1"&gt;// 3&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;makes this Js code possible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="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="nx"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Down&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First, lets see how tsc (typescript compiler) compiles the enum:&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%2Fh2i7q7dru9jpbaswla3g.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%2Fh2i7q7dru9jpbaswla3g.png" alt="tsc (typescript compiler) compiles the enum" width="800" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From what I see, the compiler made an IFFE (famously known as iffy) function which is "Immediately Invoked Function Expression". I..FF..E it's in the name. From its name, the function is immediately executed.&lt;/p&gt;

&lt;p&gt;The compiler also initialized a variable name &lt;strong&gt;Direction&lt;/strong&gt; which is &lt;strong&gt;undefined&lt;/strong&gt; for the moment.&lt;/p&gt;

&lt;p&gt;Now lets look inside. The anonymous function inside the iffy has one paramater which is treated as an object inside the function, the object that resembels the enum.&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%2F6gmg3w90w8xtbywwjn20.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%2F6gmg3w90w8xtbywwjn20.png" alt="Anonymous function" width="279" height="34"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That parameter is fed to the function as an argument for the iffy. If its null or undefined (which is our case) it will be assigned an empty object&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%2Fi04m8wycry1ag25l7qcg.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%2Fi04m8wycry1ag25l7qcg.png" alt="iffy argument" width="512" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now to juicy parts....&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Direction[Direction["Up"] = 0] = "Up";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Javascript executes the most inner square brackets to the outer brackets,&lt;br&gt;
so &lt;code&gt;Direction["Up"] = 0&lt;/code&gt; is executed first and an entry "Up" is added to the &lt;strong&gt;Direction&lt;/strong&gt; object&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the outer brackets also expects a value ( 0 in our case)&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%2Fh2b7oxaee67zev4sishe.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%2Fh2b7oxaee67zev4sishe.png" alt="Bidirectional Mapping" width="417" height="33"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the surprise of everyone (even javascript 😒), the assignment operation returns the assigned value&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="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="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;546&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// returns 546. Try it in browser console yourself&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;so the inner bracket assigns 0 to "Up" and also returns 0 for the outer bracket to create another entry in &lt;strong&gt;Direction&lt;/strong&gt; Object.&lt;/p&gt;

&lt;p&gt;Long story short, this line creates &lt;strong&gt;Bidirectional Mapping&lt;/strong&gt;(only with numeric enums) inside the &lt;strong&gt;Direction&lt;/strong&gt; object.&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%2F51nwipjt9l9mdg00lpgy.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%2F51nwipjt9l9mdg00lpgy.png" alt="Bidirectional Mapping" width="800" height="53"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//step 1&lt;/span&gt;
&lt;span class="nx"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Up&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Up&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/*

Direction ={
Up:0
}

*/&lt;/span&gt;

&lt;span class="c1"&gt;//step 2&lt;/span&gt;
&lt;span class="nx"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Up&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/*

Direction ={
Up:0,
0:"Up",
}

*/&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;After line #1 of the function, this is our &lt;strong&gt;Direction&lt;/strong&gt; object&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Up&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now u know the drill. After the function completes execution, &lt;strong&gt;Direction&lt;/strong&gt; looks like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Up&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="nx"&gt;Down&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Down&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="nx"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Left&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="nx"&gt;Right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Right&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;It's 6:45am , I gotta get to bed. Do NOT wake me up before 9. I absolutely don't wanna hear your comments or questions, but I do expect a follow, a like and a share maybe.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>enums</category>
      <category>webdev</category>
    </item>
    <item>
      <title>VueJs Reactivity... And How does it work</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Sat, 30 Jul 2022 00:53:00 +0000</pubDate>
      <link>https://dev.to/sem1colons/reactive-vue-how-does-it-work-4flb</link>
      <guid>https://dev.to/sem1colons/reactive-vue-how-does-it-work-4flb</guid>
      <description>&lt;p&gt;One of the main features of any modern JavaScript framework is reactivity. in this article you're gonna understand how Vue.Js tackles this by :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Understanding the problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vue's solution to that problem.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You're coding using vanilla JavaScript and the code calculates the total price of some products and logs it...&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%2Fqnfm720548kefyvd1b0i.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%2Fqnfm720548kefyvd1b0i.png" alt="Our scenario" width="462" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now our price has gone up to 20 per product, let's log the price again....&lt;br&gt;
to our surprise it's still 10 but why?! that's supposed to be 40, right? &lt;strong&gt;WRONG&lt;/strong&gt;.&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%2Fgct9si9z741t004shy0e.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%2Fgct9si9z741t004shy0e.png" alt="nothing is changed" width="500" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take a good look at the code again, the calculation only happens once. We never told JavaScript to track any changes nor we told it that the total price calculation is meant to update according to changes, and here's where &lt;strong&gt;The Reactive Vue&lt;/strong&gt; really shines...&lt;/p&gt;

&lt;h2&gt;
  
  
  Vue's solution
&lt;/h2&gt;

&lt;p&gt;The approach is that we want to be able to store the critical value in some sort and be able to track it and trigger the effect when the value changes.&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%2F8pmll3dii7quxysce1bd.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%2F8pmll3dii7quxysce1bd.png" alt="Code to store" width="579" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The calculation is wrapped in a function called "effect" and stored for later use when our value(price) changes. For that to happen, there are 3 main operations(functions) to run:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;track() -&amp;gt; to actually save our code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;effect() -&amp;gt; the actual behavior/calculation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trigger() -&amp;gt; to run the effect/s&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%2F547nvl4n4yvvqhqjauza.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%2F547nvl4n4yvvqhqjauza.png" alt="main operations" width="648" height="246"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Brainstorming...
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Can there be multiple effects? How does Vue handle that?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens when we want to track multiple properties?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What if we track objects...?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'll answer all that in the upcoming post as well as your questions. Feel free to ask me about anything, it's ok we're all learning here.&lt;/p&gt;

&lt;p&gt;Leave a ♥️ for the post if it was useful to reach more devs 🧑‍💻🧑‍💻...&lt;br&gt;
&lt;strong&gt;Follow me for more related content...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;recourses:&lt;br&gt;
&lt;a href="https://www.youtube.com/c/VueMastery" rel="noopener noreferrer"&gt;https://www.youtube.com/c/VueMastery&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Why React but not Vue!!</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Fri, 15 Jul 2022 18:04:26 +0000</pubDate>
      <link>https://dev.to/sem1colons/why-react-but-not-vue-4h98</link>
      <guid>https://dev.to/sem1colons/why-react-but-not-vue-4h98</guid>
      <description>&lt;p&gt;I am a Vue developer and recently started to learn React.It's the first time I write code while being angry at it 😂😂, I wonder why would someone choose the scramble(in my opinion) of React over the convenience and organisation of Vue.&lt;/p&gt;

&lt;p&gt;I want to hear your opinion about this if you have experience in React or vue or both of them.&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%2Fzivslje2aiw125fvf5ex.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%2Fzivslje2aiw125fvf5ex.jpg" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Hardstuck Fresh Graduate</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Fri, 27 May 2022 11:16:19 +0000</pubDate>
      <link>https://dev.to/sem1colons/hardstuck-fresh-graduate-5ecp</link>
      <guid>https://dev.to/sem1colons/hardstuck-fresh-graduate-5ecp</guid>
      <description>&lt;p&gt;I'm 1 month away from graduating with a BSc in software engineering. I've always seen myself as a freelance developer but that is kinda hard to start with and even if I wanted to work with a company, their demands will be 1yr experience at minimum.&lt;/p&gt;

&lt;p&gt;Although I don't have that much of professional work experience, I`ve done a few projects that verifies my skills.&lt;/p&gt;

&lt;p&gt;The question is how can I start my freelance career(or corporate career) giving that internship opportunities hardly exist in my country (Egypt) and nearly everyone want seniors with 5+ yrs. It`s really disappointing.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How many Vue stores do I need?</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Fri, 06 May 2022 18:50:28 +0000</pubDate>
      <link>https://dev.to/sem1colons/how-many-vue-stores-do-i-need-45ph</link>
      <guid>https://dev.to/sem1colons/how-many-vue-stores-do-i-need-45ph</guid>
      <description>&lt;p&gt;I'm making an e-commerce like app using VueJs and I'm learning state management with &lt;a href="https://pinia.vuejs.org" rel="noopener noreferrer"&gt;Pinia&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I`m kinda confused with how many stores do I need to integrate in my app or how many pieces of state do I need to manage. I wanna know how you determine the number of stores as an experienced developer&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%2Fblog.logrocket.com%2Fwp-content%2Fuploads%2F2022%2F04%2FComplex-Vue-state-management-made-easy-Pinia.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%2Fblog.logrocket.com%2Fwp-content%2Fuploads%2F2022%2F04%2FComplex-Vue-state-management-made-easy-Pinia.png" alt="Pinia" width="730" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
