Skip to content

Commit a455983

Browse files
authored
공유 컴포넌트 제작 완료했습니다. (#19)
* feat: Calendar 완성 shared폴더는 따로 패키지화 할 것이므로, 내부에 public을 만들고 svg파일 모아둠. * feat: Calendar 컴포넌트 prop 수정 및 타입 정리 스토리에 상호작용 가능하게 처리 정리하려면, 컴포넌트 로직 분리하고, 스토리에 interaction test도 넣어야 하나, 시간상 미루겠습니다. * feat: GoalInfo 컴포넌트 제작 완료 * feat: Calendar 화살표 기능 수정 현재 달 이전으로는 disable처리 * feat: TodoItem 제출 시의 표정 정리 제외 완성 * feat: 커스텀 체크박스 완성 * feat: GoalMenu 수정 및 완성 제어형으로 만들어서 외부에서 선택 처리하도록 함. * feat: GoalMenu 스토리북 설명 추가 앞으로의 페이지 개발과 관련해서 목표 추가 * feat: TodoItem 비동기 고려 수정 컴포넌트 내부는 deferred가 아니라 낙관적 업뎃을 사용해야 하므로 useDeferredValue제거. 스토리북에선 onChecked를 비동기 동작 적용 * feat: ToolTip 완성 * feat: Tooltip 스토리북 사이드바 경로 변경 * feat: Moti svg 크기 변하도록 수정 외부에서 width, height주입으로 크기 변경가능하게 함. 이에 따른 ToolTip컴포넌트에서의 사용 수정 * feat: Banner 컴포넌트 완성 * feat: Banner 스토리북 사이드바 경로 수정 * feat: svg 크기 변경 가능하도록 수정 및 기존 TodoItem에서 크기 적용 FloatingButton컴폰너트에서도 사용되는 svg이라서. * feat: FloatingButton 컴포넌트 완성 * feat: FloatingButton 스토리 사이드바 경로 수정 * Trigger CI/CD for redeploy * Trigger CI/CD for storybook redeploy ci과정 트리거 위해 무의미한 스토리북 수정 * feat: Toggle 컴포넌트 완성 * feat: Checkbox 컴포넌트 호버링 케이스 추가 * feat: 스토리북 배포 ci 관련 캐싱 삭제 및 cleanup 동작 추가 빌드 시 html생성이 될 때도 있고 안될 때도 있어서. CI에서는 캐싱 문제일 수 있다기에 수정 * feat: ProgressBar 완성 * feat: ProgressBar 스토리 사이드바 경로 변경 * feat: TextField 컴포넌트 완성 * feat: TextField 스토리북 불필요 부분 삭제 * fix: shared components 빌드 에러 수정 * feat: PR 관련 안정성 수정 * feat: 공통 컴포넌트들 중 일부 RCC로 수정 및 lint관련 빌드 에러 수정 상호작용이나 hooks사용하는데, use client적는 것 깜빡했었습니다.. * feat: TodoItem 라벨 클릭 이벤트 수정 라벨 클릭 시 스크롤 초기화 문제로 인해. * feat: TodoItem 스토리 '오늘날짜' 고정 값으로 변경 실제 오늘 날짜로 하면 크로마틱에서 계속 변화 감지해서 수정함. * feat: TodoItem 스토리 날짜 고정 날짜를 바꿔 넣어도 컴포넌트 내 비교를 위한 new Date()값은 날마다 바뀔 것이므로, 기준 날짜를 고정시켰습니다
1 parent f00d9c2 commit a455983

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+2715
-65
lines changed

.github/workflows/deploy-storybook.yml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,14 @@ jobs:
2929
uses: actions/setup-node@v4
3030
with:
3131
node-version: "20"
32-
cache: "npm"
33-
cache-dependency-path: "**/package-lock.json"
32+
# cache: "npm"
33+
# cache-dependency-path: "**/package-lock.json"
34+
35+
- name: Clean up node_modules and npm cache and storybook-static-shared
36+
run: |
37+
rm -rf node_modules
38+
rm -rf storybook-static-shared
39+
npm cache clean --force
3440
3541
- name: Install dependencies
3642
run: npm install

.storybook/main.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,28 @@ const config: StorybookConfig = {
3434
typescript: {
3535
reactDocgen: "react-docgen-typescript",
3636
},
37+
webpackFinal: async (config) => {
38+
if (!config.module || !config.module.rules) {
39+
return config;
40+
}
41+
42+
config.module.rules = [
43+
...config.module.rules.map((rule) => {
44+
if (!rule || rule === "...") {
45+
return rule;
46+
}
47+
if (rule.test && /svg/.test(String(rule.test))) {
48+
return { ...rule, exclude: /\.svg$/i };
49+
}
50+
return rule;
51+
}),
52+
{
53+
test: /\.svg$/,
54+
use: ["@svgr/webpack"],
55+
},
56+
];
57+
58+
return config;
59+
},
3760
};
3861
export default config;

app/layout.tsx

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,7 @@ import type { Metadata } from "next";
33
import localFont from "next/font/local";
44
import "./globals.css";
55

6-
// const geistSans = Geist({
7-
// variable: "--font-geist-sans",
8-
// subsets: ["latin"],
9-
// });
10-
11-
// const geistMono = Geist_Mono({
12-
// variable: "--font-geist-mono",
13-
// subsets: ["latin"],
14-
// });
15-
16-
export const customFont = localFont({
6+
const customFont = localFont({
177
src: "../public/fonts/SUIT-Variable.woff2",
188
display: "swap",
199
variable: "--font-suit-variable",
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// plop-templates/story.tsx.hbs
2+
import type { Meta, StoryObj } from "@storybook/react";
3+
import Banner from "./Banner"; // 실제 컴포넌트 파일 임포트
4+
5+
const meta = {
6+
title: "Shared/Banner", // Storybook 사이드바 경로 (프로젝트 규칙에 맞게 수정)
7+
component: Banner,
8+
parameters: {
9+
// Canvas 레이아웃을 중앙으로 정렬하거나 패딩을 추가할 수 있습니다.
10+
layout: "centered",
11+
docs: {
12+
description: {
13+
component: "케이스가 2개 뿐인건지? 아니면 걍 아무 말이나 쓸 수 있는지.",
14+
},
15+
},
16+
},
17+
// Docs 탭 자동 생성을 위해 필요합니다.
18+
tags: ["autodocs"],
19+
// Controls Addon에서 Props를 어떻게 제어할지, 설명을 추가합니다.
20+
// 모든 스토리에 적용될 기본 Props (선택 사항)
21+
args: {
22+
// 예시: label: 'Banner',
23+
},
24+
} satisfies Meta<typeof Banner>;
25+
26+
export default meta;
27+
28+
type Story = StoryObj<typeof meta>;
29+
30+
// 가장 기본적인 Primary 스토리
31+
// argTypes를 Primary는 기본으로 가집니다.
32+
export const Primary: Story = {
33+
argTypes: {
34+
title: {
35+
control: "text",
36+
description: "적당히 길이 넘치면 hidden",
37+
},
38+
tag: {
39+
control: "text",
40+
description: "적당히 길이 넘치면 hidden",
41+
},
42+
// 예시: backgroundColor: { control: 'color', description: '컴포넌트 배경색' },
43+
},
44+
args: {
45+
title: "아무말이나 쓸 수 있음?",
46+
tag: "모티모티모티모",
47+
},
48+
};
49+
50+
// UI variatns들을 스토리로 생성합니다.
51+
// 추가적인 스토리 예시:
52+
export const Default: Story = {
53+
args: {
54+
title: "목표는 멀어도 나는 계속 가는 중",
55+
tag: "모티모와 함께 한 지 1일차",
56+
},
57+
};
58+
59+
export const Group: Story = {
60+
args: {
61+
...Default.args,
62+
title: "[그룹]에서 피드백을 남겼어요!",
63+
},
64+
};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import MotiSvg from "../public/Moti_shared.svg";
2+
interface BannerProps {
3+
title: string;
4+
tag: string;
5+
}
6+
const Banner = ({ title, tag }: BannerProps) => {
7+
return (
8+
<>
9+
<div className="w-96 px-6 py-4 bg-indigo-500 inline-flex justify-start items-center gap-3">
10+
<div className="min-w-0 flex-1 inline-flex flex-col justify-center items-start gap-2">
11+
<p className="overflow-x-hidden self-stretch justify-center text-Color-white text-base font-bold font-['SUIT_Variable'] leading-tight">
12+
{title}
13+
</p>
14+
<div className="min-w-0 p-2 bg-white/10 rounded-[999px] inline-flex justify-center items-center gap-2">
15+
<p className="max-w-60 overflow-hidden justify-center text-white text-xs font-medium font-['SUIT_Variable'] leading-none">
16+
{tag}
17+
</p>
18+
</div>
19+
</div>
20+
<div className="w-14 h-10">
21+
<MotiSvg width={56} height={40} />
22+
</div>
23+
</div>
24+
</>
25+
);
26+
};
27+
export default Banner;
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { useState } from "react";
2+
import Calendar from "./Calendar";
3+
import { Meta, StoryObj } from "@storybook/react";
4+
5+
// meta는 공통 옵션.
6+
const meta = {
7+
title: "Shared/Calendar",
8+
component: Calendar,
9+
args: {},
10+
decorators: [
11+
(Story) => (
12+
<div onClick={(e) => e.preventDefault()}>
13+
<Story />
14+
</div>
15+
),
16+
],
17+
parameters: {
18+
docs: {
19+
description: {
20+
component: `컴포넌트 설명입니다. 일단 개발 요구사항 여기에 기록함.
21+
크기는 변동.
22+
onChange와 selected를 사용해서 상호작용하는 테스트를 추가해야 함.
23+
`,
24+
},
25+
},
26+
},
27+
} satisfies Meta<typeof Calendar>;
28+
export default meta;
29+
30+
type Story = StoryObj<typeof meta>;
31+
32+
const Wrapper = () => {
33+
const [date, setDate] = useState(new Date());
34+
return <Calendar onChange={(newDate) => setDate(newDate)} selected={date} />;
35+
};
36+
37+
export const Primary: Story = {
38+
render: Wrapper,
39+
argTypes: {
40+
selected: {
41+
description: `선택 값 주입. 제어 방식의 사용법과 같음.
42+
관련 상호작용 테스트를 추가해야 함.
43+
`,
44+
},
45+
onChange: {
46+
description: `유저의 상호작용으로 인한 클릭한 date확인 가능.
47+
관련 상호작용 테스트를 추가해야 함.
48+
`,
49+
},
50+
},
51+
args: {
52+
onChange: (date) => {
53+
console.log("date: ", date);
54+
},
55+
selected: new Date(),
56+
},
57+
};

0 commit comments

Comments
 (0)