SPB Git forge

spb/websensor

Public
33commits 1branches 0releases
3.4 MBsize
maindefault branch
10 days agolast push
TypeScript 55.4% Python 43.2% SQL 1.2%
1.1 KB · 31 lines tsx
Raw Blame History
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