āļ§ัāļ™āļĻุāļāļĢ์āļ—ี่ 28 āļĄีāļ™āļēāļ„āļĄ āļž.āļĻ. 2568

🌙 āļāļēāļĢāļ—āļģ Dark Mode āđƒāļ™ Next.js: āđƒāļŦ้āđ€āļ§็āļšāļ‚āļ­āļ‡āļ„ุāļ“āđ€āļ—่āļ‚ึ้āļ™āđāļšāļšāļĄืāļ­āļ­āļēāļŠีāļž!

āđ€āļšื่āļ­āđ„āļŦāļĄ? āļัāļšāđ€āļ§็āļšāļ—ี่āļŠāļ§่āļēāļ‡āļˆ้āļēāļˆāļ™āļ•āļēāļĨ้āļē ðŸ˜ĩ‍ðŸ’Ŧ āļ–้āļēāļ„ุāļ“āļ­āļĒāļēāļāđƒāļŦ้āļœู้āđƒāļŠ้āđ€āļĨืāļ­āļāđ„āļ”้āļ§่āļēāļ­āļĒāļēāļāđƒāļŠ้ āđ‚āļŦāļĄāļ”āļŠāļ§่āļēāļ‡ (Light Mode) āļŦāļĢืāļ­ āđ‚āļŦāļĄāļ”āļĄืāļ” (Dark Mode) āđƒāļ™ Next.js āđ€āļĢāļēāļĄีāļ§ิāļ˜ีāļ‡่āļēāļĒāđ† āđƒāļŦ้āļ„ุāļ“āļĨāļ­āļ‡āļ—āļģ!

āđƒāļ™āļšāļ—āļ„āļ§āļēāļĄāļ™ี้ āđ€āļĢāļēāļˆāļ°āļĄāļēāđ€āļˆāļēāļ°āļĨึāļ āļāļēāļĢāļ—āļģ Dark Mode āđƒāļ™ Next.js āđāļšāļšāļ„āļĢāļšāļ—ุāļāļ§ิāļ˜ี āļ—ั้āļ‡āđƒāļŠ้ CSS Variables, useState, localStorage āđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢีāđ€āļŠāļĢิāļĄ āđ€āļŠ่āļ™ Next Themes āļัāļš Tailwind CSS āļžāļĢ้āļ­āļĄāļ•ัāļ§āļ­āļĒ่āļēāļ‡āđ‚āļ„้āļ”āļ—ี่āđ€āļ­āļēāđ„āļ›āđƒāļŠ้āđ„āļ”้āđ€āļĨāļĒ! 🚀


ðŸ”Ĩ āļ—āļģāđ„āļĄāļ•้āļ­āļ‡āļĄี Dark Mode?

✅ āļ‚้āļ­āļ”ีāļ‚āļ­āļ‡ Dark Mode

  • āļŠ่āļ§āļĒāļĨāļ”āļ­āļēāļāļēāļĢāļĨ้āļēāļŠāļēāļĒāļ•āļē 👀 (āļŠāļģāļŦāļĢัāļšāļ„āļ™āļ—ี่āđƒāļŠ้āđ€āļ§็āļšāļ•āļ­āļ™āļāļĨāļēāļ‡āļ„ืāļ™)
  • āļ›āļĢāļ°āļŦāļĒัāļ”āđāļšāļ•āđ€āļ•āļ­āļĢี่ 🔋 (āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļˆāļ­ OLED)
  • āļ”ูāđ€āļ—่! 😎 āļŦāļĨāļēāļĒāđ€āļ§็āļšāđƒāļŦāļ่āđ† āļ็āđƒāļŠ้ āđ€āļŠ่āļ™ YouTube, Twitter


🛠 āļ§ิāļ˜ีāļ—āļģ Dark Mode āđƒāļ™ Next.js

🚀 1. āđƒāļŠ้ CSS Variables + useState

āļ§ิāļ˜ีāļ™ี้āđ€āļŦāļĄāļēāļ°āļัāļš:
✅ āđ€āļ§็āļšāļ—ี่āđ„āļĄ่āļ‹ัāļšāļ‹้āļ­āļ™āļĄāļēāļ
✅ āđ„āļĄ่āļ•้āļ­āļ‡āđƒāļŠ้āđ„āļĨāļšāļĢāļēāļĢีāđ€āļŠāļĢิāļĄ


ðŸ‘Ļ‍ðŸ’ŧ āļ‚ั้āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģ

1️⃣ āļŠāļĢ้āļēāļ‡ globals.css āđāļĨāļ°āļāļģāļŦāļ™āļ” Theme

āđāļ้āđ„āļ‚āđ„āļŸāļĨ์ styles/globals.css

:root {
  --bg-color: #ffffff;
  --text-color: #000000;
}

.dark-mode {
  --bg-color: #121212;
  --text-color: #ffffff;
}

