<?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: Abdelrahman Ismail</title>
    <description>The latest articles on DEV Community by Abdelrahman Ismail (@ismail9k).</description>
    <link>https://dev.to/ismail9k</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%2F49118%2Ffed17af7-5b8c-479f-a8cd-62df6a536fe2.jpg</url>
      <title>DEV Community: Abdelrahman Ismail</title>
      <link>https://dev.to/ismail9k</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ismail9k"/>
    <language>en</language>
    <item>
      <title>Fixing Claude’s Image Problem — Because I Can Fix Her</title>
      <dc:creator>Abdelrahman Ismail</dc:creator>
      <pubDate>Sat, 11 Apr 2026 09:28:42 +0000</pubDate>
      <link>https://dev.to/ismail9k/fixing-claudes-image-problem-because-i-can-fix-her-1o1a</link>
      <guid>https://dev.to/ismail9k/fixing-claudes-image-problem-because-i-can-fix-her-1o1a</guid>
      <description>&lt;p&gt;Claude is a 10, but it can’t generate images.&lt;br&gt;
Still, I had a feeling: &lt;em&gt;I can fix her.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Turns out… you actually can.&lt;/p&gt;

&lt;p&gt;Not by waiting for an official feature drop, but by wiring Claude into something that already does it well.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll plug &lt;strong&gt;Gemini (Google’s multimodal model)&lt;/strong&gt; into Claude using MCP (Model Context Protocol), effectively turning Claude into a &lt;strong&gt;multi-model agent&lt;/strong&gt; that can generate images on demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Really Happening Here
&lt;/h2&gt;

&lt;p&gt;You’re splitting responsibilities across models:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude&lt;/strong&gt; → reasoning, instructions, orchestration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini&lt;/strong&gt; → image generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; → the bridge that lets them talk&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Get Your Gemini API Key
&lt;/h2&gt;

&lt;p&gt;Head over to:&lt;br&gt;
👉 &lt;a href="https://aistudio.google.com/api-keys" rel="noopener noreferrer"&gt;https://aistudio.google.com/api-keys&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a new API key&lt;/li&gt;
&lt;li&gt;Make sure &lt;strong&gt;billing is enabled&lt;/strong&gt; (this matters for image generation)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 2: Plug Gemini into Claude (MCP Setup)
&lt;/h2&gt;

&lt;p&gt;Now the fun part, connecting the two.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Claude Desktop:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings → Developer → Edit Config&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Open &lt;code&gt;claude_desktop_config.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Add this:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gemini"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"@houtini/gemini-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"GEMINI_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_API_KEY_HERE"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Replace "YOUR_API_KEY_HERE" with your actual key.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s it. You’ve just given Claude access to Gemini.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: When Things Break (Because They Might)
&lt;/h2&gt;

&lt;p&gt;Let’s be real, this setup isn’t always plug-and-play.&lt;/p&gt;

&lt;p&gt;Here’s what usually goes wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js version is too old → use &lt;strong&gt;v18+&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;npx isn’t working properly&lt;/li&gt;
&lt;li&gt;API key has no billing attached&lt;/li&gt;
&lt;li&gt;MCP server fails silently&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What worked for me
&lt;/h3&gt;

&lt;p&gt;I hit compatibility issues locally, so I Grabbed the MCP server logs and dropped them into Claude Code, and... as expected it fixed everything in minutes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you’re stuck, check the logs first. Always.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 4: Test It
&lt;/h2&gt;

&lt;p&gt;Now try this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hey Claude, use the Gemini MCP to generate an image of what the world might look like in five years.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  💡 Pro tip
&lt;/h3&gt;

&lt;p&gt;Claude won’t always decide to use tools on its own, you need to &lt;strong&gt;nudge it clearly&lt;/strong&gt;.&lt;/p&gt;




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

&lt;p&gt;Claude didn’t need to change.&lt;/p&gt;

&lt;p&gt;You just gave it access to the right tool.&lt;/p&gt;

&lt;p&gt;And suddenly, a limitation turned into a capability.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Yeah… you fixed her.&lt;/em&gt; :D &lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/houtini-ai/gemini-mcp" rel="noopener noreferrer"&gt;https://github.com/houtini-ai/gemini-mcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aistudio.google.com" rel="noopener noreferrer"&gt;https://aistudio.google.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>tutorial</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Once Upon a Time, Writing Code Was Fun</title>
      <dc:creator>Abdelrahman Ismail</dc:creator>
      <pubDate>Tue, 24 Feb 2026 20:11:41 +0000</pubDate>
      <link>https://dev.to/ismail9k/once-upon-a-time-writing-code-was-fun-62</link>
      <guid>https://dev.to/ismail9k/once-upon-a-time-writing-code-was-fun-62</guid>
      <description>&lt;p&gt;I’m one of those developers who’s had the privilege of writing code by hand in its rawest form, the kind who wrote every line by hand. No copilots. No prompts. Just raw logic, caffeine, and a blinking cursor.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And I’m glad I did.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I used to write code for work, in my free time, when I was stressed, when I was happy, In my dreams, I still write code. I did it because creating something, fixing issues, building systems... it was fun.&lt;/p&gt;

&lt;p&gt;That feeling of fulfillment when you’d step back, look at what you built, and think:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I’m a genius. I did that.&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%2F23eokge24dpvtbez2hwb.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%2F23eokge24dpvtbez2hwb.gif" alt="Leonardo DiCaprio cheers" width="478" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Back then, you weren’t just assembling components, you were constructing mental models.&lt;br&gt;
Every function passed through layers of thought. You traced edge cases before they existed and simulated failure before production ever had the chance to surprise you.&lt;br&gt;
Every bug you fixed made you sharper.&lt;/p&gt;

&lt;p&gt;You didn’t just write code.&lt;br&gt;
You forged it.&lt;/p&gt;

&lt;p&gt;We can still do that today.&lt;br&gt;
The difference is: we don’t have to.&lt;/p&gt;

&lt;p&gt;I remember one time I've built a complex component I was truly proud of. I called my friend and said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“You have to see this... Yeah, I know it's past 2 a.m.”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not because anyone asked. Not because it was urgent.&lt;br&gt;
But because I had built something difficult, and I needed someone to witness it.&lt;/p&gt;

&lt;p&gt;That kind of excitement is hard to fake.&lt;/p&gt;

&lt;p&gt;(And no, vibe coders, I’m not exaggerating.)&lt;/p&gt;




&lt;h2&gt;
  
  
  The AI Acceleration Paradox
&lt;/h2&gt;

&lt;p&gt;Fast forward to today.&lt;/p&gt;

&lt;p&gt;In the last few months, I’ve produced more code than I used to produce in an entire year. The output metrics look incredible. Productivity charts would love me.&lt;/p&gt;

&lt;p&gt;But something feels… off.&lt;/p&gt;

&lt;p&gt;It doesn’t feel like I built it.&lt;br&gt;
It feels like the “9k Jr. developer” built it.&lt;/p&gt;

&lt;p&gt;Yes, I review it.&lt;br&gt;
Yes, I refine it.&lt;br&gt;
Yes, I understand it.&lt;/p&gt;

&lt;p&gt;But it didn’t originate from that deep cognitive grind.&lt;/p&gt;

&lt;p&gt;It feels like someone defeated the final boss and rescued the princess for you. You get the credits… but you didn’t play the game.&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%2Fo8fs3uad81mmf5rphfci.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%2Fo8fs3uad81mmf5rphfci.gif" alt="Super Mario thank you" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that’s the paradox:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When creation becomes effortless, accomplishment starts to feel weightless.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Death of Flow
&lt;/h2&gt;

&lt;p&gt;There’s another side effect no one talks about.&lt;/p&gt;

&lt;p&gt;Flow state used to come naturally when writing complex systems. You’d get lost for hours, structuring logic, debugging edge cases, refining abstractions.&lt;/p&gt;

&lt;p&gt;Now?&lt;/p&gt;

&lt;p&gt;You describe what you want.&lt;br&gt;
You wait.&lt;br&gt;
You get distracted.&lt;/p&gt;

&lt;p&gt;The AI finishes the job while you’re checking messages or scrolling social media, and you hit accept, accept, accept.&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%2Fruo3u2jxjqefnh97z1ts.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%2Fruo3u2jxjqefnh97z1ts.gif" alt="Homer Simpson button" width="480" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you typed code, your brain and hands were synchronized. The struggle encoded the system into you.&lt;/p&gt;

&lt;p&gt;AI removes friction, but friction was the encoding mechanism.&lt;/p&gt;




&lt;h2&gt;
  
  
  Typing Used to Be Joyful
&lt;/h2&gt;

&lt;p&gt;This one surprised me.&lt;/p&gt;

&lt;p&gt;Typing used to be satisfying. Mechanical keyboards (I have a couple of them), rapid thoughts turning into structured syntax, the physical rhythm of thinking through your hands.&lt;/p&gt;

&lt;p&gt;Now it’s easier to dictate requirements. Easier to describe instead of construct.&lt;/p&gt;

&lt;p&gt;But describing isn’t the same as building.&lt;/p&gt;

&lt;p&gt;And building is where the joy lived.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Ownership Gap in Production
&lt;/h2&gt;

&lt;p&gt;Here’s where it gets serious.&lt;/p&gt;

&lt;p&gt;A few weeks ago, something broke in production due to recent changes.&lt;/p&gt;

&lt;p&gt;The old 9k would have known exactly where to look. Exactly how to fix it.&lt;/p&gt;

&lt;p&gt;This time, I had to re-read my own system like a stranger.&lt;/p&gt;

&lt;p&gt;That realization hit harder than the bug itself.&lt;/p&gt;

&lt;p&gt;When code you wrote yourself fails in production, your brain already has a map. You can navigate quickly. You debug with intuition.&lt;/p&gt;

&lt;p&gt;You could almost feel it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“File XYZ, line 32. That’s where it’s failing.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because the entire codebase had passed through your brain, not just your eyes. You had simulated it. You had wrestled with it. You had lived inside it.&lt;/p&gt;

&lt;p&gt;Now when something breaks?&lt;/p&gt;

&lt;p&gt;You go back and read it line by line. Not because you’re incapable, but because you didn’t internalize it the same way. You reviewed it, but you didn’t &lt;em&gt;forge&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;There’s a cognitive difference between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing code&lt;/li&gt;
&lt;li&gt;Reviewing code&lt;/li&gt;
&lt;li&gt;Understanding code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’re slowly shifting from the first to the third.&lt;/p&gt;

&lt;p&gt;And that shift changes how deeply knowledge embeds itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  I’m Not Complaining — I’m Observing
&lt;/h2&gt;

&lt;p&gt;I’m not anti-AI. (Ironically, my initials are A.I.)&lt;/p&gt;

