0
0 Comments

In modern web development, creating a responsive navbar with a light/dark mode toggle is an essential feature for enhancing user experience. By leveraging Redux for state management, Tailwind CSS for styling, and React Router for navigation, we can create a dynamic navbar with theme-switching functionality.

Prerequisites

Before we start, ensure you have the following installed:

  • Node.js (latest version recommended)
  • React (npx create-react-app my-app)
  • Redux Toolkit (npm install @reduxjs/toolkit react-redux)
  • React Router (npm install react-router-dom)
  • Tailwind CSS (npm install tailwindcss postcss autoprefixer && npx tailwindcss init)

Step 1: Setting Up Redux for Theme Management
Create userSlice.js

<code>import { createSlice } from "@reduxjs/toolkit";

const initialState = {
  status: false,
  data: "null",
  theme: "dark" // Default theme
};

const userSlice = createSlice({
  name: "user",
  initialState,
  reducers: {
    themechange: (state) => {
      state.theme = state.theme === "dark" ? "light" : "dark";
    },
  },
});

export const { themechange } = userSlice.actions;
export default userSlice.reducer;</code>

Step 2: Implementing the Navbar with Dark Mode Toggle
Create Navbar.js

<code>import { useEffect } from "react";
import { Link } from "react-router-dom";
import { useSelector, useDispatch } from "react-redux";
import { themechange } from "../Utils/userslicer";

export default function Navbar() {
  const dispatch = useDispatch();
  const theme = useSelector((state) => state.user.theme);
  const darkMode = theme === "dark";

  useEffect(() => {
    document.documentElement.classList.remove("dark", "light");
    document.documentElement.classList.add(theme);
  }, [theme]);

  return (
    <nav className="w-full p-4 bg-white dark:bg-black flex justify-between items-center rounded-full shadow-md dark:shadow-lg fixed top-5 left-0 right-0 z-50 mx-auto max-w-7xl px-6">
      <div className="flex items-center gap-2">
        <img src="/logo.png" alt="DevStudio Logo" className="w-8 h-8 dark:invert" />
        <span className="text-black dark:text-white font-semibold text-lg">DevStudio</span>
      </div>
      <div className="flex gap-6">
        <Link to="#" className="text-gray-700 dark:text-gray-300 hover:underline">Services</Link>
        <Link to="#" className="text-gray-700 dark:text-gray-300 hover:underline">Products</Link>
        <Link to="#" className="text-gray-700 dark:text-gray-300 hover:underline">Pricing</Link>
      </div>
      <div className="flex items-center gap-4">
        <button className="bg-black text-white dark:bg-white dark:text-black px-6 py-2 rounded-full font-semibold">Book a call</button>
        <button onClick={() => dispatch(themechange())}>{darkMode ? "☀️" : "🌙"}</button>
      </div>
    </nav>
  );
}</code>

Step 3: Applying Tailwind CSS Dark Mode
Configure tailwind.config.js

<code>module.exports = {
  darkMode: "class", // Enable class-based dark mode
  content: ["./src/**/*.{js,jsx,ts,tsx}"],
  theme: {
    extend: {},
  },
  plugins: [],
};</code>

Step 4: Routing with React Router

<code>import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import Navbar from "./components/Navbar";

function App() {
  return (
    <Router>
      <Navbar />
      <Routes>
        <Route path="/" element={<h1>Home</h1>} />
        <Route path="/services" element={<h1>Services</h1>} />
        <Route path="/products" element={<h1>Products</h1>} />
      </Routes>
    </Router>
  );
}

export default App;</code>

Conclusion

By following this guide, you’ve successfully built a responsive navbar with a light/dark mode toggle using Redux Toolkit, Tailwind CSS, and React Router. This implementation ensures:

  • Efficient state management using Redux
  • SEO-friendly navigation with React Router
  • Smooth theme switching with Tailwind CSS

By implementing these best practices, your website will provide a better user experience and improve search engine rankings (SEO) with fast-loading, accessible, and responsive UI components.

Anonymous Asked question 6 days ago