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 600723c

Browse files
Merge pull request #31 from GreenMan36/theme-toggle
Add lightmode for accessibility
2 parents b95a0da + 5f7d833 commit 600723c

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-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: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,22 @@
5555

5656
--br-md: 0.5rem;
5757
--br-lg: 0.75rem;
58+
59+
transition:
60+
background-color 0.3s ease,
61+
color 0.3s ease;
62+
}
63+
64+
/*------------------------------------*\
65+
#ACCESSIBILITY/THEMING
66+
\*------------------------------------*/
67+
[data-theme="light"] {
68+
color-scheme: light;
69+
--clr-neutral-200: hsl(0, 0%, 10%);
70+
--clr-neutral-300: hsl(0, 0%, 30%);
71+
--clr-neutral-500: hsl(0, 0%, 85%);
72+
--clr-neutral-700: hsl(0, 0%, 95%);
73+
--clr-neutral-900: hsl(60, 25%, 98%);
5874
}
5975

6076
/*------------------------------------*\
@@ -434,6 +450,7 @@ abbr {
434450
.categories {
435451
display: grid;
436452
background-color: var(--bg-secondary);
453+
border: 1px solid var(--border-color);
437454
padding: 1.25rem;
438455
padding-bottom: 2rem;
439456
border-radius: var(--br-lg);

0 commit comments

Comments
(0)

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