Dark Mode
λͺ λ μ λΆν° λ€μν μ±, μΉ κ·Έλ¦¬κ³ νλμ¨μ΄μμ λ€ν¬λͺ¨λλ₯Ό μ§μνκΈ° μμνμ΅λλ€. νμ¬λ λ€ν¬λͺ¨λκ° μλλ νμ΄μ§κ° μ 보μ΄μ§ μμ μ λλ‘ νν΄μ‘μ΅λλ€. κ·Έλμ μ λ λΈλ‘κ·Έμ λ€ν¬λͺ¨λλ₯Ό μ μ©ν΄λ³΄κΈ°λ‘ μκ°νμ΅λλ€.
μμ μ μμνκΈ°μ μ λ€μν λ€λ₯Έ κ°λ°μλ€μ κ°λ° λΈλ‘κ·Έλ₯Ό μ΄ν΄λ³΄λλ° κ°μ Gatsbyλ₯Ό μ¬μ©νλλΌλ λ€ν¬λͺ¨λλ₯Ό μ μ©ν λ°©μμλ μ°¨μ΄κ° μμμ΅λλ€.
λ€ν¬λͺ¨λλ₯Ό ꡬννλ©΄μ μ λ§ λ§μ κΈλ€μ μ°Έκ³ νμ§λ§, μ€νλ € λ무 λ§μ κΈμ μ½μ νμΈμ§ μ°Έκ³ ν λΈλ‘κ·Έλ€μ λ§ν¬μ ν΄λμ§ μμμ λ§μ μ΄λ κ² ν¬μ€νΈλ‘ μ 리ν΄λλ €νλ μ΄λ €μμ΄ μμ΅λλ€.
μ λ μ΄λ»κ² λ€ν¬λͺ¨λλ₯Ό ꡬνμ νλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
1. ThemeToggle React μ»΄ν¬λνΈ
import React from 'react'
type ThemeToggleProps = {
theme: 'light' | 'dark'
toggleTheme: () => void
}
const ThemeToggle: React.FC<ThemeToggleProps> = ({ theme, toggleTheme }) => {
const themeClassName = theme === 'light' ? 'light-mode' : 'dark-mode'
return (
<button
onClick={toggleTheme}
className={`themeToggle ${themeClassName}`}
>
{theme === 'light' ? 'λ€ν¬λͺ¨λ' : 'λΌμ΄νΈλͺ¨λ'}
</button>
)
}
export default ThemeToggle
λΌμ΄νΈ λͺ¨λμ λ€ν¬ λͺ¨λ κ°μ ν λ§ μ νμ μ²λ¦¬νλ React μ»΄ν¬λνΈλ₯Ό ꡬννμμ΅λλ€. μ½λλ₯Ό κ°λ¨νκ² λ¦¬λ·°ν΄λ³΄λ©΄,
type ThemeToggleProps = {}
Typescriptλ₯Ό μ¬μ©νμ¬ ThemeToggle μ»΄ν¬λνΈμ prop νμ μ μ μ νμ΅λλ€. ν λ§λ light λλ dark λ¬Έμμ΄ μ€ νλκ³toggleTheme
λ ν¨μμ λλ€.const ThemeToggle: React.FC<ThemeToggleProps> = ({ theme, toggleTheme }) => {}
ThemeToggle μ»΄ν¬λνΈλ₯Ό μ μΈνκ³ μμ propsλ₯Ό λ°μμμ μ¬μ©ν©λλ€.- themeμ prop κ°μ λ°λΌ css ν΄λμ€ μ΄λ¦μ μ νν©λλ€.
- λ²νΌμ ν΄λ¦ν λλ§λ€ λ€ν¬λͺ¨λ νΉμ λΌμ΄νΈλͺ¨λ λ‘ ν μ€νΈκ° μ νλ©λλ€.
ν λ§ μ νμ μ²λ¦¬νλ μ»΄ν¬λνΈλ λΉκ΅μ κ°λ¨νκ² κ΅¬νμ΄ μλ£λμμ΅λλ€. μ μ»΄ν¬λνΈλ₯Ό μ΄μ μ€μ ν λ§λ₯Ό μ μ©ν μ μλ 컀μ€ν ν κ³Ό ν¨κ» μ΄ν΄λ³΄κ² μ΅λλ€.
2. ThemeToggle 컀μ€ν ν
import { useState, useEffect } from 'react'
type Theme = 'light' | 'dark'
const useThemeToggle = (): { theme: Theme; toggleTheme: () => void } => {
const [theme, setTheme] = useState<Theme>('light')
const toggleTheme = () => {
const newTheme: Theme = theme === 'light' ? 'dark' : 'light'
setTheme(newTheme)
localStorage.setItem('theme', newTheme)
}
useEffect(() => {
const savedTheme = localStorage.getItem('theme') as Theme | null
if (savedTheme) {
setTheme(savedTheme)
}
document.body.className = `theme-${theme}`
}, [theme])
return { theme, toggleTheme }
}
export default useThemeToggle
μ²μμλ μ¬μ©μ νλμ¨μ΄ μ€μ μ λ§κ² λ€ν¬λͺ¨λ νΉμ λΌμ΄νΈλͺ¨λλ₯Ό μ μ©νκ³ , ν κΈ λ²νΌμΌλ‘ μ ν κΉμ§ κ°λ₯ν λ°©μμΌλ‘ ꡬννκ³ μΆμμ§λ§ μμ§μ μ°κ΅¬κ° λ νμν κ²κ°μ΅λλ€.
μ΄λ²μλ λ‘컬 μ€ν 리μ§λ₯Ό νμ©νμ¬ μ¬μ©μκ° μ νν ν λ§λ₯Ό κΈ°μ΅νκ³ μ μ©νλ κΈ°λ₯μ μμ£Όλ‘ κ΅¬νν΄λ΄€μ΅λλ€.
- useState, useEffect ν μ κ°μ Έμ΅λλ€. useStateλ₯Ό ν΅ν΄ μ΄κΈ° ν λ§ μνλ₯Ό light λ‘ μ€μ νκ³ useEffectλ₯Ό ν΅ν΄ theme λ³μκ° λ³κ²½ λ λλ§λ€ document.bodyμ ν΄λμ€λ₯Ό λ³κ²½νμ¬ ν λ§ μ€νμΌμ λ³κ²½ μ μ© ν©λλ€.
const toggleTheme = () β {}
λ₯Ό ν΅ν΄ ν λ§λ₯Ό ν κΈνκ³ , λ³κ²½λ ν λ§λ₯Ό λ‘컬 μ€ν 리μ§μ μ μ₯ν©λλ€.return {theme, toggleThme}
컀μ€ν ν μ λ°ν κ°μΌλ‘ νμ ν λ§μ ν λ§ λ³κ²½ ν¨μλ₯Ό κ°μ²΄ ννλ‘ λ°ννκ² λ©λλ€.
μμ ThemeToggle μ»΄ν¬λνΈμμ 컀μ€ν ν μ νΈμΆνμ¬ ν λ§ μ ν κΈ°λ₯μ μ¬μ©νλ κ°λ¨ν λ°©μμΌλ‘ ꡬνμ΄ λμμ΅λλ€.
3. ν κΈ λ²νΌ μ€νμΌλ§
import React from 'react'
type ThemeToggleProps = {
theme: 'light' | 'dark'
toggleTheme: () => void
}
const ThemeToggle: React.FC<ThemeToggleProps> = ({ theme, toggleTheme }) => {
const themeClassName = theme === 'light' ? 'light-mode' : 'dark-mode'
const buttonStyle: React.CSSProperties = {
width: '50px',
height: '50px',
position: 'fixed',
border: 'none',
borderRadius: '50%',
bottom: '20px',
right: '0',
transform: 'translate(-50%, -50%)',
color: theme === 'light' ? 'white' : 'black',
backgroundColor: theme === 'light' ? 'black' : 'white',
}
return (
<button
onClick={toggleTheme}
style={buttonStyle}
className={`themeToggle ${themeClassName}`}
>
{theme === 'light' ? 'π' : 'βοΈ'}
</button>
)
}
export default ThemeToggle
const buttonStyle: React.CSSProperties = {}
λ₯Ό μ΄μ©νμ¬ ν
λ§ μ ν λ²νΌμ μ€νμΌλ§ νμ΅λλ€. μ΄ λν CSS νμΌλ‘ λ°λ‘ λΊ μ μμκ² μ§λ§, λ€λ₯Έ κΈ°λ₯μμ λν μ€νμΌ κ°μ²΄λ₯Ό ν¨μλ‘ μμ± νκΈ°μ ν΅μΌνμ΅λλ€. μΆνμ 리ν©ν λ§μμ μμ λ μ μμ΅λλ€.
μ΄λ κ² ν λ§λ₯Ό μ ννλ λ²νΌκ³Ό 컀μ€ν ν μ ν΅ν΄ λ€μ΄λλ―Ή ν λ§ λ₯Ό ꡬννμμ΅λλ€. μμνκΈ°μ λ€μν λΈλ‘κ·Έλ₯Ό μ°Έκ³ ν λλ§ νλλΌλ λ무 ν¬μ€νΈλ€μμ μ»μ μ μλ μ λ³΄κ° λ¬λΌμ κ±±μ νλκ²κ³Ό λ¬λ¦¬ μκ°λ³΄λ€ ꡬνμ΄ κ°λ¨νκ² λμ λ»λ°μ΄μμ΅λλ€. λ€λ§ νμ¬ λΈλ‘κ·Έμ μ μ©λμ΄μλ λκΈ νλ¬κ·ΈμΈμλ ν λ§λ³κ²½μ΄ μ μ©λμ§ μμ΅λλ€. μ΄ λΆλΆμ μ‘°κΈ λ μ°κ΅¬νμ¬ μ μ©μ΄ νμνλ€λ μκ°μ΄ λ€μμ΅λλ€.
μ‘°κΈμ© νμ μ€ν¬λ¦½νΈμλ μ΅μν΄μ§κ³ μκ³ , μ»΄ν¬λνΈλ₯Ό μμ±νλ κ²μλ μμ°μ€λ¬μμ§κ³ μμ΅λλ€. μμΌλ‘λ λ§μ κ³ λ―Όμ νκ³ λ€μν κΈ°λ₯ ꡬνμ μλν΄λ³΄κ² μ΅λλ€.