Files
convex-monorepo/packages/ui/src/theme.tsx

47 lines
1.3 KiB
TypeScript

'use client';
import type { ComponentProps } from 'react';
import { ThemeProvider as NextThemesProvider, useTheme } from 'next-themes';
import { Moon, Sun } from 'lucide-react';
import { Button, cn } from '@gib/ui';
const ThemeProvider = ({
children,
...props
}: ComponentProps<typeof NextThemesProvider>) => {
return <NextThemesProvider {...props}>{children}</NextThemesProvider>
};
interface ThemeToggleProps {
size?: number;
buttonProps?: Omit<ComponentProps<typeof Button>, 'onClick'>;
}
const ThemeToggle = ({ size = 1, buttonProps }: ThemeToggleProps) => {
const { setTheme, resolvedTheme } = useTheme();
return (
<Button
variant="outline"
size="icon"
onClick={() => setTheme(resolvedTheme === 'dark' ? 'light' : 'dark')}
{...buttonProps}
className={cn('cursor-pointer', buttonProps?.className)}
>
<Sun
style={{ height: `${size}rem`, width: `${size}rem` }}
className='scale-100 rotate-0 transition-all
dark:scale-0 dark:-rotate-90'
/>
<Moon
style={{ height: `${size}rem`, width: `${size}rem` }}
className='absolute scale-0 rotate-90 transition-all
dark:scale-100 dark:rotate-0'
/>
<span className="sr-only">Toggle theme</span>
</Button>
);
};
export { ThemeProvider, ThemeToggle, type ThemeToggleProps };