選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

theme-switcher.tsx 2.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. 'use client'
  2. import {
  3. RiComputerLine,
  4. RiMoonLine,
  5. RiSunLine,
  6. } from '@remixicon/react'
  7. import { useTheme } from 'next-themes'
  8. import cn from '@/utils/classnames'
  9. export type Theme = 'light' | 'dark' | 'system'
  10. export default function ThemeSwitcher() {
  11. const { theme, setTheme } = useTheme()
  12. const handleThemeChange = (newTheme: Theme) => {
  13. setTheme(newTheme)
  14. }
  15. return (
  16. <div className='flex items-center rounded-[10px] bg-components-segmented-control-bg-normal p-0.5'>
  17. <div
  18. className={cn(
  19. 'rounded-lg px-2 py-1 text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
  20. theme === 'system' && 'bg-components-segmented-control-item-active-bg text-text-accent-light-mode-only shadow-sm hover:bg-components-segmented-control-item-active-bg hover:text-text-accent-light-mode-only',
  21. )}
  22. onClick={() => handleThemeChange('system')}
  23. >
  24. <div className='p-0.5'>
  25. <RiComputerLine className='h-4 w-4' />
  26. </div>
  27. </div>
  28. <div className={cn('h-[14px] w-px bg-transparent', theme === 'dark' && 'bg-divider-regular')}></div>
  29. <div
  30. className={cn(
  31. 'rounded-lg px-2 py-1 text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
  32. theme === 'light' && 'bg-components-segmented-control-item-active-bg text-text-accent-light-mode-only shadow-sm hover:bg-components-segmented-control-item-active-bg hover:text-text-accent-light-mode-only',
  33. )}
  34. onClick={() => handleThemeChange('light')}
  35. >
  36. <div className='p-0.5'>
  37. <RiSunLine className='h-4 w-4' />
  38. </div>
  39. </div>
  40. <div className={cn('h-[14px] w-px bg-transparent', theme === 'system' && 'bg-divider-regular')}></div>
  41. <div
  42. className={cn(
  43. 'rounded-lg px-2 py-1 text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
  44. theme === 'dark' && 'bg-components-segmented-control-item-active-bg text-text-accent-light-mode-only shadow-sm hover:bg-components-segmented-control-item-active-bg hover:text-text-accent-light-mode-only',
  45. )}
  46. onClick={() => handleThemeChange('dark')}
  47. >
  48. <div className='p-0.5'>
  49. <RiMoonLine className='h-4 w-4' />
  50. </div>
  51. </div>
  52. </div>
  53. )
  54. }