Skip to content

fix: 견적 페이지 UI 및 TOP 버튼 접근성 개선 - #100

Merged
juengseulki merged 6 commits into
devfrom
fix/estimate-skeleton-ui
Aug 10, 2026
Merged

fix: 견적 페이지 UI 및 TOP 버튼 접근성 개선#100
juengseulki merged 6 commits into
devfrom
fix/estimate-skeleton-ui

Conversation

@juengseulki

@juengseulki juengseulki commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

📋 작업 내용

QA 과정에서 확인된 견적 페이지의 로딩/빈 상태 UI와 TOP 버튼 접근성 문제를 수정했습니다.


🔥 변경 사항

1. 견적 페이지 Skeleton 개선

  • 받았던 견적 페이지 진입 시 Skeleton이 중복으로 노출되는 현상을 수정했습니다.
  • 견적 상세 페이지의 프로필 이미지 영역 Skeleton을 실제 이미지 영역에 맞게 수정했습니다.
  • 로딩 과정에서 불필요한 UI 전환이 발생하지 않도록 정리했습니다.

2. 보낸 견적 요청 Empty State UI 개선

  • 보낸 견적 요청이 없는 경우 Empty State의 세로 위치를 다른 견적 관리 화면과 맞췄습니다.
  • 빈 상태에서는 상태 필터를 노출하지 않는 기존 정책을 유지했습니다.
  • Empty State에서도 회색 배경이 페이지의 남은 영역을 채우도록 레이아웃을 수정했습니다.

3. TOP 버튼 접근성 개선

  • TOP 버튼에 포커스가 남아 있는 상태에서 버튼이 숨겨질 경우 발생하던 접근성 콘솔 경고를 수정했습니다.
  • 키보드 포커스 중에는 버튼이 접근성 트리에서 갑자기 숨겨지지 않도록 처리했습니다.
  • 기존 스크롤 위치에 따른 TOP 버튼 노출 동작은 유지했습니다.

✅ 체크리스트

  • 로컬에서 정상 동작을 확인했습니다.
  • 기존 기능에 영향을 주지 않는지 확인했습니다.
  • 불필요한 console.log를 제거했습니다.
  • lint를 통과했습니다.
  • README 또는 문서를 수정했습니다. (필요 시)
  • API 명세와 일치하는지 확인했습니다.

📷 스크린샷 (선택)


🔗 관련 이슈

Closes #


💬 To Reviewer

  • 변경 사항이 제대로 반영 됐는지 위주로 확인부탁드립니다~

Summary by CodeRabbit

  • 버그 수정

    • 인증 로딩 처리와 견적 페이지 레이아웃을 개선했습니다.
    • 견적 요청 목록이 비어 있을 때 필터와 빈 상태 메시지가 올바르게 정렬됩니다.
    • 포커스된 스크롤 버튼이 스크롤 위치와 관계없이 계속 표시됩니다.
    • 견적 상세 화면의 프로필 유무에 따라 로딩 상태가 자연스럽게 표시됩니다.
  • 스타일

    • 랜딩 페이지 이미지와 견적 화면의 반응형 레이아웃 및 표시 스타일을 정리했습니다.
    • 견적 목록 필터와 로딩 화면의 정렬을 개선했습니다.
  • 개선

    • 필요한 경우 견적 상세 프로필 이미지를 우선 로드할 수 있습니다.

@vercel

vercel Bot commented Aug 10, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
moving-frontend Ready Ready Preview Aug 10, 2026 8:47am
moving-frontend-p2ol Ready Ready Preview Aug 10, 2026 8:47am

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@juengseulki, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 39 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

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.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 3a0425d2-7c45-4f19-8a43-cf9b4d395118

📥 Commits

Reviewing files that changed from the base of the PR and between b7a8e09 and d29139f.

📒 Files selected for processing (5)
  • src/app/estimates/received/page.tsx
  • src/app/estimates/requests/[estimateRequestId]/page.tsx
  • src/app/estimates/requests/page.tsx
  • src/components/common/ScrollToTopButton.tsx
  • src/components/estimate/detail/EstimateDetailLayout.tsx
📝 Walkthrough

Walkthrough

인증 로딩 대체 UI를 제거했습니다. 견적 화면의 세로 레이아웃과 빈 상태 정렬을 조정했습니다. 상세 로딩 영웅의 프로필 표시와 이미지 preload 처리를 변경했습니다. 스크롤 버튼의 포커스 동작과 랜딩 이미지 클래스 순서를 변경했습니다.

Changes

견적 화면 레이아웃 및 인증 로딩

Layer / File(s) Summary
견적 화면 레이아웃 및 인증 로딩
src/app/estimates/received/page.tsx, src/components/estimate/pending/PendingEstimatesPageClient.tsx, src/components/estimate/received/ReceivedEstimatesPageClient.tsx, src/components/estimate/requests/EstimateRequestLoadingSkeletons.tsx, src/components/estimate/requests/EstimateRequestsList.tsx, src/components/estimate/requests/EstimateRequestsPageClient.tsx
받은 견적 화면의 loadingFallback을 제거했습니다. 견적 화면 컨테이너에 flex-1을 추가했습니다. 요청 목록의 빈 상태와 필터 Skeleton 정렬을 변경했습니다.

견적 상세 로딩 영웅

Layer / File(s) Summary
견적 상세 로딩 영웅
src/components/common/DetailHeroBanner.tsx, src/components/estimate/detail/EstimateDetailLayout.tsx, src/components/estimate/detail/EstimateDetailPageSkeleton.tsx
showProfile 값에 따라 로딩 영웅과 아바타 스켈레톤을 분기합니다. preloadProfileImage 값을 프로필 이미지의 Image.preload에 전달합니다.

스크롤 버튼 포커스 동작

Layer / File(s) Summary
스크롤 버튼 포커스 동작
src/components/common/ScrollToTopButton.tsx
숨김 경로가 아니면서 스크롤 임계값을 넘거나 버튼이 포커스되면 버튼을 표시합니다. tabIndex, 포커스·블러 처리, 이벤트 의존성, 이미지 크기와 텍스트 스타일을 변경했습니다.

랜딩 이미지 클래스 정렬

Layer / File(s) Summary
랜딩 이미지 클래스 정렬
src/components/landing/*
랜딩 이미지의 Tailwind 클래스 순서를 재정렬했습니다. 클래스 값과 기능적 동작은 유지됩니다.

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

Possibly related PRs

Suggested labels: 🎨 style

Suggested reviewers: yooseohyeon

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 견적 페이지의 UI 개선과 TOP 버튼 접근성 수정이라는 주요 변경 사항을 정확하고 간결하게 설명합니다.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
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.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/estimate-skeleton-ui

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.

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

Actionable comments posted: 3

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

Inline comments:
In `@src/components/common/ScrollToTopButton.tsx`:
- Around line 53-60: Reset isFocused whenever hiddenByRoute becomes true, before
the return-null route hiding branch removes the button DOM. Update the effect or
route-handling logic around shouldHideScrollToTop and the existing focus state
so returning to an allowed route cannot show the button solely from stale focus,
while preserving scroll-threshold visibility behavior.
- Around line 90-117: Update the scroll-to-top button element in
ScrollToTopButton to add aria-hidden={!show}, keeping the existing tabIndex
behavior unchanged. This must exclude the button from the accessibility tree
when show is false while preserving accessibility when show or isFocused makes
the button visible.

In `@src/components/estimate/requests/EstimateRequestsPageClient.tsx`:
- Line 78: Update the top-level div in EstimateRequestsPageClient to include the
flex utility alongside flex-1, flex-col, and items-center, enabling the intended
flex layout while preserving the existing responsive styling and
EstimateRequestsList centering behavior.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 973589a1-f52e-4125-86c8-a1d748bb3046

📥 Commits

Reviewing files that changed from the base of the PR and between 1ea1be1 and b415cb7.

📒 Files selected for processing (11)
  • src/app/estimates/received/page.tsx
  • src/components/common/ScrollToTopButton.tsx
  • src/components/estimate/pending/PendingEstimatesPageClient.tsx
  • src/components/estimate/received/ReceivedEstimatesPageClient.tsx
  • src/components/estimate/requests/EstimateRequestsList.tsx
  • src/components/estimate/requests/EstimateRequestsPageClient.tsx
  • src/components/landing/LandingBottomBanner.tsx
  • src/components/landing/LandingFeatureCompare.tsx
  • src/components/landing/LandingFeatureRequest.tsx
  • src/components/landing/LandingHero.tsx
  • src/components/landing/LandingMoveTypes.tsx

Comment thread src/components/common/ScrollToTopButton.tsx Outdated
Comment thread src/components/common/ScrollToTopButton.tsx
Comment thread src/components/estimate/requests/EstimateRequestsPageClient.tsx Outdated

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

작업하시느라 수고하셨습니다!
tap버튼의 접근성 경고와 보낸 견적 페이지에서 스켈레톤이 두 개 뜨던 문제는 해결된 것으로 보입니다!

다만 pc 사이즈에서 보낸 견적 페이지 스켈레톤은 화면의 가로 중앙에 잘 뜨다가 로딩이 끝난 본 카드는 화면 왼쪽에 딱 붙는 이슈가 있어 확인 후 수정이 필요해보입니다!

또한 견적 상세 페이지에서 기사님 프로필 이미지가 여전히 로딩 중에는 기본 이미지의 위 아래로 검정색이 나타나는 이슈가 있습니다. 해결이 되지 않는다면 기사님 상세 페이지와 프로필 이미지 스켈레톤을 동일하게 맞추는 것도 하나의 방법일 것 같습니다!

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

또한 이번 pr 범위를 벗어나는 것이지만, 보낸 견적 요청에서는 "견적 관리를 불러오는 중입니다." 안내 문구가 한 번 표시된 후 스켈레톤이 표시되었다가 본 데이터가 표시되며, 받았던 견적에서는 "로그인 상태를 확인하는 중입니다." 안내 문구가 한 번 표시된 후 스켈레톤이 표시되었다가 본 데이터가 표시되는 이슈가 있습니다.
확인 후 스켈레톤 ui만 나타나도록 수정이 필요해보입니다.

Comment thread src/components/estimate/requests/EstimateRequestsPageClient.tsx

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

Actionable comments posted: 1

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

Inline comments:
In `@src/components/common/DetailHeroBanner.tsx`:
- Around line 11-12: Update EstimateDetailLayoutProps to include
preloadProfileImage, then pass that option through the EstimateDetailLayout call
to DetailHeroBanner so the configured value is preserved instead of falling back
to false.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: a7ab9847-da71-4b8f-bbcd-f1946565bd86

📥 Commits

Reviewing files that changed from the base of the PR and between b415cb7 and b7a8e09.

📒 Files selected for processing (5)
  • src/components/common/DetailHeroBanner.tsx
  • src/components/estimate/detail/EstimateDetailLayout.tsx
  • src/components/estimate/detail/EstimateDetailPageSkeleton.tsx
  • src/components/estimate/requests/EstimateRequestLoadingSkeletons.tsx
  • src/components/estimate/requests/EstimateRequestsPageClient.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/components/estimate/requests/EstimateRequestsPageClient.tsx

Comment thread src/components/common/DetailHeroBanner.tsx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants