[Refactor/#23] 화면 헤더를 ScreenHeader 하나로 통합 - #24
Merged
xeoxxn merged 2 commits intoSep 14, 2026
Conversation
github-actions
Bot
requested review from
jjunh33,
leegain1,
sangrae2325 and
tnals0924
September 10, 2026 06:03
leegain1
approved these changes
Sep 12, 2026
…rops) Figma의 Top Navigation 패턴(타이틀 정렬, leading/trailing 조합, 게시판류 토글형 2단 타이틀)을 props로 고르게 만들었다. display variant에서는 leading을 타입으로 막았다 — WDS 쪽 스타일이 display일 때 leading/trailing 포지셔닝을 안 줘서 레이아웃이 깨진다.
Figma의 Top Navigation이 WDS Top Navigation/Resource/Contents에서 Stream 로컬 컴포넌트(nodeId 1765:71193)로 바뀌었다. 세로 패딩 12px + Title 3/Bold(32px)로 총 56px인데, WDS display variant는 세로 패딩이 16px로 고정돼 있어 64px이 된다. variant="display"(기본값) 경로만 직접 구현으로 바꾸고, leading이 필요한 variant="normal"은 그대로 WDS TopNavigation을 재사용한다.
xeoxxn
force-pushed
the
refactor/#23-unified-screen-header
branch
from
September 14, 2026 11:47
506375f to
bfa23b1
Compare
xeoxxn
added a commit
that referenced
this pull request
Sep 14, 2026
* refactor: Bottom Nav 활성 탭을 화면 state 대신 라우트에서 파생 TEAM-BEAT/BEAT-Client의 Layout 컴포넌트 + react-router 패턴을 참고했다. ScreenLayout이 useLocation으로 현재 경로에서 활성 탭을 계산하고 useNavigate로 직접 이동시켜서, 화면마다 중복되던 bottomNavValue state와 handleBottomNavValueChange 핸들러를 제거한다. URL이 유일한 진실의 원천이 된다 * refactor: ScreenLayout을 라우터 레벨로 이동, useScreenHeader 훅 도입 화면이 <ScreenLayout>을 직접 감싸는 방식은 새 화면을 추가할 때 감싸는 걸 깜빡하면 레이아웃이 화면마다 들쭉날쭉해질 수 있었다. App.tsx에서 ScreenLayout을 부모 route로 두고 화면들을 자식 route(Outlet)로 넣어서, 그 밑 화면은 구조적으로 무조건 같은 뼈대(375x812+Bottom Nav)를 받도록 바꾼다. 화면마다 다른 헤더(Top Navigation 등)는 useScreenHeader 훅으로 ScreenLayout에 등록한다(Context 기반, 새 의존성 없음) * feat: 재사용 가능한 ScreenHeader 컴포넌트 분리 Figma에서 행사·빌릴게 화면을 대조해보니 Top Navigation의 타이틀+검색/알림 아이콘 부분은 화면마다 완전히 동일한 공통 패턴이었다(세그먼트 토글 같은 Tool 슬롯은 화면마다 값·동작이 달라 제외). ScreenHeader로 분리해 재사용하고, HomeScreen도 이걸 쓰도록 정리한다 * refactor: 대여/반납 토글을 헤더에서 화면 요소로 분리, 필터 고정+목록만 스크롤 대여/반납 세그먼트 토글은 화면마다 다른 값/동작을 가지는 페이지 전용 요소라 useScreenHeader가 아니라 RentalListScreen 본문에서 직접 그리도록 옮긴다. 토글+카테고리 필터는 고정하고 물품 목록만 스크롤되도록 화면 내부 레이아웃을 분리했다(ScreenLayout의 Outlet 래퍼는 overflow-hidden으로 바꿔 스크롤 처리를 각 화면에 위임). 무한 스크롤 목록이라 스크롤바는 scrollbar-hidden 유틸리티로 숨긴다 * docs: 용어 사전 컨벤션 추가 백엔드 엔드포인트 네이밍과 프론트 도메인 용어(라우트 경로, features 폴더명 등)를 통일하기 위한 용어 사전을 만들고, coding-style.md 네이밍 규칙에서 참조하게 한다 * refactor: rental → bililge 네이밍 통일 용어 사전(docs/conventions/terminology.md)에 맞춰 '빌릴게' 도메인의 rental 네이밍을 bililge로 전부 바꾼다: features/rental → features/bililge, 컴포넌트/타입/상수명(RentalXxx → BililgeXxx), 라우트 경로(/rental → /bililge), BottomNavValue의 'rental' → 'bililge', asset 폴더/파일명까지. Figma 노드 실제 이름을 그대로 옮긴 주석(예: 'Rental Item Card')은 용어 사전 규칙대로 그대로 둔다 * chore: main에서 컴포넌트 관련 스킬·컨벤션 문서 가져오기 * feat: 대여 신청 바텀시트 추가(휠 피커로 대여 시작 시간 선택) * fix: 휠 피커·스테퍼 숫자 폭 고정해서 자릿수 바뀌어도 안 밀리게 수정 * fix: 휠 피커 선택 줄 뒤 회색 글자가 비쳐서 두꺼워 보이던 문제 수정 * fix: figma-check 결과 반영 — 시트 상단 여백, 안내 문구 굵기 Figma에 맞춤 * fix: 바텀시트 하단 세이프에어리어에 누락된 홈 인디케이터 바 추가 * revert: 홈 인디케이터 바 제거, 세이프에어리어 여백만 유지 * fix: 바텀시트 하단 여백을 34px로 과다 계산했던 것 14px로 수정 * fix: Bottom Nav 하단 검은색 홈 인디케이터 바 제거, 여백만 유지 * fix: 바텀시트 슬라이드 애니메이션을 iOS 스타일 감속 곡선으로 자연스럽게 조정 * perf: 바텀시트 첫 오픈 때 휠 피커 마운트가 슬라이드 첫 프레임을 막던 문제 수정 * refactor: 텍스트 스타일을 WDS Typography 컴포넌트로 전환, 타이포그래피 컨벤션 추가 지금까지 text-xs/text-[Npx] 등 Tailwind 값을 화면마다 손으로 맞춰왔는데, Bottom Nav 탭 라벨이 실제 Figma 값(11px)과 다른 12px로 굳어있던 걸 계기로 @wanteddev/wds의 Typography 컴포넌트(Figma 타입 스케일과 1:1 대응)로 교체했다. * fix: 빌릴게/홈 헤더를 Figma 로컬 Top Navigation 사양(56px)에 맞춤 Figma의 Top Navigation이 WDS Top Navigation/Resource/Contents에서 Stream 로컬 컴포넌트(nodeId 1765:71193)로 바뀌었다. 세로 패딩 12px + Title 3/Bold(32px)로 총 56px인데, WDS display variant는 세로 패딩이 16px로 고정돼 있어 64px이 된다. 레이아웃만 직접 구현하고 아이콘 버튼(TopNavigationButton)은 그대로 재사용한다. * fix: 카테고리 필터 칩 높이를 Figma 스펙(32px)에 맞춤 py-2(8px)+caption1 line-height(16px)+border 2px = 34~35px로 Figma Chip(32px)보다 컸다. 패딩 대신 h-8 고정 높이로 바꿔 정확히 맞춘다. * fix: 대여 신청 버튼 높이를 Figma 스펙(56px)에 맞춤 ActionAreaButton의 size="large" Button은 padding(12px×2)+body1 line-height(24px)로 48px인데, WDS Button엔 large보다 큰 사이즈가 없어 sx로 높이만 보정한다. * refactor: 화면 스크롤을 위한 h-full을 ScreenLayout에서 기본 보장 overflow-y-auto가 동작하려면 자식 높이가 명확해야 하는데, 지금은 화면마다 h-full flex-col을 직접 챙겨야 한다. ScreenLayout이 Outlet을 h-full flex-col로 감싸서, 다음 화면이 깜빡 빠뜨려도 스크롤이 깨지지 않게 한다. * [Refactor/#23] 화면 헤더를 ScreenHeader 하나로 통합 (#24) * refactor: 화면 헤더를 ScreenHeader 하나로 통합(variant/title/leading/trailing props) Figma의 Top Navigation 패턴(타이틀 정렬, leading/trailing 조합, 게시판류 토글형 2단 타이틀)을 props로 고르게 만들었다. display variant에서는 leading을 타입으로 막았다 — WDS 쪽 스타일이 display일 때 leading/trailing 포지셔닝을 안 줘서 레이아웃이 깨진다. * fix: 빌릴게/홈 헤더를 Figma 로컬 Top Navigation 사양(56px)에 맞춤 Figma의 Top Navigation이 WDS Top Navigation/Resource/Contents에서 Stream 로컬 컴포넌트(nodeId 1765:71193)로 바뀌었다. 세로 패딩 12px + Title 3/Bold(32px)로 총 56px인데, WDS display variant는 세로 패딩이 16px로 고정돼 있어 64px이 된다. variant="display"(기본값) 경로만 직접 구현으로 바꾸고, leading이 필요한 variant="normal"은 그대로 WDS TopNavigation을 재사용한다.
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
#️⃣연관된 이슈
🎯 해결하려는 문제가 무엇인가요?
화면마다
TopNavigation을 직접 새로 조립하던 걸, Figma에서 실제로 확인되는 Top Navigation 패턴(타이틀 정렬, leading/trailing 아이콘 조합, 게시판류의 토글형 2단 타이틀 등)을 props로 고를 수 있는ScreenHeader하나로 통합한다.❓ 왜 해결해야 하나요?
화면마다 손으로 조립하면 트레일링 아이콘 조합,
variant선택, 타이포그래피(글자 크기)가 화면 수만큼 반복되고 어긋나기 쉽다 — 실제로 이전 세션에서 Bottom Nav 라벨 폰트 크기가 Figma 값과 다르게 굳어있던 사례가 있었다. 디자인 자체를 바꾸는 게 아니라, 이미 있는 WDSTopNavigation을 얇게 감싸는 지점을 하나로 모으는 리팩토링이다.⭐ 어떻게 해결했나요?
ScreenHeaderprops를variant("display"/"normal") +title(문자열 또는{ options, activeIndex, onChange }토글) +leading/trailing(ReactNode)로 재설계variant="display"(기본값)에서는leading을 아예 타입으로 막음 — discriminated union으로variant="normal"일 때만leading을 받게 해서, WDSTopNavigation이display일 때 leading/trailing 포지셔닝 스타일을 안 주는 문제(topNavigationLeftIconStyle/RightIconStyle, style.js 확인)를 타입 레벨에서 막았다title을 객체로 넘기면Typography variant="title3" weight="bold"+ 활성(semantic.label.strong)/비활성(semantic.label.disable) 색 분기로 렌더링HomeScreen,BililgeListScreen)는 트레일링 아이콘(검색·알림)을 이제 직접 넘기도록 마이그레이션 — 화면에 보이는 결과는 동일🧩 이 PR의 한계 & 트레이드오프
searchvariant(타이틀 자리가 검색 필드로 바뀌는 패턴)는 범위에서 뺐다 — 지금 실제로 쓰는 화면이 없고, 검색 화면을 만들 때 다시 판단하는 게 맞다고 봄(docs/plans/unified-screen-header.md참고, 로컬 전용 문서라 이 PR에는 안 올라감).⛓️ 기존 기능에 미치는 영향
홈/빌릴게 화면 헤더 렌더링 결과는 동일(스크린샷 비교 확인). 두 화면 모두 트레일링 아이콘을 직접 넘기도록 호출부가 바뀌었다.
🔀 Edge Case & 실패 시나리오
variant="display"에서leading을 넘기려고 하면 타입 에러로 막힌다(런타임 경고가 아니라 컴파일 타임에 막음).📋 검토한 대안과 선택 이유
preset="list"|"modal"|"search"같은 프리셋형 API도 고려했으나, 화면이 아직 4~5개뿐이라 미리 추상화할 근거가 부족하다고 판단해variant/title/leading/trailing을 그대로 노출하는 조합형으로 결정했다(기존 컨벤션 — WDS variant를 유니온 타입으로 그대로 노출 — 과도 더 맞음).💬 리뷰 포인트
[c]discriminated union으로leading제약을 표현한 방식이 과하지 않은지, 더 간단한 방법이 있을지 의견 부탁드립니다.