&lt;p&gt;I’ve witnessed the rise of code. I’ve had the privilege of writing it by hand in its rawest form, and I’m glad I did. And I also see where things are heading.&lt;/p&gt;

&lt;p&gt;AI is not going away. It will get better. Faster. More autonomous.&lt;/p&gt;

&lt;p&gt;But the Game Has Changed&lt;br&gt;
Maybe our role isn’t to type faster anymore.&lt;/p&gt;

&lt;p&gt;Maybe it’s to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architect better.&lt;/li&gt;
&lt;li&gt;Ask sharper questions.&lt;/li&gt;
&lt;li&gt;Design deeper systems.&lt;/li&gt;
&lt;li&gt;Understand trade-offs more clearly.&lt;/li&gt;
&lt;li&gt;Own decisions rather than lines of code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The craftsmanship is evolving. But we have to be intentional.&lt;/p&gt;

&lt;p&gt;Because if we fully surrender the act of building, we might accidentally surrender the joy of building too.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;So What Do I Think?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I think this moment feels uncomfortable because we’re in a transition era.&lt;/p&gt;

&lt;p&gt;The developers who wrote everything by hand feel the shift most intensely. We remember what it felt like when the friction was part of the reward.&lt;/p&gt;

&lt;p&gt;Sometimes I catch myself sounding like a grandpa already, talking about “the good old days” of writing code till 2 a.m.&lt;/p&gt;

&lt;p&gt;The new generation might never experience that same kind of satisfaction, but they’ll probably experience a different one.&lt;/p&gt;

&lt;p&gt;The challenge for us OGs isn’t to resist AI.&lt;/p&gt;

&lt;p&gt;It’s to figure out how to use it without losing ourselves in the process.&lt;/p&gt;

&lt;p&gt;Maybe the solution is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sometimes turn it off.&lt;/li&gt;
&lt;li&gt;Sometimes write the complex thing yourself.&lt;/li&gt;
&lt;li&gt;Sometimes struggle on purpose.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because struggle isn’t inefficiency.&lt;br&gt;
Sometimes, it’s meaning.&lt;/p&gt;

&lt;p&gt;And yes… for the sake of full transparency:&lt;/p&gt;

&lt;p&gt;I wrote this article with the help of AI.&lt;br&gt;
I dictated most of it instead of typing.&lt;/p&gt;

&lt;p&gt;Writing used to be fun too.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>development</category>
    </item>
    <item>
      <title>You Are Using TailwindCSS Wrong</title>
      <dc:creator>Abdelrahman Ismail</dc:creator>
      <pubDate>Tue, 16 Dec 2025 20:25:28 +0000</pubDate>
      <link>https://dev.to/ismail9k/you-are-using-tailwindcss-wrong-25gb</link>
      <guid>https://dev.to/ismail9k/you-are-using-tailwindcss-wrong-25gb</guid>
      <description>&lt;p&gt;I have mentioned before why I generally do not recommend using TailwindCSS as the primary styling approach in my projects, and I have explained that position in detail &lt;a href="https://ismail9k.com/blog/tailwind-css-why-it-s-not-my-cup-of-tea#separation-of-concerns" rel="noopener noreferrer"&gt;here&lt;/a&gt;. This time, however, I want to take a more pragmatic angle and talk about &lt;em&gt;how&lt;/em&gt; TailwindCSS can be used correctly, without turning it into an anti-pattern.&lt;/p&gt;

&lt;p&gt;Before diving in, let's go back in history.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Short History of Styling on the Web
&lt;/h2&gt;

&lt;p&gt;Once upon a time, there were happy dinosaurs… alright, that’s too far back. et’s return to the point where modern HTML and CSS became widely usable, roughly around the time HTML5 and CSS3 stabilized, the web started to scale very quickly. Around the same period, Twitter introduced Bootstrap, one of the first widely adopted component-based CSS libraries. Bootstrap was revolutionary for its time, it provided a consistent visual language, sensible defaults, and ready-made components that dramatically reduced the effort required to build interfaces.&lt;/p&gt;

&lt;p&gt;However, Bootstrap came with trade-offs. It shipped with a very opinionated design system, which meant that many websites started to look the same. Of course, we can overwrite the styles and use themes, but the overflow was inevitable. Bootstrap shipped with a fixed HTML structure that you couldn't avoid, changing any element would break the whole style. You also had to memorize the whole structure or copy-paste it from the docs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rise of Component Abstraction
&lt;/h2&gt;

&lt;p&gt;With the rise of JS frameworks like React and Vue, they enhanced the developer experience (DX) significantly. Now we can achieve a better level of abstraction by encapsulating HTML markup and classes. You can use elements directly and configure them via props/attributes.&lt;/p&gt;

&lt;p&gt;Instead of working directly with verbose markup like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&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;"modal"&lt;/span&gt; &lt;span class="na"&gt;tabindex=&lt;/span&gt;&lt;span class="s"&gt;"-1"&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;"modal-dialog"&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;"modal-content"&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;"modal-header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h5&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"modal-title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Modal title&lt;span class="nt"&gt;&amp;lt;/h5&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn-close"&lt;/span&gt; &lt;span class="na"&gt;data-bs-dismiss=&lt;/span&gt;&lt;span class="s"&gt;"modal"&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Close"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/button&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&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"modal-body"&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;Modal body text goes here.&lt;span class="nt"&gt;&amp;lt;/p&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&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"modal-footer"&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="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-secondary"&lt;/span&gt; &lt;span class="na"&gt;data-bs-dismiss=&lt;/span&gt;&lt;span class="s"&gt;"modal"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Close&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Save changes&lt;span class="nt"&gt;&amp;lt;/button&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;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;bootstrap v5 model markup&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We moved to a more expressive and maintainable abstraction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Modal&lt;/span&gt;
  &lt;span class="na"&gt;open=&lt;/span&gt;&lt;span class="s"&gt;{open}&lt;/span&gt;
  &lt;span class="na"&gt;onClose=&lt;/span&gt;&lt;span class="s"&gt;{handleClose}&lt;/span&gt;
  &lt;span class="na"&gt;aria-labelledby=&lt;/span&gt;&lt;span class="s"&gt;"modal-modal-title"&lt;/span&gt;
  &lt;span class="na"&gt;aria-describedby=&lt;/span&gt;&lt;span class="s"&gt;"modal-modal-description"&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;Modal body text goes here.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Modal&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;MUI v7.x modal component usage&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here, the structural complexity is hidden inside the component. Consumers interact with a clear API instead of raw markup and fragile class structures.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Problem Utility CSS Tried to Solve
&lt;/h2&gt;

&lt;p&gt;Now imagine a common situation. You need to add a small padding to the inline start of an element, say 5px. You create a class like &lt;code&gt;.padding-inline-start-5px&lt;/code&gt;. Later, you need 7px somewhere else, so you add &lt;code&gt;.padding-inline-start-7px&lt;/code&gt;. Over time, this approach explodes into dozens or hundreds of micro-classes, including questionable ones like &lt;code&gt;.padding-inline-start-7.8px&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;At this point, TailwindCSS introduced a genuinely good idea, utility-first CSS. Instead of inventing arbitrary class names and values, Tailwind provides a constrained, consistent scale for spacing, colors, typography, and more. This system reduces decision fatigue and enforces visual consistency across a codebase.&lt;/p&gt;

&lt;p&gt;That part is objectively strong.&lt;/p&gt;

&lt;h2&gt;
  
  
  So Why the Backlash Against TailwindCSS?
&lt;/h2&gt;

&lt;p&gt;If TailwindCSS is so clever, why are many developers (including myself) often critical of it?&lt;/p&gt;

&lt;p&gt;In my humble opinion, the issue is not the utility-classes concept itself, but how Tailwind is commonly introduced and adopted. It was presented as a framework with another level of abstraction, shipped only with the CSS part, without any HTML or JavaScript included, and you have the complete freedom to use it however you like.&lt;/p&gt;

&lt;p&gt;That freedom, combined with its rapid popularity, caused confusion, especially among beginners. Many people started learning TailwindCSS before truly understanding CSS itself. Concepts like stacking contexts, margin collapsing, or layout flow issues remain mysterious if you never learned the underlying language.&lt;/p&gt;

&lt;p&gt;To be fair, this is not unique to TailwindCSS. The same pattern exists with developers using React/Vue without a solid understanding of JavaScript. Still, Tailwind unintentionally amplifies this problem by making it possible to build UIs without ever writing or deeply understanding CSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Would Personally Use TailwindCSS
&lt;/h2&gt;

&lt;p&gt;For me, TailwindCSS is not a styling philosophy, it is a utility library. I treat it the same way I treat Lodash in JavaScript, a collection of helpful tools that make common tasks easier, not a replacement for the language itself.&lt;/p&gt;

&lt;p&gt;This is also why I appreciate projects like &lt;a href="https://unocss.dev/" rel="noopener noreferrer"&gt;UnoCSS&lt;/a&gt;, which lean heavily into this idea and push it further in a more flexible direction, without trying to be a full standalone framework.&lt;/p&gt;

&lt;p&gt;If I choose to use TailwindCSS, my approach is very strict:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core components are written using plain CSS with semantic class names&lt;/li&gt;
&lt;li&gt;Tailwind's CSS variables are used for design tokens (spacing, colors, typography)&lt;/li&gt;
&lt;li&gt;Layout, animation, hover states, and complex interactions live in CSS classes, not inline utility chains&lt;/li&gt;
&lt;li&gt;Utility classes are an exception for one-off adjustments, not the default&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  A Problematic Use of TailwindCSS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&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;"
    flex
    absolute
    text-center
    bg-white
    rounded-xl
    shadow-lg
    p-6
    w-80
  "&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Hello Tailwind&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach mixes layout, visual design, and semantics directly into the markup. Now imagine you need this card in 5 different places with slight variations. You'll be copying and modifying that entire class string each time. When design requirements change (and they always do), you'll need to hunt down every instance and update them individually.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Cleaner Alternative: Using Tailwind's CSS Variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&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;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Hello World&lt;span class="nt"&gt;&amp;lt;/h2&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;style&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/* Layout and behavior */&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* Tailwind design tokens */&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-white&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--radius&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c"&gt;/* rounded-xl */&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--shadow-lg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--spacing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c"&gt;/* p-6 */&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--spacing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c"&gt;/* w-80 */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adding Modifiers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&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;"card is-primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Hello World&lt;span class="nt"&gt;&amp;lt;/h2&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;style&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="err"&gt;...&lt;/span&gt;

 &lt;span class="err"&gt;&amp;amp;.is-primary&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-blue-500&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
   &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-white&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;

 &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nc"&gt;.is-secondary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-gray-100&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
   &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-gray-800&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="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yes, this is &lt;strong&gt;real CSS&lt;/strong&gt;. Nesting is now part of the language itself, no preprocessors required.&lt;br&gt;
