[AI 감성 일기장] Tailwind CSS와 Context API를 활용한 다크모드 구현

Dev Log

Tailwind CSS의 다크모드 기능과 React Context API를 활용하여 애플리케이션 전체에서 일관된 다크모드 전환 기능을 구현했다.

Tailwind 설정

tailwind.config.ts에서 다크모드를 클래스 기반으로 설정했다.

darkMode: "class",  // .dark 클래스 존재 여부에 따라 다크모드 활성화
theme: {
  extend: {
    colors: {
      // 색상 스키마
    },
  },
},

이를 통해 HTML 요소에 .dark 클래스가 추가되면 다크모드 스타일이 적용되도록 했다.

 

다크모드 상태 관리

ThemeContext 생성

Context API를 사용해 다크모드 상태를 전역으로 관리했다.

const ThemeContext = createContext({
  isDarkMode: false,
  toggleDarkMode: () => {},
});

export const ThemeProvider = ({ children }: ThemeProviderProps) => {
  const [isDarkMode, setIsDarkMode] = useState(false);

  // isDarkMode에 따라 .dark 클래스 추가/제거
  useEffect(() => {
    const body = document.querySelector("body");
    isDarkMode ? body?.classList.add("dark") : body?.classList.remove("dark");
    return () => {
      body?.classList.remove("dark");
    };
  }, [isDarkMode]);

  // isDarkMode 상태를 전환하는 함수
  const toggleDarkMode = () => setIsDarkMode(!isDarkMode);

  return (
    <ThemeContext.Provider value={{ isDarkMode, toggleDarkMode }}>
      {children}
    </ThemeContext.Provider>
  );
};

export default ThemeContext;
  • ThemeContext를 통해 애플리케이션 전체에 isDarkMode와 toggleDarkMode 제공
  • useEffect로 isDarkMode 상태 변경 시 body에 .dark 클래스 동적 적용
  • Tailwind CSS의 다크모드 클래스가 자동으로 활성화됨

 

전역 상태 제공

// main.tsx
import { ThemeProvider } from "context/theme-context";

<ThemeProvider>
  <App />
</ThemeProvider>

애플리케이션 최상위에서 ThemeProvider로 감싸 전체 컴포넌트에서 다크모드 상태에 접근할 수 있도록 했다.

 

다크모드 토글 버튼

export default function Footer() {
  const { isDarkMode, toggleDarkMode } = useContext(ThemeContext);

  return (
    <button onClick={toggleDarkMode}>
      {isDarkMode ? '라이트모드 아이콘' : '다크모드 아이콘'}
    </button>
  );
}

사용자가 버튼을 클릭하면 toggleDarkMode 함수가 실행되어 다크모드와 라이트모드를 전환한다.

 

다크모드 스타일 적용

컴포넌트별 스타일 조정

다크모드 상태에 따라 컴포넌트의 테마를 동적으로 변경했다.

const { isDarkMode } = useContext(ThemeContext);

return (
  <>
    <ToastContainer theme={isDarkMode ? "dark" : "light"} />
    {/* ... */}
  </>
);

 

Tailwind 다크모드 클래스 활용

Tailwind의 dark: 접두사를 사용해 다크모드 전용 스타일을 적용했다.

<div className="dark:text-white" />
const btnColor =
  type === ButtonType.DEFAULT
    ? "bg-btnLight dark:bg-btnDark dark:text-white"  // 모드별 스타일
    : type === ButtonType.POSITIVE
    ? "bg-green text-white"
    : type === ButtonType.NEGATIVE
    ? "bg-red text-white"
    : "";

return (
  <button
    className={`${btnColor} ${className}`}
    onClick={onClick}
  >
    {text}
  </button>
);

 

결과

전체 애플리케이션에서 일관된 다크모드 전환이 가능해졌다.

'Dev Log' 카테고리의 다른 글

[AI 감성 일기장] LocalStorage를 활용한 데이터 영속성 구현  (0) 2025.11.07
[AI 감성 일기장] GPT API를 활용한 AI 답장 기능 구현  (0) 2025.11.07
[AI 감성 일기장] Diary 페이지 일기 상세보기 기능 구현  (0) 2025.11.07
[AI 감성 일기장] New 페이지 일기 작성 기능 구현  (0) 2025.11.07
[AI 감성 일기장] Home 페이지 날짜 관리 및 정렬 기능 구현  (0) 2025.11.07
'Dev Log' 카테고리의 다른 글
  • [AI 감성 일기장] LocalStorage를 활용한 데이터 영속성 구현
  • [AI 감성 일기장] GPT API를 활용한 AI 답장 기능 구현
  • [AI 감성 일기장] Diary 페이지 일기 상세보기 기능 구현
  • [AI 감성 일기장] New 페이지 일기 작성 기능 구현
고견
고견
개발 자국 남기기
  • 고견
    개발자국
    고견
  • 전체
    오늘
    어제
    • 분류 전체보기 (157) N
      • Frontend (29)
        • Next.js (16)
        • JavaScript (7)
      • CS (19) N
        • 자료구조 (9)
        • 알고리즘 (5)
        • 운영체제 (4) N
        • 네트워크 (1) N
      • TIL (93)
      • Dev Log (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자료구조
    ai 감성 일기장
    함수 타입
    앱 라우터
    문자열
    CS
    바닐라 자바스크립트
    Next.js
    타입 좁히기
    App Router
    Pages Router
    emotion diary
    cs50
    algorithm
    memory
    클래스
    인터페이스
    알고리즘
    제네릭
    페이지 라우터
    Spa
    react
    generic
    C
    typescript
    트러블 슈팅
    배열
    javascript
    Trouble Shooting
    useState
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고견
[AI 감성 일기장] Tailwind CSS와 Context API를 활용한 다크모드 구현
상단으로

티스토리툴바