<?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: Mitesh Panchal</title>
    <description>The latest articles on DEV Community by Mitesh Panchal (@miteshp98).</description>
    <link>https://dev.to/miteshp98</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%2F3037966%2F645ba52d-5766-4ff2-9d62-dde6886a402c.jpeg</url>
      <title>DEV Community: Mitesh Panchal</title>
      <link>https://dev.to/miteshp98</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/miteshp98"/>
    <language>en</language>
    <item>
      <title>React Todo App (Desktop-Only Version) - Design (Frontend Mentor)</title>
      <dc:creator>Mitesh Panchal</dc:creator>
      <pubDate>Thu, 10 Apr 2025 12:04:41 +0000</pubDate>
      <link>https://dev.to/miteshp98/react-todo-app-desktop-only-version-design-frontend-mentor-213g</link>
      <guid>https://dev.to/miteshp98/react-todo-app-desktop-only-version-design-frontend-mentor-213g</guid>
      <description>&lt;p&gt;&lt;strong&gt;✨ What I Built&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A clean and functional Todo App using React.js - mainly built to practice component structure, state management, and dark/light theming.&lt;/p&gt;

&lt;p&gt;This version is desktop-only for now, but I plan to make it fully responsive later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚙️ Features&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Add new tasks&lt;br&gt;
❌ Delete tasks&lt;br&gt;
🕹️ Toggle task completion&lt;br&gt;
🌗 Dark/Light mode toggle&lt;br&gt;
🔍 Filter tasks by:&lt;/p&gt;

&lt;p&gt;🔹All&lt;br&gt;
🔷Active&lt;br&gt;
✅Completed&lt;/p&gt;

&lt;p&gt;🧹 Clear all completed tasks&lt;br&gt;
🔄 Real-time updates using useState and props&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔧 Tech Stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React.js (Functional Components + Hooks)&lt;br&gt;
CSS Modules for scoped styling&lt;br&gt;
No external UI libraries&lt;br&gt;
Modular file structure&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 What I Practiced&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lifting and managing state between components&lt;br&gt;
Controlled form elements&lt;br&gt;
Dynamic filtering&lt;br&gt;
Class toggling for theme switch&lt;br&gt;
Code reusability (e.g.,  component)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🖼️ Screenshots&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Main.jsx
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.jsx'

createRoot(document.getElementById('root')).render(
  &amp;lt;StrictMode&amp;gt;
    &amp;lt;App /&amp;gt;
  &amp;lt;/StrictMode&amp;gt;,
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;App.jsx
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import "./App.css";
import { useState } from "react";
import TodoHeader from "./components/TodoHeader";
import TodoForm from "./components/TodoForm";
import TodoList from "./components/TodoList";

function App() {
    const [isDarkMode, setIsDarkMode] = useState(false);
    const [todoItems, setTodoItems] = useState([]);

    const handleAddTodoItems = (item) =&amp;gt; {
        setTodoItems((items) =&amp;gt; [...items, item]);
    };

    const handleDeleteItems = (id) =&amp;gt; {
        setTodoItems((items) =&amp;gt; items.filter((item) =&amp;gt; item.id !== id));
    };

    const handleToggleComplete = (id) =&amp;gt; {
        setTodoItems((items) =&amp;gt;
            items.map((item) =&amp;gt; (item.id === id ? { ...item, completed: !item.completed } : item))
        );
    };

    const handleClearCompleted = () =&amp;gt; {
        setTodoItems((items) =&amp;gt; items.filter((item) =&amp;gt; !item.completed));
    };

    return (
        &amp;lt;&amp;gt;
            &amp;lt;main className={`todo-app ${isDarkMode ? "dark" : "light"}`}&amp;gt;
                &amp;lt;section className="todo-app-section"&amp;gt;
                    &amp;lt;TodoHeader onChangeTheme={setIsDarkMode} isDarkMode={isDarkMode} /&amp;gt;
                    &amp;lt;TodoForm onAddTodoItems={handleAddTodoItems} /&amp;gt;

                    {todoItems.length &amp;gt; 0 ? (
                        &amp;lt;TodoList
                            todoItems={todoItems}
                            setTodoItems={setTodoItems}
                            onTaskComplete={handleToggleComplete}
                            onDeleteItem={handleDeleteItems}
                            onClearCompleted={handleClearCompleted}
                        /&amp;gt;
                    ) : (
                        ""
                    )}
                &amp;lt;/section&amp;gt;
            &amp;lt;/main&amp;gt;
        &amp;lt;/&amp;gt;
    );
}

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;TodoHeader.jsx
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import "../styles/Header.css";
import Button from "./ui/Button";

function TodoHeader({ isDarkMode, onChangeTheme }) {
    const handleThemeToggler = () =&amp;gt; {
        onChangeTheme((isDarkMode) =&amp;gt; !isDarkMode);
    };

    return (
        &amp;lt;header className="todo-header"&amp;gt;
            &amp;lt;h1&amp;gt;Todo&amp;lt;/h1&amp;gt;

            &amp;lt;Button className={"theme-toggle"} onClick={handleThemeToggler}&amp;gt;
                &amp;lt;img src={`icon-${isDarkMode ? "sun.svg" : "moon.svg"}`} alt="icon" /&amp;gt;
            &amp;lt;/Button&amp;gt;
        &amp;lt;/header&amp;gt;
    );
}

export default TodoHeader;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;UI Button.jsx
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Button({ className, onClick, children, id }) {
    return (
        &amp;lt;button className={className} onClick={onClick} id={id}&amp;gt;
            {children}
        &amp;lt;/button&amp;gt;
    );
}

export default Button;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;TodoForm.jsx
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState } from "react";
import "../styles/TodoForm.css";
import Button from "./ui/Button";

