Mode Toggle
weekendsuperhero-io-sistine/mode-toggleFreeComponent
A theme switcher component with optional glass material. Requires a next-themes ThemeProvider (uses useTheme) — wrap your app or swap in your own theme store.
Install it
npx shadcn@latest add https://raw.githubusercontent.com/Weekendsuperhero-io/sistine/main/public/r/mode-toggle.jsonSource
1"use client";23import { Moon, Sun } from "@phosphor-icons/react";4import { useTheme } from "next-themes";5import * as React from "react";67import type { Material } from "@/lib/material";8import { Button } from "./button";910export function ModeToggle({ variant = "glass", material }: { variant?: "default" | "glass"; material?: Material }) {11 const { setTheme, resolvedTheme } = useTheme();12 const [mounted, setMounted] = React.useState(false);1314 React.useEffect(() => {15 setMounted(true);16 }, []);1718 const isDark = mounted && resolvedTheme === "dark";1920 return (21 <Button22 variant={variant === "glass" ? "glass" : "outline"}23 material={material}24 size="icon"25 onClick={mounted ? () => setTheme(isDark ? "light" : "dark") : undefined}26 aria-label="Toggle theme"27 >28 {/* Cross-fade sun↔moon: both icons stay mounted (one absolute) and animate opacity + scale +29 blur on cubic-bezier(0.2,0,0,1). Dependency-free so the shipped component stays portable. */}30 <span className="relative inline-flex size-[1.2rem] items-center justify-center">31 <Sun32 className="absolute size-[1.2rem] transition-[opacity,scale,filter] duration-300 ease-[cubic-bezier(0.2,0,0,1)]"33 style={{34 opacity: isDark ? 0 : 1,35 scale: isDark ? "0.25" : "1",36 filter: isDark ? "blur(4px)" : "blur(0px)",37 }}38 />39 <Moon40 className="absolute size-[1.2rem] transition-[opacity,scale,filter] duration-300 ease-[cubic-bezier(0.2,0,0,1)]"41 style={{42 opacity: isDark ? 1 : 0,43 scale: isDark ? "1" : "0.25",44 filter: isDark ? "blur(0px)" : "blur(4px)",45 }}46 />47 </span>48 <span className="sr-only">Toggle theme</span>49 </Button>50 );51}
What it pulls in
npm packages
Other registry items
Files it writes
More from weekendsuperhero-io/sistine
All 71 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | weekendsuperhero-io/sistine | Components | Free | 5 deps · 4 files | |
| Alertalert | weekendsuperhero-io/sistine | Components | Free | 3 deps · 4 files | |
| Alert Dialogalert-dialog | weekendsuperhero-io/sistine | Components | Free | 4 deps · 4 files | |
| Auto Foregroundauto-foreground | weekendsuperhero-io/sistine | Components | Free | no deps | |
| Avataravatar | weekendsuperhero-io/sistine | Components | Free | 4 deps · 4 files | |
| Badgebadge | weekendsuperhero-io/sistine | Components | Free | 4 deps · 4 files | |
| Breadcrumbbreadcrumb | weekendsuperhero-io/sistine | Components | Free | 5 deps · 4 files | |
| Buttonbutton | weekendsuperhero-io/sistine | Components | Free | 4 deps · 4 files |
