inflearn logo
강의

Course

Instructor

Storybooks and UI tests that can be applied directly to practice

Test Coverage and Snapshot Tests: Present in Official Documentation but Riddled with Errors

스토리북 테마에 대해 질문 드립니다.

158

jaiyah

6 asked

0

퍼블리셔로 일하고 있는데..
설정하는 부분이 녹록치 않아 이렇게 질문드립니다.

제가 하고자 하는 것은 라이트,다크 테마시 주요 컬러와 기타 색상등을 변경하려고 하는데요..

css 변수 처리 예는 아래와 같습니다.

/* root 라이트테마 기본 변수 */
:root {
  --text-color: #000;
  --bg-color: #fff;
}
/* 다크 테마 기본변수 */
.dark {
  --text-color: #fff;
  --bg-color: #000;
}

테마 설정은 다음과 같이 진행했습니다.
preivew.tsx 에 decorators 배열로 추가함.

import { withThemeByClassName } from '@storybook/addon-themes';

이렇게 하니까 dark 클래스는 잘 붙고 있는데..
문제는 상단 패널에 기본적으로 레이어로 떠서 클릭할수 있는 라이트,다크테마는 컴포넌트 화면의 배경컬러가 변경되지만 제가 애드온한 것은 토글버튼은 라이트,다크버튼이 나오더라구요.. 근데 문제는 애드온 한것은 클래스만 제어되고 있고 컴포넌트의 배경컬러를 제어하려니까 잘 안되더라구요..
상단 기본 패널의 테마설정 부분과 애드온 한 부분의 싱크가 안맞는 부분도 있구요..
이것을 어떤 식으로 처리해야하는지..
조언을 구하고 싶습니다.
강의 잘 듣고 있습니다. 감사합니다.

react typescript tailwindcss storybook ui-testing

Answer 2

0

jasonkang

안녕하세요 좋은 질문 감사합니다.

제생각에는 스토리북의 테마 시스템과 CSS 변수가 제대로 연결되지 않아서 발생하는 문제인 것 같은데요

CSS 설정은 잘 하신 것 같고, preview.ts 에 커스텀 데코레이터를 하나 생성해서 활용하는 방법이 있을 것 같습니다.

// .storybook/preview.ts 
import { withThemeByClassName } from '@storybook/addon-themes';

// 커스텀 데코레이터 함수 생성 
const withThemeBackground = (Story, context) => {
  // context.globals에서 현재 선택된 테마 정보 가져오기
  const { theme } = context.globals;
  
  // 테마가 변경될 때마다 HTML 문서에 데이터 속성으로 현재 테마 설정
  // 이를 통해 CSS에서 [data-theme='dark'] 같은 선택자로 스타일 적용 가능
  document.documentElement.dataset.theme = theme;
  
  // 다크 테마일 경우 body에 dark 클래스 추가, 아니면 제거
  if (theme === 'dark') {
    document.body.classList.add('dark');
  } else {
    document.body.classList.remove('dark');
  }
  
  // 원래 스토리 컴포넌트 반환
  return Story();
};

// 스토리북에 적용할 데코레이터 배열
export const decorators = [
  // 커스텀 테마 데코레이터
  withThemeBackground,
  
  // 스토리북 공식 테마 데코레이터
  withThemeByClassName({
    themes: {
      light: '', // 라이트 테마는 기본값이므로 클래스 없음
      dark: 'dark', // 다크 테마일 때 'dark' 클래스 적용
    },
    defaultTheme: 'light', // 기본 테마는 라이트
  }),
];

// 툴바에 테마 전환 버튼 설정
export const globalTypes = {
  theme: {
    name: 'Theme', // 테마 컨트롤의 이름
    description: '전역 테마 설정', // 설명
    defaultValue: 'light', // 기본값
    toolbar: {
      icon: 'circlehollow', // 아이콘 모양
      items: [
        { value: 'light', icon: 'circlehollow', title: '라이트 모드' }, // 라이트 테마 옵션
        { value: 'dark', icon: 'circle', title: '다크 모드' }, // 다크 테마 옵션
      ],
      showName: true, // 이름 표시 여부
    },
  },
};

// 스토리북 추가 파라미터 설정
export const parameters = {
  // 배경색 설정 (스토리북의 배경 패널용)
  backgrounds: {
    default: 'light', // 기본 배경
    values: [
      { name: 'light', value: 'var(--bg-color)' }, // 라이트 모드 배경색을 CSS 변수로 설정
      { name: 'dark', value: 'var(--bg-color)' } // 다크 모드 배경색도 같은 CSS 변수 사용 (값은 .dark에서 오버라이드됨)
    ],
  },
  // 문서 페이지 테마 설정
  docs: {
    theme: {
      light: {
        // 라이트 모드 docs 페이지 테마 설정
        appBg: 'var(--bg-color)', // 앱 배경색
        textColor: 'var(--text-color)', // 텍스트 색상
        // 필요한 다른 속성들 추가 가능
      },
      dark: {
        // 다크 모드 docs 페이지 테마 설정
        appBg: 'var(--bg-color)', // 앱 배경색
        textColor: 'var(--text-color)', // 텍스트 색상
        // 필요한 다른 속성들 추가 가능
      }
    }
  }
};