function TodoForm({ onAddTodoItems }) {
    const [task, setTask] = useState("");

    const handleForm = (e) =&amp;gt; {
        e.preventDefault();

        if (!task.trim()) return;

        const newTask = {
            id: Date.now(),
            task: task,
            completed: false,
        };

        onAddTodoItems(newTask);
        setTask("");
    };

    return (
        &amp;lt;div className="todo-form-wrapper"&amp;gt;
            &amp;lt;form action="" className="todo-form" onSubmit={handleForm}&amp;gt;
                &amp;lt;Button className={"todo-submit"}&amp;gt;&amp;lt;/Button&amp;gt;
                &amp;lt;label htmlFor="todo-input" className="todo-label"&amp;gt;&amp;lt;/label&amp;gt;
                &amp;lt;input
                    type="text"
                    name="todo-input"
                    id="todo-input"
                    placeholder="Create a new todo..."
                    onChange={(e) =&amp;gt; setTask(e.target.value)}
                    value={task}
                /&amp;gt;
            &amp;lt;/form&amp;gt;
        &amp;lt;/div&amp;gt;
    );
}

export default TodoForm;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;TodoList.jsx
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import TodoItem from "./TodoItem";
import "../styles/TodoList.css";
import TodoFooter from "./TodoFooter";
import { useState } from "react";

function TodoList({ todoItems, setTodoItems, onTaskComplete, onDeleteItem, onClearCompleted }) {
    const [activeTab, setActiveTab] = useState("all");

    let filterItems;

    if (activeTab === "all") filterItems = todoItems;
    else if (activeTab === "active")
        filterItems = todoItems.filter((item) =&amp;gt; item.completed === false);
    else filterItems = todoItems.filter((item) =&amp;gt; item.completed === true);

    return (
        &amp;lt;&amp;gt;
            &amp;lt;ul className="todo-items"&amp;gt;
                {filterItems.map((item) =&amp;gt; {
                    return (
                        &amp;lt;TodoItem
                            item={item}
                            key={item.id}
                            setTodoItems={setTodoItems}
                            onTaskComplete={onTaskComplete}
                            onDeleteItem={onDeleteItem}
                        /&amp;gt;
                    );
                })}
            &amp;lt;/ul&amp;gt;
            &amp;lt;TodoFooter
                filter={activeTab}
                onSetFilter={setActiveTab}
                todoItems={todoItems}
                onClearCompleted={onClearCompleted}
            /&amp;gt;
        &amp;lt;/&amp;gt;
    );
}
export default TodoList;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;TodoItem.jsx
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Button from "./ui/Button";

function TodoItem({ item, onTaskComplete, onDeleteItem }) {
    return (
        &amp;lt;li className="todo-item"&amp;gt;
            &amp;lt;input
                type="checkbox"
                name="todo-checkbox"
                id={`todo-checkbox-${item.id}`}
                className="todo-checkbox"
                checked={item.completed}
                onChange={() =&amp;gt; onTaskComplete(item.id)}
            /&amp;gt;
            &amp;lt;label htmlFor={`todo-checkbox-${item.id}`} className="todo-checkbox-wrapper"&amp;gt;
                &amp;lt;img src="icon-check.svg" alt="check" /&amp;gt;
            &amp;lt;/label&amp;gt;

            &amp;lt;span className="todo-text"&amp;gt;{item.task}&amp;lt;/span&amp;gt;

            &amp;lt;Button className="delete-item" onClick={() =&amp;gt; onDeleteItem(item.id)}&amp;gt;
                &amp;lt;img src="icon-cross.svg" alt="x" /&amp;gt;
            &amp;lt;/Button&amp;gt;
        &amp;lt;/li&amp;gt;
    );
}

export default TodoItem;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;TodoFooter.jsx
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Button from "./ui/Button";
import "../styles/TodoFooter.css";

const ctaBtnText = ["All", "Active", "Completed"];

function TodoFooter({ filter, onSetFilter, todoItems, onClearCompleted }) {
    const activeTodoItems = todoItems.filter((item) =&amp;gt; !item.completed).length;

    return (
        &amp;lt;div className="todo-footer"&amp;gt;
            &amp;lt;p className="todo-item-count"&amp;gt;{activeTodoItems} items left&amp;lt;/p&amp;gt;

            &amp;lt;div className="todo-footer-cta"&amp;gt;
                {ctaBtnText.map((btn) =&amp;gt; (
                    &amp;lt;Button
                        className={`cta-action-btn`}
                        key={btn}
                        onClick={() =&amp;gt; onSetFilter(btn.toLocaleLowerCase())}
                    &amp;gt;
                        &amp;lt;span
                            className={`${
                                filter === btn.toLowerCase() ? "cta-action-btn--active" : ""
                            }`}
                        &amp;gt;
                            {btn}
                        &amp;lt;/span&amp;gt;
                    &amp;lt;/Button&amp;gt;
                ))}
            &amp;lt;/div&amp;gt;

            &amp;lt;Button className={"cta-action-btn"} onClick={onClearCompleted}&amp;gt;
                &amp;lt;span&amp;gt;Clear Completed&amp;lt;/span&amp;gt;
            &amp;lt;/Button&amp;gt;
        &amp;lt;/div&amp;gt;
    );
}

export default TodoFooter;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let me know what you think or if you have any feedback! Cheers! 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
