Skip to content

[Refactor/#63] index.css 폰트 및 디자인 시스템 추가#64

Open
Seojegyeong wants to merge 10 commits intodevelopfrom
refactor/#63
Open

[Refactor/#63] index.css 폰트 및 디자인 시스템 추가#64
Seojegyeong wants to merge 10 commits intodevelopfrom
refactor/#63

Conversation

@Seojegyeong
Copy link
Collaborator

@Seojegyeong Seojegyeong commented Feb 26, 2026

🚨 관련 이슈

#63

✨ 변경사항

  • 🐞 BugFix Something isn't working
  • 💻 CrossBrowsing Browser compatibility
  • 🌏 Deploy Deploy
  • 🎨 Design Markup & styling
  • 📃 Docs Documentation writing and editing (README.md, etc.)
  • ✨ Feature Feature
  • 🔨 Refactor Code refactoring
  • ⚙️ Setting Development environment setup
  • ✅ Test Test related (storybook, jest, etc.)

✏️ 작업 내용

1. 폰트 위계 재정의

  • heading2(28px)와 기존 heading3(18px) 사이 크기 차이가 커서,
  • 중간 단계인 heading3(24px)를 신규 추가하고 기존 heading3은 heading4로 이름 변경

2. 기존 사용처 정리

  • font-heading3 사용처 → font-heading4로 일괄 교체

3. 디자인 시스템 스토리북 추가

  • Design Tokens/Typography 경로에 전체 폰트 토큰을 한눈에 볼 수 있는 스토리 추가
  • 표시 항목: Token 클래스명 / 샘플 텍스트 / Size / Weight / Line-height 등

4. 기타

  • 일부 Tailwind 스타일 경고 수정
  • 워크스페이스 카드 디자인 일부 수정(svg 크기 및 색상)

😅 미완성 작업

N/A

📢 논의 사항 및 참고 사항

이번 PR에서 전반적인 색상 및 폰트를 디자인 시스템에 맞게 통일 작업을 진행했습니다!!
이에 따라 각자 구현하신 컴포넌트에 영향이 있을 수 있으니, 아래 두 가지 사항을 꼭 확인해 주세요.

  1. 컴포넌트 동작 및 UI 확인
  • 색상/폰트 변경으로 인해 기존 컴포넌트에 깨지는 부분이 없는지 검토 후 리뷰 남겨주세요.
  1. SVG 색상 교체
  • SVG 파일을 사용할 때 원본 색상을 그대로 쓰는 경우가 있는데, SVG도 디자인 시스템의 색상 토큰으로 변경이 가능합니다.
  • 앞으로 개발 시 각자 사용 중인 SVG의 색상을 디자인 시스템에 맞게 업데이트해 주세요!
  1. 스토리북 및 디자인 시스템 활용
  • 디자인 시스템 내 구성 요소들을 스토리북에 정리해두었습니다!!!
  • 앞으로 개발 시 별도 구현보다는 스토리북에 정의된 요소를 최대한 활용해 주세요 :)

💬 리뷰어 가이드 (P-Rules)
P1: 필수 반영 (Critical) - 버그 가능성, 컨벤션 위반. 해결 전 머지 불가.
P2: 적극 권장 (Recommended) - 더 나은 대안 제시. 가급적 반영 권장.
P3: 제안 (Suggestion) - 아이디어 공유. 반영 여부는 드라이버 자율.
P4: 단순 확인/칭찬 (Nit) - 사소한 오타, 칭찬 등 피드백.

Summary by CodeRabbit

  • 스타일

    • 전반적인 제목·본문·라벨 타이포그래피 조정 및 그림자/모서리 토큰 교체로 UI 일관성 향상
    • 모달·워크스페이스·사이드바 등 레이아웃 및 컴포넌트 피치·크기·라운딩·호버 스타일 미세조정
    • 버튼·입력·스켈레톤 등 컴포넌트 시각 업데이트
  • 문서화

    • 타이포그래피, 테두리 반경, 색상, 그림자 등 디자인 토큰을 보여주는 Storybook 문서 추가

@Seojegyeong Seojegyeong requested review from YermIm and jjjsun February 26, 2026 11:57
@Seojegyeong Seojegyeong self-assigned this Feb 26, 2026
@Seojegyeong Seojegyeong added 🎨 Html&css 마크업 & 스타일링 ⚙ Setting 개발 환경 세팅 labels Feb 26, 2026
@coderabbitai
Copy link

coderabbitai bot commented Feb 26, 2026

📝 Walkthrough

Walkthrough

글로벌 디자인 토큰(타이포그래피·라운딩·쉐도우)과 이를 사용하는 컴포넌트들의 Tailwind 유틸리티 클래스가 토큰화·조정되었습니다. 여러 컴포넌트의 클래스명(폰트 크기·라운딩·쉐도우 등)과 Storybook 문서(타이포그래피, 색상, 그림자, 라운딩)가 추가·갱신되었습니다. (프로그래밍 로직 변화 없음)

Changes

Cohort / File(s) Summary
디자인 토큰 / 글로벌 스타일
src/index.css
.font-heading4 추가, .font-heading3·.font-label 속성 업데이트, 일부 deprecated 라운딩 클래스 제거, --color-bg-surface 변수 추가.
Storybook: 디자인 토큰 문서 추가
src/stories/Typography.stories.tsx, src/stories/BorderRadius.stories.tsx, src/stories/Colors.stories.tsx, src/stories/Shadows.stories.tsx
타이포그래피·라운딩·색상·쉐도우 토큰을 시각화하는 Storybook 스토리 4개 추가(정적 렌더링).
버튼 관련 변경
src/components/common/button/Button.tsx, src/components/common/button/Button.stories.tsx
big 사이즈 폰트 클래스 변경(font-heading3 → font-heading4) 및 Button 스토리 컨테이너 폭 조정(고정 360px → w-90) — 프레젠테이션 변경.
사이드바·네비게이션 스타일
src/components/Sidebar/..., src/components/Sidebar/SubMenu.tsx, src/components/common/dropdownmenu/DropdownMenu.tsx
여러 rounded·shadow·bg 유틸리티를 토큰화로 교체(rounded-component-*, shadow-Soft/Medium, bg-bg-surface 등). 동작·로직 변화 없음.
모달·드롭다운·알럿·입력 관련 라운딩·쉐도우 변경
src/components/common/modal/Modal.tsx, src/components/common/alert/Alert.tsx, src/components/auth/common/InputActions.tsx
라운딩·쉐도우 클래스 교체 및 오탈자 수정(동작 영향 없음).
인증·회원가입·비밀번호 흐름 UI 수정
src/components/auth/..., src/pages/auth/Login.tsx, src/pages/auth/Signup.tsx
헤딩/버튼 폰트(font-heading3font-heading4), 쉐도우 업데이트(shadow-sm/mdshadow-Soft), 일부 텍스트 클래스(font-body3font-body2) 변경 — 로직 불변.
워크스페이스 관련 UI 조정
src/components/workspace/WorkspaceCard.tsx, src/pages/workspace/Workspace.tsx, src/pages/workspace/WorkspaceSetting.tsx
카드 쉐도우·아이콘 사이즈·폰트·라운딩 조정, 모달/업로드 영역(max-w / h) 및 textarea 최소 높이 변경 — 레이아웃/표시 변경.
스켈레톤 및 기타 컴포넌트 라운딩 통일
src/components/auth/skeleton/*, src/components/modal/privacyModal/AgreementItem.tsx, src/components/auth/intro/*
여러 Skeleton/헤더/AgreementItem의 라운딩 및 폰트 클래스 정리(rounded-component-*font-heading4 사용).

Sequence Diagram(s)

(생성 조건 미충족 — UI/스타일 변경 및 문서 추가 중심이라 시퀀스 다이어그램 생략)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

🔨 Refactor

Suggested reviewers

  • jjjsun
  • YermIm
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 3.45% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 전체 변경사항의 핵심을 명확하게 반영하고 있습니다. 폰트 위계 재정의와 디자인 시스템 추가라는 주요 작업 내용을 간결하게 표현했습니다.
Description check ✅ Passed PR 설명이 템플릿의 모든 주요 섹션을 완벽하게 포함하고 있으며, 구체적인 작업 내용, 관련 이슈, 변경 유형, 스크린샷 등이 명확하게 기술되어 있습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/#63

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
src/components/modal/privacyModal/AgreementItem.tsx (1)

16-16: font-heading4font-bold 동시 사용은 토큰 일관성을 약하게 만듭니다.
현재는 font-heading4의 weight가 font-bold로 덮여서 토큰 의미가 일부 사라집니다. 의도가 없다면 font-bold 제거를 권장합니다.

제안 diff
-      className="font-heading4 text-text-main font-bold mb-2 mt-4 first:mt-0"
+      className="font-heading4 text-text-main mb-2 mt-4 first:mt-0"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/modal/privacyModal/AgreementItem.tsx` at line 16,
AgreementItem의 JSX에서 클래스 문자열 "font-heading4 text-text-main font-bold mb-2 mt-4
first:mt-0"가 font-heading4의 토큰 의미를 font-bold로 덮어버리므로, AgreementItem 컴포넌트의 해당
className에서 불필요한 "font-bold"를 제거하거나(권장) 만약 굵은 스타일가 의도라면 font-heading4 토큰 자체의
weight를 수정해 일관성을 유지하도록 변경하세요.
src/stories/Typography.stories.tsx (1)

69-92: 접근성 개선: 시맨틱 HTML 테이블 사용 권장

현재 div + CSS Grid로 테이블 형태의 레이아웃을 구현하고 있는데, 스크린 리더 사용자를 위해 시맨틱 HTML 테이블 요소(<table>, <thead>, <tbody>, <tr>, <th>, <td>)를 사용하는 것이 좋습니다. 이렇게 하면 보조 기술이 데이터 구조를 올바르게 파악할 수 있습니다.

♻️ 시맨틱 테이블로 리팩토링 제안
 function TypographyDoc() {
   return (
     <div className="p-8 space-y-2 max-w-2xl">
-      <div className="grid grid-cols-[120px_1fr_80px_60px_60px] gap-x-4 pb-2 border-b border-gray-200 text-xs text-gray-400 font-medium uppercase tracking-wide">
-        <span>Token</span>
-        <span>Sample</span>
-        <span>Size</span>
-        <span>Weight</span>
-        <span>Leading</span>
-      </div>
-      {fontTokens.map(({ className, label, size, weight, lineHeight }) => (
-        <div
-          key={className}
-          className="grid grid-cols-[120px_1fr_80px_60px_60px] gap-x-4 items-baseline py-3 border-b border-gray-100"
-        >
-          <span className="text-xs text-gray-400 font-mono">.{className}</span>
-          <span className={className}>{label} — 가나다라마바사</span>
-          <span className="text-xs text-gray-400">{size}</span>
-          <span className="text-xs text-gray-400">{weight}</span>
-          <span className="text-xs text-gray-400">{lineHeight}</span>
-        </div>
-      ))}
+      <table className="w-full border-collapse">
+        <thead>
+          <tr className="border-b border-gray-200 text-xs text-gray-400 font-medium uppercase tracking-wide">
+            <th className="text-left py-2 w-[120px]">Token</th>
+            <th className="text-left py-2">Sample</th>
+            <th className="text-left py-2 w-[80px]">Size</th>
+            <th className="text-left py-2 w-[60px]">Weight</th>
+            <th className="text-left py-2 w-[60px]">Leading</th>
+          </tr>
+        </thead>
+        <tbody>
+          {fontTokens.map(({ className, label, size, weight, lineHeight }) => (
+            <tr key={className} className="border-b border-gray-100">
+              <td className="text-xs text-gray-400 font-mono py-3">.{className}</td>
+              <td className={`${className} py-3`}>{label} — 가나다라마바사</td>
+              <td className="text-xs text-gray-400 py-3">{size}</td>
+              <td className="text-xs text-gray-400 py-3">{weight}</td>
+              <td className="text-xs text-gray-400 py-3">{lineHeight}</td>
+            </tr>
+          ))}
+        </tbody>
+      </table>
     </div>
   );
 }

As per coding guidelines, 접근성: 시맨틱 HTML, ARIA 속성 사용 확인.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/stories/Typography.stories.tsx` around lines 69 - 92, The TypographyDoc
component renders a tabular dataset with divs and CSS grid; replace that
structure with semantic table markup: wrap the header row in <thead> using <tr>
and <th scope="col"> for "Token, Sample, Size, Weight, Leading", then render
fontTokens inside <tbody> with one <tr> per token and <td> cells for each value
(preserve the existing CSS classes such as the grid-to-table spacing classes and
the per-token sample className applied to the sample cell), add appropriate
aria-label or caption if needed, and keep key={className} on each row; ensure
fontTokens mapping, className variable and TypographyDoc function name remain
unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/components/modal/privacyModal/AgreementItem.tsx`:
- Line 16: AgreementItem의 JSX에서 클래스 문자열 "font-heading4 text-text-main font-bold
mb-2 mt-4 first:mt-0"가 font-heading4의 토큰 의미를 font-bold로 덮어버리므로, AgreementItem
컴포넌트의 해당 className에서 불필요한 "font-bold"를 제거하거나(권장) 만약 굵은 스타일가 의도라면 font-heading4
토큰 자체의 weight를 수정해 일관성을 유지하도록 변경하세요.

In `@src/stories/Typography.stories.tsx`:
- Around line 69-92: The TypographyDoc component renders a tabular dataset with
divs and CSS grid; replace that structure with semantic table markup: wrap the
header row in <thead> using <tr> and <th scope="col"> for "Token, Sample, Size,
Weight, Leading", then render fontTokens inside <tbody> with one <tr> per token
and <td> cells for each value (preserve the existing CSS classes such as the
grid-to-table spacing classes and the per-token sample className applied to the
sample cell), add appropriate aria-label or caption if needed, and keep
key={className} on each row; ensure fontTokens mapping, className variable and
TypographyDoc function name remain unchanged.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 63ceebe and fa65740.

📒 Files selected for processing (9)
  • src/components/common/button/Button.stories.tsx
  • src/components/common/button/Button.tsx
  • src/components/modal/privacyModal/AgreementItem.tsx
  • src/components/workspace/WorkspaceCard.tsx
  • src/index.css
  • src/pages/auth/Signup.tsx
  • src/pages/workspace/Workspace.tsx
  • src/pages/workspace/WorkspaceSetting.tsx
  • src/stories/Typography.stories.tsx

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/index.css (1)

209-213: ⚠️ Potential issue | 🟡 Minor

font-body3 토큰이 누락되어 있습니다.

다른 컴포넌트(WorkspaceCard.tsx 등)에서 font-body3 클래스를 사용하고 있지만, 이 파일에 해당 토큰이 정의되어 있지 않습니다. font-body2 아래에 font-body3 정의를 추가하거나, 사용처에서 올바른 토큰으로 수정이 필요합니다.

💡 font-body3 추가 예시
  .font-body2 {
    font-size: 14px;
    font-weight: 500;
    line-height: 140%;
  }

+ .font-body3 {
+   font-size: 13px;
+   font-weight: 400;
+   line-height: 140%;
+ }
+
  .font-caption {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/index.css` around lines 209 - 213, Add a missing .font-body3 CSS token in
src/index.css so components using the class (e.g., WorkspaceCard.tsx) have a
defined style; insert a .font-body3 rule below .font-body2 with the appropriate
font-size/weight/line-height (or alternatively update usages of "font-body3" in
components to an existing token like "font-body2" if that is the intended fix)
and ensure the class name matches exactly where it's referenced.
🧹 Nitpick comments (7)
src/components/common/modal/Modal.tsx (1)

88-100: 상수 객체 외부화 고려 (선택적 개선)

sizeClassespaddingClasses 객체가 정적 값만 포함하고 있어, 컴포넌트 외부로 이동하면 매 렌더링마다 객체 재생성을 방지할 수 있습니다. 현재 성능 영향은 미미하지만, 코드 정리 측면에서 다음 리팩토링 때 고려해 볼 수 있습니다.

♻️ 제안 코드
+const SIZE_CLASSES = {
+  sm: "max-w-modal-sm",
+  md: "max-w-modal-md",
+  lg: "max-w-modal-lg",
+  xl: "max-w-modal-xl",
+} as const;
+
+const PADDING_CLASSES = {
+  none: "p-modal-none",
+  sm: "p-modal-sm",
+  md: "p-modal-md",
+  lg: "p-modal-lg",
+} as const;
+
 function Modal({
   // ...props
 }: IModalProps) {
   // ...

-  const sizeClasses = {
-    sm: "max-w-modal-sm",
-    md: "max-w-modal-md",
-    lg: "max-w-modal-lg",
-    xl: "max-w-modal-xl",
-  };
-
-  const paddingClasses = {
-    none: "p-modal-none",
-    sm: "p-modal-sm",
-    md: "p-modal-md",
-    lg: "p-modal-lg",
-  };

   // className 사용 시:
-  sizeClasses[size],
-  paddingClasses[padding],
+  SIZE_CLASSES[size],
+  PADDING_CLASSES[padding],
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/common/modal/Modal.tsx` around lines 88 - 100, 현재 Modal 컴포넌트
내부에서 매 렌더링마다 재생성되는 sizeClasses와 paddingClasses 정적 객체를 컴포넌트 외부로 옮겨 재사용하도록 변경하세요:
Modal 컴포넌트 파일 최상단에 const SIZE_CLASSES = { ... }와 const PADDING_CLASSES = { ...
}로 정의하거나 필요 시 별도 모듈로 추출(export)하고 기존 컴포넌트 내부에서 sizeClasses/paddingClasses 대신 해당
상수를 참조하도록 수정하면 됩니다(참조 대상: Modal 컴포넌트 내 sizeClasses, paddingClasses).
src/index.css (1)

197-201: font-heading4의 font-weight가 다른 heading 토큰들보다 낮습니다.

font-heading4font-weight: 400font-body1(500)보다 낮습니다. PR 이미지의 Typography 스펙 테이블에서도 heading4가 weight 400으로 표시되어 있어 의도된 것으로 보이지만, 일반적으로 heading이 body보다 굵거나 같은 것이 시각적 위계에 맞습니다.

디자인 의도가 맞다면 무시해도 되지만, 워크스페이스 카드 등에서 font-heading4 font-semibold!로 override하는 패턴이 반복된다면 기본 weight를 500으로 조정하는 것이 더 일관성 있을 수 있습니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/index.css` around lines 197 - 201, The .font-heading4 rule currently sets
font-weight: 400 which is lighter than .font-body1 (500) and causes frequent
local overrides; update the .font-heading4 CSS rule to font-weight: 500 to align
heading weight with body1 and reduce the need for ad-hoc overrides (unless the
design explicitly requires 400, in which case leave as-is and document that
exception). Ensure you change the font-weight in the .font-heading4 selector in
src/index.css and remove redundant overrides like "font-heading4 font-semibold!"
where applicable.
src/stories/BorderRadius.stories.tsx (2)

56-65: Storybook 타입을 컴포넌트 기준으로 고정해 주세요.

Line 56~65에서 Meta/StoryObj 제네릭이 비어 있어 타입 추론 이점이 줄어듭니다. satisfies Meta<typeof BorderRadiusDoc> + StoryObj<typeof meta> 조합이 더 안전합니다.

타입 고정 제안 diff
-const meta: Meta = {
+const meta = {
   title: "Design Tokens/Border Radius",
   component: BorderRadiusDoc,
   parameters: { layout: "fullscreen" },
-};
+} satisfies Meta<typeof BorderRadiusDoc>;
 
 export default meta;
-type TStory = StoryObj;
+type TStory = StoryObj<typeof meta>;

As per coding guidelines "4. 타입 안정성: TypeScript 타입의 명확성 확인. any 사용 지양, 제네릭 활용 검토."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/stories/BorderRadius.stories.tsx` around lines 56 - 65, The Meta/StoryObj
generics should be tied to the component to preserve type safety: change the
meta declaration to use "satisfies Meta<typeof BorderRadiusDoc>" (so Meta is
bound to BorderRadiusDoc) and update the story type to "StoryObj<typeof meta>"
(so All: TStory uses the inferred component types); locate and update the "meta"
constant, the "type TStory" alias, and the "All" export accordingly (symbols:
meta, BorderRadiusDoc, TStory, All, Meta, StoryObj).

33-50: 토큰 목록은 시맨틱 테이블 구조로 바꾸는 게 좋아요.

Line 33~50은 표 형태 데이터인데 div/span만 사용해서 스크린리더가 열/행 관계를 정확히 읽기 어렵습니다. <table><thead><tbody> 구조로 바꾸면 문서 접근성이 좋아집니다.

As per coding guidelines "7. 접근성: 시맨틱 HTML, ARIA 속성 사용 확인."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/stories/BorderRadius.stories.tsx` around lines 33 - 50, Replace the
non-semantic grid of divs/spans with a proper table: convert the header div into
a <table> with a <thead> containing <th scope="col">Token</th><th
scope="col">Preview</th><th scope="col">Value</th><th scope="col">Usage</th>,
and convert the radiusTokens.map(...) output into <tbody> rows (<tr>) where each
mapped item uses <td> cells; keep the existing identifiers (radiusTokens,
className, value, usage) and preserve the preview box by rendering the colored
preview inside the Preview <td> (apply the same `w-20 h-12 bg-brand-400 border
border-brand-500 ${className}` classes to a child div), keep the token text
styling (text-xs text-gray-400 font-mono) inside the Token <td>, and ensure each
<tr> still uses key={className}; add scope attributes on header <th>s for proper
screen-reader semantics.
src/stories/Colors.stories.tsx (2)

102-111: Colors 스토리도 메타/스토리 타입을 강하게 지정해 주세요.

Line 102~111에서 Meta/StoryObj 제네릭을 생략하면 타입 안정성이 낮아집니다.

권장 타입 패턴 diff
-const meta: Meta = {
+const meta = {
   title: "Design Tokens/Colors",
   component: ColorDoc,
   parameters: { layout: "fullscreen" },
-};
+} satisfies Meta<typeof ColorDoc>;
 
 export default meta;
-type TStory = StoryObj;
+type TStory = StoryObj<typeof meta>;

As per coding guidelines "4. 타입 안정성: TypeScript 타입의 명확성 확인. any 사용 지양, 제네릭 활용 검토."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/stories/Colors.stories.tsx` around lines 102 - 111, The meta and story
types are currently untyped which reduces type safety; update the declarations
to use generics tied to the component (e.g., change Meta to Meta<typeof
ColorDoc> for the meta variable and StoryObj to StoryObj<typeof ColorDoc> for
TStory) so that meta and All are strongly typed against ColorDoc (refer to
symbols: Meta, StoryObj, meta, TStory, All, ColorDoc).

79-84: 체커보드 스타일 객체는 컴포넌트 밖 상수로 분리하면 더 깔끔해요.

Line 79~84의 객체가 swatch마다 매 렌더 시 새로 생성됩니다. 공통 상수로 추출하면 가독성과 유지보수성이 좋아집니다.

As per coding guidelines "5. 성능: 불필요한 리렌더링 체크."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/stories/Colors.stories.tsx` around lines 79 - 84, Extract the inline
checkerboard style object used in Colors.stories.tsx (currently created in the
style prop at the swatch render) into a top-level constant (e.g.,
CHECKERBOARD_STYLE) exported/defined outside the component so it is not
recreated on every render; replace the inline object in the style prop with that
constant and ensure any component references (swatch or the component rendering
the style) use CHECKERBOARD_STYLE so readability and re-rendering are improved.
src/stories/Shadows.stories.tsx (1)

38-47: Storybook 메타/스토리 타입을 제네릭으로 묶어 주세요.

Line 38~47은 타입이 너무 느슨해서 추후 스토리 속성 변경 시 컴파일 타임 검증이 약해집니다.

타입 안정화 diff
-const meta: Meta = {
+const meta = {
   title: "Design Tokens/Shadows",
   component: ShadowDoc,
   parameters: { layout: "fullscreen" },
-};
+} satisfies Meta<typeof ShadowDoc>;
 
 export default meta;
-type TStory = StoryObj;
+type TStory = StoryObj<typeof meta>;

As per coding guidelines "4. 타입 안정성: TypeScript 타입의 명확성 확인. any 사용 지양, 제네릭 활용 검토."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/stories/Shadows.stories.tsx` around lines 38 - 47, The Storybook meta and
story types are too loose; make the Meta and StoryObj generics tied to the
ShadowDoc component so compile-time checks work: change the Meta declaration to
use Meta<typeof ShadowDoc> and set TStory = StoryObj<typeof meta> (or directly
type All as StoryObj<typeof meta>), ensuring the exported meta const stays typed
as Meta<typeof ShadowDoc> and the All story uses the StoryObj generic bound to
that meta/component.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/workspace/WorkspaceCard.tsx`:
- Around line 39-41: In WorkspaceCard.tsx the JSX uses the CSS class
"font-body3" which isn't defined in src/index.css; either replace "font-body3"
with the existing "font-body2" in the <div> rendering w.description or add a
matching "font-body3" rule to src/index.css (e.g., the desired size/weight
consistent with your design tokens) so the description text receives the
intended font size/weight — locate the class usage in WorkspaceCard component
and update it or add the new CSS rule in index.css accordingly.

---

Outside diff comments:
In `@src/index.css`:
- Around line 209-213: Add a missing .font-body3 CSS token in src/index.css so
components using the class (e.g., WorkspaceCard.tsx) have a defined style;
insert a .font-body3 rule below .font-body2 with the appropriate
font-size/weight/line-height (or alternatively update usages of "font-body3" in
components to an existing token like "font-body2" if that is the intended fix)
and ensure the class name matches exactly where it's referenced.

---

Nitpick comments:
In `@src/components/common/modal/Modal.tsx`:
- Around line 88-100: 현재 Modal 컴포넌트 내부에서 매 렌더링마다 재생성되는 sizeClasses와
paddingClasses 정적 객체를 컴포넌트 외부로 옮겨 재사용하도록 변경하세요: Modal 컴포넌트 파일 최상단에 const
SIZE_CLASSES = { ... }와 const PADDING_CLASSES = { ... }로 정의하거나 필요 시 별도 모듈로
추출(export)하고 기존 컴포넌트 내부에서 sizeClasses/paddingClasses 대신 해당 상수를 참조하도록 수정하면 됩니다(참조
대상: Modal 컴포넌트 내 sizeClasses, paddingClasses).

In `@src/index.css`:
- Around line 197-201: The .font-heading4 rule currently sets font-weight: 400
which is lighter than .font-body1 (500) and causes frequent local overrides;
update the .font-heading4 CSS rule to font-weight: 500 to align heading weight
with body1 and reduce the need for ad-hoc overrides (unless the design
explicitly requires 400, in which case leave as-is and document that exception).
Ensure you change the font-weight in the .font-heading4 selector in
src/index.css and remove redundant overrides like "font-heading4 font-semibold!"
where applicable.

In `@src/stories/BorderRadius.stories.tsx`:
- Around line 56-65: The Meta/StoryObj generics should be tied to the component
to preserve type safety: change the meta declaration to use "satisfies
Meta<typeof BorderRadiusDoc>" (so Meta is bound to BorderRadiusDoc) and update
the story type to "StoryObj<typeof meta>" (so All: TStory uses the inferred
component types); locate and update the "meta" constant, the "type TStory"
alias, and the "All" export accordingly (symbols: meta, BorderRadiusDoc, TStory,
All, Meta, StoryObj).
- Around line 33-50: Replace the non-semantic grid of divs/spans with a proper
table: convert the header div into a <table> with a <thead> containing <th
scope="col">Token</th><th scope="col">Preview</th><th scope="col">Value</th><th
scope="col">Usage</th>, and convert the radiusTokens.map(...) output into
<tbody> rows (<tr>) where each mapped item uses <td> cells; keep the existing
identifiers (radiusTokens, className, value, usage) and preserve the preview box
by rendering the colored preview inside the Preview <td> (apply the same `w-20
h-12 bg-brand-400 border border-brand-500 ${className}` classes to a child div),
keep the token text styling (text-xs text-gray-400 font-mono) inside the Token
<td>, and ensure each <tr> still uses key={className}; add scope attributes on
header <th>s for proper screen-reader semantics.

In `@src/stories/Colors.stories.tsx`:
- Around line 102-111: The meta and story types are currently untyped which
reduces type safety; update the declarations to use generics tied to the
component (e.g., change Meta to Meta<typeof ColorDoc> for the meta variable and
StoryObj to StoryObj<typeof ColorDoc> for TStory) so that meta and All are
strongly typed against ColorDoc (refer to symbols: Meta, StoryObj, meta, TStory,
All, ColorDoc).
- Around line 79-84: Extract the inline checkerboard style object used in
Colors.stories.tsx (currently created in the style prop at the swatch render)
into a top-level constant (e.g., CHECKERBOARD_STYLE) exported/defined outside
the component so it is not recreated on every render; replace the inline object
in the style prop with that constant and ensure any component references (swatch
or the component rendering the style) use CHECKERBOARD_STYLE so readability and
re-rendering are improved.

In `@src/stories/Shadows.stories.tsx`:
- Around line 38-47: The Storybook meta and story types are too loose; make the
Meta and StoryObj generics tied to the ShadowDoc component so compile-time
checks work: change the Meta declaration to use Meta<typeof ShadowDoc> and set
TStory = StoryObj<typeof meta> (or directly type All as StoryObj<typeof meta>),
ensuring the exported meta const stays typed as Meta<typeof ShadowDoc> and the
All story uses the StoryObj generic bound to that meta/component.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fa65740 and 36ca3f5.

⛔ Files ignored due to path filters (1)
  • src/assets/icon/workspace/building.svg is excluded by !**/*.svg and included by src/**
📒 Files selected for processing (25)
  • src/components/Sidebar/Sidebar.tsx
  • src/components/auth/common/InputActions.tsx
  • src/components/auth/flows/find-email/EnterPhoneStep.tsx
  • src/components/auth/flows/find-email/ShowEmailResultStep.tsx
  • src/components/auth/flows/reset-password/EmailVerificationStep.tsx
  • src/components/auth/flows/signup/EnterEmailStep.tsx
  • src/components/auth/intro/IntroAIAnalytics.tsx
  • src/components/auth/intro/IntroAdManagement.tsx
  • src/components/auth/skeleton/AuthFormSkeleton.tsx
  • src/components/auth/skeleton/LoginPageSkeleton.tsx
  • src/components/auth/skeleton/SignupEmailStepSkeleton.tsx
  • src/components/auth/skeleton/SignupPageSkeleton.tsx
  • src/components/common/alert/Alert.tsx
  • src/components/common/dropdownmenu/DropdownMenu.tsx
  • src/components/common/modal/Modal.tsx
  • src/components/modal/privacyModal/AgreementItem.tsx
  • src/components/workspace/WorkspaceCard.tsx
  • src/index.css
  • src/pages/auth/Login.tsx
  • src/pages/auth/Signup.tsx
  • src/pages/workspace/Workspace.tsx
  • src/pages/workspace/WorkspaceSetting.tsx
  • src/stories/BorderRadius.stories.tsx
  • src/stories/Colors.stories.tsx
  • src/stories/Shadows.stories.tsx
✅ Files skipped from review due to trivial changes (5)
  • src/components/auth/flows/reset-password/EmailVerificationStep.tsx
  • src/components/auth/skeleton/SignupEmailStepSkeleton.tsx
  • src/components/modal/privacyModal/AgreementItem.tsx
  • src/components/auth/intro/IntroAIAnalytics.tsx
  • src/components/auth/flows/find-email/ShowEmailResultStep.tsx
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/pages/workspace/Workspace.tsx
  • src/pages/workspace/WorkspaceSetting.tsx
  • src/pages/auth/Signup.tsx

@Seojegyeong
Copy link
Collaborator Author

Seojegyeong commented Feb 26, 2026

P4: 저희 현재 컴포넌트 변경사항을 확인하려면 로컬에서 직접 실행해야 하는게 불편한 것 같습니다ㅠㅠ Storybook만 별도 배포하면 어떨까요?? 로컬 환경 없이도 브라우저에서 바로 확인할 수 있고, PR마다 프리뷰 URL이 자동으로 붙어 리뷰 효율도 높아질 것 같습니다!

Seojegyeong and others added 3 commits February 26, 2026 22:19
rounded-xl/2xl → rounded-component-md/lg
drop-shadow-md → shadow-Soft
hover:bg-[#F6F6F6] → hover:bg-bg-surface
border-[#F6F6F6] → border-bg-surface
max-w-[232px] → max-w-58

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
src/components/Sidebar/Sidebar.tsx (1)

1-1: 주석 처리된 코드 정리를 고려해 주세요.

현재 사용되지 않는 코드가 주석으로 남아 있습니다:

  • Line 1: NavLink import
  • Line 13: Logo import
  • Lines 54-71: 로고 영역 전체

향후 로고 기능을 다시 사용할 계획이라면 별도 이슈로 추적하고, 사용 계획이 없다면 코드를 제거하는 것이 유지보수에 좋습니다. 주석 처리된 코드가 많으면 가독성이 떨어지고 코드 히스토리 파악이 어려워질 수 있습니다.

🧹 주석 코드 제거 제안
-// import { NavLink } from "react-router-dom";
 import { twMerge } from "tailwind-merge";

 import { footerNav, mainNav } from "@/constants/sidebarNav";

 import { useSidebar } from "@/hooks/sidebar/useSidebar";

 import { SidebarItem } from "./SidebarItem";
 import { SubMenu } from "./SubMenu";

 import ChevronIcon from "@/assets/icon/common/chevron-up.svg?react";
 import CollapseIcon from "@/assets/icon/sidebar/chevron-left.svg?react";
-// import Logo from "@/assets/logo/symbol-color.svg?react";

로고 섹션(Lines 54-71)도 함께 제거하거나, 필요시 별도 브랜치/이슈로 관리하는 것을 권장합니다.

Also applies to: 13-13, 54-71

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/Sidebar/Sidebar.tsx` at line 1, 주의: Sidebar 컴포넌트에 남아 있는 사용하지
않는 주석 코드를 정리하세요—구체적으로 주석 처리된 import 문들(NavLink 및 Logo)과 주석 처리된 로고 JSX 블록(로고 영역
전체)을 제거하거나, 향후 사용 예정이라면 별도 이슈/브랜치로 추적하도록 표시하세요; 파일 내 Sidebar 컴포넌트에서 주석화된 NavLink
import, Logo import 및 로고 섹션을 찾아 삭제하거나 이슈 링크로 대체해 코드베이스 가독성과 유지보수성을 회복하세요.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/components/Sidebar/Sidebar.tsx`:
- Line 1: 주의: Sidebar 컴포넌트에 남아 있는 사용하지 않는 주석 코드를 정리하세요—구체적으로 주석 처리된 import
문들(NavLink 및 Logo)과 주석 처리된 로고 JSX 블록(로고 영역 전체)을 제거하거나, 향후 사용 예정이라면 별도 이슈/브랜치로
추적하도록 표시하세요; 파일 내 Sidebar 컴포넌트에서 주석화된 NavLink import, Logo import 및 로고 섹션을 찾아
삭제하거나 이슈 링크로 대체해 코드베이스 가독성과 유지보수성을 회복하세요.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 36ca3f5 and 7d0f7fa.

📒 Files selected for processing (3)
  • src/components/Sidebar/Sidebar.tsx
  • src/components/Sidebar/SubMenu.tsx
  • src/components/workspace/WorkspaceCard.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/components/workspace/WorkspaceCard.tsx

<div className="min-w-0">
<div className="font-heading3 text-text-main truncate">{w.name}</div>
<div className="font-body1 text-text-main mt-1 truncate">
<div className="font-heading4 font-semibold! text-text-main truncate">
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: WorkspaceCard 구현할때, font-heading3을 text크기를 추후에 키운다는걸 전제로 두고, font-heading3로 구현했었습니다! font-heading3으로 유지해도 좋을것같아요!

>
<div className="px-2">
<h2 className="font-heading3 text-text-main mb-2">
<h2 className="font-heading4 text-text-main mb-2">
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: 이부분도 heading3으로 유지하면 좋을것같습니다!

<div className="bg-white border border-gray-100 rounded-component-lg p-8 shadow-sm">
<h2 className="font-heading3 text-text-main">기본 정보</h2>
<div className="bg-white border border-gray-100 rounded-component-lg p-8 shadow-Soft">
<h2 className="font-heading4 text-text-main">기본 정보</h2>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: 이부분도 heading3으로 유지하면 좋을것같습니다!

<WarningIcon />
<div>
<div className="text-status-red font-heading3">
<div className="text-status-red font-heading4">
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: 이부분도 heading3으로 유지하면 좋을것같습니다!

@jjjsun
Copy link
Collaborator

jjjsun commented Feb 26, 2026

P4: 앞으로 다른 스토리북도 계속 추가되고, 기존스토리북 수정되는걸 생각하면, 배포하는 방법도 좋을것같아요!

@YermIm
Copy link
Collaborator

YermIm commented Feb 26, 2026

P4: 그것도 좋습니다! 수고하셨습니다 :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🎨 Html&css 마크업 & 스타일링 ⚙ Setting 개발 환경 세팅

Projects

None yet

Development

Successfully merging this pull request may close these issues.

♻️ [Refactor] index.css 정리 및 스토리북 디자인 시스템 정의

3 participants