🔨

next-themesとshadcn/uiのToggle Groupを使ってTheme Switcherを作った

公開日
約2か月前
2024-07-27
更新履歴
preview

作成したTheme Switcher

画像のようなTheme Switcherを作成しました。shadcn/uiのToggle Groupnext-themesを使って、最小限のスタイル調整でNext.jsの公式サイトで使われているものと同じような見た目を再現しています。

次のコードをNext.jsで使ってみてください。

Theme Switcherのコード
src/components/theme-switcher.tsx
'use client'

import { ComputerIcon, MoonIcon, SunIcon } from 'lucide-react'
import { useTheme } from 'next-themes'
import { useEffect, useState } from 'react'

import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group'

export default function ThemeSwitcher() {
  const [mounted, setMounted] = useState(false)
  const { theme, setTheme } = useTheme()

  useEffect(() => {
    setMounted(true)
  }, [])

  if (!mounted || theme === undefined) {
    return
  }

  return (
    <ToggleGroup
      className='rounded-full border p-1'
      size='sm'
      type='single'
      value={theme}
      onValueChange={(value) => setTheme(value)}
    >
      <ToggleGroupItem className='rounded-full' value='dark' aria-label='Toggle dark'>
        <MoonIcon size={16} />
      </ToggleGroupItem>
      <ToggleGroupItem className='rounded-full' value='system' aria-label='Toggle system'>
        <ComputerIcon size={16} />
      </ToggleGroupItem>
      <ToggleGroupItem className='rounded-full' value='light' aria-label='Toggle light'>
        <SunIcon size={16} />
      </ToggleGroupItem>
    </ToggleGroup>
  )
}

ThemeSwitcherを使用する方法

上記のThemeSwitcherを使用するためには、次のドキュメントの通りに必要なパッケージを追加していく必要があります。

  1. shadcn/uiをインストール

  2. ダークモードの設定

  3. Toggle Groupを追加

    Terminal
    pnpm dlx shadcn-ui@latest add toggle-group