CSS is still evolving, and it’s more powerful than many people think.&lt;br&gt;
See MDN for details: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/Nesting_selector" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/Nesting_selector&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  A Reasonable Use of TailwindCSS Utility Classes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&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;"card is-primary mt-5"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Hello World&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Addressing Common Counter-Arguments
&lt;/h2&gt;

&lt;p&gt;Before we continue, let me address some common arguments I hear in favor of pure utility-first approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;"But colocation makes components more portable!"&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;True, but only if you never need to change them. The moment you have multiple instances with slight variations, you're either duplicating the entire class string or creating wrapper components anyway. Semantic classes with Tailwind variables give you the same portability with better maintainability.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;"CSS files become bloated and unmaintainable!"&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was true before component-scoped CSS and CSS modules. Modern tooling (CSS Modules, Vue scoped styles, CSS-in-JS, Svelte, etc.) eliminates this problem entirely. Your component styles live with your component.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;"Finding unused CSS is harder than unused utilities!"&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With component-scoped styles, unused CSS is automatically removed when you delete the component. With Tailwind utilities, PurgeCSS helps, but you still need to be careful about dynamic class names.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where TailwindCSS Actually Makes Sense
&lt;/h2&gt;

&lt;p&gt;There is one modern context where TailwindCSS not only makes sense, but can arguably be the right choice, which is &lt;em&gt;vibe coding&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When you are prototyping with AI tools, the primary goal is often speed and visual correctness, not long-term maintainability. You care about the result on the screen, not the elegance of the CSS architecture. In that scenario, stopping to design semantic class names, think about abstraction layers, or carefully structure styles can feel like unnecessary friction.&lt;/p&gt;

&lt;p&gt;Utility-first CSS works well here because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The feedback loop is extremely fast&lt;/li&gt;
&lt;li&gt;Styles live close to the markup AI is generating or modifying&lt;/li&gt;
&lt;li&gt;You avoid writing and debugging CSS files manually&lt;/li&gt;
&lt;li&gt;Visual tweaks are trivial and disposable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, TailwindCSS aligns very well with an exploratory, throwaway mindset. If the code is not meant to live long, evolve carefully, or be maintained by a team, then optimizing for speed over structure is a rational trade-off.&lt;/p&gt;

&lt;p&gt;This is also why Tailwind pairs naturally with AI tools. Large language models are good at composing utility class strings, but much worse at maintaining coherent, evolving CSS architectures across diffrent files.&lt;/p&gt;

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

&lt;p&gt;TailwindCSS is not wrong. Using it as a replacement for CSS is. When treated as a utility layer on top of solid CSS knowledge and component design, it can be extremely effective. When used as a shortcut to avoid learning CSS fundamentals, it quickly turns into technical debt.&lt;/p&gt;

</description>
      <category>css</category>
      <category>tailwindcss</category>
      <category>frontend</category>
      <category>ai</category>
    </item>
    <item>
      <title>The SEO Game Has Changed</title>
      <dc:creator>Abdelrahman Ismail</dc:creator>
      <pubDate>Thu, 15 May 2025 10:15:14 +0000</pubDate>
      <link>https://dev.to/ismail9k/the-seo-game-has-changed-2749</link>
      <guid>https://dev.to/ismail9k/the-seo-game-has-changed-2749</guid>
      <description>&lt;h2&gt;
  
  
  If ChatGPT Can't Find You, Do You Even Exist?
&lt;/h2&gt;

&lt;p&gt;The rise of AI-powered tools like ChatGPT, Perplexity, and Google's new AI search is reshaping how we think about content discovery. Traditional SEO (Search Engine Optimization) is no longer enough. Today, it's just as important to consider how your content surfaces in AI-generated responses, not just in Google's search results.&lt;/p&gt;

&lt;p&gt;Being on page two of Google used to be a death sentence. Now, it's worse: if AI tools can't find or quote you, you're invisible.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;GEO builds on traditional SEO, but the game has changed:&lt;/p&gt;

&lt;p&gt;Instead of asking &lt;em&gt;"How do I rank on page one?"&lt;/em&gt;, ask &lt;em&gt;"How do I become a trusted source AI will quote?"&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  SEO vs. GEO: What's the Difference?
&lt;/h2&gt;

&lt;p&gt;SEO focuses on optimizing content for traditional search engines like Google, through keywords, backlinks, metadata, and technical optimization to improve visibility on search results pages.&lt;/p&gt;

&lt;p&gt;GEO (Generative Engine Optimization) is a newer concept: optimizing your content to be referenced or quoted by generative AI tools. Unlike search engines that show ranked lists, AI tools like ChatGPT or Perplexity generate direct, conversational answers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Matters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google&lt;/strong&gt; processes over 14 billion searches per day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT&lt;/strong&gt; receives about 37.5 million prompts daily, with 1 in 5 U.S. internet users engaging monthly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perplexity AI&lt;/strong&gt; saw over 67 million visits in a single month, with an average session lasting nearly 11 minutes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These numbers highlight a growing trend: users increasingly prefer concise, AI-driven answers over scanning through search results.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Optimize for Generative Engines
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Focus on User Intent, Not Just Keywords
&lt;/h3&gt;

&lt;p&gt;AI understands natural language and context better than traditional search algorithms. Keyword stuffing is outdated. Instead, design content around what users actually want to learn or achieve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tactics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build content around natural language questions and clear answers.&lt;/li&gt;
&lt;li&gt;Use headings like "What is…", "How to…", and "Why does…" to mimic real queries.&lt;/li&gt;
&lt;li&gt;Use conversational language; avoid keyword stuffing.&lt;/li&gt;
&lt;li&gt;Explore "People Also Ask", Reddit, Quora, and AI prompt analysis to find real questions people ask.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Example: Instead of "best coffee beans 2025", write "What are the best coffee beans to buy in 2025 and why?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Use Multiple Content Formats
&lt;/h3&gt;

&lt;p&gt;AI models are rapidly becoming multimodal, capable of processing not just text, but images, videos, and audio. Diversifying your content helps broaden its reach and discoverability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tactics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repurpose blog posts into short videos, podcasts, slideshows.&lt;/li&gt;
&lt;li&gt;Use diagrams, charts, infographics, and code snippets to illustrate ideas.&lt;/li&gt;
&lt;li&gt;Always include alt text, transcripts, and captions—AI tools parse these.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Track Mentions by AI, Not Just Backlinks
&lt;/h3&gt;

&lt;p&gt;Traditional SEO measures success via backlinks. In the AI age, it's also critical to know when and how AI tools are using your content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tactics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use tools like Sourceful, Diffbot, or Chatbase to detect AI citations.&lt;/li&gt;
&lt;li&gt;Add structured data, FAQ schemas, and summaries, they help AI index your content more effectively.&lt;/li&gt;
&lt;li&gt;Monitor AI referrer traffic using UTM links and server logs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Write for humans. Format for machines.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whether it's SEO or GEO, that's the formula. Don't just aim for visibility—build trust and clarity so AI tools choose &lt;em&gt;you&lt;/em&gt; as the source worth quoting.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>The Truth About Vibe Coding: From Zero Swift to App Store</title>
      <dc:creator>Abdelrahman Ismail</dc:creator>
      <pubDate>Tue, 22 Apr 2025 18:09:19 +0000</pubDate>
      <link>https://dev.to/ismail9k/the-truth-about-vibe-coding-from-zero-swift-to-app-store-1im9</link>
      <guid>https://dev.to/ismail9k/the-truth-about-vibe-coding-from-zero-swift-to-app-store-1im9</guid>
      <description>&lt;h2&gt;
  
  
  How It All Started
&lt;/h2&gt;

&lt;p&gt;Recently, I challenged myself to build a &lt;strong&gt;complete iOS app&lt;/strong&gt;, using a programming language I had &lt;strong&gt;never written a line of code in&lt;/strong&gt;, and launch it on the &lt;strong&gt;App Store — all in just three days&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No preparation, no planning, no prior experience.&lt;br&gt;&lt;br&gt;
Just pure &lt;strong&gt;Vibe Coding&lt;/strong&gt; 🔥.&lt;/p&gt;

&lt;p&gt;In this article, I will share:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How I built it,&lt;/li&gt;
&lt;li&gt;Whether AI can truly replace engineers,&lt;/li&gt;
&lt;li&gt;And how we, as developers, should prepare for the future.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Choosing the Tools
&lt;/h2&gt;

&lt;p&gt;To push myself outside my comfort zone, I picked &lt;strong&gt;Swift&lt;/strong&gt; — a language completely different from what I usually work with (like Flutter or React Native).&lt;/p&gt;

&lt;p&gt;The app idea was simple:&lt;br&gt;&lt;br&gt;
An application that &lt;strong&gt;transforms a child's drawing into an AI-generated artwork&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For the AI part, I decided to use the &lt;strong&gt;Gemini API&lt;/strong&gt;, because it supports &lt;strong&gt;image-to-image generation&lt;/strong&gt; — you send a drawing, ask for modifications, and get a beautiful, AI-enhanced result.&lt;/p&gt;

&lt;p&gt;I opened &lt;strong&gt;Xcode&lt;/strong&gt;, &lt;strong&gt;Cursor&lt;/strong&gt;, and &lt;strong&gt;ChatGPT&lt;/strong&gt;...&lt;/p&gt;

&lt;p&gt;And just started coding.&lt;/p&gt;




&lt;h2&gt;
  
  
  Vibe Coding in Action
&lt;/h2&gt;

&lt;p&gt;The first thing I did was ask ChatGPT to generate an initial &lt;strong&gt;prompt&lt;/strong&gt; for Cursor.&lt;br&gt;&lt;br&gt;
I pasted it in, crossed my fingers…&lt;/p&gt;

&lt;p&gt;And yes, the app started taking shape!&lt;/p&gt;

&lt;p&gt;Until… I hit the first real roadblock.&lt;br&gt;&lt;br&gt;
When trying to process an image, the app crashed. No response from Gemini. No output.&lt;/p&gt;

&lt;p&gt;I tried everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asking Cursor to fix the code,&lt;/li&gt;
&lt;li&gt;Switching models AI model in Cursor to Gemini itself,&lt;/li&gt;
&lt;li&gt;Share the docs link with the AI Agent&lt;/li&gt;
&lt;li&gt;Debugging blindly.&lt;/li&gt;
&lt;li&gt;Try to say: Pleaaase work!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After an hour and a half of dead ends, I realized:&lt;br&gt;&lt;br&gt;
&lt;em&gt;"Enough playing around."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I went back to the official documentation, read it carefully (like any Software Engineer would do), wrote the full server logic myself in Node.js to validate it would work and…&lt;/p&gt;

&lt;p&gt;Boom! It worked flawlessly.&lt;/p&gt;

&lt;p&gt;Once the logic was stable, I told Cursor:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Please translate this Node.js logic into Swift."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Within two hours, I had a fully working &lt;strong&gt;MVP&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
An app that converts kids' drawings into stunning AI-powered artworks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pushing to Production
&lt;/h2&gt;