이제 컴포넌트에서 정의한 CSS 변수를 사용합니다:

.component {
  color: var(--text-color);
  background-color: var(--bg-color);
}

이렇게 한번 시도해보시고 그래도 안되면 다시 한번 말씀 부탁드립니다! 저도 로컬에서 구동해서 한번 디버깅 해볼게용

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

jaiyah님, 스토리북에서 라이트 및 다크 테마 전환 문제를 해결하는 방법에 대해 설명드리겠습니다. 질문하신 사례는 Storybook의 테마 설정과 관련된 문제로 보입니다. 다음은 이러한 문제를 해결하기 위한 몇 가지 팁입니다.

스토리북 테마 설정 및 싱크 방법

  1. 애드온 테마 설정: 스토리북에서 @storybook/addon-themes를 사용해 테마를 설정할 수 있습니다. 현재 기본적인 배경 색상은 decorators 데코레이터를 통해 제어할 수 있습니다.

예를 들어, 테마 변경에 따라 body 배경 색이 변경되도록 설정하려면 아래와 같이 구현할 수 있습니다:

   import { addDecorator } from '@storybook/react';
   import { themes } from '@storybook/theming';
   import { withThemeByClassName } from '@storybook/addon-themes';

   const themesDecorator = withThemeByClassName({
     themes: {
       light: 'light',
       dark: 'dark'
     },
     defaultTheme: 'light'
   });

   addDecorator(themesDecorator);

여기서 lightdark는 각각의 테마 클래스 이름입니다. 각 테마에 대해 CSS 변수를 정의했다면 이러한 클래스를 사용해 테마를 확인할 수 있습니다.

  1. 싱크 문제 해결: 토글 버튼이 클래스만 제어하고 실제 배경색 변경이 되지 않는 문제는 CSS 및 스토리북 전역 스타일과의 충돌 때문일 수 있습니다. CSS var()를 사용하여 스타일 업데이트가 일관되게 적용되었는지 확인하세요.

  2. 테마 전환 싱크: 각 테마에 대해 스토리북 배경을 설정하고 decorators 에서 제공하는 옵션을 사용하면 상단 패널에서의 테마 전환 시 일관된 색상 변화를 유지할 수 있습니다.

  3. 스토리북 패널 싱크: 스토리북 상단 패널의 테마 설정은 특정 스토리의 컨텍스트와 애드온으로 적용된 테마 설정이 서로 다를 수 있습니다. 이를 조정하기 위해서는 parameters를 통해 전역 설정을 동기화할 수 있습니다.

추가 도움

더 구체적인 예제 및 세부 사항은 스토리북의 공식 문서를 참고하시면 도움이 됩니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

스토리북에 대해서

0

57

1

Storybook 10에서 argTypes에 action 설정 시

0

74

1

storybook setup

0

86

2

실무 적용 관련해서 질문이 있습니다!

0

63

2

storybook 프로젝트 세팅 중 궁금한 점이 있습니다.

0

133

2

스토리북 테스트에 대한 질문

0

101

2

tailwind 4.x 버전 변경된 CSS 추출(?) 커맨드

1

207

2

테일윈드를 안쓰고 스타일 컴포넌트만 사용하는 환경에서는요?

0

144

2

[질문 x 공유용] tailwind v4.0 으로 강의랑 다를 때 (import 다름, tailwind.config.js 없어짐 등)

6

484

2

react-toastify 를 storybook에 출력 시키기

0

181

1

react에서 modal & portal 사용시 에는 어떻게 작성해야될까요

0

374

3

tsconfig

0

180

1

vite 초기설정

0

344

2

스토리 내 args에서 에러가 발생합니다.

0

208

2

Nextjs에서 tailwind를 사용할 때

0

278

2

제공해주시는 Figma 색상 코드가 강의와 달라 글 남깁니다!

0

141

2

Visual Test

1

127

1

NavigationBar 배경색

0

129

1

defaultValue 질문 드립니다!

0

123

1

svg를 public 말고 src>assets안에 넣는다면 import를 어떻게해야하나요?

1

265

2

index.tsx 빌드 오류

0

371

2

tailwind css 코드 스플릿팅이 가능한가요?

0

279

1

StoryBook 관련 궁금 사항입니다.

1

260

1

type-error 해결 방법 질문

2

406

4