body {
  background-color: var(--bg-color);
  color: var(--text-color);
  transition: background 0.3s, color 0.3s;
}

2️⃣ āđ€āļžิ่āļĄāļ›ุ่āļĄāļŠāļĨัāļšāđ‚āļŦāļĄāļ”āđƒāļ™ index.js

āđ€āļ›ิāļ”āđ„āļŸāļĨ์ pages/index.js āđāļĨ้āļ§āđ€āļžิ่āļĄāđ‚āļ„้āļ”āļ™ี้

import { useState } from "react";

export default function Home() {
  const [darkMode, setDarkMode] = useState(false);

  const toggleDarkMode = () => {
    setDarkMode(!darkMode);
    document.body.classList.toggle("dark-mode");
  };

  return (
    <div style={{ textAlign: "center", marginTop: "50px" }}>
      <h1>Dark Mode in Next.js 🌙</h1>
      <button
        onClick={toggleDarkMode}
        style={{
          padding: "10px 20px",
          fontSize: "18px",
          cursor: "pointer",
          background: darkMode ? "#fff" : "#333",
          color: darkMode ? "#000" : "#fff",
          border: "none",
          borderRadius: "5px",
        }}
      >
        {darkMode ? "Switch to Light Mode ☀️" : "Switch to Dark Mode 🌙"}
      </button>
    </div>
  );
}

🛠 2. āđƒāļŠ้ localStorage āļˆāļģāļ„่āļēāđ‚āļŦāļĄāļ”

āļ›ัāļāļŦāļē: āļ–้āļēāļĢีāđ€āļŸāļĢāļŠāļŦāļ™้āļēāđ€āļ§็āļš āļ„่āļēāđ‚āļŦāļĄāļ”āļ—ี่āđ€āļĨืāļ­āļāđ„āļ§้āļˆāļ°āļŦāļēāļĒāđ„āļ›
āļ—āļēāļ‡āđāļ้: āđƒāļŠ้ localStorage āļˆāļģāļ„่āļēāļāļēāļĢāļ•ั้āļ‡āļ„่āļēāļ‚āļ­āļ‡āļœู้āđƒāļŠ้

āļ­ัāļ›āđ€āļ”āļ•āđ‚āļ„้āļ” index.js

import { useState, useEffect } from "react";

export default function Home() {
  const [darkMode, setDarkMode] = useState(false);

  useEffect(() => {
    const savedTheme = localStorage.getItem("theme");
    if (savedTheme === "dark") {
      setDarkMode(true);
      document.body.classList.add("dark-mode");
    }
  }, []);

  const toggleDarkMode = () => {
    setDarkMode(!darkMode);
    if (!darkMode) {
      document.body.classList.add("dark-mode");
      localStorage.setItem("theme", "dark");
    } else {
      document.body.classList.remove("dark-mode");
      localStorage.setItem("theme", "light");
    }
  };

  return (
    <div style={{ textAlign: "center", marginTop: "50px" }}>
      <h1>Dark Mode in Next.js 🌙</h1>
      <button
        onClick={toggleDarkMode}
        style={{
          padding: "10px 20px",
          fontSize: "18px",
          cursor: "pointer",
          background: darkMode ? "#fff" : "#333",
          color: darkMode ? "#000" : "#fff",
          border: "none",
          borderRadius: "5px",
        }}
      >
        {darkMode ? "Switch to Light Mode ☀️" : "Switch to Dark Mode 🌙"}
      </button>
    </div>
  );
}

✅ āļ‚้āļ­āļ”ี:

  • āļˆāļģāļ„่āļēāļ˜ีāļĄāđ„āļ”้āļŦāļĨัāļ‡āļˆāļēāļāļĢีāđ€āļŸāļĢāļŠ


ðŸŽĻ 3. āđƒāļŠ้ next-themes (āđāļ™āļ°āļ™āļģ!)

✅ āļ‚้āļ­āļ”ีāļ‚āļ­āļ‡ next-themes

  • āđƒāļŠ้āļ‡่āļēāļĒāļĄāļēāļ (āđ„āļĄ่āļ•้āļ­āļ‡āđ€āļ‚ีāļĒāļ™āđ‚āļ„้āļ”āđ€āļĒāļ­āļ°)
  • āļĢāļ­āļ‡āļĢัāļš āļĢāļ°āļšāļš Dark Mode āļ­ัāļ•āđ‚āļ™āļĄัāļ•ิāļˆāļēāļ OS



🛠 āļ•ิāļ”āļ•ั้āļ‡ next-themes

npm install next-themes


ðŸ‘Ļ‍ðŸ’ŧ āđƒāļŠ้āļ‡āļēāļ™ next-themes

1️⃣ āđāļ้āđ„āļ‚ _app.js

import { ThemeProvider } from "next-themes";

