o2o-infinith-demo/templates/supporters-astro
Haewon Kam 796fa56106 feat(supporters): 주변 안내 축제를 회복 일정의 체류 기간 기준으로 먼저 보여 준다
주변 안내(/stay·/en/stay)의 축제 목록이 계절 묶음만 있고, 회복 일정 플래너에서 고른
기간과 이어지지 않았다(haewon 2026-09-16). 플래너가 체류 기간(도착일~출국 가능일)을
이 기기의 localStorage 에 남기고, 주변 안내는 그 기간과 겹치는 행사를 위로 올린다.

- Planner.astro: 결과를 그릴 때 체류 기간만 저장(시술·수술일은 저장하지 않음, 서버로도
  가지 않음). 행사 섹션에 "주변 안내에서 이 기간의 행사 전체 보기" 링크(/stay#plan:from..to)
- stay.astro·en/stay.astro: 카드에 data-start·data-end·data-km, "체류 기간" 칩(기본 숨김),
  기간 안내 문단. 스크립트가 URL 해시 또는 localStorage 에서 기간을 읽어 겹치는 카드를
  맨 앞으로 옮기고 칩을 켠다. 기간이 짧은 행사가 앞, 90일을 넘는 상시 행사는 뒤('상시 진행')
- 기간이 없거나 겹침이 없으면 화면은 이전과 같다. 저장소를 못 쓰는 브라우저는 조용히 건너뛴다
- global.css: 겹치는 카드 테두리·오른쪽 배지, 숨긴 칩
- run.mjs: planStrings.json 을 코드 갱신 목록에 넣는다. 기존 병원 폴더에 옛 문구 파일이
  남아 링크 글자가 비어 나온 것을 캡처로 발견했다

검증: 원진 빌드 게이트 통과, plan.test 14건 통과, 로컬 미리보기(Playwright)로
플래너 저장→주변 안내 정렬(20/24건, 짧은 행사 먼저)·해시 진입·기간 없음·영문·모바일 확인.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-16 09:47:01 +09:00
..
.vscode feat(supporters): 템플릿화 — 병원 고유값을 데이터로 분리하고 templates/supporters-astro 내보내기 2026-09-07 14:07:14 +09:00
briefs feat(supporters): 원진 랜딩 히어로를 글로벌 허브 리셉션 사진으로 (haewon 지정) · 갤러리 사진을 카드 후보에서 제외 2026-09-12 16:55:40 +09:00
public docs(reports): 답변엔진 확장 검토 보고서 (120문항 비용 추정·후보별 약관) 2026-09-15 09:36:33 +09:00
scripts feat(supporters): 원진 랜딩 히어로를 글로벌 허브 리셉션 사진으로 (haewon 지정) · 갤러리 사진을 카드 후보에서 제외 2026-09-12 16:55:40 +09:00
src feat(supporters): 주변 안내 축제를 회복 일정의 체류 기간 기준으로 먼저 보여 준다 2026-09-16 09:47:01 +09:00
.env.example feat(supporters): 템플릿화 — 병원 고유값을 데이터로 분리하고 templates/supporters-astro 내보내기 2026-09-07 14:07:14 +09:00
.gitignore feat(supporters): 회복 일정 플래너를 템플릿·워커에 통합 (/plan·/en/plan), /recovery·/stay 를 /plan 으로 정리 2026-09-11 11:27:59 +09:00
AGENTS.md feat(supporters): 템플릿화 — 병원 고유값을 데이터로 분리하고 templates/supporters-astro 내보내기 2026-09-07 14:07:14 +09:00
astro.config.mjs fix(supporters): astro.config 의 /stay→/recovery 리다이렉트 제거 (주변 안내 페이지가 리다이렉트 HTML 로 덮이던 원인) 2026-09-11 18:30:24 +09:00
CLAUDE.md feat(supporters): 영어 화면의 병원 고유 사실을 데이터에서 읽도록 바꾸고 템플릿 재생성 2026-09-12 14:27:57 +09:00
DEPLOY_NOTE.md feat(supporters): 회복 일정 플래너를 템플릿·워커에 통합 (/plan·/en/plan), /recovery·/stay 를 /plan 으로 정리 2026-09-11 11:27:59 +09:00
package-lock.json feat(supporters): 승인 UI·입력 반영·워커 — §7-5 ClinicInputsPanel + supporter_builds/inputs 마이그레이션 + apply_inputs, §12-2 상단 고지·개설자 승인·색인 빌드 필터, §7-6 워커 E2E(뷰성형외과 URL → 5편 → 게이트 0오류) 2026-09-07 17:07:06 +09:00
package.json feat(supporters): 승인 UI·입력 반영·워커 — §7-5 ClinicInputsPanel + supporter_builds/inputs 마이그레이션 + apply_inputs, §12-2 상단 고지·개설자 승인·색인 빌드 필터, §7-6 워커 E2E(뷰성형외과 URL → 5편 → 게이트 0오류) 2026-09-07 17:07:06 +09:00
README.md feat(supporters): 템플릿화 — 병원 고유값을 데이터로 분리하고 templates/supporters-astro 내보내기 2026-09-07 14:07:14 +09:00
tsconfig.json feat(supporters): 템플릿화 — 병원 고유값을 데이터로 분리하고 templates/supporters-astro 내보내기 2026-09-07 14:07:14 +09:00
vercel.json feat(supporters): 주변 안내(/stay·/en/stay) 복원 · 회복 일정 플래너(/plan)와 별개 페이지로 2026-09-11 18:28:12 +09:00

supporters-astro 템플릿

병원 하나의 서포터즈 사이트를 만드는 Astro 7 정적 템플릿이다. supporters/(뷰성형외과 샘플)에서 node scripts/export_template.mjs로 생성되며, 직접 편집하지 않는다. 고칠 것은 supporters/에서 고치고 다시 내보낸다.

데이터만 채우면 되는 것

파일 내용 채우는 주체
src/data/factSheet.json 병원 사실 단일 원본 (NAP·진료시간·층·진료과·안전·이력·플랫폼 집계) 근거 수집기 + 병원 확인
src/data/authors.json 작성자(실명·직함·sameAs·정정 이메일), 의학 검토 원장 운영자·병원 입력
src/data/site.json 매체 이름·로고·홈 화면 큐레이션(영상 3편, 시설 사진, 방문 약도, 추천 글) 운영자
src/data/videos.json 유튜브 채널 집계 (Top10 롱폼·정보형 쇼츠+답) 수집기
src/data/news.json 뉴스룸 (보도자료·기고·언급) scripts/build_news.py
src/data/corrections.json 정정 기록 운영자
src/content/posts/*.md 글. frontmatter 규격은 src/content.config.ts 글 생성기 + 검토 승인
public/img/ 병원 허락을 받은 이미지 수집기
scripts/home_text.txt 홈페이지 본문(공백 제거). 40자 연속 일치 검사 기준 수집기

비어 있는 값은 화면에 "확인 대기"로 표시되고 스키마에서는 빠진다. 지어내지 않는다.

빌드·검사

npm ci
npm run build          # astro build + 발행 게이트(scripts/check.mjs). error가 있으면 exit 1
npm run gate:test      # 게이트 규칙 회귀 (픽스처 + 글 전편)
node scripts/check.mjs --update-layout   # 룩앤필 변경을 승인한 뒤에만 구조 기준선 갱신

배포 주소는 SITE_URL 환경변수(vercel.json·astro.config.mjs의 __CLINIC_ID__를 병원 id로 교체). 기본은 noindex이며 PUBLIC_INDEXABLE=true로 색인을 연다.