Skip to content

feat(landing): 랜딩 페이지 스크린샷 중심 리디자인 - #110

Merged
minbros merged 15 commits into
devfrom
feat/landing-redesign
Jul 10, 2026
Merged

feat(landing): 랜딩 페이지 스크린샷 중심 리디자인#110
minbros merged 15 commits into
devfrom
feat/landing-redesign

Conversation

@minbros

@minbros minbros commented Jul 10, 2026

Copy link
Copy Markdown
Member

개요

공개 랜딩 페이지를 읽기 쉽고 신뢰감 있는 제품 소개 페이지로 재구성합니다. 스크린샷 중심으로 제품 스토리를 전달하고, 운영 팀을 공개하며, 공개 스크린샷에서 레거시 도메인 howaboutus.app을 제거했습니다.

주요 변경

  • 구조 재작성: hydration 이전 opacity:0으로 콘텐츠를 숨기던 LandingReveal·온보딩 캐러셀·LandingSections·BMJUA 폰트 로더를 제거하고, 서버 렌더링부터 완전히 보이는 정적 섹션으로 재구성. LandingView는 얇은 조립 루트가 됨.
  • 새 섹션: 헤더(파비콘 마크), 히어로, 가치 스트립, 기능 스토리 3개, 협업 카드, 사용 방법, 팀 소개, 최종 CTA. 문구·팀 데이터는 src/lib/landing 아래 타입 지정 정적 데이터로 관리.
  • 타이포그래피: BMJUA 제거, 전역 sans-serif로 통일. 히어로/섹션 제목·본문 크기 상향.
  • 스크린샷 도메인 교체: 결정론적 Sharp 스크립트(scripts/update-landing-screenshot-domain.mjs)로 4개 PNG의 주소창을 uttae.app으로 교체. 패치 영역 외 픽셀은 원본과 동일함을 raw-pixel 단언으로 검증.
  • 반응형 수정: 협업 카드를 세로 스택으로 재배치해 세로형 스크린샷을 데스크톱 360px까지 키우고, 768px에서 텍스트 열이 붕괴하던 문제 해결.
  • 모션 복원(스펙 §15 준수): 폴드 아래 섹션에만 스크롤 진입 시 페이드+12px 상승. 서버 HTML은 항상 완전히 보이고, 숨김은 hydration 후 화면 밖 요소에만 적용. 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 베이스라인 유지)
  • 브라우저 실측 — 1440/768/360px 레이아웃, 접근성(제목 위계·포커스 링·앵커 스크롤·GitHub 링크 새 탭·reduced-motion), 4개 스크린샷 도메인 육안 확인

리뷰 노트

  • 다단계 서브에이전트 실행(구현→스펙/품질 리뷰→수정)으로 진행했고, 각 태스크와 최종 전체 브랜치 리뷰까지 통과했습니다.
  • lucide-react 1.7.0에 Github 아이콘이 없어 커스텀 GithubIcon SVG를 추가했습니다.
  • 커밋 메시지 접두사가 영어/한국어 혼재라, squash merge 시 제목을 저장소 컨벤션(한국어)에 맞추셔도 됩니다.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • 새로운 기능

    • 랜딩 페이지를 새롭게 구성해 제품 기능, 협업 방식, 시작 방법, 팀 소개를 한눈에 확인할 수 있습니다.
    • 히어로 영역, 기능 스토리, 단계별 안내, 최종 무료 시작 CTA를 추가했습니다.
    • 헤더 앵커 메뉴와 로그인·무료 시작 링크를 제공합니다.
    • 팀 소개에서 GitHub 프로필로 이동할 수 있습니다.
  • 개선 사항

    • 모바일·데스크톱 반응형 레이아웃과 접근성을 강화했습니다.
    • 서버 렌더링 시 주요 콘텐츠가 즉시 표시되며, 모션 감소 설정을 지원합니다.
  • 문서

    • 랜딩 페이지 리디자인 설계 및 구현 계획을 추가했습니다.

minbros and others added 15 commits July 10, 2026 21:55
- 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>
@vercel

vercel Bot commented Jul 10, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
frontend-server Ready Ready Preview, Comment Jul 10, 2026 4:38pm

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Changes

랜딩 페이지를 정적 콘텐츠 기반의 섹션 조합 구조로 전환하고, 새 콘텐츠 계약·스크린샷 설정·접근성 모션·서버 렌더링 테스트를 추가했습니다. Sharp 기반 스크린샷 도메인 패치와 Vitest 실행 설정도 도입했습니다.

랜딩 페이지 리디자인