&lt;p&gt;Now that the MVP was ready, I moved full speed ahead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added multiple artistic styles,&lt;/li&gt;
&lt;li&gt;Improved the UI,&lt;/li&gt;
&lt;li&gt;Created a Cloud Function to hide the API key "(I know some basic security procedures, don't I?)",&lt;/li&gt;
&lt;li&gt;Built a Landing Page (or rather, let Cursor build it 😉).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, I submitted the app to the App Store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rejected!&lt;/strong&gt;! 😂&lt;/p&gt;

&lt;p&gt;Apple sent me a list of required changes.&lt;br&gt;&lt;br&gt;
Did I read it carefully?&lt;/p&gt;

&lt;p&gt;Of course not.&lt;/p&gt;

&lt;p&gt;I just fed it to Cursor and said:&lt;br&gt;&lt;br&gt;
&lt;em&gt;"Fix these issues for me."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Resubmitted.&lt;br&gt;&lt;br&gt;
Rejected again!&lt;/p&gt;

&lt;p&gt;(This time for missing a Terms &amp;amp; Conditions link.)&lt;/p&gt;

&lt;p&gt;After fixing that manually and adding a few final tweaks,&lt;br&gt;&lt;br&gt;
&lt;strong&gt;the app was finally approved and went live!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can check it here:  &lt;a href="https://www.aidoodles.app/" rel="noopener noreferrer"&gt;https://www.aidoodles.app/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Can Anyone Build an App with AI?
&lt;/h2&gt;

&lt;p&gt;After this experience, let's answer a few burning questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can anyone use AI to build production-grade apps?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;— Absolutely not.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Vibe Coding just a passing trend?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;— Definitely not.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vibe Coding is a &lt;strong&gt;powerful tool&lt;/strong&gt; — but only in the right hands.&lt;/p&gt;

&lt;p&gt;To succeed, you must already be a &lt;strong&gt;skilled developer&lt;/strong&gt; who understands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When to rely on AI,&lt;/li&gt;
&lt;li&gt;When to intervene manually,&lt;/li&gt;
&lt;li&gt;How to validate and refine the output.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you lack strong fundamentals, you will quickly hit walls you cannot overcome.&lt;/p&gt;

&lt;p&gt;Most studies confirm it too:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Senior Developers&lt;/strong&gt; benefit from AI coding tools much more than &lt;strong&gt;Juniors&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you do not understand the code that AI generates, you cannot trust it — no matter how good it looks at first glance.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Mindset for Vibe Coding
&lt;/h2&gt;

&lt;p&gt;To properly apply Vibe Coding, you need to change your mindset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Treat the AI as a &lt;strong&gt;very fast, very junior developer&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You are still the &lt;strong&gt;senior engineer&lt;/strong&gt; — reviewing, steering, and making the critical decisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never let AI write unchecked code without reviewing every line.&lt;/li&gt;
&lt;li&gt;If something looks suspicious or illogical, &lt;strong&gt;trust your judgment&lt;/strong&gt; — not the AI.&lt;/li&gt;
&lt;li&gt;Understand all the code generated.
If you don't, don't approve it — no matter how well it "seems" to work.&lt;/li&gt;
&lt;li&gt;Use AI for speeding up routine work, not making fundamental system design decisions.&lt;/li&gt;
&lt;li&gt;Never use AI in a domain where you are not already an expert.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You must always stay in the driver's seat.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Otherwise, you are just rolling dice and hoping for the best — not engineering.&lt;/p&gt;

&lt;p&gt;Until AI can genuinely replace a senior engineer's depth of understanding (which is still very far away), Vibe Coding should remain a &lt;strong&gt;partnership&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI accelerates&lt;/strong&gt;,
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You validate and finalize&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The future belongs to the developers who master the art of &lt;strong&gt;working with AI efficiently and intelligently&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Those who learn to harness Vibe Coding will become the &lt;strong&gt;9k Developers&lt;/strong&gt; companies will fight over.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Speed without quality is useless.&lt;/li&gt;
&lt;li&gt;The best engineers move &lt;strong&gt;fast&lt;/strong&gt;, but also &lt;strong&gt;maintain high standards&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Thanks for reading.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Stay fast, stay sharp.&lt;/p&gt;

</description>
      <category>9kdeveloper</category>
      <category>vibecoding</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>How to Become a 9k Developer</title>
      <dc:creator>Abdelrahman Ismail</dc:creator>
      <pubDate>Fri, 18 Apr 2025 21:20:08 +0000</pubDate>
      <link>https://dev.to/ismail9k/how-to-become-a-9k-developer-3mmn</link>
      <guid>https://dev.to/ismail9k/how-to-become-a-9k-developer-3mmn</guid>
      <description>&lt;p&gt;In software development, reaching "9k" isn’t just about being good.&lt;/p&gt;

&lt;p&gt;It’s about being &lt;strong&gt;world-class&lt;/strong&gt; — standing so far above the average that your decisions, your code, and your impact are unmistakable.&lt;/p&gt;

&lt;p&gt;Some call it being a &lt;strong&gt;10x Developer&lt;/strong&gt; — I prefer calling it a &lt;strong&gt;9k Developer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you know &lt;strong&gt;Dota 2&lt;/strong&gt;, you know that hitting &lt;strong&gt;9k MMR&lt;/strong&gt; means you’re among the best of the best — the top 0.001% of players in the most competitive, highest-paid esport in the world.&lt;/p&gt;

&lt;p&gt;And if you’re an anime fan, you’ll never forget the iconic moment from &lt;strong&gt;Dragon Ball Z&lt;/strong&gt; when Vegeta roared:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“It’s over 9000!”&lt;/strong&gt;&lt;br&gt;
A power level so high, it shattered the scouter.&lt;/p&gt;
&lt;/blockquote&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%2Fvqas184tbhuwpb2knkhl.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%2Fvqas184tbhuwpb2knkhl.gif" alt="vegeta-its-over9000" width="268" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;&lt;small&gt;Vegeta its over 9000&lt;/small&gt;&lt;/center&gt;

&lt;p&gt;After more than a decade in this industry, here’s what I’ve learned it truly takes to reach that level.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Master the Fundamentals
&lt;/h2&gt;

&lt;p&gt;Frameworks change. Trends rise and fall. New tools appear and fade.&lt;br&gt;&lt;br&gt;
But fundamentals — the real core of software engineering — stay forever.&lt;/p&gt;

&lt;p&gt;To build anything great, you must deeply understand algorithms, data structures, how networks operate, how APIs communicate, and how databases work under the hood.&lt;/p&gt;

&lt;p&gt;It’s not about memorizing syntax. It’s about mastering systems thinking: seeing architecture, predicting failure points, and designing resilient solutions.&lt;/p&gt;

&lt;p&gt;Tools are temporary. Foundations are permanent.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Focus on Impact, Not Output
&lt;/h2&gt;

&lt;p&gt;Writing more code doesn’t mean you’re doing more valuable work.&lt;/p&gt;

&lt;p&gt;The 9k Developer measures their worth not by how much they build, but by what &lt;strong&gt;changes&lt;/strong&gt; because of it.&lt;/p&gt;

&lt;p&gt;They solve meaningful problems.&lt;br&gt;&lt;br&gt;
They make systems faster, safer, simpler.&lt;br&gt;&lt;br&gt;
They elevate business outcomes, not just ship product features.&lt;br&gt;&lt;br&gt;
They raise their team's knowledge, not just their own résumé.&lt;/p&gt;

&lt;p&gt;Every day, they ask themselves:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What improved because I was here?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lines of code are cheap. &lt;strong&gt;Impact is rare.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Practice Relentlessly (and Intelligently)
&lt;/h2&gt;

&lt;p&gt;You don’t become elite through occasional effort.&lt;br&gt;&lt;br&gt;
You get there through deliberate, relentless practice — every single day.&lt;/p&gt;

&lt;p&gt;The 9k Developer codes constantly. They study better code than their own. They build side projects, dive into open-source, read architecture papers, analyze real-world systems, and seek uncomfortable feedback.&lt;/p&gt;

&lt;p&gt;It’s not mindless grinding — it’s smart, intentional practice.&lt;/p&gt;

&lt;p&gt;Consistency beats intensity. Every. Single. Time.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Embrace AI as a Force Multiplier
&lt;/h2&gt;

&lt;p&gt;The 9k Developer doesn’t fear AI — they master it intelligently.&lt;/p&gt;

&lt;p&gt;They integrate tools like GitHub Copilot, Cursor, Gemini, and ChatGPT into their workflow — not as crutches, but as force multipliers.&lt;/p&gt;

&lt;p&gt;They automate the repetitive, accelerate the mundane, and use AI to spark creativity, brainstorm designs, and even critique their own solutions.&lt;/p&gt;

&lt;p&gt;They don’t see AI as competition. They see it as an extension of their own skills.&lt;/p&gt;

&lt;p&gt;They stay pragmatic — leveraging machines where it makes sense and focusing human brilliance where it matters most.&lt;/p&gt;

&lt;p&gt;In the new era of development, those who work &lt;strong&gt;with&lt;/strong&gt; AI will replace those who fight against it.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Surround Yourself with Excellence
&lt;/h2&gt;

&lt;p&gt;Growth happens fastest when you’re surrounded by people who challenge you.&lt;/p&gt;

&lt;p&gt;The 9k Developer seeks out teams and communities where standards are high, feedback is honest, and mediocrity isn’t tolerated.&lt;/p&gt;

&lt;p&gt;They contribute to open-source projects with strict code reviews.&lt;br&gt;&lt;br&gt;
They invite criticism from engineers better than themselves.&lt;br&gt;&lt;br&gt;
They place themselves in rooms where they are not the smartest — because that’s exactly where growth happens.&lt;/p&gt;

&lt;p&gt;Exposure to excellence rewires your standards faster than any solo grind ever could.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Stay Ahead of the Meta
&lt;/h2&gt;

&lt;p&gt;The tech world doesn’t sit still.&lt;/p&gt;

&lt;p&gt;Languages evolve. Architectures shift. Security standards tighten. Entire paradigms are born.&lt;/p&gt;

&lt;p&gt;The 9k Developer stays ahead — not by chasing every trend, but by sharpening a deep radar for meaningful change.&lt;/p&gt;

&lt;p&gt;They study architectures like event-driven and serverless systems.&lt;br&gt;&lt;br&gt;
They internalize new disciplines like observability, compliance, and data ethics.&lt;br&gt;&lt;br&gt;
They explore new frameworks thoughtfully, without abandoning the core principles that stand the test of time.&lt;/p&gt;

&lt;p&gt;Curiosity keeps them sharp. Adaptability keeps them relevant.&lt;/p&gt;

