mirror of
https://github.com/OpenCut-app/OpenCut.git
synced 2026-07-13 21:52:53 +02:00
feat: switching theme across entire site
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { Button } from "../ui/button";
|
import { Button } from "../ui/button";
|
||||||
import { ChevronDown, ArrowLeft, SquarePen, Trash, Sun } from "lucide-react";
|
import { ChevronDown, ArrowLeft, SquarePen, Trash } from "lucide-react";
|
||||||
import { HeaderBase } from "../header-base";
|
import { HeaderBase } from "../header-base";
|
||||||
import { useProjectStore } from "@/stores/project-store";
|
import { useProjectStore } from "@/stores/project-store";
|
||||||
import { KeyboardShortcutsHelp } from "../keyboard-shortcuts-help";
|
import { KeyboardShortcutsHelp } from "../keyboard-shortcuts-help";
|
||||||
@@ -18,16 +18,15 @@ import { RenameProjectDialog } from "../rename-project-dialog";
|
|||||||
import { DeleteProjectDialog } from "../delete-project-dialog";
|
import { DeleteProjectDialog } from "../delete-project-dialog";
|
||||||
import { useRouter } from "next/navigation";
|
import { useRouter } from "next/navigation";
|
||||||
import { FaDiscord } from "react-icons/fa6";
|
import { FaDiscord } from "react-icons/fa6";
|
||||||
import { useTheme } from "next-themes";
|
|
||||||
import { PanelPresetSelector } from "./panel-preset-selector";
|
import { PanelPresetSelector } from "./panel-preset-selector";
|
||||||
import { ExportButton } from "./export-button";
|
import { ExportButton } from "./export-button";
|
||||||
|
import { ThemeToggle } from "../theme-toggle";
|
||||||
|
|
||||||
export function EditorHeader() {
|
export function EditorHeader() {
|
||||||
const { activeProject, renameProject, deleteProject } = useProjectStore();
|
const { activeProject, renameProject, deleteProject } = useProjectStore();
|
||||||
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
|
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
|
||||||
const [isRenameDialogOpen, setIsRenameDialogOpen] = useState(false);
|
const [isRenameDialogOpen, setIsRenameDialogOpen] = useState(false);
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { theme, setTheme } = useTheme();
|
|
||||||
|
|
||||||
const handleNameSave = async (newName: string) => {
|
const handleNameSave = async (newName: string) => {
|
||||||
console.log("handleNameSave", newName);
|
console.log("handleNameSave", newName);
|
||||||
@@ -117,15 +116,7 @@ export function EditorHeader() {
|
|||||||
<PanelPresetSelector />
|
<PanelPresetSelector />
|
||||||
<KeyboardShortcutsHelp />
|
<KeyboardShortcutsHelp />
|
||||||
<ExportButton />
|
<ExportButton />
|
||||||
<Button
|
<ThemeToggle />
|
||||||
size="icon"
|
|
||||||
variant="text"
|
|
||||||
className="h-7"
|
|
||||||
onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
|
|
||||||
>
|
|
||||||
<Sun className="!size-[1.1rem]" />
|
|
||||||
<span className="sr-only">{theme === "dark" ? "Light" : "Dark"}</span>
|
|
||||||
</Button>
|
|
||||||
</nav>
|
</nav>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { Button } from "./ui/button";
|
|||||||
import { ArrowRight } from "lucide-react";
|
import { ArrowRight } from "lucide-react";
|
||||||
import { HeaderBase } from "./header-base";
|
import { HeaderBase } from "./header-base";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
|
import { ThemeToggle } from "./theme-toggle";
|
||||||
|
|
||||||
export function Header() {
|
export function Header() {
|
||||||
const leftContent = (
|
const leftContent = (
|
||||||
@@ -21,7 +22,7 @@ export function Header() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const rightContent = (
|
const rightContent = (
|
||||||
<nav className="flex items-center gap-1">
|
<nav className="flex items-center gap-2">
|
||||||
<div className="flex items-center gap-4">
|
<div className="flex items-center gap-4">
|
||||||
<Link href="/blog">
|
<Link href="/blog">
|
||||||
<Button variant="text" className="text-sm p-0">
|
<Button variant="text" className="text-sm p-0">
|
||||||
@@ -35,11 +36,12 @@ export function Header() {
|
|||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<Link href="/projects">
|
<Link href="/projects">
|
||||||
<Button size="sm" className="text-sm ml-4">
|
<Button size="sm" className="text-sm ml-2">
|
||||||
Projects
|
Projects
|
||||||
<ArrowRight className="h-4 w-4" />
|
<ArrowRight className="h-4 w-4" />
|
||||||
</Button>
|
</Button>
|
||||||
</Link>
|
</Link>
|
||||||
|
<ThemeToggle className="mr-2" />
|
||||||
</nav>
|
</nav>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { Button } from "./ui/button";
|
||||||
|
import { Sun, Moon } from "lucide-react";
|
||||||
|
import { useTheme } from "next-themes";
|
||||||
|
|
||||||
|
interface ThemeToggleProps {
|
||||||
|
className?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function ThemeToggle({ className }: ThemeToggleProps) {
|
||||||
|
const { theme, setTheme } = useTheme();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Button
|
||||||
|
size="icon"
|
||||||
|
variant="text"
|
||||||
|
className="h-7"
|
||||||
|
onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
|
||||||
|
>
|
||||||
|
<Sun className="!size-[1.1rem]" />
|
||||||
|
<span className="sr-only">{theme === "dark" ? "Light" : "Dark"}</span>
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user