Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
277cb31
chore(ui): shadcn base-nova 설치와 컴포넌트 코드 받기
KangShinGyu98 Oct 29, 2026
0e91fd6
docs(conventions): shadcn 원칙을 Base UI·cva 기준으로 수정
KangShinGyu98 Oct 29, 2026
9d0f471
feat(icons): shadcn 부품에 쓸 Figma 아이콘 추가
KangShinGyu98 Oct 29, 2026
209a003
style(ui): Toast를 디자인 시스템 Toast에 맞춤
KangShinGyu98 Oct 29, 2026
c0496b5
style(ui): Spinner를 디자인 시스템 progress 아이콘으로 그림
KangShinGyu98 Oct 29, 2026
316daca
style(ui): Alert를 지금 화면의 안내 상자 모양으로 정리
KangShinGyu98 Oct 29, 2026
826765a
style(ui): Skeleton을 지금 화면 스켈레톤 모양으로 정리
KangShinGyu98 Oct 29, 2026
4fbb458
style(ui): Badge를 디자인 시스템 Badge에 맞춤
KangShinGyu98 Oct 29, 2026
79fd6cd
style(ui): Avatar를 지금 화면 아바타 모양으로 정리
KangShinGyu98 Oct 29, 2026
12d1a07
style(ui): Chip을 디자인 시스템 Chip에 맞춤
KangShinGyu98 Oct 29, 2026
413bcf5
style(ui): Field·Input·Textarea를 디자인 시스템 Text Field에 맞춤
KangShinGyu98 Oct 29, 2026
dc8a4d4
style(ui): Checkbox를 디자인 시스템 checkbox 아이콘으로 그림
KangShinGyu98 Oct 29, 2026
b1fa555
style(ui): Switch를 지금 화면 스위치 모양으로 정리
KangShinGyu98 Oct 29, 2026
792a29a
style(ui): Radio를 디자인 시스템 radio button 아이콘으로 그림
KangShinGyu98 Oct 29, 2026
aa94621
chore(deps): 받은 shadcn 코드가 쓰던 cn 패키지 제거
KangShinGyu98 Oct 29, 2026
9526bba
refactor(toast): 앱 토스트를 ui Toaster로 교체
KangShinGyu98 Oct 29, 2026
50608c7
refactor(spinner): 로딩 표시를 ui Spinner로 교체
KangShinGyu98 Oct 29, 2026
b01aefb
refactor(chip): 지도 칩과 목적지 칩을 ui Chip으로 교체
KangShinGyu98 Oct 29, 2026
856c113
docs(conventions): LoadingIndicator를 Spinner로 바꾼 것과 ui 부품 우선 규칙 반영
KangShinGyu98 Oct 29, 2026
8c60669
refactor(alert): 안내 상자를 ui Alert로 교체
KangShinGyu98 Oct 29, 2026
f192f6b
refactor(badge): 일차·역할·장소 분류 라벨을 ui Badge로 교체
KangShinGyu98 Oct 29, 2026
f90a7fc
refactor(skeleton): 로딩 스켈레톤 블록을 ui Skeleton으로 교체
KangShinGyu98 Oct 29, 2026
8995253
refactor(avatar): 사용자·채팅·가계부·리뷰 아바타를 ui Avatar로 교체
KangShinGyu98 Oct 29, 2026
04d30c9
refactor(text-field): 입력·메모 칸을 ui Field·Input·Textarea로 교체
KangShinGyu98 Oct 29, 2026
fe02fbf
refactor(checkbox-switch): 체크박스·스위치를 ui Checkbox·Switch로 교체
KangShinGyu98 Oct 29, 2026
603f9d4
fix(text-field): 일정 메모칸이 내용 따라 3~5줄로 자라게 함
KangShinGyu98 Oct 30, 2026
3891a6b
refactor(chat): 나간 사람 아이콘 규칙을 ChatSenderAvatar 하나로 모음
KangShinGyu98 Oct 30, 2026
a6c452f
refactor(expenses): 예산 입력 오류와 저장 실패를 상태 하나로 합침
KangShinGyu98 Oct 30, 2026
fe1e530
refactor(text-field): 새 여행 만들기 입력을 Text Field로 교체
KangShinGyu98 Oct 31, 2026
f02f47e
refactor(chip): Chip을 Badge처럼 쓰는 부품으로 바꾸고 className 칩을 없앰
KangShinGyu98 Oct 31, 2026
067dd71
fix(text-field): 일정 메모칸을 늘리지 않고 Figma 96px 고정 높이로 되돌림
KangShinGyu98 Oct 31, 2026
00b6421
fix(chip): 목적지 칩을 Selected 모양으로 바꾸고 X 누르는 영역이 라벨을 덮지 않게 함
KangShinGyu98 Oct 31, 2026
be5af8e
fix(chip): 칩 X 버튼에 손가락 커서 추가
KangShinGyu98 Oct 31, 2026
97b7f08
style(text-field): 목적지 검색칸을 Figma Search Bar 규격에 맞춤
KangShinGyu98 Oct 31, 2026
58891fb
style(text-field): 목적지 검색칸 아래에 선택 안내를 Footer 보조 문구로 다시 보임
KangShinGyu98 Oct 31, 2026
735c486
style(badge): 대기 화면 '참여 거절' 배지를 Critical 톤으로 바꿈
KangShinGyu98 Oct 31, 2026
5ec4881
style(waiting): 대기 화면 상단 로고를 콤비네이션 마크 M으로 바꿈
KangShinGyu98 Oct 31, 2026
bce5ded
style(chip): 지도 카테고리 칩 아이콘을 교체 전처럼 파란색으로 되돌림
KangShinGyu98 Oct 31, 2026
a75317f
style(chip): 칩 안 아이콘을 16px·선 1.5px로 맞춤
KangShinGyu98 Oct 31, 2026
2867839
feat(ui): Figma Search Bar를 SearchBar 부품으로 만들고 장소 검색칸에 적용
KangShinGyu98 Oct 31, 2026
c900885
style(ui): 모바일 검색 화면 뒤로가기를 SearchBarBack으로 통일
KangShinGyu98 Oct 31, 2026
53381ad
feat(text-field): Textarea를 손으로 세로 늘릴 수 있게 함(96px~8줄)
KangShinGyu98 Oct 31, 2026
a819d32
chore(ui): 동작 부품 shadcn base-nova 코드 받기
KangShinGyu98 Oct 31, 2026
8713ae3
chore(deps): TanStack Form 추가
KangShinGyu98 Oct 31, 2026
0425918
chore(ui): Base UI 대화상자·팝업이 앱 위에 뜨도록 루트 설정
KangShinGyu98 Oct 31, 2026
9a4832d
feat(icons): check·sign/logout 아이콘 추가
KangShinGyu98 Oct 31, 2026
3a84f96
style(ui): Button을 디자인 시스템 Button에 맞춤
KangShinGyu98 Oct 31, 2026
cfbcceb
style(ui): Dialog를 디자인 시스템 Modal에 맞춤
KangShinGyu98 Oct 31, 2026
d2a38a1
style(ui): AlertDialog를 디자인 시스템 Alert Dialog에 맞춤
KangShinGyu98 Oct 31, 2026
97089b6
style(ui): Drawer를 디자인 시스템 Bottom Sheet에 맞춤
KangShinGyu98 Oct 31, 2026
f732b8a
style(ui): DropdownMenu를 디자인 시스템 Dropdown Menu에 맞춤
KangShinGyu98 Oct 31, 2026
3b4270c
style(ui): Select를 디자인 시스템 Select에 맞춤
KangShinGyu98 Oct 31, 2026
0c68aa5
style(ui): Combobox를 디자인 시스템 Select Field에 맞추고 input-group 삭제
KangShinGyu98 Oct 31, 2026
6644ef5
style(ui): Popover 표면을 Modal과 같게 맞춤
KangShinGyu98 Oct 31, 2026
61f4b7b
style(ui): Tabs를 디자인 시스템 Tabs에 맞춤
KangShinGyu98 Oct 31, 2026
57c9a83
chore(deps): shadcn add가 함께 설치한 cn 패키지 제거
KangShinGyu98 Oct 31, 2026
9fbb59a
docs(conventions): Button·Base UI 팝업·대화상자 폼 원칙 반영
KangShinGyu98 Oct 31, 2026
cf724c8
feat(ui): 반응형 대화상자와 본문 스크롤 DialogBody 추가
KangShinGyu98 Oct 31, 2026
aa1915f
refactor(settings): 확인창 ConfirmDialog를 ui AlertDialog 위로 옮기기
KangShinGyu98 Oct 31, 2026
6c0ce5e
refactor(expenses): 가계부 대화상자·선택기를 ui 부품과 TanStack Form으로
KangShinGyu98 Oct 31, 2026
df7668b
refactor(expenses): 가계부 패널 버튼·메뉴·탭·예산 대화상자 교체
KangShinGyu98 Oct 31, 2026
b3a3920
refactor(plan): PC 일정 대화상자·메뉴를 ui 부품으로
KangShinGyu98 Oct 31, 2026
b85899e
refactor(plan): 모바일 일정 시트를 ui Drawer로 옮기고 MobileBottomSheet 삭제
KangShinGyu98 Oct 31, 2026
d7e3adc
refactor(place): 장소·북마크 대화상자·메뉴·탭을 ui 부품으로
KangShinGyu98 Oct 31, 2026
68333a0
refactor(map): 평점 필터·날짜 선택을 ui Select·Popover·Dialog로
KangShinGyu98 Oct 31, 2026
2a7971b
refactor(rooms): 여행방·홈 대화상자·메뉴를 ui 부품으로
KangShinGyu98 Oct 31, 2026
79dfff3
refactor(layout): 헤더·구성원·설정의 메뉴·대화상자를 ui 부품으로
KangShinGyu98 Oct 31, 2026
15bf999
refactor(packing): 준비물 대화상자·메뉴·시트를 ui 부품으로
KangShinGyu98 Oct 31, 2026
fdc8674
refactor(ui): 쓰지 않게 된 옛 대화상자·시트 부품 삭제
KangShinGyu98 Oct 31, 2026
6412011
style(analytics): 쿠키 설정 대화상자 폭을 sm(384)으로 줄이기
KangShinGyu98 Nov 1, 2026
28aa95b
style(analytics): 쿠키 설정에 대화상자 취소·저장 버튼 줄 두기
KangShinGyu98 Nov 1, 2026
062ad0c
style(rooms): 초대하기 대화상자 폭을 md(448)로 넓히기
KangShinGyu98 Nov 1, 2026
c2f0e00
style(settings): 회원 탈퇴 글자 버튼에 손가락 커서 추가
KangShinGyu98 Nov 1, 2026
19fd9b7
style(analytics): 쿠키 설정 대화상자 폭을 md(448)로 한 단계 넓히기
KangShinGyu98 Nov 1, 2026
ca49e19
style(ui): 확인창 본문 글자를 16px(body/md)로 고정
KangShinGyu98 Nov 1, 2026
52fe2fe
style(expenses): 예산 수정 대화상자 폭을 sm(384)으로 줄이기
KangShinGyu98 Nov 1, 2026
c5e0ec2
style(expenses): 카테고리 필터 칸을 184로 넓혀 '전체 카테고리' 줄바꿈 막기
KangShinGyu98 Nov 1, 2026
dc99191
style(chat): PC 채팅 입력칸을 3줄 높이로 키우기
KangShinGyu98 Nov 1, 2026
2e1ffe0
fix(expenses): PC 가계부 일차 필터가 넘치면 스크롤 막대로 옆으로 넘기게
KangShinGyu98 Nov 1, 2026
22408d1
fix(expenses): 모바일 비용 편집 통화 칸에서 코드 3글자가 잘리지 않게
KangShinGyu98 Nov 1, 2026
8f56fdd
Merge remote-tracking branch 'origin/dev' into refactor/shadcn-base-ui
KangShinGyu98 Nov 1, 2026
dc44ff4
Merge branch 'refactor/shadcn-base-ui' into refactor/shadcn-behavior
KangShinGyu98 Nov 1, 2026
01b7112
fix(packing): 저장할 수 없는 상태에서 준비물 삭제 확인 버튼을 비활성으로
KangShinGyu98 Nov 1, 2026
ad7b363
fix(expenses): 정산 요약 대화상자의 조회 재시도 진행을 progress로
KangShinGyu98 Nov 1, 2026
6321550
refactor(rooms): 여행 정보 수정 칸을 form.Field로 그리고 칸별 오류 표시
KangShinGyu98 Nov 1, 2026
15c3ec2
test(plan): 일정 시간·여행 정보 수정·방 메뉴·북마크 메뉴 테스트를 Base UI 화면 기준으로
KangShinGyu98 Nov 1, 2026
6bf03c2
test(packing): 준비물·확인창 테스트를 Base UI 화면 기준으로
KangShinGyu98 Nov 1, 2026
dabccd6
test(analytics): 쿠키 설정·모바일 헤더 메뉴·지도 평점 필터 테스트를 Base UI 화면 기준으로
KangShinGyu98 Nov 1, 2026
f0c5b58
test(expenses): 가계부 패널·분석 탭·메뉴·예산 테스트를 Base UI 화면 기준으로
KangShinGyu98 Nov 1, 2026
5b40da9
test(expenses): 비용 편집·카테고리 Select·통화 Combobox 테스트를 Base UI 화면 기준으로
KangShinGyu98 Nov 1, 2026
8b002c2
test(expenses): 가계부 Provider·딤·비용 목록 테스트를 Base UI 화면 기준으로, 옛 끌기 테스트 삭제
KangShinGyu98 Nov 1, 2026
ea85edd
fix(rooms): 여행 정보 수정 대화상자가 저장 중에 Esc·딤·X로 닫히지 않게
KangShinGyu98 Nov 1, 2026
576ac96
fix(date-picker): 칸 아래 달력에서 Tab이 페이지 맨 앞으로 빠져나가지 않게 포커스 가두기
KangShinGyu98 Nov 1, 2026
3d67a6c
refactor(ui): Sonar 표시 분기와 라벨 접근성 경고 해소
minbros Nov 2, 2026
d5299db
refactor(ui): 팝업 이벤트 경계와 Sonar 품질 경고 정리
minbros Nov 2, 2026
2207be8
chore(merge): 선행 UI PR의 Sonar 수정을 동기화
minbros Nov 2, 2026
ec24c4d
Merge pull request #254 from uttae/refactor/shadcn-behavior
minbros Nov 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
## 로딩 UI 원칙

