TypeScript 55.4%
Python 43.2%
SQL 1.2%
1"use client";23import { ThemeProvider, useTheme } from "next-themes";4import { Moon, Sun } from "lucide-react";5import { useSyncExternalStore, type ReactNode } from "react";67const noop = (): (() => void) => () => {};8/** true after hydration, false during SSR — without a setState-in-effect. */9export function useMounted(): boolean {10 return useSyncExternalStore(noop, () => true, () => false);11}1213export function Providers({ children }: { children: ReactNode }) {14 return (15 <ThemeProvider attribute="class" defaultTheme="dark" enableSystem={false} disableTransitionOnChange>16 {children}17 </ThemeProvider>18 );19}2021export function ThemeToggle() {22 const { resolvedTheme, setTheme } = useTheme();23 const mounted = useMounted();24 const dark = mounted ? resolvedTheme === "dark" : true;25 return (26 <button type="button" aria-label="Toggle theme" onClick={() => setTheme(dark ? "light" : "dark")} className="inline-flex size-8 items-center justify-center rounded-md border border-line bg-panel text-fg-muted hover:text-fg">27 {dark ? <Sun className="size-4" /> : <Moon className="size-4" />}28 </button>29 );30}31