&lt;p&gt;In a world that moves fast, learning fast is the only sustainable advantage.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Stay Humble, Stay Hungry
&lt;/h2&gt;

&lt;p&gt;The higher your skill level, the easier it becomes to slip into arrogance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The 9k Developer knows that mastery is an endless road.&lt;/p&gt;

&lt;p&gt;Every success is just the beginning of a new challenge.&lt;br&gt;&lt;br&gt;
Real strength comes from humility, curiosity, and respect — for the craft, and for the people around them.&lt;/p&gt;

&lt;p&gt;They treat juniors, seniors, managers, and non-technical colleagues with patience and kindness.&lt;/p&gt;

&lt;p&gt;They remain teachable, even after mastering more than most will ever know.&lt;/p&gt;

&lt;p&gt;Humility is not weakness.&lt;br&gt;&lt;br&gt;
It’s what makes greatness sustainable.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Take Care of the Player, Not Just the Game
&lt;/h2&gt;

&lt;p&gt;You can't win if you destroy yourself along the way.&lt;/p&gt;

&lt;p&gt;The 9k Developer knows their mind, body, and spirit are their greatest assets.&lt;/p&gt;

&lt;p&gt;They prioritize sleep.&lt;br&gt;&lt;br&gt;
They move daily.&lt;br&gt;&lt;br&gt;
They cultivate hobbies beyond coding.&lt;br&gt;&lt;br&gt;
They nurture relationships and families that ground them.&lt;/p&gt;

&lt;p&gt;Burnout isn’t a badge of honor — it’s a silent defeat.&lt;/p&gt;

&lt;p&gt;The 9k Developer plays the long game, building not just technical skills, but resilience.&lt;/p&gt;

&lt;p&gt;They don’t just build careers.&lt;br&gt;&lt;br&gt;
They build lives worth living.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. It is a Mindset
&lt;/h2&gt;

&lt;p&gt;Becoming a 9k Developer isn’t about raw talent or lucky breaks.&lt;br&gt;&lt;br&gt;
It’s about &lt;strong&gt;focus, discipline, humility, pragmatism, and relentless evolution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It’s about setting your standards higher than anyone else would ever dare set for you.&lt;br&gt;&lt;br&gt;
It’s about showing up every day, training harder, thinking sharper, and living more intentionally.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If you want to be 9k...&lt;br&gt;
&lt;strong&gt;Think like 9k.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Eat like 9k.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Live like 9k.&lt;/strong&gt;”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Final Words
&lt;/h2&gt;

&lt;p&gt;I’m not claiming to have it all figured out.&lt;br&gt;
I’m still learning, still growing, still making mistakes — and proud of it.&lt;/p&gt;

&lt;p&gt;Becoming a 9k Developer isn’t about numbers, titles, or accolades.&lt;br&gt;
It’s about constantly evolving into the best version of yourself.&lt;/p&gt;

&lt;p&gt;Everyone has their own 9k to reach.&lt;br&gt;
What matters most is that you keep moving toward it — one step, one challenge, one breakthrough at a time.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>9kdeveloper</category>
    </item>
    <item>
      <title>The CSS I Knew Has Evolved: Advanced Features, New Identity</title>
      <dc:creator>Abdelrahman Ismail</dc:creator>
      <pubDate>Mon, 02 Dec 2024 16:07:47 +0000</pubDate>
      <link>https://dev.to/ismail9k/the-css-i-knew-has-evolved-advanced-features-new-identity-316a</link>
      <guid>https://dev.to/ismail9k/the-css-i-knew-has-evolved-advanced-features-new-identity-316a</guid>
      <description>&lt;p&gt;The world of frontend development has changed drastically since I began my journey as a front-end developer a decade ago. CSS itself has not only evolved in capabilities but also embraced a fresh, modern identity with a new logo that symbolizes this evolution.&lt;/p&gt;

&lt;p&gt;Lucky for me, I didn't start in the dark days of table-based layouts, but I did witness the rise of Flexbox and the bittersweet death of &lt;code&gt;float&lt;/code&gt; and &lt;code&gt;clear&lt;/code&gt; CSS properties. If you’re unfamiliar with these terms, you might want to take a nostalgic look at &lt;a href="https://getbootstrap.com/docs/3.3/css/#grid" rel="noopener noreferrer"&gt;Bootstrap 3’s grid system&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The death of Internet Explorer marked a turning point. The web technologies started evolving at lightning speed, making it both exciting and challenging to keep up.&lt;/p&gt;

&lt;p&gt;Here’s a look at some modern CSS features I wish had existed when I started my journey as in web development. These advancements would’ve saved me countless hours of frustration and made CSS development a lot more fun.&lt;/p&gt;




&lt;h2&gt;
  
  
  Centering a Dev
&lt;/h2&gt;

&lt;p&gt;There are plenty of memes mocking CSS for lacking an easy way to center a div element. Luckily, those dark days are gone we now have the single CSS property &lt;code&gt;place-content&lt;/code&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%2F5gvlwmwhb10ilp48gxuo.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%2F5gvlwmwhb10ilp48gxuo.jpg" alt="centering Div meme" width="750" height="835"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Centering Vertically and Horizontally
&lt;/h3&gt;

&lt;p&gt;Using Grid, you can center elements effortlessly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.is-centered&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;place-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&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;Alternatively, Flexbox offers another simple solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.is-centered-flex&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vertically Centering a Block-Level Element
&lt;/h3&gt;

&lt;p&gt;With the introduction of &lt;a href="https://web.dev/blog/align-content-block" rel="noopener noreferrer"&gt;the align-content property for block layouts&lt;/a&gt;, you can now center a div vertically using &lt;code&gt;align-content&lt;/code&gt;, which works properly without requiring a flexbox wrapper.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.is-vertically-centered&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;align-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&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;
  
  
  Nested Selectors
&lt;/h2&gt;

&lt;p&gt;Preprocessors also introduced nested selectors, which make styles more structured and readable. Without them, we were stuck duplicating selectors like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.button&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&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;Today, native CSS lets you write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="err"&gt;&amp;amp;:hover&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s cleaner, it’s readable, and it’s finally supported in all modern browsers.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;:is()&lt;/code&gt; and &lt;code&gt;:where()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Selectors just got a lot smarter with these pseudo-classes. They let you simplify complex styles that previously required lots of duplication:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="nd"&gt;:is&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.featured&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.highlighted&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nd"&gt;:is&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;:focus&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="nd"&gt;:is&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.title&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.subtitle&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&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;Without :is(), the same CSS would’ve looked like this monstrosity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="nc"&gt;.featured&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="nc"&gt;.title&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="nc"&gt;.featured&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="nc"&gt;.subtitle&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="nc"&gt;.highlighted&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="nc"&gt;.title&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="nc"&gt;.highlighted&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="nc"&gt;.subtitle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;9k tip:&lt;/strong&gt; The difference between &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:is" rel="noopener noreferrer"&gt;&lt;code&gt;:is()&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:where" rel="noopener noreferrer"&gt;&lt;code&gt;:where()&lt;/code&gt;&lt;/a&gt; lies in specificity. While &lt;code&gt;:is()&lt;/code&gt; inherits the specificity of its most specific argument, &lt;code&gt;:where()&lt;/code&gt; always has zero specificity. perfect for low-priority defaults.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Container Queries
&lt;/h2&gt;

&lt;p&gt;Responsive design has always revolved around viewport widths, but container queries take a more intuitive approach: responsiveness based on an element’s parent container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@container&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;700px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a game-changer for modular and reusable components. Let’s start adopting it more widely, folks!&lt;/p&gt;

&lt;h2&gt;
  
  
  The clamp() Function
&lt;/h2&gt;

&lt;p&gt;Once upon a time, I worked on a typography-heavy &lt;a href="https://www.baianat.com/" rel="noopener noreferrer"&gt;project&lt;/a&gt; that required fonts to scale fluidly with the viewport. My first instinct? Use something like &lt;code&gt;font-size: 0.5vw;&lt;/code&gt;  that would do the trick, right?&lt;/p&gt;

&lt;p&gt;WRONG! It was a nightmare. We had to carefully control how the font resized relative to the viewport, which involved complex mathematical equations. Plus, we needed to ensure the text wouldn't become too large or too small.&lt;/p&gt;

&lt;p&gt;Then I discovered a treasure—an &lt;a href="https://blog.typekit.com/2016/08/17/flexible-typography-with-css-locks/" rel="noopener noreferrer"&gt;article&lt;/a&gt; that addressed exactly this use case. It resulted in a monster of a Stylus-CSS mixin that handles all the corner cases (remember, it was the preprocessor era 🙃)&lt;/p&gt;

&lt;p&gt;When I learned that the clamp() function is now supported natively, I was both excited and surprised, given its specific use case.&lt;/p&gt;

&lt;p&gt;Now you can achieve similar results much more elegantly by combining the &lt;code&gt;clamp&lt;/code&gt;, &lt;code&gt;min&lt;/code&gt;, and &lt;code&gt;max&lt;/code&gt; functions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;clamp&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;min&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;10&lt;/span&gt;&lt;span class="nt"&gt;vw&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="err"&gt;300&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;max&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;90&lt;/span&gt;&lt;span class="nt"&gt;vw&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="err"&gt;55&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Honorable Mention: Modern Color Features
&lt;/h2&gt;

&lt;p&gt;CSS color management has evolved dramatically, offering a plethora of new systems and tools. Features like color-mix() and support for LCH and LAB color spaces deserve their own article. stay tuned for that!&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties" rel="noopener noreferrer"&gt;Using CSS Variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Nesting_selector" rel="noopener noreferrer"&gt;Nesting Selectors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:is" rel="noopener noreferrer"&gt;The :is() and :where() Pseudo-Classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_containment/Container_queries" rel="noopener noreferrer"&gt;Container Queries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.smashingmagazine.com/2022/01/modern-fluid-typography-css-clamp/" rel="noopener noreferrer"&gt;Fluid Typography with clamp()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.css-weekly.com/transition-to-height-auto-display-none-using-pure-css?utm_source=CSS-Weekly&amp;amp;utm_campaign=Issue-589&amp;amp;utm_medium=web" rel="noopener noreferrer"&gt;Transition to height: auto &amp;amp; display: none Using Pure CSS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>programming</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Tailwind CSS: Why It's Not My Cup of Tea</title>
      <dc:creator>Abdelrahman Ismail</dc:creator>
      <pubDate>Sun, 30 Jul 2023 18:35:01 +0000</pubDate>
      <link>https://dev.to/ismail9k/tailwind-css-why-its-not-my-cup-of-tea-3n10</link>
      <guid>https://dev.to/ismail9k/tailwind-css-why-its-not-my-cup-of-tea-3n10</guid>
      <description>&lt;p&gt;Like everything, there are people who support and oppose certain things. For example, sushi may be someone's favorite food, while others can't stand its smell.&lt;/p&gt;

