Skip to content

디자인 시스템 피그마 코멘트 반영, HACK 주석 해소#62

Merged
yoouyeon merged 11 commits into
developfrom
design/MD-46
Jun 7, 2026
Merged

디자인 시스템 피그마 코멘트 반영, HACK 주석 해소#62
yoouyeon merged 11 commits into
developfrom
design/MD-46

Conversation

@yoouyeon

@yoouyeon yoouyeon commented Jun 7, 2026

Copy link
Copy Markdown
Contributor

💻 작업 내용

피그마 코멘트를 바탕으로 디자인 시스템 관련 수정 가능한 항목들을 적용했습니다.

StarChip

  • 비활성 별 색상을 하드코딩(#d2d4d5)에서 fill.alternative 토큰으로 교체

Chip (구 NameChip)

  • NameChip → Chip으로 리네이밍 (피그마 컴포넌트명 변경 반영)
  • onClick prop 추가: 있으면 , 없으면
    로 렌더링
  • ExpenseAmountInput의 퀵추가 버튼(+1만 등)을 Button에서 Chip으로 교체
  • black variant HACK 주석 제거 (피그마에 공식 추가 확인)
  • AsButton 스토리 추가

CharacterItem (잠긴 캐릭터 카드)

  • border 색상을 하드코딩(#d2d4d5)에서 border.normal 토큰으로 교체
  • 카드 전체 opacity: 0.5 적용 (피그마 반영)
  • 자물쇠 아이콘 색상을 gray.90(#c7c9cb)으로 수정

ExpenseMemberItem

  • 비활성 색상을 fill.normal-disable에서 fg.normal-disable로 교체

Input

  • helpText prop 추가
  • error 상태에서 SystemDanger 아이콘 표시, 그 외 상태는 텍스트만 표시
  • WithHelpText 스토리 추가

Button

  • 버튼 Radius 수정 (좀 더 각지게 변경됨 (full -> lg/md)
  • 스토리 수정 (중복된 disabled 스토리 제거, showcase 스토리 깨지는 부분 수정)

👻 리뷰 요구사항

아직 HACK으로 남겨둔 주석이 있습니다..! 수진님 코멘트 받으면 또 이어서 작업해서 올리겠습니다

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 입력 필드에 도움말 텍스트 및 오류 아이콘 표시 기능 추가
    • 칩 컴포넌트에 클릭 가능 상태와 동적 스타일 지원 추가
  • 개선사항

    • 여러 UI에서 칩 컴포넌트 통합 적용
    • 디자인 시스템의 색상 토큰 표준화
    • 잠금된 캐릭터 카드에 투명도 효과 추가

@yoouyeon yoouyeon added the 🎨 Design 디자인 관련 작업 label Jun 7, 2026
@github-actions

github-actions Bot commented Jun 7, 2026

Copy link
Copy Markdown

📝 관련 이슈

MD-46

@github-actions github-actions Bot requested a review from ongheong June 7, 2026 12:01
@coderabbitai

coderabbitai Bot commented Jun 7, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@yoouyeon, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 35 minutes and 32 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: be0e24b6-87cd-43a2-89c8-b1af38d76e2a

📥 Commits

Reviewing files that changed from the base of the PR and between cc9aa94 and 09b0c5a.

📒 Files selected for processing (3)
  • .github/workflows/publish-storybook.yml
  • src/shared/design-system/ui/Button/Button.stories.tsx
  • src/shared/design-system/ui/Button/Button.styles.ts
📝 Walkthrough

전체 요약

이 PR은 설계 시스템의 Chip 컴포넌트를 새로 도입하여 기존 NameChip을 대체하고, Input 컴포넌트에 헬프 텍스트 기능을 추가하며, 여러 컴포넌트의 색상 토큰을 일관성 있게 정리합니다.

변경 사항

Chip 컴포넌트 도입 및 마이그레이션

Layer / File(s) 요약
Chip 컴포넌트 기반 구현 및 문서화
src/shared/design-system/ui/Chip/Chip.tsx, Chip.styles.ts, Chip.stories.tsx, index.ts, src/shared/design-system/ui/index.ts
Chip 컴포넌트를 label, variant, size, onClick 프롭으로 구현하고, $clickable 조건부 스타일을 추가하며, Showcase와 AsButton 스토리를 작성합니다.
NameChip 제거 및 재내보내기 정리
src/shared/design-system/ui/NameChip/index.ts
설계 시스템의 NameChip 재내보내기를 제거합니다.
SettlementSummary와 ExpenseTimelineContent에서 Chip 사용
src/pages/confirmStep/ui/SettlementSummary/SettlementSummary.tsx, src/pages/expenseDetail/ui/ExpenseTimelineContent/index.tsx
멤버 칩 렌더링을 NameChip에서 Chip으로 교체하고 import를 업데이트합니다.
ExpenseAmountInput의 Button을 Chip으로 변경
src/features/expense-management/ui/ExpenseAmountInput/ExpenseAmountInput.tsx
빠른 추가 버튼과 전체삭제 버튼을 Chip 컴포넌트로 전환하고 핸들러를 연결합니다.

Input 컴포넌트 헬프 텍스트 기능

Layer / File(s) 요약
Input 헬프 텍스트 스타일 및 렌더링 구현
src/shared/design-system/ui/Input/Input.tsx, Input.styles.ts
helpText 프롭을 추가하고, HelpTextContainer, HelpText, HelpTextIconWrapper 스타일 컴포넌트를 구현하며, 에러 상태에서 SvgSystemDanger 아이콘을 함께 표시합니다.
Input 헬프 텍스트 스토리북 문서
src/shared/design-system/ui/Input/Input.stories.tsx
meta.argTypeshelpText 컨트롤을 추가하고 WithHelpText 스토리를 작성합니다.

설계 토큰 일관성 업데이트

Layer / File(s) 요약
색상 토큰 및 스타일 정규화
src/features/character-management/ui/CharacterItem/index.styles.ts, index.tsx, src/features/character-management/ui/StarChip/StarChip.styles.ts, src/pages/expenseDetail/ui/ExpenseMemberItem/index.style.ts
LockedCharacterCard의 테두리를 토큰 기반으로 변경하고 불투명도를 추가하며, 아이콘 색상과 컴포넌트 토큰 참조를 일관성 있게 정규화합니다.

관련 PR

  • moddo-kr/moddo-frontend#44: 이 PR의 SettlementSummary 컴포넌트 추가 작업에서 NameChip을 사용하던 부분을 본 PR에서 Chip으로 교체합니다.
  • moddo-kr/moddo-frontend#49: 설계 시스템의 공용 UI 재구성 작업과 같은 범위의 Chip/NameChip 마이그레이션을 수행합니다.
  • moddo-kr/moddo-frontend#54: 본 PR의 CharacterItem Certified 아이콘 색상 업데이트는 해당 PR의 SvgCertified 컴포넌트 currentColor 상속 리팩터링과 연계됩니다.

🐰 새로운 칩이 반짝이며 나타나고,

헬프 텍스트는 친절하게 속삭이네.

토큰으로 색을 맞추어,

낡은 칩을 작별하며,

설계 시스템이 춤을 춘다! ✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch design/MD-46

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.

@github-actions

github-actions Bot commented Jun 7, 2026

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

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

⚠️ Outside diff range comments (1)
src/shared/design-system/ui/Chip/Chip.stories.tsx (1)

61-83: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

AsButton 스토리에서 variant="disabled" + onClick 조합을 제거해주세요.

AsButton 스토리가 모든 variant(disabled 포함)에 대해 onClick 핸들러를 추가하고 있습니다(line 76). variant="disabled"인 칩이 클릭 가능한 것은 접근성 안티패턴입니다. 사용자는 시각적으로 비활성화된 요소가 상호작용할 수 없다고 기대하기 때문입니다.

Storybook 스토리는 개발자들이 참고하는 문서 역할을 하므로, 올바른 사용 패턴만 보여주는 것이 중요합니다.

[accessibility]

🛡️ 수정 제안: disabled variant를 AsButton 스토리에서 제외
 export const AsButton: Story = {
   render: () => (
     <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
       {SIZES.map((size) => (
         <div
           key={size}
           style={{ display: 'flex', gap: 8, alignItems: 'center' }}
         >
           <span style={{ width: 16, fontSize: 12 }}>{size}</span>
-          {VARIANTS.map((variant) => (
+          {VARIANTS.filter(v => v !== 'disabled').map((variant) => (
             <Chip
               key={variant}
               variant={variant}
               size={size}
               label="김모또"
               onClick={() => alert(`${variant} 클릭`)}
             />
           ))}
         </div>
       ))}
     </div>
   ),
 };
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/design-system/ui/Chip/Chip.stories.tsx` around lines 61 - 83, The
AsButton story is assigning onClick to every variant including
variant="disabled", which is an accessibility anti-pattern; update the AsButton
render so when mapping VARIANTS for clickable Chips you skip or filter out the
"disabled" variant (or conditionally omit the onClick prop for Chip when variant
=== "disabled"), ensuring Chip instances with variant="disabled" are rendered
non-interactive; refer to AsButton, VARIANTS, SIZES, Chip, and the onClick prop
to locate and change the mapping logic.
🧹 Nitpick comments (1)
src/shared/design-system/ui/Input/Input.tsx (1)

73-82: ⚡ Quick win

접근성 향상을 위해 aria-describedby 연결을 고려하세요.

helpText를 input과 aria-describedby 속성으로 연결하면 스크린 리더 사용자가 입력 필드와 관련된 도움말 메시지를 더 잘 인식할 수 있습니다.

♿ 제안하는 개선 방안
 const Input = forwardRef<HTMLInputElement, InputProps>(function Input(
   {
     id: idProp,
     label,
     required = false,
     placeholder,
     state = 'default',
     variant = 'default',
     trailingIcon,
     helpText,
     value,
     onChange,
     onClick,
     ...rest
   },
   ref
 ) {
   const generatedId = useId();
+  const helpTextId = useId();
   const inputId = idProp ?? generatedId;
   const isDisabled = state === 'disabled';
   const isPrice = variant === 'price';

   return (
     <S.Container>
       {label && (
         <S.LabelRow>
           <S.LabelText htmlFor={inputId}>{label}</S.LabelText>
           {required && <S.Required>*</S.Required>}
         </S.LabelRow>
       )}
       <S.InputWrapper $state={state} $variant={variant}>
         <S.StyledInput
           ref={ref}
           id={inputId}
           $variant={variant}
           placeholder={placeholder}
           required={required}
           {...rest}
           value={value}
           onChange={onChange}
           onClick={onClick}
           disabled={isDisabled}
+          aria-describedby={helpText && variant === 'default' ? helpTextId : undefined}
         />
         {isPrice && <S.PriceUnit>원</S.PriceUnit>}
         {!isPrice && trailingIcon && (
           <S.IconWrapper
             $disabled={isDisabled}
             onClick={!isDisabled ? onClick : undefined}
           >
             {trailingIcon}
           </S.IconWrapper>
         )}
       </S.InputWrapper>
       {helpText && variant === 'default' && (
-        <S.HelpTextContainer>
+        <S.HelpTextContainer id={helpTextId}>
           {state === 'error' && (
             <S.HelpTextIconWrapper>
               <SvgSystemDanger width={18} height={18} />
             </S.HelpTextIconWrapper>
           )}
           <S.HelpText $state={state}>{helpText}</S.HelpText>
         </S.HelpTextContainer>
       )}
     </S.Container>
   );
 });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/design-system/ui/Input/Input.tsx` around lines 73 - 82, Add an
accessible connection between the input and its help text by giving the rendered
help text element (S.HelpText inside S.HelpTextContainer) a stable id (e.g.,
`${id}-help` or derive from the Input component's id) and wiring that id into
the input element's aria-describedby when helpText is present and variant ===
'default'; update the Input component render/props where the input element is
created (and any relevant prop like id on the component) to include
aria-describedby={helpText ? helpId : undefined} so screen readers will
associate the help text with the input.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@src/shared/design-system/ui/Chip/Chip.stories.tsx`:
- Around line 61-83: The AsButton story is assigning onClick to every variant
including variant="disabled", which is an accessibility anti-pattern; update the
AsButton render so when mapping VARIANTS for clickable Chips you skip or filter
out the "disabled" variant (or conditionally omit the onClick prop for Chip when
variant === "disabled"), ensuring Chip instances with variant="disabled" are
rendered non-interactive; refer to AsButton, VARIANTS, SIZES, Chip, and the
onClick prop to locate and change the mapping logic.

---

Nitpick comments:
In `@src/shared/design-system/ui/Input/Input.tsx`:
- Around line 73-82: Add an accessible connection between the input and its help
text by giving the rendered help text element (S.HelpText inside
S.HelpTextContainer) a stable id (e.g., `${id}-help` or derive from the Input
component's id) and wiring that id into the input element's aria-describedby
when helpText is present and variant === 'default'; update the Input component
render/props where the input element is created (and any relevant prop like id
on the component) to include aria-describedby={helpText ? helpId : undefined} so
screen readers will associate the help text with the input.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 3ea7f4ee-ea9b-4651-bf92-d2b1b5fe3493

📥 Commits

Reviewing files that changed from the base of the PR and between 9fb4fb7 and cc9aa94.

📒 Files selected for processing (17)
  • src/features/character-management/ui/CharacterItem/index.styles.ts
  • src/features/character-management/ui/CharacterItem/index.tsx
  • src/features/character-management/ui/StarChip/StarChip.styles.ts
  • src/features/expense-management/ui/ExpenseAmountInput/ExpenseAmountInput.tsx
  • src/pages/confirmStep/ui/SettlementSummary/SettlementSummary.tsx
  • src/pages/expenseDetail/ui/ExpenseMemberItem/index.style.ts
  • src/pages/expenseDetail/ui/ExpenseTimelineContent/index.tsx
  • src/shared/design-system/ui/Chip/Chip.stories.tsx
  • src/shared/design-system/ui/Chip/Chip.styles.ts
  • src/shared/design-system/ui/Chip/Chip.tsx
  • src/shared/design-system/ui/Chip/index.ts
  • src/shared/design-system/ui/Input/Input.stories.tsx
  • src/shared/design-system/ui/Input/Input.styles.ts
  • src/shared/design-system/ui/Input/Input.tsx
  • src/shared/design-system/ui/NameChip/NameChip.tsx
  • src/shared/design-system/ui/NameChip/index.ts
  • src/shared/design-system/ui/index.ts
💤 Files with no reviewable changes (2)
  • src/shared/design-system/ui/NameChip/NameChip.tsx
  • src/shared/design-system/ui/NameChip/index.ts

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 7, 2026

Copy link
Copy Markdown

Deploying moddo-frontend with  Cloudflare Pages  Cloudflare Pages

Latest commit: 09b0c5a
Status: ✅  Deploy successful!
Preview URL: https://a4a52869.moddo-frontend.pages.dev
Branch Preview URL: https://design-md-46.moddo-frontend.pages.dev

View logs

@yoouyeon yoouyeon merged commit fdf443a into develop Jun 7, 2026
4 checks passed
@yoouyeon yoouyeon deleted the design/MD-46 branch June 7, 2026 12:45
@yoouyeon yoouyeon mentioned this pull request Jun 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🎨 Design 디자인 관련 작업

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant