harryk-ds는 재사용과 유지보수에 용이한 UI 컴포넌트 & Motion 컴포넌트를 제공하는 디자인 시스템이에요.
harryk-ds/
├── packages/ # 컴포넌트 패키지
│ ├── ui/ # UI 컴포넌트 (@harryk-ds/ui)
│ │ └── src/components/
│ │ └── button/
│ └── motion/ # 모션 컴포넌트 (@harryk-ds/motion)
│ └── src/components/
│ └── FadeIn/
└── apps/ # 애플리케이션
└── storybook/ # Storybook 문서화 (@harryk-ds/storybook)
└── src/stories/
이 프로젝트는 중앙 집중형 스토리 관리 방식을 채택했어요.
-
컴포넌트 패키지 (
packages/*): 순수한 컴포넌트 라이브러리- 가벼운 번들 크기의 디자인 시스템을 만들어요.
- 각 패키지별 독립적인 배포가 가능해요.
-
Storybook 앱 (
apps/storybook): 문서화 전용- 패키지의 Storybook을 작성하고 시각적 문서화에 집중해요.
pnpm installpnpm storybookhttp://localhost:6006 에서 컴포넌트를 확인할 수 있어요.
pnpm dev# 모든 패키지 빌드
pnpm build
# Storybook 정적 사이트 빌드 (배포용)
pnpm build-storybook기본 UI 컴포넌트를 제공해요.
컴포넌트:
Button- color, variant, size 옵션으로 다양한 형태의 버튼을 만들 수 있어요.
기술 스택:
- React 19
- TypeScript
- Vanilla Extract CSS
- Vite
애니메이션 컴포넌트를 제공해요.
컴포넌트:
FadeIn- duration, delay, direction, distance 옵션으로 다양한 페이드인 애니메이션을 적용할 수 있어요.
기술 스택:
- React 19
- TypeScript
- Framer Motion
- Vite
# UI 컴포넌트
npm install @harryk-ds/ui
# 모션 컴포넌트
npm install @harryk-ds/motionimport { Button } from "@harryk-ds/ui";
import { FadeIn } from "@harryk-ds/motion";
function App() {
return (
<FadeIn direction="up" delay={0.2} duration={0.6} distance={20}>
<Button color="primary" variant="fill" size="lg">
안녕하세요!
</Button>
</FadeIn>
);
}모든 컴포넌트의 상세한 문서는 Storybook에서 확인할 수 있어요.
pnpm storybook각 컴포넌트별로 다음을 제공해요:
- 사용법 및 예시
- Props API 문서
- 인터랙티브 컨트롤
- 접근성 가이드라인
# 개발
pnpm dev # 모든 패키지 워치 모드
pnpm dev:ui # UI 패키지만 개발
pnpm dev:motion # Motion 패키지만 개발
# 빌드
pnpm build # 모든 패키지 빌드
pnpm build:ui # UI 패키지만 빌드
pnpm build:motion # Motion 패키지만 빌드
# Storybook
pnpm storybook # Storybook 개발 서버
pnpm build-storybook # Storybook 정적 빌드
# Chromatic (시각적 테스트)
pnpm chromatic # Chromatic 배포 및 시각적 테스트
pnpm chromatic:ci # CI 환경용 Chromatic 실행
# 유틸리티
pnpm type-check # 타입 체크
pnpm lint # 린트 검사
pnpm lint:fix # 린트 자동 수정
pnpm clean # 빌드 파일 및 node_modules 정리- 언어: TypeScript 5.9
- UI 라이브러리: React 19
- 빌드 도구: Vite 7
- 패키지 매니저: pnpm 10 (workspace)
- CSS-in-JS: Vanilla Extract (UI 패키지)
- 애니메이션: Framer Motion 11 (Motion 패키지)
- 문서화: Storybook 8 + Chromatic
- 린터/포맷터: Biome 2.2
- Git Hooks: Husky 9
- CI/CD: GitHub Actions
- Node.js: 24
-
Chromatic 계정 생성
- chromatic.com에서 계정을 생성해요.
- GitHub 저장소를 연결해요.
-
프로젝트 토큰 설정
# 환경 변수 파일 생성 cp env.example .env # CHROMATIC_PROJECT_TOKEN에 발급받은 토큰 입력
-
GitHub Secrets 설정
- Repository Settings > Secrets and variables > Actions
CHROMATIC_PROJECT_TOKEN추가
-
Chromatic 배포
pnpm chromatic
-
Vercel 프로젝트 생성
vercel --prod
-
빌드 설정
- Build Command:
pnpm build-storybook - Output Directory:
apps/storybook/storybook-static - Root Directory:
/
- Build Command:
-
환경 변수 (필요시)
NODE_VERSION=24
우리는 Changeset을 기반으로 한 자동 배포 시스템을 사용해요. 상세한 배포 방법은 배포 가이드를 참고해주세요.
주의: 로컬에서의
npm publish는 지양하고, 모든 배포는 CI/CD 워크플로우를 통하는 것을 원칙으로 해요.
GitHub Actions를 통해 자동화된 CI/CD 파이프라인이 구성되어 있어요.
트리거: main, develop 브랜치로의 push 또는 PR
작업 내용:
-
Lint and Type Check
- Biome를 통한 코드 린팅
- TypeScript 타입 체크
-
Build
- 모든 패키지 빌드 검증
- Storybook 정적 빌드
- 빌드 결과물 아티팩트 업로드 (7일 보관)
트리거: main, develop 브랜치로의 PR 생성 시
작업 내용:
- Storybook 빌드 및 Chromatic 배포
- TurboSnap 활성화 (변경된 스토리만 처리)
- 시각적 회귀 테스트는 스킵 (
skip: 'chromatic') - PR 리뷰용 Storybook 미리보기 제공
특징:
- ✅ 의존성 캐싱으로 빌드 시간 단축
- ✅ Node.js 24.12.0 환경에서 실행
- ✅ 병렬 처리로 효율적인 CI 실행
- ✅ PR에서 자동 실패 방지 (
exitZeroOnChanges)
아직 정식 오픈 전이에요. 아이디어나 피드백이 있다면 GitHub Issues에서 공유해 주세요!
MIT License - 자세한 내용은 LICENSE 파일을 참조하세요.
- harryk-im - Initial work