<?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: Minoosh</title>
    <description>The latest articles on DEV Community by Minoosh (@minoosh).</description>
    <link>https://dev.to/minoosh</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%2F2839592%2Fd86e9f73-5e2e-49ca-a70b-b39abfffde32.png</url>
      <title>DEV Community: Minoosh</title>
      <link>https://dev.to/minoosh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/minoosh"/>
    <language>en</language>
    <item>
      <title>My ChatGPT Year 2025</title>
      <dc:creator>Minoosh</dc:creator>
      <pubDate>Tue, 23 Dec 2025 19:07:55 +0000</pubDate>
      <link>https://dev.to/minoosh/my-chatgpt-year-2025-5ej9</link>
      <guid>https://dev.to/minoosh/my-chatgpt-year-2025-5ej9</guid>
      <description>&lt;p&gt;My ChatGPT Year 2025 looked like this: coffee, coding, sticky notes.&lt;/p&gt;

&lt;p&gt;It was surprisingly accurate. Well.... not that hard to guess this. I work on projects almost every day. I code, I learn, I debug. I ask a lot of questions. ChatGPT has become part of my daily workflow, and honestly, a very good teacher.&lt;/p&gt;

&lt;p&gt;Still, seeing such an accurate picture (with coffee and sticky notes!) made me pause.&lt;/p&gt;

&lt;p&gt;If I’m predictable enough for an AI to describe my desk so well, it’s not because it’s watching me. It’s because patterns are easy to form when we repeat things every day. (At least I am happy that I have changed my habit of drinking coffee to other hot drinks recently and chatgpt does not know about it yet ... haha)&lt;/p&gt;

&lt;p&gt;That brought back something I occasionally think about: &lt;br&gt;
data and awareness.&lt;/p&gt;

&lt;p&gt;I don’t find this scary, but I do think it’s important to stay conscious. I’ve always cared about understanding influence and manipulation. Sometimes that mindset makes me feel like I’m swimming against the river. But I prefer that to drifting without noticing.&lt;/p&gt;

&lt;p&gt;AI is powerful and helpful. But awareness still matters.&lt;/p&gt;

&lt;p&gt;For me, this is the kind of data I’m careful not to share with AI:&lt;br&gt;
passwords, tokens, or access keys&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;financial information&lt;/li&gt;
&lt;li&gt;exact location or daily routines&lt;/li&gt;
&lt;li&gt;sensitive health or legal details (which I used to share! : / )&lt;/li&gt;
&lt;li&gt;deeply personal vulnerabilities that could be misused&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some data is harmless. Some data deserves protection.&lt;br&gt;
Using AI doesn’t mean turning off your thinking.&lt;br&gt;
It means using it with intention.&lt;/p&gt;

</description>
      <category>prorammerslife</category>
      <category>programming</category>
      <category>manipulation</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>A Small Trick for Smarter, More Reliable Inputs in React</title>
      <dc:creator>Minoosh</dc:creator>
      <pubDate>Wed, 29 Oct 2025 23:43:19 +0000</pubDate>
      <link>https://dev.to/minoosh/a-small-trick-for-smarter-more-reliable-inputs-in-react-1pbp</link>
      <guid>https://dev.to/minoosh/a-small-trick-for-smarter-more-reliable-inputs-in-react-1pbp</guid>
      <description>&lt;p&gt;Have you ever forgotten to add an id to an input and later realized your label doesn’t work? It’s a small mistake, but it breaks accessibility and can easily happen when you’re moving fast.&lt;br&gt;