&lt;p&gt;Tailwind is no exception; some developers love using it, while others do not. Although it is well-supported by a large community, I personally prefer not to use it in my upcoming projects. In this article, I will represent the "NO" camp and share my thoughts on why.&lt;/p&gt;

&lt;h2&gt;
  
  
  TLDR;
&lt;/h2&gt;

&lt;p&gt;Despite Tailwind CSS's popularity, it has issues like complex maintainability, reduced readability, overuse of utility classes, and limited customizability. It complicates version control, disrupts traditional coding separation, and could make projects overly dependent on it. As CSS continues to evolve and become more efficient, the value of utility-based CSS frameworks like Tailwind could diminish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maintainability
&lt;/h2&gt;

&lt;p&gt;First, my concerns about Tailwind CSS are related to maintainability. Tailwind encourages the use of utility classes directly in your markup, which can lead to an incredibly cluttered HTML structure. Although utility classes can be very powerful, they can create a spaghetti-like effect when used extensively. This can create significant readability and maintainability issues, especially with more extensive projects.&lt;/p&gt;

&lt;p&gt;Essentially, this approach makes your markup include the presentation layer again, resulting in a messy and unstructured codebase. This means you have redundant CSS that you never want to change, and you have to endlessly tweak the markup to get things looking right. You may be building a library of components, but it will just result in endlessly repeated markup.&lt;/p&gt;

&lt;p&gt;Furthermore, Tailwind's approach can significantly increase the size of the codebase, impacting the load time of web pages. Although we have PurgeCSS, which can remove unused styles, it has its own challenges. Implementing it effectively can be a complex task and can create additional maintenance burdens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Readability
&lt;/h2&gt;

&lt;p&gt;Reading a series of classes sequentially can be a tedious task, especially when there are multiple media queries containing different values. It can be difficult to determine which value applies to which screen. This is especially true when multiple developers are contributing to the codebase and do not follow a consistent order when sorting the classes.&lt;/p&gt;

&lt;p&gt;It would be helpful to have a tool that enforces class order, such as the &lt;a href="https://github.com/hudochenkov/stylelint-order" rel="noopener noreferrer"&gt;&lt;strong&gt;stylelint-order&lt;/strong&gt;&lt;/a&gt; plugin for CSS.&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%2Forta775nujy07wxbog13.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%2Forta775nujy07wxbog13.png" alt="snippet-of-newly-created-nextjs-project" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;&lt;small&gt;A screenshot from a newly created Nextjs project&lt;/small&gt;&lt;/center&gt;

&lt;p&gt;Additionally, if you use a well-structured markup and follow one of the CSS naming conventions like &lt;a href="https://suitcss.github.io/" rel="noopener noreferrer"&gt;SUIT&lt;/a&gt;, &lt;a href="https://getbem.com/" rel="noopener noreferrer"&gt;BEM&lt;/a&gt;, or others, you can easily understand the HTML markup you are reading. Considering the given example below, You can easily understand that there is a list with several items, and the that the &lt;code&gt;.card__title&lt;/code&gt; element is a child of the &lt;code&gt;.card&lt;/code&gt; component.&lt;/p&gt;

&lt;p&gt;While if used a bunch of utility styling classes that do not have any semantic meaning. It would be hard decrypting the meaning of this puzzle!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&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;"list"&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;"list__item"&lt;/span&gt;&lt;span class="nt"&gt;&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&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"list__item"&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;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card__title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Awesome&lt;span class="nt"&gt;&amp;lt;/h2&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;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"list__item"&lt;/span&gt;&lt;span class="nt"&gt;&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Separation of Concerns
&lt;/h2&gt;

&lt;p&gt;Next is the age-old principle of separation of concerns. Tailwind muddles the boundary between styling and markup. Traditionally, we separate HTML (structure), CSS (presentation), and JavaScript (behavior) to create more manageable, understandable codebases. But with Tailwind, the HTML gets polluted with styling information, which not only makes the HTML harder to read but also breaks this principle.&lt;/p&gt;

&lt;p&gt;To be clear, there's nothing wrong with bending or breaking principles if it serves your specific use case better, we have now CSS-in-JS and HTML-in-JS. but this doesn't seem to be a popular opinion when using Tailwind CSS. This departure from the conventional methodology can be a point of friction for developers who prefer keeping things separated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Utility Classes
&lt;/h2&gt;

&lt;p&gt;Utility classes are useful for web design, but Tailwind overuses them. Utility classes should be helper classes used in specific and limited situations where they are needed, not the default dominant approach. For me I would consider using Tailwind if it were presented as a set of utility classes that can be added on top of a perfectly working app. Similar to the &lt;a href="https://underscorejs.org/" rel="noopener noreferrer"&gt;Underscore.js&lt;/a&gt; library, which provides functions that can be used to make things easier and faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cascading and Modifiers
&lt;/h2&gt;

&lt;p&gt;Tailwind make it difficult to take advantage of one of the main benefits of Cascading Style Sheets (CSS), which is its ability to cascade.&lt;/p&gt;

&lt;p&gt;For example, imagine you have a navbar that changes its style when scrolling. With CSS, you can simply add the class &lt;code&gt;.navbar--scrolling&lt;/code&gt;, which will change the style of the navbar and its children.&lt;/p&gt;

&lt;p&gt;However, achieving the same effect using Tailwind requires conditionally adding/removing classes for both the navbar and each of its children.&lt;/p&gt;

&lt;p&gt;Tailwind does not make it easy to switch between multiple themes. If you want to implement different color schemes or themes, you have to define classes for each theme. This can be a tedious and time-consuming process, especially for larger projects with many themes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tailwind’s &lt;a class="mentioned-user" href="https://dev.to/apply"&gt;@apply&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;According to Tailwind documentation, if there are too many classes or reusable classes, it is recommended to use &lt;a class="mentioned-user" href="https://dev.to/apply"&gt;@apply&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Creating reusable classes is the best way to solve the mentioned above problems with Tailwind. However, could we achieve the same functionality with better readability by simply using plain CSS or preprocessors?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.btn-primary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;@apply&lt;/span&gt; &lt;span class="err"&gt;py-2&lt;/span&gt; &lt;span class="err"&gt;px-4&lt;/span&gt; &lt;span class="err"&gt;bg-blue-500&lt;/span&gt; &lt;span class="err"&gt;text-white&lt;/span&gt; &lt;span class="err"&gt;font-semibold&lt;/span&gt; &lt;span class="err"&gt;rounded-lg&lt;/span&gt; &lt;span class="err"&gt;shadow-md&lt;/span&gt; &lt;span class="py"&gt;hover&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;bg-blue-700&lt;/span&gt; &lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;outline-none&lt;/span&gt; &lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ring-2&lt;/span&gt; &lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ring-blue-400&lt;/span&gt; &lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ring-opacity-75&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I aware that Tailwind can create a similar layout by using even spacing values and font sizes, so developers don't have to memorize padding, margins, etc. values for the entire website. However, This would be a valid point if we didn't already have CSS variables or preprocessors that solved this issue before Tailwind was created.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limited Customizability
&lt;/h2&gt;

&lt;p&gt;Another point to consider when discussing Tailwind CSS is its limitation on customizability. While Tailwind prides itself on being highly customizable, the truth is that this flexibility is largely confined to the configuration file. Yes, you can customize your color palette, typography, and spacing scales, but any custom styles outside of these presets involve manually writing CSS. This could negate the utility-first approach, especially if you're working on a design-heavy project that requires unique, non-reusable styles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning Curve
&lt;/h2&gt;

&lt;p&gt;Despite being touted as a simpler alternative to traditional CSS, Tailwind comes with its own learning curve. You need to familiarize yourself with its utility classes and syntax, which can take time and effort. Moreover, since it's a low-level utility-first framework, there can be a steep learning curve for developers who are more accustomed to semantic CSS.&lt;/p&gt;

&lt;p&gt;Also, its extensive list of utility classes can be overwhelming for beginners. While it offers flexibility, it also demands that you know what you're doing. Hence, mistakes can be costly in terms of time and effort.&lt;/p&gt;

&lt;p&gt;Moreover, if you or your team have already invested a lot in learning and getting proficient with CSS, adding Tailwind to the stack might seem like unnecessary overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Increased Complexity in Version Control
&lt;/h2&gt;

&lt;p&gt;When multiple developers are working on a project, conflicts are bound to arise. With Tailwind's approach of putting styling within HTML tags, it increases the complexity of managing these conflicts. The HTML structure could potentially change every time there's a visual change. Compare this to traditional CSS where markup and styles are separate; conflicts tend to be less complicated and more manageable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Misleading for Newcomers
&lt;/h2&gt;

&lt;p&gt;Many newer web developers have turned to using Tailwind as their go-to CSS framework, which has become a popular trend in the web development community. However, many individuals endorse it without fully understanding the underlying principles of CSS, such as cascading and specificity.&lt;/p&gt;

&lt;p&gt;Although this cannot be directly considered a problem with Tailwind, it should be mentioned.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependency and Future Proofing
&lt;/h2&gt;

&lt;p&gt;Lastly, the use of Tailwind CSS makes a project heavily dependent on it. If Tailwind becomes deprecated or the community moves to a new favorite, transitioning could be a complex and time-consuming process. While no library or framework can guarantee perpetual support, the risk associated with this kind of tight coupling is something to consider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;It's also important to remember that CSS, as a language, continues to evolve and adapt. CSS Houdini is on the horizon, with the potential to make many of the arguments for Tailwind redundant. The premise of utility-based CSS loses ground when CSS itself becomes more powerful and efficient.&lt;/p&gt;

&lt;p&gt;I don't discourage anyone from using Tailwind if it suits their needs, it's worth noting that every solution has its pros and cons. While Tailwind may provide solutions for some developers and offer a different development experience, there are also challenges you may face. In this overview, I've aimed to provide you with an idea of these challenges so that you can be prepared and choose your tools wisely.&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>css</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AI-Powered Tools to Get Your Next Software Job Offer</title>
      <dc:creator>Abdelrahman Ismail</dc:creator>
      <pubDate>Wed, 14 Oct 2020 15:28:18 +0000</pubDate>
      <link>https://dev.to/ismail9k/ai-powered-tools-to-get-your-next-software-job-offer-3p5n</link>
      <guid>https://dev.to/ismail9k/ai-powered-tools-to-get-your-next-software-job-offer-3p5n</guid>
      <description>&lt;p&gt;Finding your perfectly-fit job should not be rocket science, especially for the new job seekers.&lt;br&gt;
There are lots of articles that explain how to write a killer technical resume, I will focus here on the tools that could help you build your resume, audit it, and automate the job-searching-process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a Resume
&lt;/h2&gt;

