Skip to content

[REFACTOR] 모달·생성하기·시간 추가 버튼을 공용 Button으로 교체 - #317

Merged
ehye1 merged 12 commits into
developfrom
refactor/ui/316-apply-common-button
Oct 10, 2026
Merged

ehye1 merged 12 commits into
developfrom
refactor/ui/316-apply-common-button

Conversation

@ehye1

@ehye1 ehye1 commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

ISSUE 🔗

close #316



What is this PR? 🔍

#305에서 만든 공용 Button을 실제 화면에 적용했습니다. 생성하기 버튼, 확인/취소 형태의 모든 모달 버튼, 시간 추가 모달의 프리셋 칩을 Button으로 교체하고, 사용처가 없어진 ModalButton·CreateButton을 제거했습니다.

생성하기 버튼

  • 할 일 생성·태그 생성 모달의 CreateButton을 Button primary fill m으로 교체했습니다.

모달 하단 버튼

  • 확인/취소 형태의 모달을 모두 왼쪽 secondary outline lg, 오른쪽 primary fill lg로 통일했습니다.

온보딩 버튼

  • 이전·다음·시작하기 버튼을 Button m으로 교체했습니다. 다음 버튼은 활성일 때 primary, 비활성일 때 secondary이고, 비활성용 화살표 아이콘(chevron-small-right-disable.svg)을 추가했습니다. 활성 조건은 기존과 같습니다.