Here’s a quick way to make sure it never happens again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function Input({ 
  label, 
  id, 
  name, 
  ...props 
}) {
  const inputId = id || name || label?.toLowerCase().replace(/\s+/g, '-');

  return (
    &amp;lt;div&amp;gt;
      {label &amp;amp;&amp;amp; &amp;lt;label htmlFor={inputId}&amp;gt;{label}&amp;lt;/label&amp;gt;}
      &amp;lt;input id={inputId} name={name} {...props} /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This line does the magic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const inputId = id || name || label?.toLowerCase().replace(/\s+/g, '-');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It simply checks:&lt;br&gt;
If an id exists, use it.&lt;br&gt;
If not, use the name.&lt;br&gt;
If neither exists, generate one from the label (e.g. "First Name" → "first-name").&lt;br&gt;
So even if you forget the id, your input will still stay linked to its label... no broken accessibility, no silent bugs.&lt;br&gt;
This pattern isn’t something all developers use, but it’s a clean habit that makes your components more reliable and professional. It’s small details like this that separate quick prototypes from solid, production-ready code.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Improved My Form Handling, Validation, and EmailJS in React</title>
      <dc:creator>Minoosh</dc:creator>
      <pubDate>Wed, 22 Oct 2025 22:54:15 +0000</pubDate>
      <link>https://dev.to/minoosh/how-i-improved-my-form-handling-validation-and-emailjs-in-react-55e9</link>
      <guid>https://dev.to/minoosh/how-i-improved-my-form-handling-validation-and-emailjs-in-react-55e9</guid>
      <description>&lt;p&gt;I’ve been working on my React project today and focused on handling forms properly. I combined React Hook Form, Zod validation, and EmailJS to create a real working contact form that actually sends emails.&lt;br&gt;
If you’re a junior developer who’s trying to understand how all these pieces fit together, I hope this post helps you save a few hours of confusion &lt;/p&gt;

&lt;p&gt;Step 1: Setting up React Hook Form + Zod&lt;br&gt;
First, I installed the necessary libraries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install react-hook-form zod @hookform/resolvers sonner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, I imported everything in my ContactForm.jsx file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import * as z from "zod";
import { toast } from "sonner";

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

&lt;/div&gt;



&lt;p&gt;I created a simple validation schema using Zod:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const contactSchema = z.object({
  name: z.string().min(1, "Name is required").max(100),
  email: z.string().email("Invalid email").max(50),
  message: z.string().min(1, "Message is required").max(1000),
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zod lets you describe what valid data looks like in plain English, and React Hook Form handles the rest automatically.&lt;/p&gt;

&lt;p&gt;Step 2: Building the form&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function ContactForm() {
  const {
    register,
    handleSubmit,
    reset,
    formState: { errors, isSubmitting },
  } = useForm({
    resolver: zodResolver(contactSchema),
  });

  const onSubmit = async (data) =&amp;gt; {
    console.log(data);
  };

  return (
    &amp;lt;form onSubmit={handleSubmit(onSubmit)} className="space-y-4 max-w-md mx-auto"&amp;gt;
      &amp;lt;input
        type="text"
        {...register("name")}
        placeholder="Your name"
        className="border rounded p-2 w-full"
      /&amp;gt;
      {errors.name &amp;amp;&amp;amp; &amp;lt;p className="text-red-500"&amp;gt;{errors.name.message}&amp;lt;/p&amp;gt;}

      &amp;lt;input
        type="email"
        {...register("email")}
        placeholder="Your email"
        className="border rounded p-2 w-full"
      /&amp;gt;
      {errors.email &amp;amp;&amp;amp; &amp;lt;p className="text-red-500"&amp;gt;{errors.email.message}&amp;lt;/p&amp;gt;}

      &amp;lt;textarea
        {...register("message")}
        placeholder="Your message"
        className="border rounded p-2 w-full"
      /&amp;gt;
      {errors.message &amp;amp;&amp;amp; &amp;lt;p className="text-red-500"&amp;gt;{errors.message.message}&amp;lt;/p&amp;gt;}

      &amp;lt;button
        type="submit"
        disabled={isSubmitting}
        className="bg-blue-500 text-white px-4 py-2 rounded"
      &amp;gt;
        {isSubmitting ? "Sending..." : "Send"}
      &amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  );
}
export default function ContactForm() {
  const {
    register,
    handleSubmit,
    reset,
    formState: { errors, isSubmitting },
  } = useForm({
    resolver: zodResolver(contactSchema),
  });

  const onSubmit = async (data) =&amp;gt; {
    console.log(data);
  };

  return (
    &amp;lt;form onSubmit={handleSubmit(onSubmit)} className="space-y-4 max-w-md mx-auto"&amp;gt;
      &amp;lt;input
        type="text"
        {...register("name")}
        placeholder="Your name"
        className="border rounded p-2 w-full"
      /&amp;gt;
      {errors.name &amp;amp;&amp;amp; &amp;lt;p className="text-red-500"&amp;gt;{errors.name.message}&amp;lt;/p&amp;gt;}

      &amp;lt;input
        type="email"
        {...register("email")}
        placeholder="Your email"
        className="border rounded p-2 w-full"
      /&amp;gt;
      {errors.email &amp;amp;&amp;amp; &amp;lt;p className="text-red-500"&amp;gt;{errors.email.message}&amp;lt;/p&amp;gt;}

      &amp;lt;textarea
        {...register("message")}
        placeholder="Your message"
        className="border rounded p-2 w-full"
      /&amp;gt;
      {errors.message &amp;amp;&amp;amp; &amp;lt;p className="text-red-500"&amp;gt;{errors.message.message}&amp;lt;/p&amp;gt;}

      &amp;lt;button
        type="submit"
        disabled={isSubmitting}
        className="bg-blue-500 text-white px-4 py-2 rounded"
      &amp;gt;
        {isSubmitting ? "Sending..." : "Send"}
      &amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, validation was already working. If I left any field empty or entered an invalid email, friendly red error messages appeared.&lt;/p&gt;

&lt;p&gt;Step 3: Sending real emails with EmailJS&lt;/p&gt;

&lt;p&gt;I created a free account on EmailJS, added my email template, and grabbed the following values from my dashboard:&lt;/p&gt;

&lt;p&gt;Service ID&lt;br&gt;
Template ID&lt;br&gt;
Public Key&lt;/p&gt;

&lt;p&gt;These are all safe to use in the frontend.&lt;/p&gt;

&lt;p&gt;Then I installed the library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @emailjs/browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And updated my onSubmit function:&lt;br&gt;
import emailjs from "@emailjs/browser";&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const onSubmit = async (data) =&amp;gt; {
  try {
    const templateParams = {
      from_name: data.name,
      from_email: data.email,
      message: data.message,
    };

    await emailjs.send(
      "your_service_id",
      "your_template_id",
      templateParams,
      "your_public_key"
    );

    toast.success("Message sent successfully!");
    reset();
  } catch (error) {
    console.error("Error sending message:", error);
    toast.error("Failed to send message. Please try again later.");
  }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When I hit submit, I saw a toast saying "Message sent successfully!" and then I got the actual email in my inbox 🎉&lt;br&gt;
That was a big confidence boost.&lt;/p&gt;

&lt;p&gt;What I Learned Today&lt;/p&gt;

&lt;p&gt;data only exists inside onSubmit. React Hook Form passes the form data there after validation.&lt;br&gt;
Zod plus React Hook Form makes validation clean and readable.&lt;br&gt;
EmailJS works safely from the frontend when using the public key.&lt;br&gt;
Async/await plus try/catch make form submissions easy to handle.&lt;br&gt;
Adding a loading state and toasts improves UX.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;This was a big step toward writing more professional React code. Forms are no longer intimidating. Now I understand the flow:&lt;/p&gt;

&lt;p&gt;User types → Validation → onSubmit → EmailJS → Success toast → Reset form.&lt;/p&gt;

&lt;p&gt;That’s a simple but powerful pattern that I’ll reuse again and again.&lt;br&gt;
If you’re just starting with React forms, play around, log your data, and celebrate small wins. They add up fast.&lt;/p&gt;

&lt;p&gt;✍️ I’m a self-taught front-end developer learning React and sharing my journey. If you’ve gone through something similar, I’d love to hear about it in the comments!&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>🌍 My Journey with React Leaflet: Learning to Build an Interactive Map</title>
      <dc:creator>Minoosh</dc:creator>
      <pubDate>Thu, 09 Oct 2025 04:31:02 +0000</pubDate>
      <link>https://dev.to/minoosh/my-journey-with-react-leaflet-learning-to-build-an-interactive-map-ef9</link>
      <guid>https://dev.to/minoosh/my-journey-with-react-leaflet-learning-to-build-an-interactive-map-ef9</guid>
      <description>&lt;p&gt;Recently, I started learning how to make an interactive map for a web app I am working on, using React Leaflet.&lt;br&gt;
The idea is to let users click anywhere on the map to add a marker. Later, they’ll be able to write a title, a description, and even add a photo for that spot.&lt;br&gt;
In the future, each spot will be reviewed by an admin before it shows up on the map.&lt;/p&gt;

&lt;p&gt;🧩 What I Have Done So Far&lt;/p&gt;

&lt;p&gt;I created a React map using MapContainer, TileLayer, and Marker_added Popup and useMapEvents later on_.&lt;br&gt;
The map displays the location of a city, when I type a city name, it finds its coordinates using OpenStreetMap’s Nominatim API.&lt;/p&gt;

&lt;p&gt;💻 My Coding Challenges&lt;br&gt;
I faced many small but confusing problems while building this project.&lt;/p&gt;

&lt;p&gt;At first, I didn’t really understand how this useMapEvents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function AddMarkerOnClick() {
    useMapEvents({
      click(e) {
        const { lat, lng } = e.latlng;
        setMarkers((prev) =&amp;gt; [...prev, { lat, lng }]);
        setLastMarker({ lat, lng });
        setShowModal(true);
      },
    });
    return null;
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I couldn’t figure out why the click was written inside an object, or how React Leaflet knew what it meant. But then I learned that this object simply tells the map what actions to listen for. The click event is already built into the map library.  Once I realized that, it all made sense.&lt;/p&gt;

&lt;p&gt;Now, whenever I click on the map, a marker appears exactly where I clicked.&lt;br&gt;
It feels great to see it working — even though it’s simple, it’s a huge step forward!&lt;/p&gt;

&lt;p&gt;🧠 Working on the Modal&lt;/p&gt;

&lt;p&gt;Next, I started building a modal that opens when a user adds a marker. Inside the modal, users can type the title and description for that place.&lt;br&gt;
The tricky part was making sure that when the modal opens, the rest of the page becomes inactive and that my close button doesn’t disappear behind the overlay.&lt;/p&gt;

&lt;p&gt;It took me a while to understand how positioning and z-index work together, but I finally got it right. Now, the modal appears on top of everything, and the background stays dimmed and unclickable.&lt;/p&gt;

&lt;p&gt;🌱 What I Learned&lt;/p&gt;

&lt;p&gt;Even though these might sound like small technical details, each one helped me understand how React components, Tailwind styling, and CSS positioning actually work together.&lt;/p&gt;

&lt;p&gt;Every small “why doesn’t this work?” moment is actually a step toward becoming a better developer. Today once again I felt I  really enjoy this journey.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>react</category>
    </item>
    <item>
      <title>Today I Learned: Layouts and the Z-Index Trap in React</title>
      <dc:creator>Minoosh</dc:creator>
      <pubDate>Thu, 18 Sep 2025 00:32:57 +0000</pubDate>
      <link>https://dev.to/minoosh/today-i-learned-layouts-and-the-z-index-trap-in-react-366f</link>
      <guid>https://dev.to/minoosh/today-i-learned-layouts-and-the-z-index-trap-in-react-366f</guid>
      <description>&lt;p&gt;Sometimes, what seems “simple” in front-end development can surprise you in the best way — a little challenge, a little learning. Today, I ran into a couple of tricky issues while building my React app with a sticky Navbar and shared Layout. Here’s what happened and what I learned.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Layouts make life way easier&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I wanted my Navbar and Footer to show up on every page without having to copy them into every component. That’s where a Layout component really saved me.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function Layout({ children }) {
  return (
    &amp;lt;div className="font-sans"&amp;gt;
      &amp;lt;Navbar /&amp;gt;     {/* stays the same across pages */}
      {children}     {/* page-specific content */}
      &amp;lt;Footer /&amp;gt;     {/* stays the same across pages */}
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, for each page route, I just wrapped it in the Layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Route path="/team" element={&amp;lt;Layout&amp;gt;&amp;lt;Team /&amp;gt;&amp;lt;/Layout&amp;gt;} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ The best part? I don’t have to copy &lt;code&gt;&amp;lt;Navbar /&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;Footer /&amp;gt;&lt;/code&gt; everywhere. Any update I make to them automatically shows up on all pages — clean, efficient, and it feels so good seeing it just work.&lt;/p&gt;

&lt;p&gt;2.The z-index surprise&lt;/p&gt;

&lt;p&gt;Even with the Layout set up, I noticed a small hiccup: my Navbar wasn’t clickable in some areas.&lt;br&gt;
I had this CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;section className="absolute top-0 left-0 w-full z-10"&amp;gt;...&amp;lt;/section&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I thought, “z-10? That should put me on top of everything!” — not quite. But it was actually a great little puzzle.&lt;br&gt;
Here’s why:&lt;br&gt;
z-index only works within the same stacking context.&lt;br&gt;
If a parent or sibling element has position set and a higher z-index, it can cover your Navbar, even if your Navbar has z-10.&lt;br&gt;
Transparent elements can also block clicks if they’re sitting above your Navbar.&lt;br&gt;
How I fixed it:&lt;br&gt;
Made sure no parent element created a higher stacking context.&lt;br&gt;
Bumped the Navbar z-index up:&lt;br&gt;
&lt;code&gt;z-[9999]&lt;/code&gt;&lt;br&gt;
Adjusted parent elements so the stacking order made sense.&lt;br&gt;
✅ After that, my Navbar links were fully clickable, and the Layout worked perfectly — such a satisfying little win!&lt;/p&gt;

&lt;p&gt;*** Lessons Learned ***&lt;/p&gt;

&lt;p&gt;Layout components are a total lifesaver — putting shared stuff like Navbar/Footer in one place makes your life so much easier.&lt;br&gt;
z-index doesn’t automatically put you on top — understanding stacking contexts and parent/sibling elements is key.&lt;br&gt;
Even invisible or transparent elements can block clicks — good reminder to always check the layering.&lt;br&gt;
💡 Small CSS hiccups can be tricky, but each one is a chance to learn and improve. Today reminded me that debugging UI is just as rewarding as writing the code itself — and seeing it all work perfectly at the end is the best feeling!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>layout</category>
      <category>css</category>
    </item>
    <item>
      <title>Solved: Why Tailwind CSS Wasn't Working with My Vite React App</title>
      <dc:creator>Minoosh</dc:creator>
      <pubDate>Wed, 17 Sep 2025 18:20:05 +0000</pubDate>
      <link>https://dev.to/minoosh/solved-why-tailwind-css-wasnt-working-with-my-vite-react-app-2ooo</link>
      <guid>https://dev.to/minoosh/solved-why-tailwind-css-wasnt-working-with-my-vite-react-app-2ooo</guid>
      <description>&lt;p&gt;Hey fellow developers! 👋&lt;/p&gt;

&lt;p&gt;Just solved a classic frontend setup puzzle and thought I'd share in case anyone else is wrestling with the same issue.&lt;/p&gt;

&lt;p&gt;I was setting up Tailwind CSS in a React + Vite project and hit that frustrating wall where the styles just wouldn't apply. You know the feeling - you've followed the docs, everything looks right, but that beautiful blue bg-blue-500 just renders as plain white?&lt;/p&gt;

&lt;p&gt;Turns out I'd missed three crucial things:&lt;/p&gt;

&lt;p&gt;The content array in tailwind.config.js was empty (facepalm moment) - Tailwind needs to know which files to scan for class names!&lt;br&gt;
PostCSS configuration - Vite uses it automatically but needs that postcss.config.js file to play nice with Tailwind&lt;br&gt;
Import order matters - Those &lt;a class="mentioned-user" href="https://dev.to/tailwind"&gt;@tailwind&lt;/a&gt; directives need to be in your main CSS file (index.css, not App.css)&lt;br&gt;
The fix was simple once I stepped back and checked the fundamentals:&lt;/p&gt;

&lt;p&gt;Proper content paths: ["./index.html", "./src/*&lt;em&gt;/&lt;/em&gt;.{js,ts,jsx,tsx}"]&lt;br&gt;
Complete PostCSS setup with tailwindcss and autoprefixer&lt;br&gt;
And of course, the classic "have you tried turning it off and on again?" (restarting the dev server)&lt;br&gt;
Sometimes it's the obvious things that trip us up! What's your most recent "aha!" moment with CSS tooling?&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>vite</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🧹 Cleaning Git History &amp; Repo Setup: My Dev Struggles Today</title>
      <dc:creator>Minoosh</dc:creator>
      <pubDate>Wed, 10 Sep 2025 21:36:52 +0000</pubDate>
      <link>https://dev.to/minoosh/cleaning-git-history-repo-setup-my-dev-struggles-today-19mg</link>
      <guid>https://dev.to/minoosh/cleaning-git-history-repo-setup-my-dev-struggles-today-19mg</guid>
      <description>&lt;p&gt;Today I thought I’d have a smooth coding day, but instead, I spent hours wrestling with Git and GitHub 😅.&lt;br&gt;
After fixing my secret-handling yesterday, I tried to push my project again and ran into new challenges.&lt;/p&gt;

&lt;p&gt;The Problems:&lt;/p&gt;

&lt;p&gt;Old commits still had my token: Even though I removed it locally, it was still in the history. GitHub push protection wasn’t letting me push until it was completely gone.&lt;br&gt;
Git history cleanup: I had to use git filter-repo to actually remove the file from all previous commits. That felt scary because it rewrites history.&lt;br&gt;
Two project folders: To stay safe, I worked in a cloned folder called chef-ai-clean. But then I had both chef-ai and chef-ai-clean on my computer and kept confusing which one was the “real” project.&lt;br&gt;
Remote issues: I deleted the old repo on GitHub and created a new one. That meant I had to re-add the remote and figure out why my first push was failing.&lt;br&gt;
What I Learned&lt;br&gt;
git filter-repo is the right way to clean secrets from history (not just deleting the line).&lt;br&gt;
Fresh clones are safer when rewriting history.&lt;br&gt;
Renaming folders is fine. I just moved the old one aside and renamed chef-ai-clean back to chef-ai.&lt;br&gt;
The first push needs:&lt;br&gt;
git push -u origin main&lt;br&gt;
The -u is important because it sets the tracking branch, so afterwards I can just run git push.&lt;/p&gt;

&lt;p&gt;The Win:&lt;/p&gt;

&lt;p&gt;After a lot of trial and error, I finally have:&lt;br&gt;
A clean repo on GitHub &lt;br&gt;
Secrets safely ignored by Git&lt;br&gt;
A local folder with the right name (chef-ai)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>github</category>
      <category>ai</category>
      <category>react</category>
    </item>
    <item>
      <title>Chef-ai-project: Keeping API Tokens Safe in React</title>
      <dc:creator>Minoosh</dc:creator>
      <pubDate>Wed, 10 Sep 2025 04:20:56 +0000</pubDate>
      <link>https://dev.to/minoosh/chef-ai-project-keeping-api-tokens-safe-in-react-43hf</link>
      <guid>https://dev.to/minoosh/chef-ai-project-keeping-api-tokens-safe-in-react-43hf</guid>
      <description>&lt;p&gt;Today I ran into a small but important problem in my React project. I’m building an app where you enter a list of ingredients, and an AI (Mistral) suggests a recipe.&lt;br&gt;
At first, I just hardcoded my Hugging Face API token in ai.js like this:&lt;br&gt;
const hf = new HfInference("MY_TOKEN_HERE");&lt;br&gt;
It worked locally… but GitHub blocked my push 😅. Apparently, secret scanning doesn’t like exposed tokens.&lt;br&gt;
What I Did&lt;br&gt;
Environment variables&lt;br&gt;
I created a .env file:&lt;br&gt;
VITE_HF_API_KEY=your_huggingface_token_here&lt;br&gt;
and added it to .gitignore. Now the token is private and safe.&lt;br&gt;
Using it in Vite/React&lt;br&gt;
const hf = new HfInference(import.meta.env.VITE_HF_API_KEY);&lt;br&gt;
Calling the AI safely&lt;br&gt;
I made an async function to get recipes and added error handling:&lt;br&gt;
export async function getRecipeFromMistral(ingredientsArr) {&lt;br&gt;
  // join ingredients, call AI, return recipe&lt;br&gt;
}&lt;br&gt;
Takeaway&lt;br&gt;
Even small projects are a great way to practice security and good habits. I learned that environment variables + .gitignore keep secrets safe while letting the app work normally.&lt;br&gt;
Little wins like this make me feel more confident as a developer 😄.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>ai</category>
      <category>react</category>
    </item>
    <item>
      <title>Building My First React Portfolio: Challenges, Learning, and Growth</title>
      <dc:creator>Minoosh</dc:creator>
      <pubDate>Sun, 31 Aug 2025 06:00:19 +0000</pubDate>
      <link>https://dev.to/minoosh/building-my-first-react-portfolio-challenges-learning-and-growth-59l</link>
      <guid>https://dev.to/minoosh/building-my-first-react-portfolio-challenges-learning-and-growth-59l</guid>
      <description>&lt;p&gt;Recently, I started working on my portfolio website with React and Tailwind. I wanted it to have a minimal black and white theme with some subtle animations to keep it clean but not boring. It’s still in progress, but it already feels rewarding to see it come together.&lt;br&gt;
Lately, I’ve run into some more complex challenges while building it. Learning when to break things into smaller components, and how to pass props cleanly without overcomplicating state, has been a big part of my growth.&lt;br&gt;
One tricky area has been handling responsiveness and layout across different screen sizes. Tailwind makes a lot of it easier, but I’ve realized that once animations and layouts get more custom, keeping everything consistent across breakpoints takes extra care.&lt;br&gt;
I’ve also gained a much better understanding of how hooks and props work. Form handling, for example, was a challenge at first. I spent around 4 hours setting up a third-party email handling service, but I finally got it working and can now successfully receive messages in my inbox. And of course, there are always bugs here and there.&lt;br&gt;
Even though these issues slowed me down, I’ve noticed that each time I push through, I come out with a clearer understanding of React’s patterns and how to balance good design with clean code.&lt;br&gt;
I’m getting more and more interested in React, and I’m already thinking about tackling a more complex project once I finish my website.&lt;/p&gt;

</description>
      <category>react</category>
      <category>tailwindcss</category>
      <category>frontend</category>
      <category>challenge</category>
    </item>
    <item>
      <title>3 Weeks into React – Still Excited!</title>
      <dc:creator>Minoosh</dc:creator>
      <pubDate>Wed, 30 Jul 2025 16:31:00 +0000</pubDate>
      <link>https://dev.to/minoosh/3-weeks-into-react-still-excited-2keh</link>
      <guid>https://dev.to/minoosh/3-weeks-into-react-still-excited-2keh</guid>
      <description>&lt;p&gt;Hey everyone! Just wanted to share a quick update — I started learning React about 3 weeks ago, and I’m still super excited about it. 🎉&lt;/p&gt;

&lt;p&gt;It’s been a mix of fun, confusion, and those little “aha!” moments that keep me going. There's so much to learn, but every day I feel like I’m getting just a bit better.&lt;/p&gt;

&lt;p&gt;Right now, I’m working on a project called Chef Claude — it’s helping me understand React in a hands-on way&lt;/p&gt;

&lt;p&gt;If you’re also learning React or remember what it was like in the beginning, feel free to say hi or share your tips. 😊&lt;/p&gt;

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

</description>
      <category>webdev</category>
      <category>react</category>
    </item>
    <item>
      <title>The Power of Reaching Out: A Coffee Chat That Reignited My Motivation</title>
      <dc:creator>Minoosh</dc:creator>
      <pubDate>Tue, 15 Jul 2025 17:27:04 +0000</pubDate>
      <link>https://dev.to/minoosh/the-power-of-reaching-out-a-coffee-chat-that-reignited-my-motivation-3idl</link>
      <guid>https://dev.to/minoosh/the-power-of-reaching-out-a-coffee-chat-that-reignited-my-motivation-3idl</guid>
      <description>&lt;p&gt;A few days ago, I was thinking about how to expand my network and connect with people in the tech industry. That’s when I remembered an old friend I hadn't seen in almost two years. He works in IT at a university here in Vancouver. I reached out, and to my delight, we met up yesterday.&lt;/p&gt;

&lt;p&gt;What followed was an incredibly insightful and encouraging conversation.&lt;/p&gt;

&lt;p&gt;He generously shared his journey with me—how he navigated his path, the unexpected opportunities he found, and the mindset shifts that helped him grow. One key takeaway was how valuable short certificates can be when paired with focused goals. He also reminded me not to limit my job search to traditional tech companies—there are many organizations out there with tech roles that fly under the radar.&lt;/p&gt;

&lt;p&gt;We also talked about volunteering as a way to build experience and connections, the importance of tailoring your resume for every role, and staying consistent with applications. One piece of practical advice stood out: don't waste time applying to job postings that are more than a couple of days old—by then, they might already be gone.&lt;/p&gt;

&lt;p&gt;I left our conversation with a spark of energy and a fresh sense of direction. I know I still have a long road ahead of me—so much to learn, so much to build—but I’m genuinely excited about it all.&lt;/p&gt;

&lt;p&gt;Sometimes, all it takes is a simple coffee chat with someone you trust to reframe your perspective.&lt;/p&gt;

</description>
      <category>beginners</category>
    </item>
    <item>
      <title>My Latest Frontend Project: A Budget Tracker App!</title>
      <dc:creator>Minoosh</dc:creator>
      <pubDate>Thu, 10 Jul 2025 22:21:01 +0000</pubDate>
      <link>https://dev.to/minoosh/my-latest-frontend-project-a-budget-tracker-app-1jh5</link>
      <guid>https://dev.to/minoosh/my-latest-frontend-project-a-budget-tracker-app-1jh5</guid>
      <description>&lt;p&gt;Hey everyone! 👋&lt;/p&gt;

&lt;p&gt;I wanted to share a quick update on my frontend development journey. I’ve been learning JavaScript, HTML, and CSS for a while now, and recently I completed a small but meaningful project — a Budget Tracker App &lt;/p&gt;

&lt;p&gt;Why I Built It&lt;/p&gt;

&lt;p&gt;I wanted to challenge myself with something more practical — a project that deals with data, categories, and monthly summaries, without making things overly complicated. It also gave me a great opportunity to dive deeper into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Functional programming
_ keeping the code clean &lt;/li&gt;
&lt;li&gt;keeping the logic and the UI separate&lt;/li&gt;
&lt;li&gt;DOM manipulation&lt;/li&gt;
&lt;li&gt;Problem-solving with real-world logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What the App Does&lt;/p&gt;

&lt;p&gt;The Budget Tracker App allows users to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add monthly expenses (with category and amount)&lt;/li&gt;
&lt;li&gt;Edit or delete any expense&lt;/li&gt;
&lt;li&gt;View a summary of expenses per category&lt;/li&gt;
&lt;li&gt;See the total expense for the current month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I Learned&lt;/p&gt;

&lt;p&gt;This project helped me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand the value of structuring code&lt;/li&gt;
&lt;li&gt;Practice updating the UI based on data changes&lt;/li&gt;
&lt;li&gt;Break down complex problems into smaller, manageable tasks&lt;/li&gt;
&lt;li&gt;Improve my debugging and testing workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You will find the project here in my GitHub:&lt;br&gt;
&lt;a href="https://github.com/MinooshVejdani/budget-tracker" rel="noopener noreferrer"&gt;https://github.com/MinooshVejdani/budget-tracker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌱 What’s Next?&lt;/p&gt;

&lt;p&gt;I’m just getting started with &lt;strong&gt;React&lt;/strong&gt;, and I’m excited to rebuild this app using React components. This will help me see the contrast between vanilla JS and modern frameworks — and sharpen my skills even more.&lt;br&gt;
Thanks for reading! I’m loving the learning journey so far. If you’ve worked on similar projects or have feedback, I’d love to connect!&lt;/p&gt;

&lt;p&gt;Happy coding! 👩‍💻✨&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