export default function MyApp({ Component, pageProps }) {
  return (
    <ThemeProvider attribute="class">
      <Component {...pageProps} />
    </ThemeProvider>
  );
}

2️⃣ āđāļ้āđ„āļ‚ index.js

import { useTheme } from "next-themes";
import { useEffect, useState } from "react";

export default function Home() {
  const { theme, setTheme } = useTheme();
  const [mounted, setMounted] = useState(false);

  useEffect(() => setMounted(true), []);

  if (!mounted) return null; // āļ›้āļ­āļ‡āļัāļ™ Hydration Error

  return (
    <div className="p-5 text-center">
      <h1 className="text-2xl">Dark Mode with next-themes 🌙</h1>
      <button
        onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
        className="mt-3 px-4 py-2 text-white bg-black rounded"
      >
        {theme === "dark" ? "Switch to Light Mode ☀️" : "Switch to Dark Mode 🌙"}
      </button>
    </div>
  );
}

ðŸ”Ĩ āļ‡่āļēāļĒāļŠุāļ”āđ† āđāļ„่āđ€āļĢีāļĒāļ setTheme() āđāļĨ้āļ§āļ›āļĨ่āļ­āļĒāđƒāļŦ้ next-themes āļˆัāļ”āļāļēāļĢāđƒāļŦ้!

🏁 āļŠāļĢุāļ›

āļ§ิāļ˜ี āļ‚้āļ­āļ”ี āļ‚้āļ­āđ€āļŠีāļĒ
CSS Variables + useState āļ‡่āļēāļĒ, āđ„āļĄ่āļ•้āļ­āļ‡āđƒāļŠ้āđ„āļĨāļšāļĢāļēāļĢี āļĢีāđ€āļŸāļĢāļŠāđāļĨ้āļ§āļ„่āļēāļŦāļēāļĒ
localStorage āļˆāļģāļ„่āļēāļ˜ีāļĄāđ„āļ”้āļŦāļĨัāļ‡āļĢีāđ€āļŸāļĢāļŠ āļ•้āļ­āļ‡āđƒāļŠ้ useEffect
next-themes (āđāļ™āļ°āļ™āļģ) āļĢāļ­āļ‡āļĢัāļš Dark Mode āļ­ัāļ•āđ‚āļ™āļĄัāļ•ิ āļ•้āļ­āļ‡āļ•ิāļ”āļ•ั้āļ‡āđ„āļĨāļšāļĢāļēāļĢี

ðŸŽŊ āļ–้āļēāļ„ุāļ“āļ­āļĒāļēāļāļ—āļģ Dark Mode āđāļšāļšāļ‡่āļēāļĒāļŠุāļ” ðŸ‘‰ āđƒāļŠ้ next-themes
ðŸŽŊ āļ–้āļēāļ­āļĒāļēāļāļ„āļ§āļšāļ„ุāļĄāđ€āļ­āļ‡āļ—ั้āļ‡āļŦāļĄāļ” ðŸ‘‰ āđƒāļŠ้ CSS Variables + localStorage

🚀 āļĨāļ­āļ‡āļ—āļģāđ€āļĨāļĒ āđāļĨ้āļ§āđ€āļ§็āļšāļ‚āļ­āļ‡āļ„ุāļ“āļˆāļ°āļ”ูāđ‚āļ›āļĢāļ‚ึ้āļ™ 300%!! 😆

āđ„āļĄ่āļĄีāļ„āļ§āļēāļĄāļ„ิāļ”āđ€āļŦ็āļ™:

āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļ„ิāļ”āđ€āļŦ็āļ™

āļāļēāļĢāđƒāļŠ้ Image Optimization āđƒāļ™ Next.js: āđ‚āļŦāļĨāļ”āđ„āļ§ SEO āļ”ี āļ›āļĢāļ°āļŦāļĒัāļ”āđāļšāļ™āļ”์āļ§ิāļ˜!

āđ€āļ„āļĒāđ€āļˆāļ­āļ›ัāļāļŦāļēāđ€āļ§็āļšāđ‚āļŦāļĨāļ”āļŠ้āļēāđ€āļžāļĢāļēāļ°āļĢูāļ›āļ āļēāļžāļ‚āļ™āļēāļ”āđƒāļŦāļ่āļŦāļĢืāļ­āđ€āļ›āļĨ่āļē? 📷 āļ–้āļēāđƒāļŠ่ Next.js āļĄีāļŸีāđ€āļˆāļ­āļĢ์ Image Optimization āļ—ี่āļŠ่āļ§āļĒāđƒāļŦ้āļĢูāļ›āļ āļēāļžāđ‚āļŦāļĨāļ”āđ€āļĢ็āļ§āļ‚ึ้āļ™ āļ­ัāļ•āđ‚āļ™āļĄัāļ•ิ āđ„āļĄ...