Просмотр исходного кода

feat: upgrade theme button to theme dropdown (#33)

Theme button is upgraded to theme dropdown to include
system as an option.

Resolves #29
Sat Naing 1 год назад
Родитель
Сommit
bd30be4f68
1 измененных файлов с 43 добавлено и 10 удалено
  1. 43 10
      src/components/theme-switch.tsx

+ 43 - 10
src/components/theme-switch.tsx

@@ -1,7 +1,14 @@
-import { IconMoon, IconSun } from '@tabler/icons-react'
+import { useEffect } from 'react'
+import { IconCheck, IconMoon, IconSun } from '@tabler/icons-react'
+import { cn } from '@/lib/utils'
+import {
+  DropdownMenu,
+  DropdownMenuContent,
+  DropdownMenuItem,
+  DropdownMenuTrigger,
+} from '@/components/ui/dropdown-menu'
 import { useTheme } from './theme-provider'
 import { Button } from './custom/button'
-import { useEffect } from 'react'
 
 export default function ThemeSwitch() {
   const { theme, setTheme } = useTheme()
@@ -14,14 +21,40 @@ export default function ThemeSwitch() {
     metaThemeColor && metaThemeColor.setAttribute('content', themeColor)
   }, [theme])
 
+  console.log(theme)
+
   return (
-    <Button
-      size='icon'
-      variant='ghost'
-      className='rounded-full'
-      onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}
-    >
-      {theme === 'light' ? <IconMoon size={20} /> : <IconSun size={20} />}
-    </Button>
+    <DropdownMenu>
+      <DropdownMenuTrigger asChild>
+        <Button variant='ghost' size='icon' className='scale-95 rounded-full'>
+          <IconSun className='size-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0' />
+          <IconMoon className='absolute size-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100' />
+          <span className='sr-only'>Toggle theme</span>
+        </Button>
+      </DropdownMenuTrigger>
+      <DropdownMenuContent align='end'>
+        <DropdownMenuItem onClick={() => setTheme('light')}>
+          Light{' '}
+          <IconCheck
+            size={14}
+            className={cn('ml-auto', theme !== 'light' && 'hidden')}
+          />
+        </DropdownMenuItem>
+        <DropdownMenuItem onClick={() => setTheme('dark')}>
+          Dark
+          <IconCheck
+            size={14}
+            className={cn('ml-auto', theme !== 'dark' && 'hidden')}
+          />
+        </DropdownMenuItem>
+        <DropdownMenuItem onClick={() => setTheme('system')}>
+          System
+          <IconCheck
+            size={14}
+            className={cn('ml-auto', theme !== 'system' && 'hidden')}
+          />
+        </DropdownMenuItem>
+      </DropdownMenuContent>
+    </DropdownMenu>
   )
 }