import {useSite} from '@/lib/site-context'; import {bookingLabel, bookingLinks, heroFacts, lowestPrice} from '@/lib/derive'; /** * 파스텔의 첫 화면 — **연노랑 판 위에 둥근 사진**. * * ★ 사진을 쓴다 (2026-09-03, 두 번째 반려) * 처음엔 상호를 담은 CSS 배지를 벽지처럼 깔았다. 레퍼런스(아이스크림 브랜드)는 그게 맞다 — * **그쪽은 파는 게 브랜드고, 여기는 파는 게 집이다.** 손님이 첫 화면에서 보고 싶은 건 * 상호를 반복한 무늬가 아니라 방이 어떻게 생겼는가다. 파스텔은 사진을 감싸는 판으로 남기고, * 원 무늬는 사진 뒤에 몇 개만 흘려 이 안의 결만 유지한다. * ★ 사진 모서리를 크게 굴린다(--tpl-radius 가 24px 인 안이다). 각진 사진 하나만 딱딱해 보인다. * ★ 장식 원은 aria-hidden 이고 사진 **뒤**에 둔다. 사진을 가리면 장식이 아니라 방해다. */ export function Hero() { const payload = useSite(); const {place, narrative} = payload; const facts = heroFacts(payload); const price = lowestPrice(payload); const links = bookingLinks(payload); const line = narrative.tagline ?? narrative.summary; const locality = place.addressLocality ?? place.addressRegion; // 대표 사진이 먼저. og:image 와 첫 장이 다르면 공유 카드와 화면이 어긋난다. const shots = [...payload.media] .filter((image) => image.alt?.trim()) .sort((a, b) => Number(b.isPrimary) - Number(a.isPrimary)) .slice(0, 3); // id="top" — 상단 워드마크와 하단 바가 여기로 돌아온다. return (
{/* 판 1 — 연노랑 바탕. 왼쪽에 말, 오른쪽에 사진. */}
{/* 장식 원 — 사진 뒤에서 살짝만 삐져나온다. 화면 밖으로 잘려도 된다. */}
{locality && (

{locality}

)} {/* h1 은 페이지에 하나. 가게 이름이 들어가야 "○○ 홈페이지" 질의에 잡힌다. */}

{place.name}

{line && (

{line}

)} {links.length > 0 && ( {bookingLabel(links[0])}로 예약 )}
{shots[0] && (
{shots[0].alt}
)} {/* 나머지 두 장은 아래 작게. 사진 문장(alt)이 문서에서 사라지지 않게 남긴다. */} {shots.length > 1 && (
    {shots.slice(1).map((image) => (
  • {image.alt}
  • ))}
)}
{/* 판 2 — 가격 · 핵심 값. ★ 국내 숙박 사이트에서 첫 화면이 답해야 하는 건 셋이다: 얼마인가 · 언제 드나 · 어디서 예약하나. 예약은 위 버튼이 받고 나머지 둘이 이 띠다. 값이 하나도 없으면(수집 전 가게) 빈 칸 네 개 대신 판을 지운다. */} {(price || facts.length > 0) && (
{price && (
최저가
{price}
)} {facts.map((row) => (
{row.label}
{row.value}
))}
)}
); }