Layer / File(s) Summary
콘텐츠 및 스타일 계약
docs/superpowers/..., src/lib/landing/*, src/lib/public-assets.ts, src/app/layout.tsx
새 랜딩 데이터 모델, 타이포그래피, 스크린샷 크기, 한국어 문서 언어와 폰트 제거 설정을 반영합니다.
랜딩 섹션 구현
src/app/_components/Landing*.tsx, src/components/icons/*
헤더·히어로·가치·기능·협업·시작 방법·팀·CTA 섹션과 링크·GitHub 아이콘을 구현합니다.
페이지 조합 및 모션
src/app/_components/LandingView.tsx, src/app/_components/LandingMotion.tsx, src/components/layout/SiteFooter.tsx
새 섹션 렌더링 흐름과 뷰포트·포커스·reduced-motion 처리를 적용하고 푸터 텍스트 크기를 조정합니다.
서버 렌더링 및 계약 검증
vitest.config.ts, package.json, src/**/*.test.ts*
Vitest 실행 설정과 콘텐츠, 링크, 정적 섹션, 모션 및 전체 랜딩 HTML 검증을 추가합니다.
스크린샷 도메인 패치
scripts/update-landing-screenshot-domain.mjs
지정 영역에만 uttae.app을 합성하고 이미지 외부 영역의 픽셀 불변을 확인합니다.

저장소 유지보수

Layer / File(s) Summary
로컬 디렉터리 무시 규칙
.gitignore
.serena/, .superpowers/, .worktrees/ 경로를 무시합니다.

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: 랜딩 이미지 렌더링
Loading

Poem

당근발처럼 새 랜딩이 펼쳐져요
토끼는 스크린샷을 콕 고쳐요
섹션마다 이야기가 자라고
모션은 살며시 귀를 세우고
uttae.app 햇살 아래 깡충!

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 랜딩 페이지를 스크린샷 중심으로 재구성하는 변경 내용을 정확히 요약한 제목입니다.
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.

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.

❤️ 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: 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

📥 Commits

Reviewing files that changed from the base of the PR and between a914e5a and 8c7eabb.

⛔ Files ignored due to path filters (5)
  • package-lock.json is excluded by !**/package-lock.json
  • public/landing/01-hero-app.png is excluded by !**/*.png
  • public/landing/02-feature-map.png is excluded by !**/*.png
  • public/landing/03-feature-place-share.png is excluded by !**/*.png
  • public/landing/04-feature-plan.png is excluded by !**/*.png
📒 Files selected for processing (34)
  • .gitignore
  • docs/superpowers/plans/2026-07-10-landing-page-redesign.md
  • docs/superpowers/specs/2026-07-10-landing-page-redesign-design.md
  • package.json
  • scripts/update-landing-screenshot-domain.mjs
  • src/app/_components/LandingActionLink.test.tsx
  • src/app/_components/LandingActionLink.tsx
  • src/app/_components/LandingCollaborationSection.tsx
  • src/app/_components/LandingFeatureStory.tsx
  • src/app/_components/LandingFinalCta.tsx
  • src/app/_components/LandingHeader.tsx
  • src/app/_components/LandingHero.tsx
  • src/app/_components/LandingHowItWorks.tsx
  • src/app/_components/LandingMotion.test.tsx
  • src/app/_components/LandingMotion.tsx
  • src/app/_components/LandingOnboardingCarousel.tsx
  • src/app/_components/LandingReveal.tsx
  • src/app/_components/LandingSections.tsx
  • src/app/_components/LandingStaticSections.test.tsx
  • src/app/_components/LandingTeamSection.tsx
  • src/app/_components/LandingValueStrip.tsx
  • src/app/_components/LandingView.test.tsx
  • src/app/_components/LandingView.tsx
  • src/app/layout.tsx
  • src/components/icons/GithubIcon.tsx
  • src/components/icons/index.ts
  • src/components/layout/SiteFooter.tsx
  • src/lib/landing/landing-content.test.ts
  • src/lib/landing/landing-content.ts
  • src/lib/landing/landing-font.ts
  • src/lib/landing/landing-screenshots.ts
  • src/lib/landing/landing-typography.ts
  • src/lib/public-assets.ts
  • vitest.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

Comment thread scripts/update-landing-screenshot-domain.mjs
Comment thread src/app/_components/LandingHeader.tsx
@minbros
minbros merged commit 1e6be6f into dev Jul 10, 2026
3 checks passed
@minbros
minbros deleted the feat/landing-redesign branch July 10, 2026 17:32
minbros added a commit that referenced this pull request Jul 11, 2026
* 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant