Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
1a074e9
Merge branch 'master' into develop after v0.1.21 release
SHcommit Oct 12, 2026
0eb3037
Merge pull request #394 from YRootLab/sync/v0.1.21-back-merge
SHcommit Oct 12, 2026
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
e738b65
Merge pull request #395 from YRootLab/feat/k-maru-discovery-navigation
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