&lt;p&gt;If you are using Microsoft Word for creating your resume, I can't judge you (I used to use HTML and CSS for mine), but come on... there are hundreds of tools online to finish this task for you already with great results, and here is some:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.linkedin.com/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;If you already have a LinkedIn portfolio (which you should have Mr. 🤓), you can extract your data into a resume file. To access the resume builder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the &lt;strong&gt;Me&lt;/strong&gt; icon at the top of your LinkedIn homepage.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;View profile&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;More…&lt;/strong&gt; button in the introduction card.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Build a resume&lt;/strong&gt; from the dropdown.&lt;/li&gt;
&lt;li&gt;Edit the content then save it as a pdf&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="http://bit.ly/canva-resume-maker" rel="noopener noreferrer"&gt;Canva&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;If you’d like to have a more vivid resume with more design details, Canva will perfectly suit your needs. With a variety of pre-made resume designs that you can pick from.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://bit.ly/canva-resume-templates" rel="noopener noreferrer"&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%2Fi%2F3l45y0omjspmfgu51ret.png" alt="Canav resume templats" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;&lt;small&gt;Canva Resume Templates&lt;/small&gt;&lt;/center&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.zety.com" rel="noopener noreferrer"&gt;Zety&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Zety is a great website if you're focusing only on the resume details and don't like to get involved with the design headache.&lt;/p&gt;

&lt;p&gt;The best thing about Zety is that it has a wizard that takes you through several steps to generate your resume, and each step gives you suggestions and tips which are extremely helpful. Another great thing I really liked; you can fill the data with your current resume or start from scratch.&lt;/p&gt;

&lt;p&gt;Unfortunately, they don't have a free option to download your resume 😢. But, I think &lt;strong&gt;$2.70&lt;/strong&gt; is a good deal compared to the service you will get.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://resumelab.com/" rel="noopener noreferrer"&gt;Resume Lab&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Resume Lab is another great platform that focuses on create Resumes, CVs, and covers letters. They also have A fully complementary blog with over 250+ custom-tailored career guides and white-paper studies.&lt;/p&gt;

&lt;p&gt;Their system has a unique feature, which compares your resume's strength to other resumes in real-time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Audit Your Resume
&lt;/h2&gt;

&lt;p&gt;The fastest way to improve your chances of being accepted on the job is to have artificial intelligence on your side.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://grammarly.com/" rel="noopener noreferrer"&gt;Grammarly&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Grammarly without saying is your superhero; it can save you from embarrassing situations, such as sending your profile with a typo or a grammatical error. You can use it to audit your resume writing tone and grammar.&lt;/p&gt;

&lt;p&gt;Their monthly subscription costs A LOT, but for one who is not working as a copywriter, the free plan is more than enough. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://bit.ly/ResumeWorded" rel="noopener noreferrer"&gt;Resume Worded&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Resume Worded is an AI-powered platform that provides you with detailed feedback on your resume and LinkedIn profile. It gives you some free hints to improve it, and they promise you that finding your dream job is certain and they may be right.&lt;/p&gt;

&lt;p&gt;I gave it a try myself; I thought that my resume should get high results, but out of 100, I got only 61. I have a lot of things to improve here.&lt;/p&gt;

&lt;p&gt;It tested my resume data in four domains: &lt;strong&gt;impact&lt;/strong&gt;, &lt;strong&gt;brevity&lt;/strong&gt;, &lt;strong&gt;style&lt;/strong&gt;, and &lt;strong&gt;skills&lt;/strong&gt; and it gave specific details on points of strength and weakness, and how you can improve it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bit.ly/ResumeWorded" rel="noopener noreferrer"&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%2Fi%2Fja1c475kykss13pyang3.png" alt="Alt Text" width="800" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;&lt;small&gt;Resume Worded analysis&lt;/small&gt;&lt;/center&gt;

&lt;h2&gt;
  
  
  Automate Your Job Search
&lt;/h2&gt;

&lt;p&gt;Searching for the perfectly-fit software engineering job over dozens of working websites is time consuming stressful work. LoopCV thought they could save your time and efforts, and automate this whole process because modern problems require modern solutions.&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%2Fi%2Fm7gik82t2swxz0ngj3el.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%2Fi%2Fm7gik82t2swxz0ngj3el.jpg" alt="Modern problems require modern solutions" width="600" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;&lt;small&gt;Modern problems require modern solutions&lt;/small&gt;&lt;/center&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://loopcv.pro/" rel="noopener noreferrer"&gt;LoopCV&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;LoopCV collects millions of job postings, from most jobs websites all over the internet.&lt;/p&gt;

&lt;p&gt;You upload your resume and define your job's top preferences you are looking for. And here comes the magic: they match your profile with all the posts, and they start sending emails on behalf of you to each job that matches you. You can change your preferences, try different templates, and make the job search fun.&lt;/p&gt;

&lt;p&gt;In the dashboard, you can see the emails you sent, the open rates, and more. You can even create A/B testing for different emails.&lt;/p&gt;

&lt;p&gt;What drives me crazy, is the fact that the system is smart enough that it could fill the job forms from your resume data. 🤯&lt;/p&gt;

&lt;p&gt;&lt;a href="https://loopcv.pro/" rel="noopener noreferrer"&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%2Fi%2Fv9yn6ngt79tfsas2odq6.png" alt="LoopCV dashboard" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;&lt;small&gt;LoopCV dashboard&lt;/small&gt;&lt;/center&gt;

&lt;p&gt;You can create a free loop now, hunting a specific job title, with no hidden fees.&lt;/p&gt;

&lt;p&gt;After using LoopCV, post your experience on &lt;a href="https://www.trustpilot.com/evaluate/loopcv.pro" rel="noopener noreferrer"&gt;trustpilot&lt;/a&gt;, and mention your recommendations if you have any.&lt;/p&gt;

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

&lt;p&gt;Finding a new job is for sure a hard task, for both the developer and the recruiter, but you can reduce the efforts, and work smart not hard; by using tools that help you achieve your target. And good luck with finding your dream job!&lt;/p&gt;

&lt;p&gt;Now that you may have benefited from those tools, please add in the comments below your experience, and any other tools that are related to this post. 🤓👇&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/writing-a-killer-software-engineering-resume-b11c91ef699d/" rel="noopener noreferrer"&gt;How to write a killer Software Engineering résumé&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://levelup.gitconnected.com/how-to-write-a-stand-out-technical-resume-6cce4721cd8c" rel="noopener noreferrer"&gt;How To Write A Stand-Out Technical Resume
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tools</category>
      <category>jobs</category>
      <category>work</category>
      <category>offers</category>
    </item>
    <item>
      <title>Neomorphism designs, UI components library</title>
      <dc:creator>Abdelrahman Ismail</dc:creator>
      <pubDate>Sun, 26 Jan 2020 20:30:34 +0000</pubDate>
      <link>https://dev.to/ismail9k/neomorphic-design-ui-components-library-ihj</link>
      <guid>https://dev.to/ismail9k/neomorphic-design-ui-components-library-ihj</guid>
      <description>&lt;p&gt;Every while a new design trend arise and became the dominator of the shape of the period. Recently, the neomorphic design style becoming very &lt;a href="https://dribbble.com/tags/neomorphism" rel="noopener noreferrer"&gt;trending&lt;/a&gt; and is gaining more and more popularity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Neomorphism Design
&lt;/h2&gt;

&lt;p&gt;You can form this effect, by adding two shadows to your flat-designed elements, one is a light shadow from the top left of the element, and the other is a dark shadow towards the bottom right. the combination of both creates the effect of the elements pushing themselves through your display.&lt;/p&gt;

&lt;p&gt;You can read more about how to apply this technic in-depth here: &lt;a href="https://medium.com/@s.jagoori/design-trends-neumorphism-59a9ba9d9284" rel="noopener noreferrer"&gt;Design trends: Neomorphic design&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%2Fogvpjq1b7xvfyxqwkj6n.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%2Fogvpjq1b7xvfyxqwkj6n.png" alt="Neomorphism design components" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first time I saw this design concept, I immediately loved it. I started to apply it to some basic web components; buttons, inputs, etc..&lt;/p&gt;

&lt;p&gt;Then I had an idea, why not create a full set of UI components based on this concept.&lt;/p&gt;

&lt;p&gt;I reviewed the most famous frameworks and components libraries structure and concepts, to design the structure I will follow. In the end, I summed up to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each component will have five sizes (xs, sm, md, lg, xl).&lt;/li&gt;
&lt;li&gt;Components size will depend on its font-size only; when change the component's &lt;code&gt;font-size&lt;/code&gt; property, its width, height, margin, and padding will be changed respectively because they all are in &lt;code&gt;em&lt;/code&gt; unit.&lt;/li&gt;
&lt;li&gt;The grid will have also five media breaking points (xs, sm, md, lg, xl).&lt;/li&gt;
&lt;li&gt;Shadows depth will have five levels, in addition to two shadows style emboss and deboss.&lt;/li&gt;
&lt;li&gt;Classes naming conventions will be a modified version of &lt;a href="https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md" rel="noopener noreferrer"&gt;SUIT naming convention&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The components are written in &lt;a href="http://stylus-lang.com/" rel="noopener noreferrer"&gt;Stylus&lt;/a&gt; because it's the best 🤪🤪.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After TWO days of hard work 🤓🤓, and lots of potions coffee. I want to introduce &lt;a href="https://ismail9k.com/neomorphism" rel="noopener noreferrer"&gt;Neomorphism, UI components library&lt;/a&gt;. (creative name, right? 🤷‍♂️🤷‍♂️)&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ismail9k" rel="noopener noreferrer"&gt;
        ismail9k
      &lt;/a&gt; / &lt;a href="https://github.com/ismail9k/neomorphism" rel="noopener noreferrer"&gt;
        neomorphism
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      UI components library in the new neomorphism design style
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Final words
&lt;/h2&gt;

&lt;p&gt;This project very far from completion, it still work-in-progress. I plan to include more components, and support dark-theme too, and maybe in the future expose it as React/Vuejs components. I just wanted to share it as early as possible, to gather feedback, and maybe to force myself, to dedicate more time to work on it 😭😭. Thank you for reading.&lt;/p&gt;

</description>
      <category>css</category>
      <category>frontend</category>
      <category>ui</category>
      <category>neomorphism</category>
    </item>
    <item>
      <title>My 2020 Portfolio</title>
      <dc:creator>Abdelrahman Ismail</dc:creator>
      <pubDate>Wed, 01 Jan 2020 12:22:06 +0000</pubDate>
      <link>https://dev.to/ismail9k/my-2020-portfolio-38h1</link>
      <guid>https://dev.to/ismail9k/my-2020-portfolio-38h1</guid>
      <description>&lt;p&gt;I want to share my new portfolio with you: &lt;strong&gt;&lt;a href="https://ismail9k.com" rel="noopener noreferrer"&gt;https://ismail9k.com&lt;/a&gt;&lt;/strong&gt; ✌️✌️&lt;/p&gt;

