보조기억장치

shadcn/ui 다크모드 적용 본문

React/Next.js

shadcn/ui 다크모드 적용

캐세이 2023. 10. 23. 20:39

next-theme 설치

# npm i next-themes

 

theme provider 생성 (components/theme-provider.tsx)

"use client"
 
import * as React from "react"
import { ThemeProvider as NextThemesProvider } from "next-themes"
import { type ThemeProviderProps } from "next-themes/dist/types"
 
export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
  return <NextThemesProvider {...props}>{children}</NextThemesProvider>
}

 

Layout ThemeProvider 로 감싸주기

import { ThemeProvider } from "@/components/providers/theme-provider";

 

        <ThemeProvider
          attribute="class"
          defaultTheme="system"
          enableSystem
          disableTransitionOnChange
          storageKey="seoul-theme-2"
        >
          {children}
        </ThemeProvider>

 

Toggle 추가 (components/mode-toggle.tsx)

"use client"

import * as React from "react"
import { Moon, Sun } from "lucide-react"
import { useTheme } from "next-themes"

import { Button } from "@/components/ui/button"
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"

export function ModeToggle() {
  const { setTheme } = useTheme()

  return (
    <DropdownMenu>
      <DropdownMenuTrigger asChild>
        <Button variant="outline" size="icon">
          <Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
          <Moon className="absolute h-[1.2rem] w-[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
        </DropdownMenuItem>
        <DropdownMenuItem onClick={() => setTheme("dark")}>
          Dark
        </DropdownMenuItem>
        <DropdownMenuItem onClick={() => setTheme("system")}>
          System
        </DropdownMenuItem>
      </DropdownMenuContent>
    </DropdownMenu>
  )
}

 

Toggle 버튼 적용하기

import { ModeToggle } from "@/components/mode-toggle";

...

 <ModeToggle />

...

 

 

'React > Next.js' 카테고리의 다른 글

zod 사용법  (0) 2024.04.30
Favicon 추가 하기  (0) 2023.10.23
Next.js 13.5  (0) 2023.09.21
Vercel Module not found: Can't resolve  (0) 2023.09.08
Clerk 적용해보기  (0) 2023.08.07