- 화면 전환과 데이터 조회 중에 `불러오는 중…`, `확인 중…` 같은 문장형 로딩 안내를 화면에 노출하지 않는다.
- 최초 로딩에는 완료 후 화면과 배치·크기가 비슷한 스켈레톤을 우선 사용한다. 작은 영역에는 공통 `LoadingIndicator` 같은 간결한 로딩 표시를 사용한다.
- 최초 로딩에는 완료 후 화면과 배치·크기가 비슷한 스켈레톤을 우선 사용한다. 작은 영역에는 공통 `Spinner`(`src/components/ui/spinner`) 같은 간결한 로딩 표시를 사용한다.
- 제목, 진행 현황, 버튼, 목록의 자리를 미리 확보해 로딩 전후에 화면이 튀거나 다른 화면이 잠깐 끼어 보이지 않게 한다.
- 백그라운드 재조회에서는 이미 표시된 유효한 데이터를 유지하고, 새 데이터가 준비되면 갱신한다. 재조회만으로 전체 화면을 비우거나 금액을 임시 값으로 바꾸지 않는다.
- 로딩 상태는 `role="status"`, `aria-label`, `aria-busy`, `sr-only` 등으로 접근성 도구에 전달할 수 있다. 화면에서 문구를 숨기는 것과 접근성 안내를 제거하는 것은 구분한다.
Expand Down
9 changes: 5 additions & 4 deletions Design.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
예를들어서 피그마 페이지에 폰트가 17px이고 시멘틱 토큰과 css변수가 없다면 임의값을 사용한다.

