o2o-infinith-demo/templates/supporters-astro/src/components/ReviewBox.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 { supporter, physician } from '../lib';
interface Props { author: string; reviewer?: string; status: 'reviewed' | 'pending'; dateModified: string }
const { author, reviewer, status, dateModified } = Astro.props;
const a = supporter(author);
const p = reviewer ? physician(reviewer) : null;
---
<section class="review-box" aria-label="작성·감수 정보">
{p?.image ? <img src={p.image} alt={`${p.name} ${p.title}`} width="56" height="56" /> : <div class="avatar">{a.name.slice(0, 1)}</div>}
<div>
<div><strong>작성</strong> <a href={`/authors/${author}`}>{a.name}</a> · {a.role} {a.email ? <> · 정정 요청 <a href={`mailto:${a.email}`}>{a.email}</a></> : <> · 정정 요청은 <a href="/corrections">정정 기록</a> 페이지 안내를 따릅니다</>}</div>
{p && status === 'reviewed' ? (
<div><strong>의학 검토</strong> {p.name} {p.title} <span class="badge reviewed">검토 완료 {dateModified}</span></div>
) : (
<div><strong>의학 검토</strong> <span class="badge pending">검토 대기</span> <span style="color:var(--slate-500)">병원이 담당 원장과 검토일을 확정하면 표시합니다.</span></div>
)}
<div style="color:var(--slate-500);margin-top:0.3rem">서포터즈는 의학적 판단을 하지 않습니다. 시술 여부와 방법은 반드시 전문의 상담으로 결정하세요.</div>
</div>
</section>