&lt;p&gt;I have added a hidden funny page, which you can access, by right click on the figure in the intro section, or touch it for one second on mobile devices. 🤫🤫&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%2F5bexmsnrophkur7j8cbc.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%2F5bexmsnrophkur7j8cbc.png" alt="Alt Text" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please let me know what you think about it, thank you, and happy new year DEV folks 🥳🥳&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>2020</category>
    </item>
    <item>
      <title>Use SVG Icons with Vue.js</title>
      <dc:creator>Abdelrahman Ismail</dc:creator>
      <pubDate>Sun, 24 Nov 2019 19:40:28 +0000</pubDate>
      <link>https://dev.to/ismail9k/use-svg-icons-with-vue-js-2km7</link>
      <guid>https://dev.to/ismail9k/use-svg-icons-with-vue-js-2km7</guid>
      <description>&lt;p&gt;Many developers prefer to use the font-icons over the SVG ones because it has a simpler syntax, and it integrates seamlessly with almost any front-end component library.&lt;/p&gt;

&lt;p&gt;In this article, I will try to demonstrate the technics I follow to make it easily to  SVG icons.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;You can find the final component here: &lt;a href="https://github.com/Abdelrahman3D/use-svg/blob/master/src/AppIcon.vue" rel="noopener noreferrer"&gt;AppIcon.vue&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using
&lt;/h2&gt;

&lt;p&gt;First, let's look at an SVG heart-icon syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 24 24"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M12,21.35L10.55,20.03C5.4,15.36 2,12.27 2,8.5C2,5.41 4.42,3 7.5,3C9.24,3 10.91,3.81 12,5.08C13.09,3.81 14.76,3 16.5,3C19.58,3 22,5.41 22,8.5C22,12.27 18.6,15.36 13.45,20.03L12,21.35Z"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You see here that most icons are alike, except for the path's &lt;code&gt;d&lt;/code&gt; attribute, which describes the icon shape. So, we can wrap this into a useable Vue component, which accepts the icon's path as a prop.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;// AppIcon.vue
&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;svg&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:24px;height:24px"&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 24 24"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;:d=&lt;/span&gt;&lt;span class="s"&gt;"path"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&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;AppIcon&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="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&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="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Although we have wrapped our icon into a usable component, we can enhance this more. We can store all the app icons paths in a js object, to make it easier to access the icon using its name rather than the long initiative path.&lt;br&gt;
To get your icon's path, you can use your custom-designed icons, or get them from this awesome website: &lt;a href="https://materialdesignicons.com/" rel="noopener noreferrer"&gt;https://materialdesignicons.com/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I also use &lt;a href="http://www.svgs.us/" rel="noopener noreferrer"&gt;Svgus&lt;/a&gt; app to manage my icons sets.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;icons.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"heart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"M12,21.35L10.55,20.03C5.4,15.36 2,12.27 2,8.5C2,5.41 4.42,3 7.5,3C9.24,3 10.91,3.81 12,5.08C13.09,3.81 14.76,3 16.5,3C19.58,3 22,5.41 22,8.5C22,12.27 18.6,15.36 13.45,20.03L12,21.35Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&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;// AppIcon.vue
&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;svg&lt;/span&gt;
    &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt;
    &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:24px;height:24px"&lt;/span&gt;
    &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 24 24"&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;:d=&lt;/span&gt;&lt;span class="s"&gt;"path"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;icons&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;./icons.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&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;AppIcon&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;path&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="nx"&gt;icons&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="p"&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;p&gt;You can also use the npm package &lt;code&gt;@mdi/js&lt;/code&gt;, to easily import icons' path, instead of copying and pasting it.&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;// icons.js&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;mdiHeart&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;@mdi/js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;heart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;mdiHeart&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now we can use our icon-component easily across the app&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;app-icon&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"heart"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Styling
&lt;/h2&gt;

&lt;p&gt;To use our icons we should able to resize it and change its color easily.&lt;br&gt;
SVGs use &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; properties to control its size, and &lt;code&gt;fill&lt;/code&gt;/&lt;code&gt;stroke&lt;/code&gt; properties to control its colors. Unlike font-icons which use font-size and color to control the icon visuals. &lt;br&gt;
Let's suppose you are using bootstrap as your main components library. If you added an SVG icon inside a button before the text, you will find it's very challenging to set the icon size and colors, without explicitly setting the icon's fill in normal status and hover status and size to much the button size.&lt;/p&gt;

&lt;p&gt;We will map the properties of the icon to be controlled using font-size and color. Now when the element &lt;code&gt;font-size&lt;/code&gt; changes the icon will follow its size. And by following when the button's color changes the icons will too.&lt;br&gt;
🧙‍♂️ Let's use this magical snippet to achieve this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;currentColor&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;As you can see now, the icon's size will depend on the element's font-size. And luckily for us, the &lt;code&gt;currentColor&lt;/code&gt; value is here to save our day, and also it's &lt;a href="https://caniuse.com/#search=currentColor" rel="noopener noreferrer"&gt;supported&lt;/a&gt; in all browsers (even IE 9 😲).&lt;/p&gt;

&lt;p&gt;Let's refactor our component, to make our icon flexible enough, and also accepts color status and different sizing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I useed &lt;em&gt;1.2em&lt;/em&gt; instead of &lt;em&gt;1em&lt;/em&gt; as the default value. This will give a better visual harmony&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;// AppIcon.vue
&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;svg&lt;/span&gt;
    &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 24 24"&lt;/span&gt;
    &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt;
    &lt;span class="na"&gt;:class=&lt;/span&gt;&lt;span class="s"&gt;"styleClasses"&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;:d=&lt;/span&gt;&lt;span class="s"&gt;"path"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;icons&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;./icons.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&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;AppIcon&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;path&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="nx"&gt;icons&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="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;styleClasses&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&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;color&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;`is-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;val&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="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;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;/* default */&lt;/span&gt;
&lt;span class="nc"&gt;.icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.2em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.2em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;currentColor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* sizes */&lt;/span&gt;
&lt;span class="nc"&gt;.icon.is-large&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.icon.is-medium&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.6em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.6em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.icon.is-normal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.2em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.2em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.icon.is-small&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.icon.is-tiny&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.8em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.8em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* colors */&lt;/span&gt;
&lt;span class="nc"&gt;.icon.is-primary&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.icon.is-blue&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#2196F3&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.icon.is-success&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.icon.is-green&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#4CAF50&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.icon.is-danger&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.icon.is-red&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#F44336&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.icon.is-warning&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.icon.is-orange&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FF9800&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;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;AppIcon&lt;/code&gt; component we created earlier is relatively simple. It doesn’t manage any state, watch any state passed to it, and it has no lifecycle methods. It can be perfectly refactored into a &lt;a href="https://vuejs.org/v2/guide/render-function.html#Functional-Components" rel="noopener noreferrer"&gt;functional-component&lt;/a&gt;. Since functional components are usually much faster than normal components, this will boost our app performance, especially if we are using many icons.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;template-based functional components, introduced in Vue 2.5.0+.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&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="na"&gt;functional&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt;
    &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 24 24"&lt;/span&gt;
    &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt;
    &lt;span class="na"&gt;:class=&lt;/span&gt;&lt;span class="s"&gt;"$options.methods.getStyleClasses(props)"&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;:d=&lt;/span&gt;&lt;span class="s"&gt;"$options.methods.getPath(props)"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;icons&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;./icons&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&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="s2"&gt;AppIcon&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;getPath&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;icons&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;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;getStyleClasses&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="k"&gt;return&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;size&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;color&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;`is-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;val&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="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The downside of using functional components is it requires you to explicitly add attributes and events-listener to the root element, to make it behave as a normal component.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="na"&gt;functional&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt;
    &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 24 24"&lt;/span&gt;
    &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt;
    &lt;span class="na"&gt;:class=&lt;/span&gt;&lt;span class="s"&gt;"$options.methods.getStyleClasses($options)"&lt;/span&gt;
    &lt;span class="na"&gt;v-bind=&lt;/span&gt;&lt;span class="s"&gt;"data.attrs"&lt;/span&gt;
    &lt;span class="na"&gt;v-on=&lt;/span&gt;&lt;span class="s"&gt;"listeners"&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;:d=&lt;/span&gt;&lt;span class="s"&gt;"$options.methods.getPath($options)"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/svg&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;a href="https://github.com/Abdelrahman3D/use-svg/commit/3d0ccc32d2aed029e483d281f5733c3fca986f0f?diff=split" rel="noopener noreferrer"&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%2Fv31bk57otq7fmdsh2uru.png" alt="Compare after refactor component" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;Compare after refactor component&lt;/center&gt;
&lt;h2&gt;
  
  
  Accessibility
&lt;/h2&gt;

&lt;p&gt;The last piece in our puzzle is to make our icons accessible, for screen-readers and every user for our app.&lt;br&gt;
To achieve this, we will add a title element inside our icon with the icon name, and add &lt;code&gt;aria-role&lt;/code&gt;, you can also add a description for a long icon description.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="na"&gt;functional&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt;
    &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 24 24"&lt;/span&gt;
    &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt;
    &lt;span class="na"&gt;:class=&lt;/span&gt;&lt;span class="s"&gt;"$options.methods.getStyleClasses(props)"&lt;/span&gt;
    &lt;span class="na"&gt;v-bind=&lt;/span&gt;&lt;span class="s"&gt;"data.attrs"&lt;/span&gt;
    &lt;span class="na"&gt;v-on=&lt;/span&gt;&lt;span class="s"&gt;"listeners"&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;&lt;span class="si"&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;title&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;desc&lt;/span&gt; &lt;span class="na"&gt;v-if=&lt;/span&gt;&lt;span class="s"&gt;"props.desc"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&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;desc&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/desc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;:d=&lt;/span&gt;&lt;span class="s"&gt;"$options.methods.getPath(props)"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;icons&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;./icons.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&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="s2"&gt;AppIcon&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;getPath&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;icons&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;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;getStyleClasses&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="k"&gt;return&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;size&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;color&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;`is-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;val&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="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://github.com/Abdelrahman3D/use-svg/commit/b7f3f60ec7c937605f7ebd4d504296e39a4d9dc7#diff-9ac8dbe1d96c123503c05d8a5da5bcd0" rel="noopener noreferrer"&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%2Ffw1idpkqhxw1rybghzyf.png" alt="AppIcon component after accessibility support" width="800" height="759"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;AppIcon component after accessibility support&lt;/center&gt;
&lt;h2&gt;
  
  
  Consolation
&lt;/h2&gt;

&lt;p&gt;We have reviewed how we can easily integrate SVG icons with our Vue apps.&lt;br&gt;
You can find the final component in this repo.&lt;/p&gt;


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



&lt;p&gt;Thanks for reading 😄😄&lt;/p&gt;

</description>
      <category>vue</category>
      <category>svg</category>
      <category>icon</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
