SPB Git forge

spb/fetcha

Public
11commits 1branches 0releases
1.5 MBsize
maindefault branch
16 days agolast push
TypeScript 97.5% SQL 1.4% Python 0.8%
1.4 KB · 37 lines tsx
Raw Blame History
1"use client";2import * as React from "react";3import { ThemeProvider as NextThemesProvider, useTheme } from "next-themes";4import { Monitor, Moon, Sun } from "lucide-react";5import { Button } from "./button";6import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "./dropdown-menu";78export function ThemeProvider({ children }: { children: React.ReactNode }) {9  return (10    <NextThemesProvider attribute="class" defaultTheme="system" enableSystem disableTransitionOnChange>11      {children}12    </NextThemesProvider>13  );14}1516export function ThemeToggle({ className }: { className?: string }) {17  const { setTheme, theme } = useTheme();18  return (19    <DropdownMenu>20      <DropdownMenuTrigger asChild>21        <Button variant="ghost" size="icon-sm" className={className} aria-label="Toggle theme">22          <Sun className="size-4 dark:hidden" />23          <Moon className="hidden size-4 dark:block" />24        </Button>25      </DropdownMenuTrigger>26      <DropdownMenuContent align="end">27        {(["light", "dark", "system"] as const).map((t) => (28          <DropdownMenuItem key={t} onClick={() => setTheme(t)} className={theme === t ? "font-medium text-fg" : undefined}>29            {t === "light" ? <Sun /> : t === "dark" ? <Moon /> : <Monitor />}30            <span className="capitalize">{t}</span>31          </DropdownMenuItem>32        ))}33      </DropdownMenuContent>34    </DropdownMenu>35  );36}37