Skip to content

Add theme system with SSR support and inverted sidebar tokens#1

Merged
Seungwoo321 merged 6 commits into
mainfrom
develop
May 1, 2026
Merged

Add theme system with SSR support and inverted sidebar tokens#1
Seungwoo321 merged 6 commits into
mainfrom
develop

Conversation

@Seungwoo321
Copy link
Copy Markdown
Contributor

Summary

  • 테마 시스템 추가: ThemeProvider, useTheme, ThemeToggle 컴포넌트로 라이트/다크/시스템 모드 지원
  • SSR FOUC 방지를 위한 getThemeInitScript() 제공 (@wireweave/ui/server entry)
  • Sidebar 인버전 토큰 시스템 구현: 페이지 배경과 항상 반대 톤 유지 (라이트 페이지 → 다크 사이드바, 다크 페이지 → 라이트 사이드바)

Changes

  • 테마 시스템 구현 (src/components/theme.tsx + theme-script.ts)
    • ThemeProvider: localStorage 영속 + OS prefers-color-scheme 자동 추적
    • ThemeToggle: 2-way (light/dark) 또는 3-way (light/dark/system) 토글 버튼
    • getThemeInitScript(): hydration 전 inline script로 FOUC 방지 (server-safe)
  • Sidebar 토큰 시스템 (src/styles/theme.css)
    • --color-sidebar-* 시맨틱 변수 11종 추가 (배경, hover, foreground, active, border, overlay, logo 등)
    • 라이트/다크 양쪽에 인버전 매핑 정의 (라이트: slate-800 → 다크: slate-100)
    • 알파 값은 color-mix(in oklab, var(--color-blue-500) 20%, transparent) 패턴 사용
  • Sidebar 컴포넌트 리팩토링 (src/components/sidebar.tsx)
    • 하드코딩된 색상/팔레트 변수를 모두 --color-sidebar-* 토큰으로 교체
    • hover/active/foreground-muted 상태별 토큰 적용
    • logo/avatar 그라디언트를 --color-sidebar-logo-from/to 토큰으로 교체
  • Sub-export 추가 (package.json, vite.config.ts)
    • @wireweave/ui/server entry 추가 (getThemeInitScript SSR 호출용)
    • 메인 entry는 'use client' 배너 자동 삽입, server entry는 제외
  • Storybook 스토리 추가/업데이트
    • ThemeToggle.stories.tsx: 2-way/3-way 토글 예제, size variants
    • Sidebar.stories.tsx: ThemeProvider decorator로 라이트/다크 토큰 검증 화면 추가
  • 문서화 (CLAUDE.md)
    • Sidebar 토큰 테이블 추가 (라이트/다크 매핑 명시)
    • 테마 시스템 API 섹션 추가 (ThemeProvider/useTheme/ThemeToggle/getThemeInitScript 사용법)
    • sub-export 섹션 업데이트 (/server entry 설명)

Test Plan

  • Storybook에서 Sidebar 라이트/다크 토글 시 인버전 동작 확인
  • ThemeToggle 2-way/3-way 모드 동작 검증
  • getThemeInitScript() 반환 문자열 형식 검증
  • Next.js/Remix 등 SSR 환경에서 FOUC 방지 스크립트 통합 테스트
  • localStorage 접근 불가 환경(private mode)에서 graceful fallback 확인
  • prefers-color-scheme 변경 시 system 모드 자동 반응 확인

Seungwoo321 and others added 6 commits May 1, 2026 21:09
ThemeProvider, useTheme 훅, ThemeToggle 컴포넌트를 추가하여 라이트/다크 모드 전환 기능을 구현했습니다. localStorage 기반 영속화와 OS prefers-color-scheme 자동 감지를 지원하며, SSR 환경에서 FOUC를 방지하기 위한 `getThemeInitScript()`를 server-safe entry (`@wireweave/ui/server`)로 분리했습니다. theme.css에 Orange 팔레트를 추가하고 Sidebar 시맨틱 토큰을 인버전 패턴으로 재정의했습니다. vite config에서 server 청크에는 'use client' banner를 제외하도록 조건부 처리를 추가했습니다.
페이지 배경과 반대 톤을 유지하도록 사이드바 색상 시스템을 재구성했습니다. 모든 하드코딩된 팔레트 참조를 `--color-sidebar-*` 시맨틱 토큰으로 교체하고, 라이트/다크 모드에서 자동으로 인버전되도록 구현했습니다.
ThemeToggle 컴포넌트의 Storybook 스토리를 추가하고 Sidebar 스토리를 테마 시스템과 통합했습니다. 라이트/다크 모드 전환 시 사이드바 인버전 동작을 시각적으로 확인할 수 있으며, 2-way/3-way 토글 모드와 크기 variants를 모두 테스트할 수 있습니다.
서버 사이드 유틸리티를 위한 `/server` sub-export를 추가하고 버전을 0.3.0으로 올렸습니다.
Sidebar 토큰 시스템과 테마 API 사용법을 문서화했습니다. Sidebar 인버전 토큰 테이블, sub-export 상세 설명, ThemeProvider/useTheme/ThemeToggle 사용법, FOUC 방지를 위한 getThemeInitScript 가이드를 추가했습니다.
@Seungwoo321 Seungwoo321 merged commit 50ac0ad into main May 1, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant