feat(landing): 랜딩 페이지 스크린샷 중심 리디자인 - #110
Conversation
- Vitest·Sharp 개발 의존성과 테스트 환경 추가 - 랜딩 콘텐츠·타이포그래피·스크린샷 계약 갱신
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The inner side-by-side grid capped each card's portrait screenshot at 220px and, at 768px, squeezed the text column down to ~54.5px because the outer grid already limits card width to ~340-500px. Restack each card's text block above its screenshot so the portrait can render at the spec's 320-360px width without starving the copy. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
02-feature-map.png still showed the legacy howaboutus.app domain in its toolbar at the same geometry as the other patched screenshots. Add it to the domain-patch script's TARGETS and re-run assets:landing-domain; the other three PNGs were byte-identical after re-processing and are not part of this change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
📝 WalkthroughWalkthroughChanges랜딩 페이지를 정적 콘텐츠 기반의 섹션 조합 구조로 전환하고, 새 콘텐츠 계약·스크린샷 설정·접근성 모션·서버 렌더링 테스트를 추가했습니다. Sharp 기반 스크린샷 도메인 패치와 Vitest 실행 설정도 도입했습니다. 랜딩 페이지 리디자인
저장소 유지보수
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant Browser
participant LandingView
participant LandingContent
participant LandingMotion
participant LandingScreenshot
Browser->>LandingView: 랜딩 페이지 요청
LandingView->>LandingContent: 정적 콘텐츠 조회
LandingView->>LandingMotion: 섹션 표시 래핑
LandingMotion->>Browser: 포커스·뷰포트 상태에 따른 섹션 표시
LandingView->>LandingScreenshot: 스크린샷 리소스 전달
LandingScreenshot->>Browser: 랜딩 이미지 렌더링
Poem
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
Warning Tools execution failed with the following error: Failed to run tools: 14 UNAVAILABLE: read ECONNRESET 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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
src/app/_components/LandingStaticSections.test.tsx (1)
16-26: 🔒 Security & Privacy | 🔵 Trivial | 💤 Low value외부 링크에
rel="noopener"추가를 권장.테스트는
rel="noreferrer"만 검증하고 있습니다. 현대 브라우저에서는target="_blank"가 암묵적으로noopener를 적용하지만, 구형 브라우저 호환성 및 방어적 관점에서rel="noopener noreferrer"를 명시하는 것이 권장됩니다.LandingTeamSection컴포넌트의 실제rel속성 값을 확인해 주세요.🤖 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/app/_components/LandingStaticSections.test.tsx` around lines 16 - 26, Update LandingTeamSection’s external links to explicitly use rel="noopener noreferrer" alongside target="_blank", then update the test’s rel assertion to verify both tokens for each link instead of checking only noreferrer.
🤖 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 `@scripts/update-landing-screenshot-domain.mjs`:
- Around line 7-12: TARGETS 배열에서 02-feature-map.png를 제거하고, 주소창이 포함된 나머지 3개 스크린샷만
도메인 패치 대상으로 유지하세요. update-landing-screenshot-domain 스크립트의 대상 목록과 관련 처리 로직이 3개 파일
기준으로 동작하는지 확인하세요.
In `@src/app/_components/LandingHeader.tsx`:
- Around line 25-35: 모바일에서 숨겨지는 LandingHeader의 nav 요소 때문에 navItems 링크에 접근할 수
없습니다. LandingHeader의 네비게이션을 모바일에서도 표시하거나, 모바일 메뉴 토글과 접근 가능한 메뉴 UI를 추가해 "기능", "사용
방법", "팀" 링크를 제공하세요. 기존 landing-sm 이상 레이아웃과 로그인 CTA 동작은 유지하세요.
---
Nitpick comments:
In `@src/app/_components/LandingStaticSections.test.tsx`:
- Around line 16-26: Update LandingTeamSection’s external links to explicitly
use rel="noopener noreferrer" alongside target="_blank", then update the test’s
rel assertion to verify both tokens for each link instead of checking only
noreferrer.
🪄 Autofix (Beta)
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: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: d054a5d0-df9a-464e-a895-cf808f9ed1e5
⛔ Files ignored due to path filters (5)
package-lock.jsonis excluded by!**/package-lock.jsonpublic/landing/01-hero-app.pngis excluded by!**/*.pngpublic/landing/02-feature-map.pngis excluded by!**/*.pngpublic/landing/03-feature-place-share.pngis excluded by!**/*.pngpublic/landing/04-feature-plan.pngis excluded by!**/*.png
📒 Files selected for processing (34)
.gitignoredocs/superpowers/plans/2026-07-10-landing-page-redesign.mddocs/superpowers/specs/2026-07-10-landing-page-redesign-design.mdpackage.jsonscripts/update-landing-screenshot-domain.mjssrc/app/_components/LandingActionLink.test.tsxsrc/app/_components/LandingActionLink.tsxsrc/app/_components/LandingCollaborationSection.tsxsrc/app/_components/LandingFeatureStory.tsxsrc/app/_components/LandingFinalCta.tsxsrc/app/_components/LandingHeader.tsxsrc/app/_components/LandingHero.tsxsrc/app/_components/LandingHowItWorks.tsxsrc/app/_components/LandingMotion.test.tsxsrc/app/_components/LandingMotion.tsxsrc/app/_components/LandingOnboardingCarousel.tsxsrc/app/_components/LandingReveal.tsxsrc/app/_components/LandingSections.tsxsrc/app/_components/LandingStaticSections.test.tsxsrc/app/_components/LandingTeamSection.tsxsrc/app/_components/LandingValueStrip.tsxsrc/app/_components/LandingView.test.tsxsrc/app/_components/LandingView.tsxsrc/app/layout.tsxsrc/components/icons/GithubIcon.tsxsrc/components/icons/index.tssrc/components/layout/SiteFooter.tsxsrc/lib/landing/landing-content.test.tssrc/lib/landing/landing-content.tssrc/lib/landing/landing-font.tssrc/lib/landing/landing-screenshots.tssrc/lib/landing/landing-typography.tssrc/lib/public-assets.tsvitest.config.ts
💤 Files with no reviewable changes (5)
- src/lib/landing/landing-font.ts
- src/app/_components/LandingOnboardingCarousel.tsx
- src/lib/public-assets.ts
- src/app/_components/LandingSections.tsx
- src/app/_components/LandingReveal.tsx
* fix(plan): 새 일차 추가 버튼 삭제 * feat(plan): 일정-북마크 추가 탭 상단 북마크 목록 사이드스크롤 기능 추가 * feat(schedule): 토글/경로표시 기능 분리 및 경로표시버튼 추가 * fix:contact@uttae.app로 공식 이메일 교체 * feat(schdule_item): schedule item 글씨체 키우기, 메모 UI 변경, 줄바꿈 기능추가 * docs: 랜딩 페이지 리디자인 설계 추가 * docs: 랜딩 페이지 구현 계획 추가 * chore: 로컬 워크트리 디렉터리 제외 * docs: CLAUDE.md에서 AGENTS.md import하는 얇은 어댑터 추가 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(landing): 랜딩 페이지 스크린샷 중심 리디자인 (#110) * docs: 랜딩 페이지 리디자인 설계 추가 * docs: 랜딩 페이지 구현 계획 추가 * chore: 로컬 워크트리 디렉터리 제외 * docs: 랜딩 작업 기준선 기록 * test(landing): 랜딩 리디자인 계약 정의 - Vitest·Sharp 개발 의존성과 테스트 환경 추가 - 랜딩 콘텐츠·타이포그래피·스크린샷 계약 갱신 * feat: add landing hero foundation Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat: add landing product story sections Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix: forward svg props in GithubIcon Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat: rebuild landing page composition Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix: update landing screenshot domain Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix: stack collaboration cards vertically for larger portraits The inner side-by-side grid capped each card's portrait screenshot at 220px and, at 768px, squeezed the text column down to ~54.5px because the outer grid already limits card width to ~340-500px. Restack each card's text block above its screenshot so the portrait can render at the spec's 320-360px width without starving the copy. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix: patch legacy domain in map feature screenshot 02-feature-map.png still showed the legacy howaboutus.app domain in its toolbar at the same geometry as the other patched screenshots. Add it to the domain-patch script's TARGETS and re-run assets:landing-domain; the other three PNGs were byte-identical after re-processing and are not part of this change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore: update stale landing comments Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat: add motion-safe scroll reveal to landing sections Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix: block interaction with hidden reveal sections Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * fix(schedule_id): font size 수정 * fix(schedule): memo placeholder 문구 수정 * feat(memo): on/off 트리거 스위치화 및 삭제 버튼·확인 alert 추가 - 메모 트리거를 항상 노출되는 토글 방식으로 변경 (열려있을 때도 사라지지 않음) - 활성 상태 (편집 중이거나 저장된 메모 있음) 는 브랜드 그린 강조 - 저장된 메모 읽기 모듈 우상단에 삭제 버튼 추가 - 클릭 시 confirm alert 후 memo 를 빈 문자열로 저장 * feat(memo): 내용 내 URL 자동 하이퍼링크 처리 - renderMemoWithLinks 유틸로 http(s):// 및 www. URL 을 <a> 로 변환 - 후행 문장부호 (. , ; : ! ? ) ]) 는 URL 에서 분리해 텍스트로 유지 - www. 로 시작하면 https:// prefix 붙여 새 탭 오픈 - 클릭 이벤트 stopPropagation 으로 카드 클릭 (지도 이동) 과 분리 * style(memo): 그레이 필 톤 리디자인 및 커스텀 스티키 아이콘 - editorModule 을 amber 톤에서 gray-100/70 필 형태 (rounded-2xl, 테두리·그림자 제거) 로 변경 - memoTextarea, timeInputCompact 도 amber → gray 로 통일 - 우측 하단 접힘 스티키 노트 커스텀 아이콘 MemoIcon 추가 - 메모 트리거 및 편집/읽기 모듈에서 lucide StickyNote → MemoIcon 교체 * fix:전역 폰트 사이즈 키우기 작업 * feat(schedule): 시간 표시를 AM/PM 시작~종료 range 로 개선 - formatScheduleTimeRange 신설 - "10:00 AM – 11:00 AM" 형식으로 시작·종료 시간 range 표시 (12시간제) - 카드 안에 초록 필로 시간 range 표시 (contentColumn 하단 mt-auto 배치) - 시간 트리거 버튼 라벨을 "출발-도착시간 추가/staySummary" → "시간 설정" 으로 단순화 - 기존 readOnlySummary 블록 제거 - 시간 표시가 read/edit 모드 공통 처리됨 * refactor(schedule): 카드 사이즈·padding 재조정 및 트리거 하단 이동 - 카드 padding p-3 → p-3.5, gap-x-3 → gap-x-3.5, titleRow gap-2 → 2.5 로 상향 - 썸네일·컨텐츠 컬럼 사이즈 7rem → 6rem (min-h 도 동기화), Image sizes hint 96px 로 수정 - primaryTypeBadge text-base → text-xs 로 다시 컴팩트하게 - 메모/시간 트리거 row 를 contentColumn 안 → 카드 하단 col-span-2 로 이동 (border-t 로 구분선 추가) * style(schedule): 일차 헤더 재구성 및 sky/ivory 컬러 팔레트 정리 - 일차 헤더에서 날짜(subtitle) 를 primary 위치로 이동, 일차 번호(title) 는 sky 필로 우측 부착 - 헤더 행 전체에 아이보리 배경(#FFFFF0) 적용, 접힘 상태에 따라 rounded-2xl / rounded-t-2xl 조건부 처리 - schedule item 카드 트리거 버튼: brand-green → sky-600 (hover 시 sky-50 배경 + sky-600 텍스트), active 상태에 font-semibold 추가 * refactor(rooms): destinations 배열 계약으로 API·캐시·지도 마이그레이션 - RoomCreate/Update/Detail/ListItem 타입의 destination을 destinations: string[]로 교체 - role 타입을 "HOST" | "MEMBER"로 좁힘 - useCreateRoom·useUpdateRoom·syncRoomDetailFromServer 캐시 갱신을 destinations 기준으로 변경 - Map 부트스트랩 destination은 destinations[0] 기준으로 파생 - RoomCard 요약을 destinations.join(", ")로 표시 - 폼 상태는 임시로 destinations[0] ↔ [destination] 브릿지 유지 (다음 커밋에서 다중 입력 UI 도입) * feat(rooms): DestinationChipsField 다중 여행지 입력 UI 도입 - DestinationChipsField: Google Places 선택 시 칩으로 추가, X로 삭제, 최대 5개 - 중복·초과 시 인라인 경고 노출, 각 항목 100자 clamp - TripFormValues.destinations: string[]로 전환, isTripDestinationsValid·areDestinationsEqual 헬퍼 추가 - TripFormFields "목적지" 카드 헤더에 n/5 카운터 추가 - 방 생성·수정 폼 상태를 배열로 통합하고 submit 시 서버 계약대로 전송 * feat(rooms): 여행지 서버 에러 코드 한국어 매핑 - INVALID_DESTINATIONS_SIZE / DUPLICATE_DESTINATION 코드 상수·기본 메시지 추가 - messageForRoomDestinationError 헬퍼로 코드→한국어 변환 - createRoom·updateRoom이 헬퍼를 통해 사용자 표시 문구를 던지도록 조정 * refactor(plan): 일정 시간 설정 UI를 카드 하단 인라인에서 모달로 전환 - 오버레이·다이얼로그 셸(rounded-3xl, backdrop blur)로 감싸고 Esc·백드롭 클릭으로 닫히도록 변경 - 헤더에 시계 아이콘·"시간 설정" 타이틀 배치, 카드 이벤트 stopPropagation 관련 코드는 모달 격리로 정리 - 시간·체류 입력 필드와 오버랩 경고 문구는 기존 로직 유지 * refactor(plan): 프론트 인접 일정 시간 겹침 판정 로직 제거 - scheduleAdjacentConflicts 유틸 및 관련 prop/렌더 제거 - 시간 편집 모달 자동 오픈·경고 배너 제거 - 미사용 overlapWarningCompact 토큰 정리 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * refactor(place): 상세창 히어로 단일 이미지화 및 사진 탭 제거 - HeroGrid(3분할) → HeroImage(단일)로 축소 - 탭 구조 [홈][리뷰][사진] → [홈][리뷰] - PhotosTab·PhotoLightbox 삭제 및 히어로 클릭 핸들러 제거 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * style(place): 상세 패널 폭 확장 및 내부 padding 상향 - 폭 300px → 360px, off-screen translate 350 → 400px - 헤더/홈/리뷰 탭 padding px-4 → px-5, py-3 → py-4 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * feat(chat): 사용자 메시지 내 URL 자동 하이퍼링크 처리 - 공용 renderTextWithLinks 유틸 추가 (http(s)://, www. 매칭 + 후행 문장부호 분리) - ChatMarkdownContent preserveWhitespace 경로에도 URL 링크화 적용 - 메모의 renderMemoWithLinks 로컬 유틸을 공용 유틸로 치환 - chat-markdown-components 의 linkClassName 헬퍼를 export 하여 variant 별 링크 색상 공유 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * style(schedule): 여행지 제목 크기 한 단계 축소 - PLAN_PLACE_CARD_TW.titleCompact: text-lg → text-base Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * feat(places): 장소 사진 API에 size 프리셋 파라미터 반영 - PhotoSize 타입 (THUMB|CARD|HERO|GALLERY) 및 DEFAULT_PHOTO_SIZE=CARD 도입 - requestPlacePhotoUrl / requestPlacePhotoUrlsBatch 에 size 파라미터 추가 - placePhotoUrlQueryKey 에 size 포함 → 해상도별 캐시 분리 - 컨텍스트별 프리셋 지정: - usePlanPlaceCardPhoto / OgPlacePreviewCard / PlaceShareCard / BookmarkPlacePreviewCard → CARD - HeroSection → HERO - 시딩 경로 (usePlacesSearch, warmChatHistoryPlacePhotos, schedule-bulk-hydration) CARD 로 통일 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * refactor(schedule): 일정 항목 생성 시 프론트 기본 시간 값 제거 - API 계약 완화: RoomScheduleItemCreateRequest 의 startTime/durationMinutes optional - 응답 타입 RoomScheduleItem 도 nullable (string|null, number|null) 로 조정 - createScheduleItemAtPlanIndex 에서 startTimeHm·durationMinutes 하드코딩 삭제 - useCreateScheduleItem startTimeHm 파라미터 및 기본값 계산 제거 - AddFromBookmarkModal / AddToScheduleModal 의 default 계산 호출 제거 - 미사용된 defaultNewItemStartTimeHm* 유틸 삭제 - PlanPlace 변환 지점(null→undefined) 정합성 반영 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Revert "feat(places): 장소 사진 API에 size 프리셋 파라미터 반영" This reverts commit ce38e13. * feat(schedule): 체류시간 0 을 명시적 값으로 허용 - formatScheduleStaySummary/TimeRange 가 null/undefined(미설정)과 0(명시적 0분)을 구분 - PlanPlaceCard 가 durationMinutes 를 ?? 0 없이 raw 로 전달 - 0 저장 시 카드에 "시작 – 시작" range 및 "0분" 표기가 정상 노출 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(schedule): 체류시간 0 range 표기를 "시작~" 로 변경 - formatScheduleTimeRange: dur === 0 일 때 "9:00 AM – 9:00 AM" 대신 "9:00 AM~" 반환 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * style(schedule): 일차 헤더 아이보리 배경 제거 - PlanDaySection 헤더 행에서 bg-[#FFFFF0] 삭제, 컨테이너 흰색 배경으로 통일 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(plan): 시간 설정 초기화 동작 수정 - 시간 초기화 시 시작 시각과 체류시간을 미설정 상태로 저장 - 출발시간이 없을 때 체류시간 입력과 저장을 차단 - 최초 시간 설정 중에도 초기화 버튼이 표시되도록 개선 * feat(place): Google Maps 리뷰 전체보기 링크 추가 - 장소 상세 googleMapsLinks 응답에서 리뷰 URL을 매핑 - 리뷰 수집 여부와 관계없이 외부 리뷰 링크를 조건부 표시 * feat(maps): Google Maps 장소 및 길찾기 링크 추가 - 장소 상세의 권장 googleMapsLinks.placeUri를 홈 탭에 연결 - 일정 구간의 Place ID와 이동수단으로 길찾기 링크 생성 * fix(layout): 세로 스크롤바 레이아웃 흔들림 방지 - overflow-y-auto 컨테이너에 안정적인 scrollbar gutter 적용 - textarea를 제외하고 채팅 스크롤 영역을 명시적으로 보강 * fix(place): 리뷰 평점 요약 UI 정확성 개선 - 표본 리뷰 기반 별점 분포 제거 - Google 평점과 전체 리뷰 수 및 일부 리뷰 안내 표시 - 평점 요약 UI 회귀 테스트 추가 * feat(plan): 이동 수단 공유 저장 백엔드 연동 복원 (#111) * feat(plan): 이동 수단 공유 저장 백엔드 연동 복원 - PATCH …/items/{itemId}/travel-mode API·useUpdateScheduleItemTravelMode 복원, 선택 시 낙관적 반영 후 실패하면 서버 값으로 복귀 - 이동 수단 원천을 sessionStorage에서 서버 schedule_items.travel_mode(place.travelMode)로 전환, 모드 영속화(NS_MODE) 제거 - routes/batch 요청에서 travelMode 생략해 서버 저장값 사용, 응답의 실제 수단으로 캐시 시딩 - PlanTravelTime을 저장 수단 상시 조회 + 나머지 수단 메뉴 오픈 시 지연 조회 구조로 단순화 - SCHEDULE_ITEM_TRAVEL_MODE_UPDATED STOMP 이벤트 복원, 수신 시 일정 항목 재조회로 동기화 - usePrefetchScheduleDrivingRoutes → usePrefetchScheduleRoutes 등 DRIVING 전제 명칭 정리 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore(lint): worktree 사본을 ESLint ignore에 추가 - 인자 없는 eslint 실행 시 .worktrees/ 내부 사본과 각자의 .next 산출물까지 lint되어 메모리·시간 낭비(18k 문제, 2.5GB)가 발생하던 문제 방지 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(plan): 경로 batch 시딩에 일정 지문 가드 추가 - in-flight dedup 키를 출발 항목 목록에서 일정 지문으로 교체해 목적지만 바뀐 일정이 이전 batch Promise를 공유하지 않게 함 - batch 응답 도착 시 현재 캐시의 일정 지문과 대조해 불일치하면 시딩을 버려 옛 목적지 경로가 새 구간 캐시에 남는 레이스 차단 - 가드 동작 단위 테스트 추가 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: parkjuyeong0312 <dcmo77777@gmail.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
개요
공개 랜딩 페이지를 읽기 쉽고 신뢰감 있는 제품 소개 페이지로 재구성합니다. 스크린샷 중심으로 제품 스토리를 전달하고, 운영 팀을 공개하며, 공개 스크린샷에서 레거시 도메인
howaboutus.app을 제거했습니다.주요 변경
opacity:0으로 콘텐츠를 숨기던LandingReveal·온보딩 캐러셀·LandingSections·BMJUA 폰트 로더를 제거하고, 서버 렌더링부터 완전히 보이는 정적 섹션으로 재구성.LandingView는 얇은 조립 루트가 됨.src/lib/landing아래 타입 지정 정적 데이터로 관리.scripts/update-landing-screenshot-domain.mjs)로 4개 PNG의 주소창을uttae.app으로 교체. 패치 영역 외 픽셀은 원본과 동일함을 raw-pixel 단언으로 검증.prefers-reduced-motion이면 모션 생략, 숨김 상태에서pointer-events-none+포커스 진입 시 즉시 공개로 접근성 보장.layout.tsx문서 언어ko, 푸터 본문 14px로 가독성 상향, Vitest 계약 테스트 추가.검증
npm test— 통과 (Vitest 계약 테스트: 문구 순서·팀 정보·타이포그래피·서버 HTML 가시성·스크린샷)npm run build— 통과npm run lint— 랜딩 관련 신규 지적 0건 (기존 비-랜딩 파일 38 errors/29 warnings 베이스라인 유지)리뷰 노트
Github아이콘이 없어 커스텀GithubIconSVG를 추가했습니다.🤖 Generated with Claude Code
Summary by CodeRabbit
새로운 기능
개선 사항
문서