o2o-infinith-demo/supporters/src/components/FactBlock.astro
Haewon Kam 622441e6aa feat(supporters): 템플릿화 — 병원 고유값을 데이터로 분리하고 templates/supporters-astro 내보내기
- src/data/site.json 신설(매체 이름·로고·홈 큐레이션), factSheet에 kind·areaLabel·transitShort·transitNote·reservationUrl·doctorsUrl·youtube.title 추가
- lib.ts: PENDING('확인 대기')·v()·has()·surface()·editor() 도입, 스키마는 빈 값을 빼고 생성
- 페이지·컴포넌트 15개에서 뷰성형외과 하드코딩 제거, 빈 데이터 empty-state (글 0편·영상 0건·뉴스 0건·이미지 없음)
- 검증: 28페이지 표시 텍스트·구조 지문 이전 빌드와 동일(홈 title 마침표 1건만 정정), JSON-LD 차이는 빈 sameAs 제거뿐
- scripts/export_template.mjs + scripts/template/data(빈 데이터 세트) → templates/supporters-astro (빈 데이터로 10페이지 0오류 빌드, 게이트 통과)
- 게이트 픽스처를 자체 authors로 분리해 템플릿에서도 테스트 통과, 구조 기준선의 글 상세 페이지는 사전순 첫 글로 동적 선택

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-07 14:07:14 +09:00

20 lines
1.4 KiB
Plaintext

---
import { fact, v, has } from '../lib';
const f = fact as Record<string, any>;
const rows = f.hours?.rows ?? [];
interface Props { compact?: boolean }
const { compact = false } = Astro.props;
---
<aside class="fact-block" aria-label="병원 기본 정보">
<h2>{v(f.shortName, '병원')} 기본 정보</h2>
<dl>
<dt>정식 명칭</dt><dd>{v(f.name)}</dd>
<dt>주소</dt><dd>{v(f.address?.full)}</dd>
<dt>전화</dt><dd>{has(f.phone) ? <a href={`tel:${f.phone.replace(/-/g, '')}`}>{f.phone}</a> : v(f.phone)}</dd>
<dt>진료시간</dt><dd>{rows.length ? rows.map((r: any) => r.open ? `${r.days} ${r.open}~${r.close}` : `${r.days} ${r.note}`).join(' · ') : v(null)}</dd>
<dt>가는 길</dt><dd>{v(f.transit)}</dd>
{!compact && <><dt>개원</dt><dd>{has(f.founded) ? `${f.founded}년` : v(null)}</dd><dt>규모</dt><dd>{v(f.building?.summary)}</dd></>}
</dl>
<p style="margin:0.8rem 0 0;font-size:0.8rem;color:var(--slate-500)">진료시간 출처: {has(f.hours?.source) ? <a href={f.hours.source} rel="noopener">{f.hours.sourceLabel}</a> : v(null)}. 주소·전화는 {has(f.address?.source) ? <a href={f.address.source} rel="noopener">공식 홈페이지 표기</a> : '공식 홈페이지 표기'}를 따릅니다. 이 정보는 {v(f.checkedAt, '확인일 미정')}에 확인했고 다음 확인 예정일은 {v(f.nextCheck, '미정')}입니다.</p>
</aside>