시간 추가 모달 칩

  • 변경 요약: +10M / +30M / +1H / 직접입력 칩을 Button secondary fill m으로 교체했습니다.
  • 선택 상태를 aria-pressed로 표현한 이유:
    • 칩에는 접근성 때문에 원래 aria-pressed가 필요합니다. 이 값 하나로 의미("눌린 토글 버튼")와 모양이 같이 정해집니다.
    • Button의 secondary fill에 aria-pressed: 스타일(흰 배경 + blue-300 테두리)을 추가해, 앞으로 토글 버튼이 생겨도 aria-pressed만 넘기면 같은 모양이 됩니다.
    • selected prop을 추가하는 방법도 검토했습니다. 하지만 secondary fill에만 의미가 있는 prop이 생기고, 접근성 속성과 상태를 이중으로 관리하게 돼서 제외했습니다.
    • aria-pressed를 넘기지 않는 기존 버튼에는 영향이 없습니다.
  • 글자색: 칩 글자색은 이 화면에서만 timo-black(#121212)이라 className으로 지정했습니다. 다른 secondary 버튼은 피그마대로 gray-900을 유지합니다.
  • 직접입력 박스:
    • 기존에는 직접입력을 선택해도 입력창에서 포커스가 빠지면 테두리가 회색(gray-500)으로 돌아가, 다른 선택된 칩과 다르게 보였습니다.
    • 박스가 보이는 것 자체가 선택 상태이므로, 테두리를 항상 blue-300으로 두어 선택된 칩과 같은 모양이 되도록 했습니다.
    • 대신 포커스 표시가 사라져서, 포커스일 때는 Button과 같은 포커스 링(blue-300, 2px, 흰 틈 2px)을 더했습니다.
  • 자동 포커스: 직접입력을 누르면 바로 입력할 수 있도록 input에 포커스를 옮깁니다. autoFocus는 jsx-a11y/no-autofocus에 걸려서, 모듈 레벨 callback ref(focusOnMount)로 마운트 시 한 번만 포커스되게 했습니다.



To Reviewers

  • 시간 칩 선택 스타일에서 변경되는 부분은 확인 후 반영하겠습니다!



Screenshot 📷

image

Test Checklist ✔

  • pnpm check-types 통과
  • pnpm lint 통과
  • pnpm build 통과
  • Storybook에서 선택 칩·모달 하단 버튼 확인
  • 앱에서 생성하기·모달 버튼·시간 추가 모달(칩 선택, 직접입력 포커스) 확인
  • 모바일(375px) 레이아웃 확인

ehye1 added 7 commits October 7, 2026 13:16
할 일 생성·태그 생성 모달의 CreateButton을 공용 Button(primary fill m)으로 교체했습니다.
Modal.BorderButton은 secondary outline lg, Modal.FillButton은 primary fill lg Button을 사용하도록 교체했습니다.
ModalButton을 직접 사용하던 모달을 공용 Button으로 교체하고, 시간 추가하기 버튼의 비활성 스타일 덮어쓰기와 중복 className을 제거했습니다.
공용 Button으로 교체되어 사용처가 없어진 ModalButton과 CreateButton 컴포넌트, 스토리, export를 제거했습니다.
secondary fill Button에 aria-pressed일 때 흰 배경과 파란 테두리로 바뀌는 선택 스타일과 Pressed 스토리를 추가했습니다.
시간 추가 모달의 프리셋·직접입력 칩을 공용 Button(secondary fill m)으로 교체하고, 직접입력 선택 시 입력창에 바로 포커스되며 선택 상태를 파란 테두리로 유지하도록 했습니다.
테두리가 항상 파란색이 되면서 사라진 포커스 표시를 Button과 같은 포커스 링으로 보완했습니다.
@ehye1 ehye1 added ⏰ Timo-web Timo 웹 서비스 ⌚ Timo-Design-system Timo 디자인 시스템 ♻ Refactor 기능 개선 및 리팩토링 작업 ♥️ 혜원 혜원양 labels Oct 7, 2026
@ehye1 ehye1 self-assigned this Oct 7, 2026
@vercel

vercel Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
timo-client-timo-web Ready Ready Preview Oct 10, 2026 9:52am UTC

@coderabbitai

coderabbitai Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository: Team-Timo/Timo-client/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 4ce6933a-997b-4827-9710-f7d90488522e

📥 Commits

Reviewing files that changed from the base of the PR and between 6c2bfd9 and ec5b6eb.


⛔ Files ignored due to path filters (1)
  • packages/timo-design-system/src/icons/source/chevron-small-right-disable.svg is excluded by !**/*.svg

📒 Files selected for processing (3)
  • apps/timo-web/app/[locale]/onboarding/_components/OnboardingButton.tsx
  • apps/timo-web/components/timer/TimerExtendModalPanel.tsx
  • apps/timo-web/components/todo-modal/create/CreateTodoModalContent.tsx

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.



Walkthrough

모달·타이머·생성·온보딩 화면의 버튼을 공용 Button으로 교체합니다. secondary fill 버튼에 aria-pressed 스타일과 Storybook 예시를 추가하고, CreateButton과 ModalButton을 제거합니다.

Changes

공용 Button 전환

Layer / File(s) Summary
공용 버튼 스타일과 기존 컴포넌트 정리
packages/timo-design-system/src/components/button/button/*, packages/timo-design-system/src/components/button/create-button/*, packages/timo-design-system/src/components/button/modal-button/*, packages/timo-design-system/src/components/index.ts
secondary fill 버튼에 aria-pressed 스타일과 Storybook 예시를 추가합니다. CreateButton과 ModalButton의 구현, 스토리, 공개 내보내기를 제거합니다.
공통 모달과 모달 화면 버튼 교체
packages/timo-design-system/src/components/layout/modal/Modal.tsx, apps/timo-web/app/[locale]/(main)/settings/..., apps/timo-web/components/timer/*
공통 모달과 설정·타이머 모달의 버튼을 Button으로 교체합니다. 타이머 사용자 지정 입력에 마운트 포커스를 연결하고 일부 버튼의 클래스 지정을 제거합니다.
생성·온보딩 화면 버튼 교체
apps/timo-web/components/tag/CreateTagModalContainer.tsx, apps/timo-web/components/todo-modal/create/CreateTodoModalContent.tsx, apps/timo-web/app/[locale]/onboarding/_components/OnboardingButton.tsx
태그·할 일 생성 버튼과 온보딩 버튼을 Button으로 교체합니다. 생성 비활성화 조건과 온보딩 버튼의 활성 조건을 유지합니다.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Refactor

Merge Risk | ⚪ Minimal · up to ec5b6

Merge Risk: ⚪ Minimal · up to ec5b6

This change swaps existing buttons for the shared Button component and keeps their behavior. No concrete merge-blocking risk was identified.

Security Architecture Review

Security architecture risk: 🔵 Low · up to ec5b6

The change is confined to shared UI controls in a private package. Existing callbacks, validation, disabled conditions, and non-submitting button behavior are preserved. No introduced security issue was established, but end-to-end authorization and duplicate-request guarantees could not be verified.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The verified reachability change is limited to UI component dependencies. Onboarding navigation and completion retain their existing callers and guards; the separate calendar OAuth authorization action is not newly reachable through OnboardingButton. Backend tenant and asset isolation cannot be inferred from this client-side comparison.

Trust Boundaries and Controls

  • observed — User-entered todo data still passes through the client schema and existing request mapping to POST /api/v1/todos using authenticated transport. This establishes the unchanged client path, not server-side ownership, authorization, atomicity, or idempotency guarantees.

Resilience and Maintainability Implications

  • observed — Todo creation already reset fields and closed the modal immediately after dispatch, without a mutation-pending disable. Success invalidates cached views and failure produces an error toast. Repeated-request and failed-submission recovery limitations predate this PR; no increased exposure was established, and server duplicate protection remains unknown.

Pre-merge checks | Passed 4 | Failed 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check Warning #316의 범위는 모달, 생성 버튼, 시간 추가 버튼의 공용 Button 전환입니다. OnboardingButton의 이전·다음·시작 버튼 교체는 #316에 연결된 요구사항이나 관련 코딩 목표로 확인되지 않습니다. 커밋 요약에 포함된 .claude/launch.json 삭제도 로컬 개발 환경 파일 정리로, #316의 기능 구현과 연결되지 않습니다… OnboardingButton 변경과 .claude/launch.json 삭제를 이 PR에서 제거하세요. 해당 변경이 필요하면 별도의 이슈에 연결한 PR로 분리하세요.
✅ Passed checks (4 passed)
Check name Status Explanation
Description check Passed 설명은 공용 Button 적용, 기존 버튼 컴포넌트 제거, 스타일 변경, 접근성 처리 및 테스트 결과를 구체적으로 설명합니다. 변경 사항과 직접 관련되어 있습니다.
Title check Passed 제목은 모달, 생성하기, 시간 추가 버튼을 공용 Button으로 교체한 핵심 변경을 간결하게 설명합니다.
Linked Issues check Passed 직접 연결된 활성 이슈는 #316입니다. 생성 버튼은 primary fill m으로 교체되었습니다. 모달 버튼은 secondary outline lg와 primary fill lg를 사용합니다. 탈퇴, 캘린더 연결 해제, 타이머 종료, 시간 추가 모달의 직접 ModalButton 사용을 교체했습니다. 시간 추가 버튼의 별도 비활성 스타일을 제…
Docstring Coverage Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 1…

Full details: Out of Scope Changes check

Explanation

#316의 범위는 모달, 생성 버튼, 시간 추가 버튼의 공용 Button 전환입니다. OnboardingButton의 이전·다음·시작 버튼 교체는 #316에 연결된 요구사항이나 관련 코딩 목표로 확인되지 않습니다. 커밋 요약에 포함된 .claude/launch.json 삭제도 로컬 개발 환경 파일 정리로, #316의 기능 구현과 연결되지 않습니다.


  • Fix all pre-merge checks with AI
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

@github-actions

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Storybook Preview

항목 링크
Storybook 열기
Chromatic 빌드 확인

마지막 업데이트: 2026-10-10 09:52 UTC

@github-actions

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Timo Performance Report

Bundle Size — timo-web
라우트 크기 First Load JS
/[locale]/home 277.85 kB 🔴 483.66 kB
/[locale]/today 262.10 kB 🔴 467.91 kB
/[locale]/focus 223.45 kB 🔴 429.27 kB
/[locale]/settings 229.94 kB 🔴 435.76 kB
/[locale]/statistics 211.79 kB 🔴 417.61 kB
/[locale]/[...rest] 0 B 🟡 205.82 kB
/[locale]/login 282.60 kB 🔴 488.42 kB
/[locale]/oauth/calendar/callback 121.38 kB 🟡 327.19 kB
/[locale]/oauth/callback 121.04 kB 🟡 326.85 kB
/[locale]/onboarding 295.37 kB 🔴 501.18 kB
/[locale] 120.35 kB 🟡 326.17 kB
/[locale]/policy 121.32 kB 🟡 327.14 kB
/robots.txt/route 0 B 🟡 205.82 kB
/sitemap.xml/route 0 B 🟡 205.82 kB

공유 번들: 205.82 kB
🟢 < 200kB  |  🟡 < 350kB  |  🔴 ≥ 350kB (First Load JS · gzip)

Lighthouse — timo-web
URL Perf A11y LCP CLS TBT
/en/home 🔴 62 🟢 96 🔴 16.3s 🟢 0.000 🟡 490ms
/en/today 🔴 61 🟢 96 🔴 16.3s 🟢 0.000 🟡 502ms
/en/focus 🔴 63 🟢 96 🔴 16.1s 🟢 0.000 🟡 435ms
/en/statistics 🔴 65 🟢 96 🔴 16.1s 🟢 0.000 🟡 399ms

Perf ≥ 70 / A11y ≥ 85 목표
LCP 🟢 < 2.5s 🟡 < 4s 🔴 ≥ 4s  |  CLS 🟢 < 0.1 🟡 < 0.25 🔴 ≥ 0.25  |  TBT 🟢 < 200ms 🟡 < 600ms 🔴 ≥ 600ms

Image Optimization — timo-web
파일 크기 포맷 상태
favicon.png 27.84 kB PNG ⚠️ 🟢
images/google-calendar.png 36.20 kB PNG ⚠️ 🟢
images/google-logo.png 26.79 kB PNG ⚠️ 🟢
og.png 437.44 kB PNG ⚠️ 🟡

총 4개 · 528.28 kB  |  🟢 < 200KB  |  🟡 < 500KB  |  🔴 ≥ 500KB
⚠️ 4개 파일 WebP/AVIF 변환 권장

측정 커밋: 017f9f4

@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.

🔇 Additional comments (1)
packages/timo-design-system/src/components/button/button/Button.stories.tsx-148-148 (1)

148-148: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

⚠️ Unverified finding
Verification ran but could not confirm this finding. It is shown for review, not as a verified issue.

Pressed 스토리에서 Controls를 활성화해 주세요.

현재 설정은 Controls 패널을 비활성화합니다. 이 스토리는 aria-pressed에 따른 스타일을 보여주므로, 해당 값을 Controls에서 바꿀 수 있도록 args와 argTypes를 연결해 주세요. Storybook의 공식 Args 문서를 구현 참고 자료로 권장합니다.

As per coding guidelines, “Controls 패널에서 props가 조작 가능한가”.

Source: Coding guidelines


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Repository: Team-Timo/Timo-client/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 8e22be9a-869e-4342-a184-b44557fb54c5
📥 Commits

Reviewing files that changed from the base of the PR and between 1d3ee6d and 6c2bfd9.

📒 Files selected for processing (16)
  • apps/timo-web/app/[locale]/(main)/settings/_components/account/SettingsCalendarDisconnectModal.tsx
  • apps/timo-web/app/[locale]/(main)/settings/_containers/withdrawal/SettingsWithdrawModalContainer.tsx
  • apps/timo-web/components/tag/CreateTagModalContainer.tsx
  • apps/timo-web/components/timer/TimerCompleteModalPanel.tsx
  • apps/timo-web/components/timer/TimerEndModalPanel.tsx
  • apps/timo-web/components/timer/TimerExtendModalPanel.tsx
  • apps/timo-web/components/timer/TimerStopModalPanel.tsx
  • apps/timo-web/components/todo-modal/create/CreateTodoModalContent.tsx
  • packages/timo-design-system/src/components/button/button/Button.stories.tsx
  • packages/timo-design-system/src/components/button/button/Button.tsx
  • packages/timo-design-system/src/components/button/create-button/CreateButton.stories.tsx
  • packages/timo-design-system/src/components/button/create-button/CreateButton.tsx
  • packages/timo-design-system/src/components/button/modal-button/ModalButton.stories.tsx
  • packages/timo-design-system/src/components/button/modal-button/ModalButton.tsx
  • packages/timo-design-system/src/components/index.ts
  • packages/timo-design-system/src/components/layout/modal/Modal.tsx
💤 Files with no reviewable changes (5)
  • packages/timo-design-system/src/components/index.ts
  • packages/timo-design-system/src/components/button/modal-button/ModalButton.stories.tsx
  • packages/timo-design-system/src/components/button/create-button/CreateButton.tsx
  • packages/timo-design-system/src/components/button/modal-button/ModalButton.tsx
  • packages/timo-design-system/src/components/button/create-button/CreateButton.stories.tsx

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

@jjangminii jjangminii left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

확인했습니다~ 공통 컴포넌트로 바꾸니 훨씬 깔끔해졌네요 👍 👍

Comment thread apps/timo-web/components/timer/TimerExtendModalPanel.tsx Outdated
@jjangminii
jjangminii self-requested a review October 7, 2026 08:04

@jjangminii jjangminii left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

혹시 온보딩도 버튼 공통 컴포넌트로 변경해 줄 수 있을까요? 제가 회의때 추가로 말한다는걸 까먹었어요 😢
Image

ehye1 added 3 commits October 7, 2026 17:24
온보딩 다음 버튼 비활성 상태에 쓸 #9F9F9F 작은 오른쪽 화살표 아이콘을 추가했습니다.
온보딩 이전(secondary 왼쪽 아이콘), 다음(활성 primary·비활성 secondary 오른쪽 아이콘), 시작하기(primary fill) 버튼을 공용 Button(m)으로 교체했습니다. 활성 조건은 기존과 동일하게 유지했습니다.
개인 개발 환경에서만 쓰는 .claude/launch.json이 커밋에 포함되어 제거했습니다.
@ehye1

ehye1 commented Oct 7, 2026

Copy link
Copy Markdown
Contributor Author

온보딩 버튼도 공통 컴포넌트로 교체했습니다 ~!

@jjangminii jjangminii left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

확인했습니다-! 👍 👍

@github-actions github-actions Bot added the 🫵🏻 Reminded 리마인드 완료 label Oct 8, 2026
…ply-common-button

# Conflicts:
#	apps/timo-web/components/todo-modal/create/CreateTodoModalContent.tsx
@ehye1
ehye1 merged commit 8c8c9ec into develop Oct 10, 2026
13 checks passed
@ehye1
ehye1 deleted the refactor/ui/316-apply-common-button branch October 10, 2026 09:58
@jjangminii jjangminii mentioned this pull request Oct 12, 2026

This branch was successfully deployed

1 active deployment
Preview — ec5b6eb8 Deployed Oct 10, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

⌚ Timo-Design-system Timo 디자인 시스템 ⏰ Timo-web Timo 웹 서비스 ♥️ 혜원 혜원양 ♻ Refactor 기능 개선 및 리팩토링 작업 🫵🏻 Reminded 리마인드 완료

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[REFACTOR] 모달·생성하기·시간 추가 버튼을 공용 Button으로 교체

2 participants