Skip to content

Commit 2afd4ec

Browse files
committed
feat: switching theme across entire site
1 parent 886cf81 commit 2afd4ec

File tree

3 files changed

+32
-14
lines changed

3 files changed

+32
-14
lines changed

apps/web/src/components/editor/editor-header.tsx

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"use client";
22

33
import { Button } from "../ui/button";
4-
import { ChevronDown, ArrowLeft, SquarePen, Trash, Sun } from "lucide-react";
4+
import { ChevronDown, ArrowLeft, SquarePen, Trash } from "lucide-react";
55
import { HeaderBase } from "../header-base";
66
import { useProjectStore } from "@/stores/project-store";
77
import { KeyboardShortcutsHelp } from "../keyboard-shortcuts-help";
@@ -18,16 +18,15 @@ import { RenameProjectDialog } from "../rename-project-dialog";
1818
import { DeleteProjectDialog } from "../delete-project-dialog";
1919
import { useRouter } from "next/navigation";
2020
import { FaDiscord } from "react-icons/fa6";
21-
import { useTheme } from "next-themes";
2221
import { PanelPresetSelector } from "./panel-preset-selector";
2322
import { ExportButton } from "./export-button";
23+
import { ThemeToggle } from "../theme-toggle";
2424

2525
export function EditorHeader() {
2626
const { activeProject, renameProject, deleteProject } = useProjectStore();
2727
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
2828
const [isRenameDialogOpen, setIsRenameDialogOpen] = useState(false);
2929
const router = useRouter();
30-
const { theme, setTheme } = useTheme();
3130

3231
const handleNameSave = async (newName: string) => {
3332
console.log("handleNameSave", newName);
@@ -117,15 +116,7 @@ export function EditorHeader() {
117116
<PanelPresetSelector />
118117
<KeyboardShortcutsHelp />
119118
<ExportButton />
120-
<Button
121-
size="icon"
122-
variant="text"
123-
className="h-7"
124-
onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
125-
>
126-
<Sun className="!size-[1.1rem]" />
127-
<span className="sr-only">{theme === "dark" ? "Light" : "Dark"}</span>
128-
</Button>
119+
<ThemeToggle />
129120
</nav>
130121
);
131122

apps/web/src/components/header.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Button } from "./ui/button";
55
import { ArrowRight } from "lucide-react";
66
import { HeaderBase } from "./header-base";
77
import Image from "next/image";
8+
import { ThemeToggle } from "./theme-toggle";
89

910
export function Header() {
1011
const leftContent = (
@@ -21,7 +22,7 @@ export function Header() {
2122
);
2223

2324
const rightContent = (
24-
<nav className="flex items-center gap-1">
25+
<nav className="flex items-center gap-2">
2526
<div className="flex items-center gap-4">
2627
<Link href="/blog">
2728
<Button variant="text" className="text-sm p-0">
@@ -35,11 +36,12 @@ export function Header() {
3536
</Link>
3637
</div>
3738
<Link href="/projects">
38-
<Button size="sm" className="text-sm ml-4">
39+
<Button size="sm" className="text-sm ml-2">
3940
Projects
4041
<ArrowRight className="h-4 w-4" />
4142
</Button>
4243
</Link>
44+
<ThemeToggle className="mr-2" />
4345
</nav>
4446
);
4547

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
"use client";
2+
3+
import { Button } from "./ui/button";
4+
import { Sun, Moon } from "lucide-react";
5+
import { useTheme } from "next-themes";
6+
7+
interface ThemeToggleProps {
8+
className?: string;
9+
}
10+
11+
export function ThemeToggle({ className }: ThemeToggleProps) {
12+
const { theme, setTheme } = useTheme();
13+
14+
return (
15+
<Button
16+
size="icon"
17+
variant="text"
18+
className="h-7"
19+
onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
20+
>
21+
<Sun className="!size-[1.1rem]" />
22+
<span className="sr-only">{theme === "dark" ? "Light" : "Dark"}</span>
23+
</Button>
24+
);
25+
}

0 commit comments

Comments
 (0)