From 1b3ae7b55b98b61ea1bf95fc1d4eb2651fc26fec Mon Sep 17 00:00:00 2001 From: AKASHDHARDUBEY Date: Thu, 4 Dec 2025 23:23:20 +0530 Subject: [PATCH] feat: Implement Dark/Light theme toggle on Landing Page --- src/components/Navbar.jsx | 7 ++++ src/components/ThemeToggle.jsx | 20 +++++++++++ src/context/ThemeContext.jsx | 31 ++++++++++++++++ src/main.jsx | 7 ++-- src/pages/LandingPage.jsx | 66 +++++++++++++++++----------------- tailwind.config.js | 1 + 6 files changed, 98 insertions(+), 34 deletions(-) create mode 100644 src/components/ThemeToggle.jsx create mode 100644 src/context/ThemeContext.jsx diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx index 8ef775d07..5c0c52b33 100644 --- a/src/components/Navbar.jsx +++ b/src/components/Navbar.jsx @@ -4,6 +4,7 @@ import logo from "../assets/logo_light_160.png"; import { SideSheet } from "@douyinfe/semi-ui"; import { IconMenu } from "@douyinfe/semi-icons"; import { socials } from "../data/socials"; +import ThemeToggle from "./ThemeToggle"; export default function Navbar() { const [openMenu, setOpenMenu] = useState(false); @@ -74,6 +75,9 @@ export default function Navbar() { +
+ +
+ ); +} diff --git a/src/context/ThemeContext.jsx b/src/context/ThemeContext.jsx new file mode 100644 index 000000000..cec7dfc0d --- /dev/null +++ b/src/context/ThemeContext.jsx @@ -0,0 +1,31 @@ +import { createContext, useContext, useEffect, useState } from "react"; + +const ThemeContext = createContext(); + +export const ThemeProvider = ({ children }) => { + const [theme, setTheme] = useState( + localStorage.getItem("theme") || + (window.matchMedia("(prefers-color-scheme: dark)").matches + ? "dark" + : "light") + ); + + useEffect(() => { + const root = window.document.documentElement; + root.classList.remove("light", "dark"); + root.classList.add(theme); + localStorage.setItem("theme", theme); + }, [theme]); + + const toggleTheme = () => { + setTheme((prev) => (prev === "dark" ? "light" : "dark")); + }; + + return ( + + {children} + + ); +}; + +export const useTheme = () => useContext(ThemeContext); diff --git a/src/main.jsx b/src/main.jsx index 1e8888d9e..3639ec58a 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -5,11 +5,14 @@ import App from "./App.jsx"; import en_US from "@douyinfe/semi-ui/lib/es/locale/source/en_US"; import "./index.css"; import "./i18n/i18n.js"; +import { ThemeProvider } from "./context/ThemeContext"; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( - - + + + + , ); diff --git a/src/pages/LandingPage.jsx b/src/pages/LandingPage.jsx index 4fe62f07c..b40f93186 100644 --- a/src/pages/LandingPage.jsx +++ b/src/pages/LandingPage.jsx @@ -44,8 +44,8 @@ export default function LandingPage() { }, []); return ( -
-
+
+
@@ -53,12 +53,12 @@ export default function LandingPage() { {/* Hero section */} -
+
-
-
+
+

@@ -67,13 +67,13 @@ export default function LandingPage() {
Free and open source, simple, and intuitive database design editor, data-modeler, and SQL generator.{" "} - + No sign up - + Free of charge - + Quick and easy
@@ -81,7 +81,7 @@ export default function LandingPage() {