Skip to content

[Product/FE] 프로덕트 화면 다크모드 지원 #307

Description

@bottlenote-app

배경

프로덕트 화면에 다크모드 기능 요청.

현재 코드 확인 기준으로 bottle-note-frontend는 Tailwind의 class 기반 dark mode 설정과 CSS 변수 기반 토큰 일부가 이미 존재하지만, 실제 앱 루트/프로덕트 레이아웃에는 dark class 적용·사용자 설정·전환 UI가 아직 연결되어 있지 않은 상태로 보인다.

코드 확인 근거

  • tailwind.config.ts
    • darkMode: ['class'] 설정이 이미 있음
    • background, foreground, card, border 등 CSS 변수 기반 색상 토큰이 일부 정의되어 있음
  • src/style/globals.css
    • :root.dark 색상 CSS 변수가 이미 존재함
  • src/app/layout.tsx
    • <html lang="ko" className="touch-manipulation">로 고정되어 있고, 테마 상태에 따른 dark class 주입은 없음
    • 루트 래퍼가 bg-bgGray 등 고정 색상 사용
  • src/app/(primary)/layout.tsx
    • 프로덕트 기본 레이아웃이 bg-white로 고정되어 있음
  • src/store/settingsStore.ts
    • Zustand persist 기반 설정 저장 구조가 이미 있으나, 현재는 currentScreen만 저장함
  • src/app/(primary)/settings/*
    • 설정 화면과 메뉴 구조가 있어 다크모드 토글 진입점을 추가하기 적합함

요구 사항

프로덕트 화면에서 사용자가 라이트/다크 모드를 선택하거나 시스템 설정을 따를 수 있도록 한다.

권장 사용자 옵션

  • 라이트 모드
  • 다크 모드
  • 시스템 설정 따르기

최소 범위로 시작할 경우 1차는 라이트/다크 토글만 제공하고, 이후 시스템 설정 추종을 확장해도 된다.

가능한 접근 방법

접근 A. 기존 구조 활용: Zustand persist + html class 제어

  • settingsStore 또는 별도 themeStorethemeMode 저장
    • 예: light | dark | system
  • 클라이언트 Provider에서 저장된 설정을 읽어 document.documentElement.classList.toggle('dark', ...) 적용
  • prefers-color-schemesystem 모드일 때만 구독
  • 설정 화면에 다크모드 메뉴/토글 추가

장점:

  • 기존 Zustand persist 패턴과 잘 맞음
  • 신규 의존성 없이 구현 가능
  • 현재 Tailwind darkMode: ['class'] 설정을 그대로 활용 가능

주의점:

  • 초기 렌더링 시 테마 class 적용 전 깜빡임이 생길 수 있어, 필요하면 <head>에 초기 테마 적용 스크립트 또는 provider 초기화 전략 필요
  • 기존 화면에 bg-white, text-mainBlack, bg-bgGray처럼 고정 색상이 많아 일괄 치환/보정 필요

접근 B. next-themes 도입

  • next-themes로 SSR/CSR 테마 class 관리
  • 설정 화면에서 setTheme 호출

장점:

  • Next.js 테마 class/시스템 설정 처리에 익숙한 패턴
  • 초기 깜빡임 대응이 상대적으로 쉬움

주의점:

  • 신규 의존성 도입이므로 번들 영향/유지보수성 검토와 승인 필요
  • 현재 프로젝트 지침상 신규 패키지는 승인 후 설치해야 함

접근 C. 디자인 토큰 단계적 전환

  • 먼저 글로벌 토큰과 레이아웃만 다크 대응
  • 이후 주요 화면별로 고정 색상 클래스를 bg-background, text-foreground, bg-card, border-border 또는 보틀노트 전용 semantic token으로 단계적 치환

장점:

  • 리스크를 낮추고 화면별 QA 가능
  • 기존 디자인 시스템 정비와 함께 진행 가능

주의점:

  • 화면별 색상 누락이 생기기 쉬워 QA 체크리스트가 필요

권장 구현 방향

1차 구현은 접근 A + C를 권장한다.

  • 신규 의존성 없이 기존 Tailwind/Zustand 구조를 활용
  • settingsStore 또는 themeStore에 테마 설정 추가
  • Providers 하위에 ThemeInitializer/ThemeProvider 추가
  • html.dark class를 적용해 기존 .dark CSS 변수 사용
  • 프로덕트 공통 레이아웃부터 bg-white/bg-bgGray 고정값을 semantic token으로 변경
  • 설정 화면에 다크모드 선택 UI 추가
  • 주요 화면을 우선순위로 단계 대응

우선 적용 화면 제안

  • 홈/탭바/공통 레이아웃
  • 검색/상세
  • 리뷰 목록/리뷰 상세
  • 마이페이지/설정
  • 로그인/커스텀 화면은 별도 디자인 의도가 있을 수 있어 후순위 검토

QA 체크리스트

  • 앱 최초 진입 시 저장된 테마가 적용되는지
  • 설정 화면에서 라이트/다크 전환 시 즉시 반영되는지
  • 새로고침/재방문 후 설정이 유지되는지
  • 시스템 설정 추종을 지원하는 경우 OS 테마 변경에 반응하는지
  • 주요 화면의 배경/텍스트/카드/보더 대비가 충분한지
  • 하단 탭바, 모달, 드로어, 토스트/알럿 등 공통 컴포넌트가 깨지지 않는지
  • SVG/이미지 아이콘 중 darkgray/black 고정 아이콘이 다크 배경에서 보이는지
  • WebView 환경에서 safe-area 배경색과 본문 배경색이 어긋나지 않는지

후속 검토 필요

  • 다크모드 디자인 토큰을 Figma/디자인 시스템에서 별도 확정할지
  • 브랜드 코랄 색상은 다크모드에서도 유지할지, 대비 보정 토큰을 둘지
  • 설정값을 로컬 저장만 할지, 로그인 사용자 기준 서버 저장까지 확장할지
  • 앱 WebView 네이티브 영역 상태바/하단 영역 색상 연동이 필요한지

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions