mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-04-23 05:51:33 +00:00
60 lines
1.8 KiB
TypeScript
60 lines
1.8 KiB
TypeScript
import { Moon, Sun } from 'lucide-react';
|
|
|
|
import { useTheme } from '../../../contexts/ThemeContext';
|
|
import { cn } from '../../../lib/utils';
|
|
|
|
type DarkModeToggleProps = {
|
|
checked?: boolean;
|
|
onToggle?: (nextValue: boolean) => void;
|
|
ariaLabel?: string;
|
|
};
|
|
|
|
function DarkModeToggle({
|
|
checked,
|
|
onToggle,
|
|
ariaLabel = 'Toggle dark mode',
|
|
}: DarkModeToggleProps) {
|
|
const { isDarkMode, toggleDarkMode } = useTheme();
|
|
const isControlled = typeof checked === 'boolean' && typeof onToggle === 'function';
|
|
const isEnabled = isControlled ? checked : isDarkMode;
|
|
|
|
const handleToggle = () => {
|
|
if (isControlled && onToggle) {
|
|
onToggle(!isEnabled);
|
|
return;
|
|
}
|
|
|
|
toggleDarkMode();
|
|
};
|
|
|
|
return (
|
|
<button
|
|
onClick={handleToggle}
|
|
className={cn(
|
|
'relative inline-flex h-7 w-12 flex-shrink-0 touch-manipulation cursor-pointer items-center rounded-full border-2 transition-colors duration-200',
|
|
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',
|
|
isEnabled ? 'border-primary bg-primary' : 'border-border bg-muted',
|
|
)}
|
|
role="switch"
|
|
aria-checked={isEnabled}
|
|
aria-label={ariaLabel}
|
|
>
|
|
<span className="sr-only">{ariaLabel}</span>
|
|
<span
|
|
className={cn(
|
|
'flex h-5 w-5 transform items-center justify-center rounded-full shadow-sm transition-transform duration-200',
|
|
isEnabled ? 'translate-x-[22px] bg-white' : 'translate-x-[2px] bg-foreground/60 dark:bg-foreground/80',
|
|
)}
|
|
>
|
|
{isEnabled ? (
|
|
<Moon className="h-3 w-3 text-primary" />
|
|
) : (
|
|
<Sun className="h-3 w-3 text-white dark:text-background" />
|
|
)}
|
|
</span>
|
|
</button>
|
|
);
|
|
}
|
|
|
|
export default DarkModeToggle;
|