Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
c581150
feat: 네비게이션 메뉴바에 K-마루 추가 및 아이콘 시스템 HugeIcons 일원화
yshls Oct 14, 2026
8df71c6
feat: 메뉴바 순서 조정 (한옥마루 → K-마루 → 소리마루 → 지도마루)
yshls Oct 14, 2026
6de0120
fix: 지도 네비게이션 레일 메뉴 순서 및 구성을 홈 메뉴바와 1:1로 일치
yshls Oct 14, 2026
9930101
design: K-마루 장소 카드 및 필터 칩 디자인 전면 개편
yshls Oct 14, 2026
a096f10
feat: add member API repository and warmth particles hook for realtim…
yshls Oct 14, 2026
c49c747
Potential fix for pull request finding 'CodeQL / Unused variable, imp…
yshls Oct 14, 2026
3fe70c8
design: K-마루 카드 및 탭의 border 제거 및 ringShadow 토큰으로 통일
yshls Oct 14, 2026
61b5e62
feat: K-마루 장소 개수 인디케이터 삭제 및 액션바 레이아웃 정돈
yshls Oct 14, 2026
670e9bb
feat: K-마루 장소 목록 그리드 페이지네이션 구현
yshls Oct 14, 2026
384fc87
feat: K-마루 중복 서브 필터 영역 제거 및 레이아웃 단순화
yshls Oct 14, 2026
ba0d72c
feat: add DiscoveryPlaceCard component for k-culture discovery feature
yshls Oct 14, 2026
9c8c574
feat: K-마루 장소 검색창 추가 (아이콘 포함) 및 호버 애니메이션 개선
yshls Oct 14, 2026
33edb4f
design: K-마루 검색창 하단 간격 추가 및 입력 스타일 ringShadow 토큰으로 개선
yshls Oct 14, 2026
ed6790d
refactor: k-culture discovery 목 데이터(fixtures.ts) 삭제
yshls Oct 14, 2026
02903f3
feat: K-마루 히어로 카드 + 드라마별/지역별 가로 스크롤 섹션 추가
yshls Oct 14, 2026
b24b347
feat: add FeaturedPlaceCard component for K-culture discovery feature
yshls Oct 14, 2026
c5db7b0
Potential fix for pull request finding 'CodeQL / Unused variable, imp…
yshls Oct 14, 2026
42f69e8
Potential fix for pull request finding 'CodeQL / Unused variable, imp…
yshls Oct 14, 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
12 changes: 12 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,18 @@ Lightweight human-readable summary of meaningful repository changes. This does n

## Unreleased

- K-마루(`KCultureDiscovery`) 장소 카드 및 페이지 디자인을 전면 개편했다:
- 주제 탭 아래 중복되어 시각적 피로감을 주던 세부 서브 필터 영역(콘텐츠 유형, 지역, 장소 유형 칩 묶음)을 전면 제거하여, 주제 탭과 장소 카드가 시원하고 여백감 넘치게 이어지도록 페이지 구성을 정돈했다.
- 장소 목록의 과도한 세로 스크롤을 방지하기 위해 6개 단위 그리드 페이지네이션(`DiscoveryPlacesSection`)을 구현하고, `ringShadow` 토큰 기반의 세련된 페이지 버튼(`[<] [1] [2] ... [>]`)과 페이지 전환 시 부드러운 상단 스크롤을 지원했다.
- 장소 목록 상단의 '장소 N곳' 개수 표시 및 라이브 닷 인디케이터를 삭제하여 시각적 군더더기를 없애고, '작품 목록' 버튼만 우측에 단정하게 배치했다.
- 온마루 디자인 시스템 원칙에 맞추어 장소 카드, 스켈레톤, 필터 칩, 네비게이션 탭의 불필요한 외곽선(`border`)을 일체 배제하고, 자연스러운 입체감을 위해 온마루 표준 `ringShadow` 토큰(`card`, `cardHoverGlow`, `button`, `chipActive` 등)으로 통일했다.
- 장소 카드에 K-콘텐츠 전용 인라인 뱃지(`WorkRelationBadge`)를 도입해 작품명과 촬영지/방문지 역할을 세련된 미니 블록으로 시각화했다.
- 지역명이 비어 있거나 없는 경우 빈 핀 아이콘만 노출되던 문제를 해결하고, 한국관광공사 지역 코드 매핑을 통해 정규화된 2글자 지역명을 렌더링하도록 개선했다.
- 이미지 미제공 장소의 폴백을 은은한 수묵·한지 질감과 단정한 엠블럼의 고품격 비주얼로 업그레이드했다.
- 메뉴바(상단 데스크톱 네비게이션, 모바일 하단 탭바, 모바일 메뉴 및 지도 사이드 레일)에 K-콘텐츠 탐색을 위한 `K-마루` 항목을 추가하고 헤더 정렬 테스트를 갱신했다.
- 지도 화면의 네비게이션 레일(`MapNavRail`) 메뉴 순서를 홈 메뉴바와 동일하게 `홈 → 한옥마루 → K-마루 → 소리마루 → 지도마루`로 동기화하고, 지도마루 아이콘을 홈과 동일한 `MapIcon`으로 일치시켰으며 `모음마루`를 하단 개인화 영역으로 분리 정돈했다.
- 사계절(`seasons`) 컴포넌트의 `lucide-react` 화살표 아이콘을 프로젝트 표준인 `HugeIcons`로 교체하고 `lucide-react` 의존성을 제거했다.

## [v0.1.21] - 2026-10-13

- 사계 화면에서 장소 사진 미리보기를 마우스 hover가 아니라 탭(클릭)으로 바꿔, 모든 화면 크기에서 배경 사진이 깜빡이지 않게 했다.
Expand Down
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
"@vercel/analytics": "^2.0.1",
"@vercel/speed-insights": "^2.0.0",
"framer-motion": "^12.42.2",
"lucide-react": "^1.29.0",
"gsap": "^3.15.0",
"lenis": "^1.3.25",
"leva": "^0.10.1",
Expand Down
52 changes: 52 additions & 0 deletions src/app/api/discovery/place-image/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { NextResponse } from 'next/server';

// ponytail: 백엔드가 placeImage: null 반환하는 동안 TourAPI에서 직접 가져오는 임시 브릿지
export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const contentId = searchParams.get('contentId');

if (!contentId || !/^\d+$/.test(contentId)) {
return NextResponse.json({ imageUrl: null });
}

const apiKey = process.env.TOUR_API_KEY;
if (!apiKey) return NextResponse.json({ imageUrl: null });

try {
const qs = new URLSearchParams({
serviceKey: apiKey,
contentId,
defaultYN: 'N',
firstImageYN: 'Y',
areacodeYN: 'N',
catcodeYN: 'N',
addrinfoYN: 'N',
mapinfoYN: 'N',
overviewYN: 'N',
numOfRows: '1',
pageNo: '1',
MobileOS: 'ETC',
MobileApp: 'OnMaru',
_type: 'json',
});

const res = await fetch(
`https://apis.data.go.kr/B551011/KorService2/detailCommon2?${qs}`,
{ signal: AbortSignal.timeout(5000) },
);

if (!res.ok) return NextResponse.json({ imageUrl: null });

const data = await res.json();
const raw = data?.response?.body?.items?.item;
const item = Array.isArray(raw) ? raw[0] : raw;
const imageUrl = item?.firstimage || item?.firstimage2 || null;

return NextResponse.json(
{ imageUrl: imageUrl ? imageUrl.replace(/^http:\/\//i, 'https://') : null },
{ headers: { 'Cache-Control': 'public, max-age=86400, stale-while-revalidate=3600' } },
);
} catch {
return NextResponse.json({ imageUrl: null });
}
}
29 changes: 0 additions & 29 deletions src/features/hanok-archive/HanokArchive.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import HanokStayAccordion from '@/features/hanok-archive/sections/HanokStayAccor
import HanokMap from '@/features/hanok-archive/sections/HanokMap';
import HanokPolaroidClothesline from '@/features/hanok-archive/sections/HanokPolaroidClothesline';
import HanokSideIndex from '@/features/hanok-archive/components/HanokSideIndex';
import KCultureThemeFeed from '@/features/hanok-archive/components/KCultureThemeFeed';
import HanokManifestoCta from '@/features/hanok-archive/sections/HanokManifestoCta';
import HanokStructureCards from '@/features/hanok-archive/structure/HanokStructureCards';
import type { Village, VillageMeta } from '@/features/hanok-archive/types';
Expand Down Expand Up @@ -85,21 +84,6 @@ const SectionContainer = styled.div`
}
`;

const KCultureSectionContainer = styled(SectionContainer)`
padding-top: clamp(14px, 2vw, 24px);
padding-bottom: clamp(14px, 2vw, 24px);

@media (max-width: 1024px) {
padding-top: clamp(12px, 2vw, 20px);
padding-bottom: clamp(12px, 2vw, 20px);
}

@media (max-width: 640px) {
padding-top: clamp(10px, 2vw, 16px);
padding-bottom: clamp(10px, 2vw, 16px);
}
`;

const StyledVesselReveal = styled(VesselReveal)`
width: 100%;
`;
Expand All @@ -120,10 +104,6 @@ const paperGround = css`



const EditorialSection = styled.div`
padding-top: clamp(32px, 3.5vh, 46px);
`;


const ChapterBreak = styled.div`
padding-top: clamp(80px, 9vh, 124px);
Expand Down Expand Up @@ -298,15 +278,6 @@ export default function HanokArchive({
</IntroStage>
</StyledVesselReveal>

{}
<EditorialSection>
<StyledVesselReveal id={HANOK_REVEAL_SECTIONS.kculture}>
<KCultureSectionContainer>
<KCultureThemeFeed />
</KCultureSectionContainer>
</StyledVesselReveal>
</EditorialSection>

{


Expand Down
1 change: 0 additions & 1 deletion src/features/hanok-archive/components/HanokSideIndex.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import { HANOK_REVEAL_SECTIONS } from '@/features/hanok-archive/hanokSectionReve


const SIDE_INDEX_SECTIONS = [
{ id: 'hanok-kculture-themes', label: '스크린 속 한옥' },
{ id: HANOK_REVEAL_SECTIONS.structure, label: '3D 구조 & 일조' },
{ id: HANOK_REVEAL_SECTIONS.grid, label: '전국 한옥 도감' },
{ id: HANOK_REVEAL_SECTIONS.stay, label: '지역별 한옥 스테이' },
Expand Down
Loading
Loading