9router / src /shared /components /ThemeToggle.js
2api
feat: configurable stream stall timeout + per-provider UI
88c4c60
Raw
History Blame Contribute Delete
1.24 kB
"use client";
import { useTheme } from "@/shared/hooks/useTheme";
import { cn } from "@/shared/utils/cn";
export default function ThemeToggle({ className, variant = "default" }) {
const { isDark, toggleTheme } = useTheme();
const variants = {
default: cn(
"flex items-center justify-center size-10 rounded-full",
"text-text-muted hover:text-text-main",
"hover:bg-surface-2 transition-colors"
),
card: cn(
"flex items-center justify-center size-11 rounded-full",
"bg-surface/60 hover:bg-surface",
"border border-border",
"backdrop-blur-md shadow-sm hover:shadow-[var(--shadow-warm)]",
"text-text-muted hover:text-brand-500",
"transition-all group"
),
};
return (
<button
onClick={toggleTheme}
className={cn(variants[variant], className)}
aria-label={`Switch to ${isDark ? "light" : "dark"} mode`}
title={`Switch to ${isDark ? "light" : "dark"} mode`}
>
<span
className={cn(
"material-symbols-outlined text-[22px]",
variant === "card" && "transition-transform duration-300 group-hover:rotate-12"
)}
>
{isDark ? "light_mode" : "dark_mode"}
</span>
</button>
);
}