diff --git a/src/components/ThemeToggle.tsx b/src/components/ThemeToggle.tsx
new file mode 100644
index 00000000..78a3fe4d
--- /dev/null
+++ b/src/components/ThemeToggle.tsx
@@ -0,0 +1,35 @@
+import { useState, useEffect } from "react";
+
+const ThemeToggle = () => {
+ const [theme, setTheme] = useState("dark");
+
+ useEffect(() => {
+ // if the theme isn't set, use the user's system preference
+ const savedTheme = localStorage.getItem("theme");
+ if (savedTheme) {
+ setTheme(savedTheme);
+ document.documentElement.setAttribute("data-theme", savedTheme);
+ } else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
+ setTheme("dark");
+ document.documentElement.setAttribute("data-theme", "dark");
+ } else {
+ setTheme("light");
+ document.documentElement.setAttribute("data-theme", "light");
+ }
+ });
+
+ const toggleTheme = () => {
+ const newTheme = theme === "dark" ? "light" : "dark";
+ setTheme(newTheme);
+ localStorage.setItem("theme", newTheme);
+ document.documentElement.setAttribute("data-theme", newTheme);
+ };
+
+ return (
+
+ );
+};
+
+export default ThemeToggle;
diff --git a/src/layouts/Header.tsx b/src/layouts/Header.tsx
index 52243cde..858638a3 100644
--- a/src/layouts/Header.tsx
+++ b/src/layouts/Header.tsx
@@ -2,6 +2,7 @@ import { GitHubIcon } from "../components/Icons";
import LinkButton from "../components/LinkButton";
import Logo from "../components/Logo";
import SearchInput from "../components/SearchInput";
+import ThemeToggle from "../components/ThemeToggle";
const Header = () => {
return (
@@ -9,6 +10,7 @@ const Header = () => {