### 1-3. 컴포넌트
목표는 shadcn이다. 아직 설치 전이라 기존 공용 컴포넌트와 병행하고, 무엇을 쓸지는 [핵심 원칙 1-1](docs/code-conventions/principles.md)을 따른다.
목표는 shadcn(Base UI)이다. 옮기는 동안 기존 공용 컴포넌트와 병행하고, 무엇을 쓸지는 [핵심 원칙 1-1](docs/code-conventions/principles.md)을 따른다.
- 공용: `src/components/<도메인>/`(`layout`, `place`, `map`, `settings` …)
- shadcn: 설치 후 `src/components/ui/`
- shadcn: `src/components/ui/`
- 특정 페이지 전용: `src/app/**/_components/`

### 1-4. Figma 디자인 시스템
Expand All @@ -35,7 +35,8 @@
- 11 [Tabs](https://www.figma.com/design/Va7ys9C4lx9PIHOGvlaAID/Design-System?node-id=5138-2632) — Tabs Line, Tabs Chip, Tab Item
- 12 [Toast](https://www.figma.com/design/Va7ys9C4lx9PIHOGvlaAID/Design-System?node-id=5285-4979) — Toast
- 13 [Alert Dialog](https://www.figma.com/design/Va7ys9C4lx9PIHOGvlaAID/Design-System?node-id=5619-553) — Alert Dialog
- 14·15 [Chip · Badge](https://www.figma.com/design/Va7ys9C4lx9PIHOGvlaAID/Design-System?node-id=5624-159) — Chip(Solid·Outline), Badge(Weak·Solid·Outline, 톤 6종)
- 14 [Chips](https://www.figma.com/design/Va7ys9C4lx9PIHOGvlaAID/Design-System?node-id=5624-159) — Chip(Solid·Outline)
- 15 [Badges](https://www.figma.com/design/Va7ys9C4lx9PIHOGvlaAID/Design-System?node-id=5864-12983) — Badge(Weak·Solid·Outline, 톤 6종)
- [Update Log](https://www.figma.com/design/Va7ys9C4lx9PIHOGvlaAID/Design-System?node-id=5635-11) — 디자인 시스템 변경 기록

---
Expand Down Expand Up @@ -111,7 +112,7 @@ import { MapPinIcon } from "@/assets/icons";

### 3-3. 이벤트 피드백
- 사용자 액션에는 결과 피드백이 있어야 한다
- alert는 toast, confirm은 `ConfirmDialog`를 쓰고 요구조건에 맞춘다(shadcn 설치 후 기준은 [핵심 원칙 1-1](docs/code-conventions/principles.md))
- alert는 toast, confirm은 `ConfirmDialog`(ui `AlertDialog` 위)를 쓰고 요구조건에 맞춘다(shadcn 부품으로 옮기는 기준은 [핵심 원칙 1-1](docs/code-conventions/principles.md))
- 비동기 동작 중 중복 실행 방지(핵심 원칙 2-4)


Expand Down
21 changes: 21 additions & 0 deletions components.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "base-nova",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/app/globals.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}
6 changes: 3 additions & 3 deletions docs/code-conventions/anti-patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@
- ✓ prop을 더하기 전에 계산 → slot → `variant` → 화면 훅 순서로 본다. `<PlaceCard variant="compact" action={<AddToScheduleButton placeId={place.id} />} />`(원칙 2-2·1-4)

### 6. 있는 부품 다시 만들기
- 신호: 새 `fixed inset-0` 모달·바텀시트·로딩 표시, `SettingsActionButton`·`alertDialogButtonClass`가 맞는 자리에 복붙한 버튼 클래스, 새로 만든 범용 Button, `lucide-react`·새 아이콘 패키지
- ✓ `ConfirmDialog`·`SettingsDialog`·`MobileBottomSheet`·`LoadingIndicator`를 먼저 쓴다. 버튼은 `SettingsActionButton`·`alertDialogButtonClass`가 맞으면 쓰고, 아니면 그 자리 `<button>`에 토큰 클래스로 쓴다(범용 Button은 보류). 아이콘은 `@/assets/icons`(원칙 1-1, Design.md 2장).
- 신호: 새 `fixed inset-0` 모달·바텀시트·로딩 표시, 손으로 만든 메뉴·셀렉트·탭, `Button` 대신 복붙한 버튼 클래스, `useState`로 하나씩 든 대화상자 폼 값·오류, `lucide-react`·새 아이콘 패키지
- ✓ `src/components/ui/`의 부품(`Button`·`Dialog`·`AlertDialog`·`Drawer`·`DropdownMenu`·`Select`·`Combobox`·`Popover`·`Tabs`·`Spinner`·`Skeleton` 등)과 확인창 `ConfirmDialog`를 먼저 쓴다. 대화상자 폼은 TanStack Form(원칙 2-9). 아이콘은 `@/assets/icons`(원칙 1-1, Design.md 2장).

### 7. 미리 만든 추상화
- 신호: 사용처가 하나인 래퍼·옵션 객체·범용 컴포넌트, `useMount`·`useUpdateEffect` 같은 생명주기 훅, 쓰는 곳 없는 설정 레이어. 로직을 나누는 화면 훅은 사용처가 하나여도 걸리지 않는다.
Expand Down Expand Up @@ -87,7 +87,7 @@

### 17. 토큰 우회
- 신호: 토큰에 있는 값을 `text-[16px] leading-6`·`rounded-[8px]`·`#333`으로 쓴다. `bg-gray-800`·`shadow-md`(Tailwind 기본값), `dark-gray`(레거시 별칭), `text-body-s`(없는 토큰 이름), 타이포 토큰에 붙인 `font-semibold`, 템플릿 리터럴 className, 조립한 클래스 이름(`` `bg-${tone}` ``)
- ✓ `text-body-m-regular`, `rounded-md`, `text-text`, 클래스는 `cn("…", TONE_CLASS[tone], className)`(원칙 3-6).
- ✓ `text-body-m-regular`, `rounded-md`, `text-text`, 변형은 cva로 두고 `cn(tagVariants({ tone }), className)`(원칙 3-6).

### 18. div 버튼과 지운 포커스
- 신호: `<div onClick>`, 단순 이동을 `router.push` 버튼으로 만든다. 아이콘 버튼에 `aria-label`이 없다. placeholder만 있는 입력, `outline-none`으로 지운 포커스 표시
Expand Down
Loading