인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

jaiyah님의 프로필 이미지

작성한 질문수

실무에 바로 적용하는 스토리북과 UI 테스트

공식문서에는 있지만 오류로 가득한 Test Coverage와 Snapshot 테스트

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

작성

·

39

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

답변 2

0

강병진님의 프로필 이미지
강병진
지식공유자

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

제생각에는 스토리북의 테마 시스템과 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

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 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를 통해 전역 설정을 동기화할 수 있습니다.

추가 도움

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

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

jaiyah님의 프로필 이미지

작성한 질문수

질문하기