Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f24171b

Browse files
Initial implementation light/darkmode
Respects browser preference, uses local storage for settings saving. Some elements aren't colored correctly or look ugly.
1 parent 448df1a commit f24171b

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

‎src/components/ThemeToggle.tsx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { useState, useEffect } from "react";
2+
3+
const ThemeToggle = () => {
4+
const [theme, setTheme] = useState("dark");
5+
6+
useEffect(() => {
7+
// if the theme isn't set, use the user's system preference
8+
const savedTheme = localStorage.getItem("theme");
9+
if (savedTheme) {
10+
setTheme(savedTheme);
11+
document.documentElement.setAttribute("data-theme", savedTheme);
12+
} else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
13+
setTheme("dark");
14+
document.documentElement.setAttribute("data-theme", "dark");
15+
} else {
16+
setTheme("light");
17+
document.documentElement.setAttribute("data-theme", "light");
18+
}
19+
});
20+
21+
const toggleTheme = () => {
22+
const newTheme = theme === "dark" ? "light" : "dark";
23+
setTheme(newTheme);
24+
localStorage.setItem("theme", newTheme);
25+
document.documentElement.setAttribute("data-theme", newTheme);
26+
};
27+
28+
return (
29+
<button onClick={toggleTheme} className="button" aria-label="Toggle theme">
30+
{theme === "dark" ? "🌞" : "🌚"}
31+
</button>
32+
);
33+
};
34+
35+
export default ThemeToggle;

‎src/layouts/Header.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ import { GitHubIcon } from "../components/Icons";
22
import LinkButton from "../components/LinkButton";
33
import Logo from "../components/Logo";
44
import SearchInput from "../components/SearchInput";
5+
import ThemeToggle from "../components/ThemeToggle";
56

67
const Header = () => {
78
return (
89
<header className="header">
910
<Logo />
1011
<nav className="primary-nav">
1112
<SearchInput />
13+
<ThemeToggle />
1214
<LinkButton
1315
href="https://github.com/dostonnabotov/quicksnip/blob/main/CONTRIBUTING.md"
1416
target="_blank"

‎src/styles/main.css

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
--clr-neutral-500: #3c3c3c;
2020
--clr-neutral-700: #2a2a2a;
2121
--clr-neutral-900: #1c1c1c;
22+
--clr-neutral-200-light: #1c1c1c;
23+
--clr-neutral-300-light: #2a2a2a;
24+
--clr-neutral-500-light: #b3b3b3;
25+
--clr-neutral-700-light: #e0e0e0;
26+
--clr-neutral-900-light: #ffffff;
2227

2328
--clr-accent: #00b4b8;
2429

@@ -55,6 +60,19 @@
5560

5661
--br-md: 0.5rem;
5762
--br-lg: 0.75rem;
63+
64+
transition:
65+
background-color 0.3s ease,
66+
color 0.3s ease;
67+
}
68+
69+
[data-theme="light"] {
70+
--bg-primary: var(--clr-neutral-900-light);
71+
--bg-secondary: var(--clr-neutral-700-light);
72+
--text-primary: var(--clr-neutral-200-light);
73+
--text-secondary: var(--clr-neutral-300-light);
74+
--text-dark: var(--clr-neutral-900-light);
75+
--border-color: var(--clr-neutral-500-light);
5876
}
5977

6078
/*------------------------------------*\

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /