@roottale/cms-renderer-next 0.48.0 → 0.51.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/dist/blog-filter-BKCGM0qd.d.ts +29 -0
  3. package/dist/{chunk-6MFHA555.js → chunk-27RT6B3O.js} +1 -1
  4. package/dist/chunk-27RT6B3O.js.map +1 -0
  5. package/dist/chunk-2QU4JU46.js +3927 -0
  6. package/dist/chunk-2QU4JU46.js.map +1 -0
  7. package/dist/chunk-4RQ3SEDL.js +106 -0
  8. package/dist/chunk-4RQ3SEDL.js.map +1 -0
  9. package/dist/{chunk-OMXEU4LS.js → chunk-QYNEOFL7.js} +140 -136
  10. package/dist/chunk-QYNEOFL7.js.map +1 -0
  11. package/dist/concerns-client.d.ts +1 -1
  12. package/dist/expertise-client.d.ts +1 -1
  13. package/dist/expertise-client.js +1 -1
  14. package/dist/hero-carousel-client.js +1 -1
  15. package/dist/routes.d.ts +334 -20
  16. package/dist/routes.js +249 -68
  17. package/dist/routes.js.map +1 -1
  18. package/dist/seo-asset-hosts.d.ts +36 -0
  19. package/dist/seo-asset-hosts.js +391 -0
  20. package/dist/seo-asset-hosts.js.map +1 -0
  21. package/dist/server.d.ts +23 -241
  22. package/dist/server.js +6 -6
  23. package/dist/{site-config-Dicv57oY.d.ts → site-config-BvUyDx_f.d.ts} +411 -411
  24. package/dist/spaces-client.d.ts +1 -1
  25. package/dist/team-expanding-stage-client.d.ts +1 -1
  26. package/dist/team-expanding-stage-client.js +1 -1
  27. package/dist/templates.d.ts +64 -25
  28. package/dist/templates.js +13 -6
  29. package/dist/templates.js.map +1 -1
  30. package/package.json +7 -2
  31. package/dist/chunk-6MFHA555.js.map +0 -1
  32. package/dist/chunk-FZK3EXYZ.js +0 -103
  33. package/dist/chunk-FZK3EXYZ.js.map +0 -1
  34. package/dist/chunk-LIBSVC4M.js +0 -3642
  35. package/dist/chunk-LIBSVC4M.js.map +0 -1
  36. package/dist/chunk-OMXEU4LS.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/PostCard.tsx","../../cms-i18n/src/index.ts","../src/TableOfContents.tsx","../../ui-react/dist/theme/index.js","../src/theme-css-vars.ts","../src/FloatingCta.tsx","../src/LeadForm.tsx","../src/block-to-react.tsx","../src/toc.ts","../src/server/blog-list.tsx","../src/server/blog-settings.ts","../src/server/post-links.ts","../src/server/theme.tsx","../src/server/blog-categories.tsx","../src/server/blog-post.tsx","../src/server/blog-post-archive.tsx","../src/server/tiptap-node-renderer.tsx","../src/section-render-context.ts","../src/server/tiptap-embed-renderer.tsx","../src/server/tiptap-types.ts","../src/server/tiptap-inline-renderer.tsx","../src/server/render-tiptap.tsx","../src/server/blog-post-body.tsx","../src/server/blog-post-breadcrumb.tsx","../src/server/blog-post-footer.tsx","../src/server/page.tsx","../src/templates/section-templates/shared.tsx","../src/templates/section-templates/hero.tsx","../src/templates/section-templates/rich-text.tsx","../src/templates/section-templates/services-base.tsx","../src/templates/section-templates/services-variants.tsx","../src/templates/section-templates/services.tsx","../src/templates/section-templates/footer.tsx","../src/templates/section-templates/faq.tsx","../src/templates/section-templates/cta-banner.tsx","../src/templates/metric-value.ts","../src/templates/section-templates/trust.tsx","../src/templates/section-templates/testimonials-editorial.tsx","../src/templates/section-templates/testimonials-rail.tsx","../src/templates/section-templates/testimonials-star.tsx","../src/templates/section-templates/testimonials.tsx","../src/templates/section-templates/team.tsx","../src/templates/section-templates/contact-shared.tsx","../src/templates/section-templates/contact-channels.tsx","../src/templates/section-templates/contact-visit.tsx","../src/templates/section-templates/contact.tsx","../src/templates/section-templates/practice-shared.tsx","../src/templates/section-templates/hours.tsx","../src/templates/section-templates/pricing.tsx","../src/templates/section-templates/process.tsx","../src/templates/section-templates/before-after.tsx","../src/templates/professional-sections.tsx","../src/templates/render-section-node.tsx","../src/templates/register.ts","../src/server.tsx"],"sourcesContent":["/**\n * `<RootTalePostCard>` — server-only summary card for a single CmsPostContent.\n *\n * Building block for `<RootTaleBlogList>` (and customer-side custom grids).\n * Pure SSR — featured image + category + title + meta + excerpt. Featured\n * image uses `CmsPostContent.featuredImageUrl` (CF Images delivery URL exposed\n * since cms-client 0.12); category is the first `terms` entry whose taxonomy is\n * `category`. Both render only when present, so text-only posts are unchanged.\n */\n\nimport type { ReactElement } from \"react\";\nimport type { CmsPostContent, CmsTermRef } from \"@roottale/cms-client/server\";\n\ntype CmsPostWithAuthor = CmsPostContent & { authorName?: string | null };\n\nexport interface RootTalePostCardProps {\n post: CmsPostContent;\n /** Customer-side URL builder. Defaults to `/blog/${slug}`. */\n href?: (post: CmsPostContent) => string;\n /**\n * 표시 옵션 (플랫폼 blog-settings + 글별 override resolve 결과). 미지정 시\n * 발행일만 표시(작성자 없음) — 직접 사용하는 커스텀 그리드 하위호환.\n * `showImage`/`showCategory` 는 데이터가 있을 때 노출 여부(기본 노출).\n */\n display?: {\n showDate: boolean;\n showAuthor: boolean;\n showImage?: boolean;\n showCategory?: boolean;\n };\n}\n\nfunction firstCategoryName(terms: CmsTermRef[] | undefined | null): string | null {\n if (!terms) return null;\n const cat = terms.find((t) => t.taxonomy === \"category\");\n return cat ? cat.name : null;\n}\n\nexport function RootTalePostCard(props: RootTalePostCardProps): ReactElement {\n const { post, href = defaultHref, display } = props;\n const showDate = display ? display.showDate : true;\n const showAuthor = display ? display.showAuthor : false;\n const showImage = display?.showImage !== false;\n const showCategory = display?.showCategory !== false;\n const authorName = (post as CmsPostWithAuthor).authorName;\n const publishedDate = showDate ? formatPublishedDate(post.publishedAt) : \"\";\n const views = typeof post.viewCount === \"number\" ? post.viewCount : null;\n const imageUrl = showImage ? post.featuredImageUrl : null;\n const category = showCategory ? firstCategoryName(post.terms) : null;\n return (\n <article data-roottale-cms=\"card\" className=\"rt-cms-card\">\n <a className=\"rt-cms-card-link\" href={href(post)}>\n {imageUrl ? (\n <img\n className=\"rt-cms-card-image\"\n src={imageUrl}\n alt=\"\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n ) : null}\n {category ? (\n <span className=\"rt-cms-card-category\">{category}</span>\n ) : null}\n {publishedDate || (showAuthor && authorName) || views !== null ? (\n <p className=\"rt-cms-meta\">\n {publishedDate ? (\n <span className=\"rt-cms-meta-item\" data-rt-cms-meta=\"date\">\n {publishedDate}\n </span>\n ) : null}\n {showAuthor && authorName ? (\n <span className=\"rt-cms-meta-item\" data-rt-cms-meta=\"author\">\n 작성자 {authorName}\n </span>\n ) : null}\n {/* ADR-0065 — 조회수는 사이트 공개 토글 on 일 때만 API 가 viewCount 를\n 내려준다. 따라서 값이 있으면 그대로 노출(별도 표시 설정 불필요). */}\n {views !== null ? (\n <span className=\"rt-cms-meta-item\" data-rt-cms-meta=\"views\">\n 조회 {views.toLocaleString(\"ko-KR\")}\n </span>\n ) : null}\n </p>\n ) : null}\n <h2 className=\"rt-cms-title\">{post.title}</h2>\n {post.excerpt ? <p className=\"rt-cms-excerpt\">{post.excerpt}</p> : null}\n <span className=\"rt-cms-card-action\" aria-hidden=\"true\">\n 읽기\n </span>\n </a>\n </article>\n );\n}\n\nfunction defaultHref(post: CmsPostContent): string {\n return `/blog/${post.slug}`;\n}\n\nfunction formatPublishedDate(iso: string): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return \"\";\n return new Intl.DateTimeFormat(\"ko-KR\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }).format(d);\n}\n","/**\n * `@roottale/cms-i18n` — RootTale CMS 렌더러 UI 문자열 (ADR-0034 §3).\n *\n * **콘텐츠 다국어(ADR-0052 A안, `posts.locale`/`translations[]`)와는 별개 층** —\n * 이 패키지는 렌더러가 소비자에게 보여주는 *고정 UI 카피*(빈 목록 안내, 목차\n * 제목 등)만 다룬다. 글 본문 번역은 사람이 admin 에서 직접 작성한다(§0).\n *\n * Phase 1(W4-6 PR C2) = 최소 실체화: locale 별 사전 + 타입 안전 `t()`.\n * gettext(.po 로딩)·ICU 플러럴 등은 Phase 4 몫 — **과설계 금지**\n * (ADR-0034 §3, `tenant-site-i18n-plan.md` §3 PR C2).\n */\n\n/** 사전이 존재하는 locale. 그 외(`ja`/`zh-hans` 등)는 `t()` 가 ko 로 fail-soft. */\nexport const CMS_I18N_LOCALES = [\"ko\", \"en\"] as const;\nexport type CmsI18nLocale = (typeof CMS_I18N_LOCALES)[number];\n\n/**\n * 사전 키 — `cms-renderer-next` 의 고객 노출 기본 문자열(1차 실체화 실측 범위)만.\n * 새 키를 늘릴 땐 ko/en 양쪽에 반드시 값을 채운다(타입이 강제).\n */\nexport interface CmsI18nDict {\n /** `RootTaleBlogList` — 발행 글 0건. */\n blogListEmpty: string;\n /** `RootTaleBlogCategories` — 카테고리 0건. */\n blogCategoriesEmpty: string;\n /** `RootTaleBlogList` — 카테고리 필터 \"전체\" 칩. */\n allCategoriesLabel: string;\n /** `RootTaleBlogPost` — 관련 글 섹션 제목. */\n relatedPostsTitle: string;\n /** `RootTaleBlogPost` — 글 미발견 기본 안내. */\n postNotFound: string;\n /** `RootTalePage` — 페이지 미발견 기본 안내. */\n pageNotFound: string;\n /** `RootTaleTableOfContents` — 목차 기본 제목. */\n tableOfContentsTitle: string;\n}\n\nconst DICTS: Record<CmsI18nLocale, CmsI18nDict> = {\n ko: {\n blogListEmpty: \"아직 발행된 글이 없습니다.\",\n blogCategoriesEmpty: \"아직 카테고리가 없습니다.\",\n allCategoriesLabel: \"전체\",\n relatedPostsTitle: \"관련 글\",\n postNotFound: \"글을 찾을 수 없습니다.\",\n pageNotFound: \"페이지를 찾을 수 없습니다.\",\n tableOfContentsTitle: \"목차\",\n },\n en: {\n blogListEmpty: \"No posts published yet.\",\n blogCategoriesEmpty: \"No categories yet.\",\n allCategoriesLabel: \"All\",\n relatedPostsTitle: \"Related posts\",\n postNotFound: \"Post not found.\",\n pageNotFound: \"Page not found.\",\n tableOfContentsTitle: \"Table of contents\",\n },\n};\n\n/** 사전 없는 locale(`ja`/`zh-hans`/undefined 등) 은 ko 로 fail-soft — 문자열이 아예 안 나오는 것보다 낫다. */\nfunction resolveLocale(locale: string | undefined): CmsI18nLocale {\n return locale === \"en\" ? \"en\" : \"ko\";\n}\n\n/**\n * 타입 안전 `t()`. `locale` 를 안 주거나(undefined) 사전이 없는 locale 이면 ko\n * 기본값 — **하위호환**: locale 프로퍼티를 모르는 기존 소비자는 지금까지처럼\n * 한글 문자열을 그대로 받는다(diff 0).\n *\n * ```ts\n * import { t } from \"@roottale/cms-i18n\";\n * const emptyMessage = props.emptyMessage ?? t(props.locale, \"blogListEmpty\");\n * ```\n */\nexport function t(locale: string | undefined, key: keyof CmsI18nDict): string {\n return DICTS[resolveLocale(locale)][key];\n}\n\nexport const PACKAGE_NAME = \"@roottale/cms-i18n\";\n","/**\n * `<RootTaleTableOfContents>` — server-only anchor list for blog posts.\n *\n * Pure SSR. Renders `<nav>` + ordered anchors that link to `#<id>` slots\n * emitted by `attachHeadingIds`. No scroll-spy here — that requires an\n * `IntersectionObserver` which only exists in the browser; a client-island\n * variant can layer on top later without changing the data contract.\n *\n * Internal ancestor: `roottale-internal/packages/cms-renderer/src/TableOfContents.tsx`\n * (had `'use client'` + IntersectionObserver). Stripped to server-safe form per\n * the platform renderer contract (no `'use client'` boundary — ADR-0023 §5.3).\n */\n\nimport type { ReactElement } from \"react\";\n// ADR-0034 §3 (W4-6 PR C2) — 기본 제목의 locale 해석(콘텐츠 다국어와 별개 층).\nimport { t } from \"@roottale/cms-i18n\";\n\nimport type { TocEntry } from \"./toc.js\";\n\nexport interface RootTaleTableOfContentsProps {\n entries: TocEntry[];\n title?: string;\n /** 명시 `title` 없을 때 기본 제목의 locale. 미지정 = ko(\"목차\"). */\n locale?: string;\n}\n\nexport function RootTaleTableOfContents(\n props: RootTaleTableOfContentsProps,\n): ReactElement | null {\n const { entries, locale, title = t(locale, \"tableOfContentsTitle\") } = props;\n if (entries.length === 0) return null;\n return (\n <nav data-roottale-cms=\"toc\" className=\"rt-cms-toc\" aria-label={title}>\n <details className=\"rt-cms-toc-details\" open>\n <summary className=\"rt-cms-toc-summary\">\n {title ? <span className=\"rt-cms-toc-title\">{title}</span> : null}\n <span className=\"rt-cms-toc-toggle\" aria-hidden=\"true\" />\n </summary>\n <ol className=\"rt-cms-toc-list\">\n {entries.map((entry) => (\n <li\n key={entry.id}\n className={`rt-cms-toc-item rt-cms-toc-level-${entry.level}`}\n >\n <a href={`#${entry.id}`}>{entry.text}</a>\n </li>\n ))}\n </ol>\n </details>\n </nav>\n );\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nexport function themeToCssVars(theme) {\n return {\n ...(theme.colors?.primary ? { \"--rt-color-primary\": theme.colors.primary } : {}),\n ...(theme.colors?.primaryForeground ? { \"--rt-color-primary-foreground\": theme.colors.primaryForeground } : {}),\n ...(theme.colors?.secondary ? { \"--rt-color-secondary\": theme.colors.secondary } : {}),\n ...(theme.colors?.secondaryForeground ? { \"--rt-color-secondary-foreground\": theme.colors.secondaryForeground } : {}),\n ...(theme.colors?.accent ? { \"--rt-color-accent\": theme.colors.accent } : {}),\n ...(theme.colors?.accentForeground ? { \"--rt-color-accent-foreground\": theme.colors.accentForeground } : {}),\n ...(theme.colors?.background ? { \"--rt-color-background\": theme.colors.background } : {}),\n ...(theme.colors?.foreground ? { \"--rt-color-foreground\": theme.colors.foreground } : {}),\n ...(theme.colors?.muted ? { \"--rt-color-muted\": theme.colors.muted } : {}),\n ...(theme.colors?.mutedForeground ? { \"--rt-color-muted-foreground\": theme.colors.mutedForeground } : {}),\n ...(theme.colors?.destructive ? { \"--rt-color-destructive\": theme.colors.destructive } : {}),\n ...(theme.colors?.destructiveForeground ? { \"--rt-color-destructive-foreground\": theme.colors.destructiveForeground } : {}),\n ...(theme.colors?.border ? { \"--rt-color-border\": theme.colors.border } : {}),\n ...(theme.colors?.input ? { \"--rt-color-input\": theme.colors.input } : {}),\n ...(theme.colors?.ring ? { \"--rt-color-ring\": theme.colors.ring } : {}),\n ...(theme.fonts?.body ? { \"--rt-font-body\": theme.fonts.body } : {}),\n ...(theme.fonts?.display ? { \"--rt-font-display\": theme.fonts.display } : {}),\n ...(theme.radius?.sm ? { \"--rt-radius-sm\": theme.radius.sm } : {}),\n ...(theme.radius?.md ? { \"--rt-radius-md\": theme.radius.md } : {}),\n ...(theme.radius?.lg ? { \"--rt-radius-lg\": theme.radius.lg } : {}),\n ...(theme.radius?.xl ? { \"--rt-radius-xl\": theme.radius.xl } : {}),\n };\n}\nexport function RootTaleThemeProvider({ children, name = \"custom\", theme, style, ...props }) {\n return (_jsx(\"div\", { ...props, \"data-rt-theme\": name, style: { ...style, ...themeToCssVars(theme) }, children: children }));\n}\n","import type { RootTaleTheme } from \"@roottale/cms-client/server\";\nimport {\n themeToCssVars as themeToUiCssVars,\n type RootTaleThemeStyle,\n} from \"@roottale/ui-react/theme\";\n\nexport type RootTaleCssVars = RootTaleThemeStyle;\n\nexport function themeToCssVars(theme: RootTaleTheme | null): RootTaleCssVars | null {\n if (!theme) return null;\n const vars = themeToUiCssVars(theme);\n if (Object.keys(vars).length === 0) return null;\n return vars;\n}\n","/**\n * `<RootTaleFloatingCta>` — fixed-position call-to-action stack.\n *\n * Server-only (anchors only, no state). External targets (`kakao` / `custom`)\n * open in a new tab with `rel=\"noopener noreferrer\"`; tel/contact stay in the\n * same tab so iOS/Android can trigger the dialer / mailto handler.\n *\n * Internal ancestor: `roottale-internal/packages/cms-renderer/src/FloatingCta.tsx`.\n */\n\nimport type { ReactElement } from \"react\";\n\nexport type CtaButtonType = \"phone\" | \"contact\" | \"kakao\" | \"custom\";\n\nexport interface CtaButton {\n type: CtaButtonType;\n label: string;\n href: string;\n /** Optional override icon (emoji or short text). */\n icon?: string;\n}\n\nexport type FloatingCtaPosition =\n | \"bottom-right\"\n | \"bottom-left\"\n | \"bottom-center\";\n\nexport interface RootTaleFloatingCtaProps {\n buttons: CtaButton[];\n position?: FloatingCtaPosition;\n}\n\nexport function RootTaleFloatingCta(\n props: RootTaleFloatingCtaProps,\n): ReactElement | null {\n const { buttons, position = \"bottom-right\" } = props;\n if (!buttons || buttons.length === 0) return null;\n return (\n <div\n data-roottale-cms=\"floating-cta\"\n className={`rt-cms-floating-cta rt-cms-floating-cta--${position}`}\n >\n {buttons.map((btn, idx) => {\n const isExternal = btn.type === \"kakao\" || btn.type === \"custom\";\n return (\n <a\n key={`${btn.type}-${idx}`}\n href={btn.href}\n className={`rt-cms-floating-cta__btn rt-cms-floating-cta__btn--${btn.type}`}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n >\n <span aria-hidden=\"true\" className=\"rt-cms-floating-cta__icon\">\n {btn.icon ?? defaultIcon(btn.type)}\n </span>\n <span className=\"rt-cms-floating-cta__label\">{btn.label}</span>\n </a>\n );\n })}\n </div>\n );\n}\n\nfunction defaultIcon(type: CtaButtonType): string {\n switch (type) {\n case \"phone\":\n return \"☎\";\n case \"contact\":\n return \"✉\";\n case \"kakao\":\n return \"💬\";\n case \"custom\":\n return \"→\";\n }\n}\n","/**\n * `@roottale/cms-renderer-next` — RootTaleLeadForm RSC.\n *\n * 외부 고객 사이트(roottale.com, 고객사 외주)의 진단 신청 폼.\n *\n * 권장 연동(API key 하나): `action` 을 *사이트 자체* 의 Route Handler / 폼\n * action 으로 두고, 그 서버 코드가 `@roottale/cms-client` 의 `submitInquiry()` 로\n * 블로그 조회와 동일한 `ROOTTALE_API_KEY` 를 실어 intake API 로 forward 한다. 키가\n * tenant 를 식별 → 리드가 그 tenant 의 admin /crm 으로 라우팅, `tenant_slug` 불필요.\n * (API key 는 브라우저로 노출 금지 — 직접 api.roottale.com 으로 POST 하지 말 것.)\n *\n * PII 는 server 측에서 암호화 후 `inquiries` insert, 302 `?ok=1` / `?err=*` redirect.\n *\n * vertical prop:\n * - 미지정 = \"분야 선택\" select 노출 (consulting/medical/tax/legal), 필드셋은\n * 기존 B2B 세트 그대로(방문자가 vertical 을 스스로 고르는 범용 폼이라 필드를\n * vertical 별로 분기하지 않음)\n * - 지정 = hidden input + 표시 라벨 + vertical 별 추가 필드\n * (medical = 국외이전 동의 — ADR-0018)\n *\n * vertical=\"medical\" 필드셋 (C5 1차, premium-component-backlog):\n * 환자가 채우는 문의 폼에 B2B 리드 필드(\"사업체명\" 필수·\"현재 사이트 URL\")를\n * 노출하던 정합성 문제를 수정 — 의료는 이름·전화번호(필수) + 상담 희망\n * 분야/증상·문의 내용(선택)만 노출한다. intake 계약(tenant-api `POST\n * /v1/public/inquiries`, `packages/api-core/src/routes/inquiries.ts`)이\n * `business_name` 을 vertical 불문 hard-required 로 검증하므로(신규 폼 백엔드\n * 금지 — F3 계약 고정), 화면에는 안 보이지만 hidden input 으로 자리표시자\n * `\"-\"` 를 전송해 계약을 만족시킨다. \"상담 희망 분야/증상\" 은 기존\n * `consultation_field` 키(어드민 CRM \"상담 분야\" 표시)로, \"문의 내용\" 은 기존\n * `message` 키로 매핑 — 둘 다 이미 intake 가 선택 필드로 수용하던 키라 서버\n * 변경이 필요 없다. \"현재 사이트 URL\" 은 의료에 무의미해 필드 자체를 생략.\n *\n * redirectPath prop:\n * - 외부 사이트가 폼 제출 후 돌아갈 path (API 가 allowlist 검증, ?ok=1 / ?err=*)\n *\n * RSC form. Turnstile를 켠 경우 Cloudflare 위젯 script만 추가한다.\n * customer-facing className 전체 `.rt-cms-*` prefix, scoped via\n * `[data-roottale-cms]` (cms-public.css). customer override 자유.\n */\n\nimport type { ReactElement } from \"react\";\n\nimport { LeadFormMeta } from \"./lead-form-meta.client.js\";\n\nexport type LeadFormVertical = \"consulting\" | \"medical\" | \"tax\" | \"legal\";\n\nexport interface RootTaleLeadFormProps {\n /**\n * 폼 제출 대상 — *사이트 자체* 의 server 엔드포인트(Route Handler / form action).\n * 그 서버 코드가 `cms-client` `submitInquiry()` 로 API key 를 실어 forward 한다.\n * 예: `/api/inquiry`. (API key 노출 위험 때문에 intake API 직접 지정 금지.)\n */\n action: string;\n /**\n * vertical 고정. 미지정 시 select 노출.\n * `medical` 일 때 국외이전 동의 체크박스 추가 (ADR-0018).\n */\n vertical?: LeadFormVertical;\n /**\n * 폼 제출 후 API가 돌려보낼 절대 URL.\n * tenant-api `LEAD_INTAKE_ALLOWED_ORIGINS` allowlist 검증. fail = fallback.\n * 미지정 시 tenant-api env의 LEAD_INTAKE_REDIRECT_BASE 사용.\n */\n redirectUrl?: string;\n heading?: string;\n description?: string;\n submitLabel?: string;\n turnstileSiteKey?: string;\n /** 추가 클래스 (customer 디자인 hook). */\n className?: string;\n}\n\nconst VERTICAL_LABEL: Record<LeadFormVertical, string> = {\n consulting: \"컨설팅\",\n medical: \"의료\",\n tax: \"세무\",\n legal: \"법률\",\n};\n\nconst VERTICAL_OPTIONS: { value: LeadFormVertical; label: string }[] = [\n { value: \"consulting\", label: \"컨설팅 / 일반\" },\n { value: \"medical\", label: \"의료 (병의원·치과·한의원)\" },\n { value: \"tax\", label: \"세무 (세무사·회계사)\" },\n { value: \"legal\", label: \"법률 (법무법인·변호사)\" },\n];\n\nexport function RootTaleLeadForm(\n props: RootTaleLeadFormProps,\n): ReactElement {\n const {\n action,\n vertical,\n redirectUrl,\n heading,\n description,\n submitLabel = \"진단 신청\",\n turnstileSiteKey,\n className,\n } = props;\n\n const formClass = [\"rt-cms-lead-form\", className].filter(Boolean).join(\" \");\n const isMedical = vertical === \"medical\";\n\n return (\n <form\n method=\"post\"\n action={action}\n data-roottale-cms=\"lead-form\"\n className={formClass}\n >\n {/* 어트리뷰션·여정 계측 island(RSC 경계 §5) — 시각 출력 없음. v1 은\n `form_id` 를 \"contact\" 로 고정한다(사이트당 실배치 리드 폼이\n /contact 1개뿐 — 인스턴스별 식별이 필요해지면 공개 prop 신설 검토). */}\n <LeadFormMeta formId=\"contact\" />\n {heading ? (\n <h2 className=\"rt-cms-lead-heading\">{heading}</h2>\n ) : null}\n {description ? (\n <p className=\"rt-cms-lead-description\">{description}</p>\n ) : null}\n\n {redirectUrl ? (\n <input type=\"hidden\" name=\"_redirect_url\" value={redirectUrl} />\n ) : null}\n\n {vertical ? (\n <>\n <input type=\"hidden\" name=\"vertical\" value={vertical} />\n <p className=\"rt-cms-lead-vertical-label\">\n 분야: <strong>{VERTICAL_LABEL[vertical]}</strong>\n </p>\n </>\n ) : (\n <label className=\"rt-cms-field\">\n <span className=\"rt-cms-field-label\">\n 분야 <span aria-hidden=\"true\">*</span>\n </span>\n <select\n name=\"vertical\"\n required\n className=\"rt-cms-field-input rt-cms-field-select\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>\n 선택하세요\n </option>\n {VERTICAL_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n )}\n\n <label className=\"rt-cms-field\">\n <span className=\"rt-cms-field-label\">\n 이름 <span aria-hidden=\"true\">*</span>\n </span>\n <input\n type=\"text\"\n name=\"contact_name\"\n required\n autoComplete=\"name\"\n className=\"rt-cms-field-input\"\n />\n </label>\n\n {isMedical ? (\n // 환자 문의에는 \"사업체명\" 개념이 없다 — 화면에는 노출하지 않되,\n // intake 가 vertical 불문 hard-required 로 검증하는 계약(위 파일\n // 헤더 코멘트 참조)을 만족시키기 위해 자리표시자만 hidden 전송.\n <input type=\"hidden\" name=\"business_name\" value=\"-\" />\n ) : (\n <label className=\"rt-cms-field\">\n <span className=\"rt-cms-field-label\">\n 사업체명 <span aria-hidden=\"true\">*</span>\n </span>\n <input\n type=\"text\"\n name=\"business_name\"\n required\n autoComplete=\"organization\"\n className=\"rt-cms-field-input\"\n />\n </label>\n )}\n\n <label className=\"rt-cms-field\">\n <span className=\"rt-cms-field-label\">\n 전화번호 <span aria-hidden=\"true\">*</span>\n </span>\n <input\n type=\"tel\"\n name=\"phone\"\n required\n autoComplete=\"tel\"\n inputMode=\"tel\"\n pattern={\"0\\\\d{1,2}-?\\\\d{3,4}-?\\\\d{4}\"}\n placeholder=\"010-1234-5678\"\n className=\"rt-cms-field-input\"\n />\n </label>\n\n <label className=\"rt-cms-field\">\n <span className=\"rt-cms-field-label\">\n 이메일 <span aria-hidden=\"true\">*</span>\n </span>\n <input\n type=\"email\"\n name=\"email\"\n required\n autoComplete=\"email\"\n className=\"rt-cms-field-input\"\n />\n </label>\n\n {isMedical ? (\n <>\n <label className=\"rt-cms-field\">\n <span className=\"rt-cms-field-label\">\n 상담 희망 분야·증상 (선택)\n </span>\n <input\n type=\"text\"\n name=\"consultation_field\"\n placeholder=\"예: 무릎 통증, 정기검진\"\n className=\"rt-cms-field-input\"\n />\n </label>\n\n <label className=\"rt-cms-field\">\n <span className=\"rt-cms-field-label\">문의 내용 (선택)</span>\n <textarea\n name=\"message\"\n rows={4}\n placeholder=\"증상이 언제부터 있었는지, 궁금하신 점을 자유롭게 적어주세요.\"\n className=\"rt-cms-field-input rt-cms-field-textarea\"\n />\n </label>\n </>\n ) : (\n <label className=\"rt-cms-field\">\n <span className=\"rt-cms-field-label\">현재 사이트 URL (선택)</span>\n <input\n type=\"url\"\n name=\"current_site_url\"\n placeholder=\"https://\"\n className=\"rt-cms-field-input\"\n />\n <span className=\"rt-cms-field-hint\">없으면 비워두세요.</span>\n </label>\n )}\n\n <label className=\"rt-cms-lead-consent\">\n <input type=\"checkbox\" name=\"privacy_consent\" required />\n <span>\n <strong>(필수)</strong> 개인정보 수집·이용에 동의합니다. (수집 항목:{\" \"}\n {isMedical\n ? \"이름·연락처·이메일·상담 내용(작성 시)·사이트 이용 기록(방문 페이지·상호작용)\"\n : \"이름·연락처·이메일·사업체명·사이트 이용 기록(방문 페이지·상호작용)\"}\n . 보관 기간: 문의 종료 후 3년)\n </span>\n </label>\n\n {vertical === \"medical\" ? (\n <label className=\"rt-cms-lead-consent\">\n <input\n type=\"checkbox\"\n name=\"overseas_transfer_consent\"\n required\n />\n <span>\n <strong>(필수, 의료)</strong> 의료 PII 의 국외이전(보관·처리)에\n 동의합니다. (의료법 §21·개인정보보호법 §28 — ADR-0018)\n </span>\n </label>\n ) : null}\n\n {turnstileSiteKey ? (\n <>\n <script\n src=\"https://challenges.cloudflare.com/turnstile/v0/api.js\"\n async\n defer\n />\n <div\n className=\"cf-turnstile\"\n data-sitekey={turnstileSiteKey}\n data-action=\"turnstile-spin-v1\"\n />\n </>\n ) : null}\n\n <div className=\"rt-cms-lead-actions\">\n <button type=\"submit\" className=\"rt-cms-lead-submit\">\n {submitLabel}\n </button>\n </div>\n </form>\n );\n}\n","// ADR-0034 §1.5 amended — Block JSON → React elements\n//\n// Next/RSC public renderer 가 본 함수로 block tree 를 server-side React element\n// 로 변환. cms-renderer-astro 의 `block-to-html.ts` 와 1:1 대응 (같은 7 + α\n// block 핸들러). `BlockDefinition.nextRender` 정합.\n//\n// 알려지지 않은 block 은 rawHtml 출력 (codex v3 verdict #4, opaque atom\n// round-trip 보존).\n\nimport type { ReactElement, ReactNode } from \"react\";\n\nimport {\n type Block,\n type BindingResolver,\n applyBlockBindings,\n createFieldBindingResolver,\n sanitizeHtml,\n} from \"@roottale/cms-core\";\n\nfunction isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\nfunction htmlContent(html: string): { __html: string } {\n // dangerouslySetInnerHTML 진입 전 단일 chokepoint — 모든 block 의\n // rawHtml/content 는 여기서 sanitize 된다 (cms-core sanitizeHtml). API 키로\n // 글을 작성하는 외부 writer 가 inline `<script>`/`on*`/`javascript:` 를\n // 주입하는 저장형 XSS 방어.\n return { __html: sanitizeHtml(html) };\n}\n\nfunction renderInner(blocks: readonly Block[]): ReactElement[] {\n return blocks.map((b, i) => renderBlock(b, i));\n}\n\n/**\n * 단일 block 을 ReactElement 로 변환. `block-to-html.ts` 와 동일 분기.\n */\nexport function renderBlock(block: Block, key: number = 0): ReactElement {\n const dataBlockId = block._id;\n\n switch (block.name) {\n case \"core/paragraph\": {\n const text = isString(block.attributes.content)\n ? block.attributes.content\n : block.rawHtml ?? \"\";\n return (\n <p\n key={key}\n data-block-id={dataBlockId}\n dangerouslySetInnerHTML={htmlContent(text)}\n />\n );\n }\n case \"core/heading\": {\n const levelRaw = block.attributes.level;\n const level =\n typeof levelRaw === \"number\" && levelRaw >= 2 && levelRaw <= 4\n ? levelRaw\n : 2;\n const text = isString(block.attributes.content)\n ? block.attributes.content\n : block.rawHtml ?? \"\";\n const props = {\n \"data-block-id\": dataBlockId,\n dangerouslySetInnerHTML: htmlContent(text),\n } as const;\n /* eslint-disable jsx-a11y/heading-has-content -- 내용은 props 의\n dangerouslySetInnerHTML 로 들어간다(CMS 본문 HTML). 룰은 JSX children\n 만 보고 \"빈 제목\"으로 판단하는데, 빈 제목은 위에서 걸러진다. */\n if (level === 2) return <h2 key={key} {...props} />;\n if (level === 3) return <h3 key={key} {...props} />;\n return <h4 key={key} {...props} />;\n /* eslint-enable jsx-a11y/heading-has-content */\n }\n case \"core/image\": {\n const src = isString(block.attributes.url) ? block.attributes.url : \"\";\n const alt = isString(block.attributes.alt) ? block.attributes.alt : \"\";\n const caption = isString(block.attributes.caption)\n ? block.attributes.caption\n : null;\n return (\n <figure key={key} data-block-id={dataBlockId}>\n <img src={src} alt={alt} loading=\"lazy\" />\n {caption && <figcaption>{caption}</figcaption>}\n </figure>\n );\n }\n case \"core/list\": {\n const ordered = block.attributes.ordered === true;\n const items = (block.innerBlocks ?? []).map(\n (item, i): ReactNode =>\n item.rawHtml ? (\n <li\n key={i}\n dangerouslySetInnerHTML={htmlContent(item.rawHtml)}\n />\n ) : (\n <li key={i}>{renderInner(item.innerBlocks ?? [])}</li>\n ),\n );\n return ordered ? (\n <ol key={key} data-block-id={dataBlockId}>\n {items}\n </ol>\n ) : (\n <ul key={key} data-block-id={dataBlockId}>\n {items}\n </ul>\n );\n }\n case \"core/quote\": {\n const inner = renderInner(block.innerBlocks ?? []);\n const citation = isString(block.attributes.citation)\n ? block.attributes.citation\n : null;\n return (\n <blockquote key={key} data-block-id={dataBlockId}>\n {inner}\n {citation && <cite>{citation}</cite>}\n </blockquote>\n );\n }\n case \"core/code\": {\n const code = isString(block.attributes.content)\n ? block.attributes.content\n : block.rawHtml ?? \"\";\n const lang = isString(block.attributes.language)\n ? block.attributes.language\n : undefined;\n return (\n <pre\n key={key}\n data-block-id={dataBlockId}\n data-language={lang}\n >\n <code>{code}</code>\n </pre>\n );\n }\n case \"core/columns\": {\n return (\n <div\n key={key}\n className=\"rt-columns\"\n data-block-id={dataBlockId}\n >\n {renderInner(block.innerBlocks ?? [])}\n </div>\n );\n }\n case \"core/separator\":\n return <hr key={key} data-block-id={dataBlockId} />;\n case \"core/spacer\": {\n const heightRaw = block.attributes.height;\n const height = isString(heightRaw) ? heightRaw : \"32px\";\n return (\n <div\n key={key}\n className=\"rt-spacer\"\n data-block-id={dataBlockId}\n style={{ height }}\n />\n );\n }\n case \"core/group\": {\n return (\n <div\n key={key}\n className=\"rt-group\"\n data-block-id={dataBlockId}\n >\n {renderInner(block.innerBlocks ?? [])}\n </div>\n );\n }\n default: {\n // codex review §15 — 알려지지 않은 block 의 rawHtml 을 그대로\n // `dangerouslySetInnerHTML` 로 내보내면 API key 로 글을 작성하는 외부\n // 클라이언트가 임의 HTML/script 를 외부 사이트로 삽입할 수 있다 (XSS).\n // rawHtml 분기 자체를 제거 — 후속 PR 에서 cms-core 의 sanitize 모듈을\n // 도입한 뒤에만 raw 출력을 허용한다.\n const rawHtml = block.rawHtml;\n return (\n <div\n key={key}\n className=\"rt-unknown-block\"\n data-block-id={dataBlockId}\n data-block-name={block.name}\n data-rawhtml-suppressed={rawHtml ? \"true\" : undefined}\n >\n {renderInner(block.innerBlocks ?? [])}\n </div>\n );\n }\n }\n}\n\n/** Block tree 전체를 React element 배열로 직렬화. */\nexport function renderBlocks(blocks: readonly Block[]): ReactElement[] {\n return blocks.map((b, i) => renderBlock(b, i));\n}\n\n/**\n * ADR-0041 §7 — Block Bindings 를 먼저 적용한 뒤 렌더.\n * `metadata.bindings` 의 `roottale/field`/`acf/field` 를 `fields`(acf 값)로\n * 치환. 바인딩 없으면 renderBlocks 와 동일.\n */\nexport function renderBoundBlocks(\n blocks: readonly Block[],\n opts: {\n fields?: Record<string, unknown> | null;\n resolver?: BindingResolver;\n } = {},\n): ReactElement[] {\n const resolver = opts.resolver ?? createFieldBindingResolver(opts.fields);\n return renderBlocks(applyBlockBindings(blocks, resolver));\n}\n","/**\n * `@roottale/cms-renderer/toc` — Tiptap doc → TOC entries + heading id injection.\n *\n * Server-only utility. Walks a Tiptap JSON doc, extracts H1-H4 headings, and\n * derives stable kebab-case ids (Korean-safe). The companion `attachHeadingIds`\n * mutates a shallow clone of the doc so renderers can emit heading anchors\n * that match what `<RootTaleTableOfContents>` links to.\n *\n * Internal ancestor: `roottale-internal/packages/cms-renderer/src/toc.ts`\n * (HTML-string based, vendored snapshot). Ported to Tiptap-JSON because the\n * platform renderer no longer round-trips through HTML before render.\n */\n\nexport interface TocEntry {\n level: 2 | 3 | 4;\n text: string;\n id: string;\n}\n\ntype TiptapNode = {\n type?: string;\n text?: string;\n attrs?: Record<string, unknown>;\n content?: TiptapNode[];\n marks?: { type?: string }[];\n};\n\ntype TiptapDoc = { type?: string; content?: TiptapNode[] };\n\nfunction tocLevel(rawLevel: number): TocEntry[\"level\"] | null {\n if (rawLevel < 1 || rawLevel > 4) return null;\n if (rawLevel < 3) return 2;\n return rawLevel === 3 ? 3 : 4;\n}\n\nexport function headingToId(text: string): string {\n return text\n .trim()\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s-]/gu, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nfunction textOf(node: TiptapNode): string {\n if (typeof node.text === \"string\") return node.text;\n if (!Array.isArray(node.content)) return \"\";\n return node.content.map(textOf).join(\"\");\n}\n\nexport function extractToc(doc: Record<string, unknown>): TocEntry[] {\n const root = doc as TiptapDoc;\n const content = Array.isArray(root.content) ? root.content : [];\n const entries: TocEntry[] = [];\n const idCounts = new Map<string, number>();\n\n for (const node of content) {\n if (node?.type !== \"heading\") continue;\n const rawLevel = Number(node.attrs?.level ?? 2);\n const level = tocLevel(rawLevel);\n if (level === null) continue;\n const text = textOf(node).trim();\n if (!text) continue;\n\n const base = headingToId(text) || \"heading\";\n const count = idCounts.get(base) ?? 0;\n const id = count === 0 ? base : `${base}-${count}`;\n idCounts.set(base, count + 1);\n\n entries.push({ level, text, id });\n }\n\n return entries;\n}\n\n/**\n * Returns a shallow-cloned Tiptap doc where each H1-H4 carries the matching\n * `attrs.id` from `entries` (same order as `extractToc` returns). Existing\n * `id` attrs are overwritten so renderer + TOC always agree on anchors.\n */\nexport function attachHeadingIds(\n doc: Record<string, unknown>,\n entries: TocEntry[],\n): Record<string, unknown> {\n const root = doc as TiptapDoc;\n const content = Array.isArray(root.content) ? root.content : [];\n let cursor = 0;\n const nextContent = content.map((node) => {\n if (node?.type !== \"heading\") return node;\n const rawLevel = Number(node.attrs?.level ?? 2);\n if (rawLevel < 1 || rawLevel > 4) return node;\n if (!textOf(node).trim()) return node;\n const entry = entries[cursor++];\n if (!entry) return node;\n return {\n ...node,\n attrs: { ...(node.attrs ?? {}), id: entry.id },\n };\n });\n return { ...(root as Record<string, unknown>), content: nextContent };\n}\n","import type { ReactElement } from \"react\";\nimport {\n fetchPosts,\n resolvePostDisplay,\n type CmsPostContent,\n type CmsPostType,\n} from \"@roottale/cms-client/server\";\nimport {\n postsForCollection,\n postsNotInAnyCollection,\n type RouteCollection,\n} from \"@roottale/cms-core\";\nimport { t } from \"@roottale/cms-i18n\";\n\nimport {\n collectCategories,\n defaultCategoryHref,\n filterPostsByCategory,\n} from \"../blog-filter.js\";\nimport { RootTalePostCard } from \"../PostCard.js\";\nimport { fetchBlogSettingsFailSoft } from \"./blog-settings.js\";\nimport { defaultPostHref, makeCollectionPostHref } from \"./post-links.js\";\nimport {\n resolveThemeStyleFailSoft,\n type RootTaleThemeInput,\n} from \"./theme.js\";\n\nexport type RootTaleBlogListProps = {\n apiKey: string;\n baseUrl?: string;\n limit?: number;\n /** Filter by post type (`post` or `page`). Default = `post` only. */\n type?: CmsPostType;\n postHref?: (post: CmsPostContent) => string;\n emptyMessage?: string;\n collection?: string;\n collections?: readonly RouteCollection[];\n /**\n * `collection`과 배타적이다. `collections` 없이 지정해도 예외를 던진다.\n */\n excludeCollections?: boolean;\n showCategoryFilter?: boolean;\n activeCategory?: string;\n categoryHref?: (slug: string | null) => string;\n allCategoriesLabel?: string;\n author?: string;\n theme?: RootTaleThemeInput;\n locale?: string;\n};\n\ntype ScopePostsInput = {\n readonly posts: CmsPostContent[];\n readonly collection?: string;\n readonly collections?: readonly RouteCollection[];\n readonly excludeCollections: boolean;\n};\n\nfunction validateCollectionScope(props: RootTaleBlogListProps): void {\n if (props.collection && props.excludeCollections) {\n throw new Error(\n \"RootTaleBlogList: `collection` 과 `excludeCollections` 를 동시에 줄 수 없습니다 — 포지티브/네거티브 스코프는 배타적입니다.\",\n );\n }\n if (props.excludeCollections && !props.collections) {\n throw new Error(\n \"RootTaleBlogList: `excludeCollections` 는 `collections` 와 함께 줘야 합니다.\",\n );\n }\n}\n\nfunction scopePosts(input: ScopePostsInput): CmsPostContent[] {\n const { posts, collection, collections, excludeCollections } = input;\n if (collection && collections) {\n return postsForCollection(posts, collections, collection);\n }\n if (excludeCollections && collections) {\n return postsNotInAnyCollection(posts, collections);\n }\n return posts;\n}\n\nexport async function RootTaleBlogList(\n props: RootTaleBlogListProps,\n): Promise<ReactElement> {\n validateCollectionScope(props);\n\n const {\n apiKey,\n baseUrl,\n limit,\n type = \"post\",\n collection,\n collections,\n excludeCollections = false,\n locale,\n emptyMessage = t(locale, \"blogListEmpty\"),\n showCategoryFilter = false,\n activeCategory,\n categoryHref = defaultCategoryHref,\n allCategoriesLabel = t(locale, \"allCategoriesLabel\"),\n author,\n theme: themeProp,\n } = props;\n const postHref =\n props.postHref ??\n (collections ? makeCollectionPostHref(collections) : defaultPostHref);\n\n const [page, themeStyle, blogSettings] = await Promise.all([\n fetchPosts({\n apiKey,\n baseUrl,\n limit,\n type,\n ...(author ? { author } : {}),\n ...(collection && collections ? { collectionKey: collection } : {}),\n ...(excludeCollections && collections ? { excludeCollections: true } : {}),\n ...(locale ? { locale } : {}),\n }),\n resolveThemeStyleFailSoft({ themeProp, apiKey, baseUrl }),\n fetchBlogSettingsFailSoft({ apiKey, baseUrl }),\n ]);\n const items = scopePosts({\n posts: page.items,\n collection,\n collections,\n excludeCollections,\n });\n\n if (items.length === 0) {\n return (\n <div data-roottale-cms=\"list\" style={themeStyle ?? undefined}>\n <p className=\"rt-cms-empty\">{emptyMessage}</p>\n </div>\n );\n }\n\n const categories = showCategoryFilter ? collectCategories(items) : [];\n const visiblePosts = showCategoryFilter\n ? filterPostsByCategory(items, activeCategory)\n : items;\n const isAllCategoriesActive = !activeCategory;\n\n return (\n <div data-roottale-cms=\"list\" style={themeStyle ?? undefined}>\n {showCategoryFilter && categories.length > 0 ? (\n <nav className=\"rt-cms-filter\" aria-label=\"카테고리 필터\">\n <a\n className=\"rt-cms-filter-chip\"\n href={categoryHref(null)}\n data-active={isAllCategoriesActive ? \"\" : undefined}\n aria-current={isAllCategoriesActive ? \"true\" : undefined}\n >\n {allCategoriesLabel}\n </a>\n {categories.map((category) => (\n <a\n key={category.slug}\n className=\"rt-cms-filter-chip\"\n href={categoryHref(category.slug)}\n data-active={activeCategory === category.slug ? \"\" : undefined}\n aria-current={\n activeCategory === category.slug ? \"true\" : undefined\n }\n >\n {category.name}\n </a>\n ))}\n </nav>\n ) : null}\n {visiblePosts.length === 0 ? (\n <p className=\"rt-cms-empty\">{emptyMessage}</p>\n ) : (\n <ul className=\"rt-cms-list\">\n {visiblePosts.map((post) => (\n <li key={post.id} className=\"rt-cms-list-item\">\n <RootTalePostCard\n post={post}\n href={postHref}\n display={resolvePostDisplay(post, blogSettings)}\n />\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","import {\n DEFAULT_BLOG_SETTINGS,\n fetchBlogSettings,\n type RootTaleBlogSettings,\n} from \"@roottale/cms-client/server\";\n\ntype FetchBlogSettingsInput = {\n readonly apiKey: string;\n readonly baseUrl?: string;\n};\n\nexport async function fetchBlogSettingsFailSoft(\n input: FetchBlogSettingsInput,\n): Promise<RootTaleBlogSettings> {\n return fetchBlogSettings(input).catch(() => DEFAULT_BLOG_SETTINGS);\n}\n","import type { CmsPostContent } from \"@roottale/cms-client/server\";\nimport {\n resolvePostCollection,\n resolvePostPath,\n type RouteCollection,\n} from \"@roottale/cms-core\";\n\nexport function defaultPostHref(post: CmsPostContent): string {\n return `/blog/${post.slug}`;\n}\n\nexport function defaultAuthorHref(slug: string): string {\n return `/blog/author/${slug}`;\n}\n\nexport function makeCollectionPostHref(\n collections: readonly RouteCollection[],\n): (post: CmsPostContent) => string {\n return (post) => {\n const path = resolvePostPath(post, collections);\n if (path) return path;\n\n const collection = resolvePostCollection(post, collections);\n if (collection?.detail === false && collection.basePath) {\n return collection.basePath;\n }\n return defaultPostHref(post);\n };\n}\n","import type { CSSProperties, ReactElement, ReactNode } from \"react\";\nimport {\n fetchTheme,\n type RootTaleTheme,\n} from \"@roottale/cms-client/server\";\n\nimport { themeToCssVars } from \"../theme-css-vars.js\";\n\nexport type RootTaleThemeInput = RootTaleTheme | null | undefined;\n\ntype ResolveThemeStyleInput = {\n readonly themeProp: RootTaleThemeInput;\n readonly apiKey: string;\n readonly baseUrl?: string;\n};\n\nexport async function resolveThemeStyleFailSoft(\n input: ResolveThemeStyleInput,\n): Promise<CSSProperties | null> {\n const { themeProp, apiKey, baseUrl } = input;\n if (themeProp === null) return null;\n if (themeProp !== undefined) return themeToCssVars(themeProp);\n\n const fetched = await fetchTheme({ apiKey, baseUrl }).catch(() => null);\n return themeToCssVars(fetched);\n}\n\nexport function RootTaleThemeProvider(props: {\n readonly theme: RootTaleTheme | null | undefined;\n readonly children: ReactNode;\n}): ReactElement {\n const style = themeToCssVars(props.theme ?? null);\n if (!style) return <>{props.children}</>;\n\n return (\n <div data-roottale-cms=\"theme-root\" data-rt-theme=\"\" style={style}>\n {props.children}\n </div>\n );\n}\n","import type { ReactElement } from \"react\";\nimport {\n fetchPosts,\n type RootTaleTheme,\n} from \"@roottale/cms-client/server\";\nimport type { RouteCollection } from \"@roottale/cms-core\";\nimport { t } from \"@roottale/cms-i18n\";\n\nimport {\n collectCategoriesWithCounts,\n collectCollectionCategories,\n defaultCategoryHref,\n} from \"../blog-filter.js\";\nimport { resolveThemeStyleFailSoft } from \"./theme.js\";\n\nexport type RootTaleBlogCategoriesProps = {\n apiKey: string;\n baseUrl?: string;\n limit?: number;\n categoryHref?: (slug: string) => string;\n emptyMessage?: string;\n collection?: string;\n collections?: readonly RouteCollection[];\n theme?: RootTaleTheme | null | undefined;\n locale?: string;\n};\n\nexport async function RootTaleBlogCategories(\n props: RootTaleBlogCategoriesProps,\n): Promise<ReactElement> {\n const {\n apiKey,\n baseUrl,\n limit,\n collection,\n collections,\n categoryHref = defaultCategoryHref,\n locale,\n emptyMessage = t(locale, \"blogCategoriesEmpty\"),\n theme: themeProp,\n } = props;\n const [page, themeStyle] = await Promise.all([\n fetchPosts({\n apiKey,\n baseUrl,\n limit,\n type: \"post\",\n ...(locale ? { locale } : {}),\n }),\n resolveThemeStyleFailSoft({ themeProp, apiKey, baseUrl }),\n ]);\n const categories =\n collection && collections\n ? collectCollectionCategories(page.items, collections, collection)\n : collectCategoriesWithCounts(page.items);\n\n return (\n <nav\n data-roottale-cms=\"categories\"\n className=\"rt-cms-categories\"\n aria-label=\"블로그 카테고리\"\n style={themeStyle ?? undefined}\n >\n {categories.length === 0 ? (\n <p className=\"rt-cms-empty\">{emptyMessage}</p>\n ) : (\n <ul className=\"rt-cms-category-list\">\n {categories.map((category) => (\n <li key={category.slug} className=\"rt-cms-category-list-item\">\n <a\n className=\"rt-cms-category-link\"\n href={categoryHref(category.slug)}\n >\n <span className=\"rt-cms-category-name\">{category.name}</span>\n <span className=\"rt-cms-category-count\">{category.count}</span>\n </a>\n </li>\n ))}\n </ul>\n )}\n </nav>\n );\n}\n","import type { CSSProperties, ReactElement } from \"react\";\nimport {\n fetchPost,\n fetchPosts,\n resolvePostDisplay,\n selectRelatedPosts,\n type CmsPostContent,\n} from \"@roottale/cms-client/server\";\nimport { t } from \"@roottale/cms-i18n\";\n\nimport { attachHeadingIds, extractToc } from \"../toc.js\";\nimport { fetchBlogSettingsFailSoft } from \"./blog-settings.js\";\nimport { renderArchiveRelated, renderFieldFacts } from \"./blog-post-archive.js\";\nimport { BlogPostBody } from \"./blog-post-body.js\";\nimport { renderBlogPostBreadcrumb } from \"./blog-post-breadcrumb.js\";\nimport {\n renderFaqJsonLd,\n renderPostCta,\n renderRelatedPosts,\n} from \"./blog-post-footer.js\";\nimport type { RootTaleBlogPostProps } from \"./blog-post-types.js\";\nimport {\n defaultAuthorHref,\n defaultPostHref,\n makeCollectionPostHref,\n} from \"./post-links.js\";\nimport { resolveThemeStyleFailSoft } from \"./theme.js\";\n\ntype FetchRelatedPostsInput = {\n readonly post: CmsPostContent;\n readonly apiKey: string;\n readonly baseUrl?: string;\n readonly count: number;\n readonly locale?: string;\n};\n\nasync function fetchRelatedPostsFailSoft(\n input: FetchRelatedPostsInput,\n): Promise<readonly CmsPostContent[]> {\n if (input.count <= 0) return [];\n\n const candidates = await fetchPosts({\n apiKey: input.apiKey,\n baseUrl: input.baseUrl,\n type: \"post\",\n limit: 30,\n ...(input.locale ? { locale: input.locale } : {}),\n }).catch(() => null);\n if (!candidates) return [];\n return selectRelatedPosts(input.post, candidates.items, input.count);\n}\n\nfunction authorInitials(name: string): string {\n const trimmed = name.trim();\n if (!trimmed) return \"\";\n const parts = trimmed.split(/\\s+/).filter(Boolean);\n if (parts.length >= 2) {\n return `${parts[0]?.[0] ?? \"\"}${parts[1]?.[0] ?? \"\"}`.toUpperCase();\n }\n return [...trimmed].slice(0, 2).join(\"\").toUpperCase();\n}\n\nfunction formatPublishedDate(iso: string): string {\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(\"ko-KR\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }).format(date);\n}\n\nfunction authorImageRadiusCss(\n radius: \"circle\" | \"rounded\" | \"square\",\n): string {\n if (radius === \"circle\") return \"999px\";\n if (radius === \"rounded\") return \"0.875rem\";\n return \"0\";\n}\n\nexport async function RootTaleBlogPost(\n props: RootTaleBlogPostProps,\n): Promise<ReactElement> {\n const {\n apiKey,\n slugOrId,\n baseUrl,\n notFoundElement,\n showTitle = true,\n showTableOfContents,\n tableOfContentsTitle,\n relatedPostsCount = 0,\n locale,\n relatedPostsTitle = t(locale, \"relatedPostsTitle\"),\n collections,\n showFieldFacts = false,\n theme: themeProp,\n authorHref = defaultAuthorHref,\n breadcrumb,\n } = props;\n const [post, themeStyle, blogSettings] = await Promise.all([\n fetchPost({ apiKey, slugOrId, baseUrl, ...(locale ? { locale } : {}) }),\n resolveThemeStyleFailSoft({ themeProp, apiKey, baseUrl }),\n fetchBlogSettingsFailSoft({ apiKey, baseUrl }),\n ]);\n\n if (!post) {\n return (\n notFoundElement ?? (\n <div data-roottale-cms=\"post-missing\" style={themeStyle ?? undefined}>\n <p className=\"rt-cms-empty\">{t(locale, \"postNotFound\")}</p>\n </div>\n )\n );\n }\n\n const display = resolvePostDisplay(post, blogSettings, {\n showTableOfContents,\n tableOfContentsTitle,\n });\n const toc = display.showTableOfContents ? extractToc(post.bodyJson) : [];\n const renderDoc =\n toc.length > 0 ? attachHeadingIds(post.bodyJson, toc) : post.bodyJson;\n const related = await fetchRelatedPostsFailSoft({\n post,\n apiKey,\n baseUrl,\n count: relatedPostsCount,\n locale,\n });\n const relatedHref =\n props.postHref ??\n (collections ? makeCollectionPostHref(collections) : defaultPostHref);\n\n const authorName = post.authorName;\n const authorSlug = post.authorSlug;\n const views = typeof post.viewCount === \"number\" ? post.viewCount : null;\n const publishedDate = display.showDate\n ? formatPublishedDate(post.publishedAt)\n : \"\";\n const showTopAuthor = display.showAuthor && Boolean(authorName);\n const displayAuthorName = authorName ?? display.authorProfileName;\n const authorBio =\n post.authorBio ??\n display.authorProfileBio ??\n display.authorCardDescription;\n const authorImageUrl = post.authorImageUrl ?? display.authorProfileImageUrl;\n const authorImageAlt = `${displayAuthorName ?? \"\"} 프로필 사진`.trim();\n const authorImageStyle: CSSProperties = {\n borderRadius: authorImageRadiusCss(display.authorProfileImageRadius),\n objectPosition: `${display.authorProfileImagePositionX}% ${display.authorProfileImagePositionY}%`,\n };\n const showAuthorCard = display.showAuthorCard && Boolean(displayAuthorName);\n\n return (\n <article\n data-roottale-cms=\"post\"\n className=\"rt-cms-article\"\n style={themeStyle ?? undefined}\n >\n {renderBlogPostBreadcrumb({\n post,\n collections,\n postHref: relatedHref,\n options: breadcrumb,\n })}\n <header className=\"rt-cms-post-header\">\n {showTitle ? <h1 className=\"rt-cms-title\">{post.title}</h1> : null}\n {post.excerpt ? <p className=\"rt-cms-excerpt\">{post.excerpt}</p> : null}\n {publishedDate || showTopAuthor || views !== null ? (\n <p className=\"rt-cms-meta\">\n {publishedDate ? (\n <time\n dateTime={post.publishedAt ?? undefined}\n className=\"rt-cms-meta-item\"\n data-rt-cms-meta=\"date\"\n >\n {publishedDate}\n </time>\n ) : null}\n {showTopAuthor ? (\n <span className=\"rt-cms-meta-item\" data-rt-cms-meta=\"author\">\n 작성자{\" \"}\n {authorSlug ? (\n <a className=\"rt-cms-author-link\" href={authorHref(authorSlug)}>\n {authorName}\n </a>\n ) : (\n authorName\n )}\n </span>\n ) : null}\n {views !== null ? (\n <span className=\"rt-cms-meta-item\" data-rt-cms-meta=\"views\">\n 조회 {views.toLocaleString(\"ko-KR\")}\n </span>\n ) : null}\n </p>\n ) : null}\n </header>\n {renderArchiveRelated(post.archiveRelated, collections)}\n {showFieldFacts ? renderFieldFacts(post) : null}\n <BlogPostBody\n doc={renderDoc}\n fields={post.fields}\n apiKey={apiKey}\n baseUrl={baseUrl}\n toc={toc}\n tocTitle={display.tocTitle}\n tocPosition={display.tocPosition}\n />\n {showAuthorCard && displayAuthorName ? (\n <section className=\"rt-cms-author-card\" aria-label=\"작성자\">\n {authorImageUrl ? (\n <img\n className=\"rt-cms-author-card__image\"\n src={authorImageUrl}\n alt={authorImageAlt}\n loading=\"lazy\"\n style={authorImageStyle}\n />\n ) : (\n <div className=\"rt-cms-author-card__avatar\" aria-hidden=\"true\">\n {authorInitials(displayAuthorName)}\n </div>\n )}\n <div className=\"rt-cms-author-card__body\">\n <p className=\"rt-cms-author-card__eyebrow\">\n {display.authorCardEyebrow}\n </p>\n <p className=\"rt-cms-author-card__name\">\n {authorSlug ? (\n <a className=\"rt-cms-author-link\" href={authorHref(authorSlug)}>\n {displayAuthorName}\n </a>\n ) : (\n displayAuthorName\n )}\n </p>\n {authorBio ? (\n <p className=\"rt-cms-author-card__description\">{authorBio}</p>\n ) : null}\n </div>\n </section>\n ) : null}\n {renderRelatedPosts(related, relatedHref, relatedPostsTitle)}\n {renderPostCta(blogSettings.postCta)}\n {renderFaqJsonLd(post.bodyJson)}\n </article>\n );\n}\n","import type { ReactElement } from \"react\";\nimport type {\n CmsArchiveRelatedGroup,\n CmsFieldMetaEntry,\n CmsPostContent,\n} from \"@roottale/cms-client/server\";\nimport type { RouteCollection } from \"@roottale/cms-core\";\n\nconst FIELD_FACT_TYPES = new Set([\n \"text\",\n \"textarea\",\n \"email\",\n \"url\",\n \"select\",\n \"radio\",\n \"button_group\",\n \"number\",\n \"range\",\n]);\n\nfunction archiveGroupTitle(group: CmsArchiveRelatedGroup): string {\n if (group.collectionKey === \"conditions\") {\n return `이 증상과 관련된 질환 ${group.items.length}`;\n }\n if (group.collectionKey === \"treatments\") {\n return `관련 치료법 ${group.items.length}`;\n }\n if (group.collectionKey === \"symptoms\") {\n return `관련 증상 ${group.items.length}`;\n }\n return `${group.label} ${group.items.length}`;\n}\n\nfunction defaultArchiveBasePath(collectionKey: string): string {\n if (collectionKey === \"symptoms\") return \"/symptoms\";\n if (collectionKey === \"conditions\") return \"/conditions\";\n if (collectionKey === \"treatments\") return \"/treatments\";\n return \"/blog\";\n}\n\nfunction archivePostHref(\n collectionKey: string,\n slug: string,\n collections: readonly RouteCollection[] | undefined,\n): string {\n const collection = collections?.find((item) => item.key === collectionKey);\n const basePath =\n collection?.basePath || defaultArchiveBasePath(collectionKey);\n const trimmedBase = basePath.replace(/\\/+$/, \"\");\n if (collection?.detail === false) return trimmedBase;\n return `${trimmedBase}/${slug}`;\n}\n\nexport function renderArchiveRelated(\n groups: readonly CmsArchiveRelatedGroup[],\n collections: readonly RouteCollection[] | undefined,\n): ReactElement | null {\n const visibleGroups = groups.filter((group) => group.items.length > 0);\n if (visibleGroups.length === 0) return null;\n\n return (\n <aside className=\"rt-archive-related\" aria-label=\"연관 정보\">\n {visibleGroups.map((group) => (\n <section key={group.collectionKey} className=\"rt-archive-related__group\">\n <h2 className=\"rt-archive-related__title\">\n {archiveGroupTitle(group)}\n </h2>\n <ul className=\"rt-archive-related__list\">\n {group.items.map((item) => (\n <li key={item.id} className=\"rt-archive-related__item\">\n <a\n className=\"rt-archive-related__link\"\n href={archivePostHref(\n item.collectionKey,\n item.slug,\n collections,\n )}\n >\n <span className=\"rt-archive-related__item-title\">\n {item.title}\n </span>\n {item.excerpt ? (\n <span className=\"rt-archive-related__item-excerpt\">\n {item.excerpt}\n </span>\n ) : null}\n </a>\n </li>\n ))}\n </ul>\n </section>\n ))}\n </aside>\n );\n}\n\nfunction fieldFactValue(\n raw: unknown,\n meta: CmsFieldMetaEntry,\n): string | null {\n if (raw === null || raw === undefined) return null;\n if (typeof raw === \"number\") return raw.toLocaleString(\"ko-KR\");\n if (typeof raw !== \"string\" || raw.trim() === \"\") return null;\n if (!meta.choices) return raw;\n\n const choice = meta.choices.find((item) => item.value === raw);\n return choice ? choice.label : raw;\n}\n\nexport function renderFieldFacts(\n post: CmsPostContent,\n): ReactElement | null {\n if (!post.fields) return null;\n\n const rows = post.fieldsMeta\n .filter((meta) => FIELD_FACT_TYPES.has(meta.type))\n .flatMap((meta) => {\n const value = fieldFactValue(post.fields?.[meta.name], meta);\n return value === null ? [] : [{ meta, value }];\n });\n if (rows.length === 0) return null;\n\n return (\n <aside className=\"rt-archive-facts\" aria-label=\"상세 정보\">\n <dl className=\"rt-archive-facts__list\">\n {rows.map(({ meta, value }) => (\n <div key={meta.name} className=\"rt-archive-facts__row\">\n <dt className=\"rt-archive-facts__label\">{meta.label}</dt>\n <dd\n className={\n meta.type === \"textarea\"\n ? \"rt-archive-facts__value rt-archive-facts__value--multiline\"\n : \"rt-archive-facts__value\"\n }\n >\n {value}\n </dd>\n </div>\n ))}\n </dl>\n </aside>\n );\n}\n","import type { CSSProperties, ReactElement } from \"react\";\nimport {\n bindingSrcValue,\n bindingTextValue,\n boundFieldValue,\n} from \"@roottale/cms-core\";\n\nimport {\n getSectionNodeRenderer,\n type SectionRenderContext,\n} from \"../section-render-context.js\";\nimport { renderEmbedNode } from \"./tiptap-embed-renderer.js\";\nimport { renderTextNode } from \"./tiptap-inline-renderer.js\";\nimport { parseTiptapNode, type TiptapNode } from \"./tiptap-types.js\";\n\ntype FieldsRecord = Record<string, unknown> | null;\n\nexport type RenderNodeContext = {\n readonly fields: FieldsRecord;\n readonly section: SectionRenderContext;\n};\n\nfunction boundContentText(\n node: TiptapNode,\n fields: FieldsRecord,\n): string | undefined {\n return bindingTextValue(\n boundFieldValue(node.attrs?.bindings, \"content\", fields),\n );\n}\n\nfunction alignStyle(node: TiptapNode): CSSProperties | undefined {\n const align = node.attrs?.textAlign;\n if (typeof align !== \"string\" || align === \"\" || align === \"left\") {\n return undefined;\n }\n if (align === \"center\" || align === \"right\" || align === \"justify\") {\n return { textAlign: align };\n }\n return undefined;\n}\n\nfunction tableCellSpans(node: TiptapNode): {\n readonly colSpan: number | undefined;\n readonly rowSpan: number | undefined;\n} {\n const colspan = Number(node.attrs?.colspan);\n const rowspan = Number(node.attrs?.rowspan);\n return {\n colSpan: Number.isFinite(colspan) && colspan > 1 ? colspan : undefined,\n rowSpan: Number.isFinite(rowspan) && rowspan > 1 ? rowspan : undefined,\n };\n}\n\nexport function renderTiptapNode(\n value: unknown,\n key: number,\n context: RenderNodeContext,\n): ReactElement | string | null {\n const node = parseTiptapNode(value);\n if (!node) return null;\n\n const children = node.content?.map((child, index) =>\n renderTiptapNode(child, index, context),\n );\n\n switch (node.type) {\n case \"paragraph\": {\n const bound = boundContentText(node, context.fields);\n return (\n <p key={key} style={alignStyle(node)}>\n {bound ?? children}\n </p>\n );\n }\n case \"heading\": {\n const rawLevel = Number(node.attrs?.level ?? 2);\n const finiteLevel = Number.isFinite(rawLevel) ? rawLevel : 2;\n const level = Math.min(Math.max(finiteLevel, 2), 4);\n const rawId = node.attrs?.id;\n const id =\n typeof rawId === \"string\" && rawId.length > 0 ? rawId : undefined;\n const style = alignStyle(node);\n const inner = boundContentText(node, context.fields) ?? children;\n if (level === 2) {\n return (\n <h2 key={key} id={id} style={style}>\n {inner}\n </h2>\n );\n }\n if (level === 3) {\n return (\n <h3 key={key} id={id} style={style}>\n {inner}\n </h3>\n );\n }\n return (\n <h4 key={key} id={id} style={style}>\n {inner}\n </h4>\n );\n }\n case \"bulletList\":\n return <ul key={key}>{children}</ul>;\n case \"orderedList\":\n return <ol key={key}>{children}</ol>;\n case \"listItem\":\n return <li key={key}>{children}</li>;\n case \"blockquote\":\n return <blockquote key={key}>{children}</blockquote>;\n case \"codeBlock\":\n return (\n <pre key={key}>\n <code>{children}</code>\n </pre>\n );\n case \"horizontalRule\":\n return <hr key={key} />;\n case \"hardBreak\":\n return <br key={key} />;\n case \"image\": {\n const boundSrc = bindingSrcValue(\n boundFieldValue(node.attrs?.bindings, \"src\", context.fields),\n );\n const src = boundSrc ?? node.attrs?.src;\n if (typeof src !== \"string\" || src.length === 0) return null;\n\n const alt = typeof node.attrs?.alt === \"string\" ? node.attrs.alt : \"\";\n const title =\n typeof node.attrs?.title === \"string\" ? node.attrs.title : undefined;\n const width =\n typeof node.attrs?.width === \"number\" && node.attrs.width > 0\n ? node.attrs.width\n : undefined;\n const height =\n typeof node.attrs?.height === \"number\" && node.attrs.height > 0\n ? node.attrs.height\n : undefined;\n return (\n <img\n key={key}\n src={src}\n alt={alt}\n title={title}\n width={width}\n height={height}\n loading=\"lazy\"\n />\n );\n }\n case \"columns\":\n return (\n <div key={key} className=\"rt-columns\">\n {children}\n </div>\n );\n case \"column\":\n return (\n <div key={key} className=\"rt-column\">\n {children}\n </div>\n );\n case \"table\":\n return (\n <div key={key} className=\"rt-table-wrap\">\n <table className=\"rt-table\">\n <tbody>{children}</tbody>\n </table>\n </div>\n );\n case \"tableRow\":\n return <tr key={key}>{children}</tr>;\n case \"tableHeader\": {\n const { colSpan, rowSpan } = tableCellSpans(node);\n return (\n <th key={key} colSpan={colSpan} rowSpan={rowSpan}>\n {children}\n </th>\n );\n }\n case \"tableCell\": {\n const { colSpan, rowSpan } = tableCellSpans(node);\n return (\n <td key={key} colSpan={colSpan} rowSpan={rowSpan}>\n {children}\n </td>\n );\n }\n case \"embed\":\n return renderEmbedNode(node, key);\n case \"faq\":\n return (\n <div key={key} data-roottale-cms=\"faq\" className=\"rt-cms-faq\">\n {children}\n </div>\n );\n case \"faqItem\":\n return (\n <details key={key} className=\"rt-cms-faq-item\">\n {children}\n </details>\n );\n case \"faqQuestion\":\n return (\n <summary key={key} className=\"rt-cms-faq-q\">\n {children}\n </summary>\n );\n case \"faqAnswer\":\n return (\n <div key={key} className=\"rt-cms-faq-a\">\n {children}\n </div>\n );\n case \"tableOfContents\":\n return null;\n case \"section\": {\n // 섹션 템플릿은 templates 계층이 주입한다(ADR-0040 P2 단방향). 주입 전이면\n // 미지 섹션과 같은 fail-soft — dev 경고 후 skip.\n const renderSection = getSectionNodeRenderer();\n if (!renderSection) {\n if (context.section.isDev()) {\n console.warn(\n '[cms-renderer-next] section 노드를 그릴 템플릿이 등록되지 않았다 — 렌더 skip. `import \"@roottale/cms-renderer-next/templates\"` 가 필요하다.',\n );\n }\n return null;\n }\n return renderSection(node, key, context.section);\n }\n case \"text\":\n return renderTextNode(node, key);\n default:\n return children ? <span key={key}>{children}</span> : null;\n }\n}\n","/**\n * 섹션 렌더러 주입 지점 — ADR-0040 P2 단방향 계약(코어 ◄ templates).\n *\n * 본문(tiptap) 안의 `section` 노드는 `templates/` 의 컴포넌트로 그려야 하는데,\n * 코어가 `templates/` 를 직접 import 하면 P3+ `site-kit` 분리 시 순환·번들\n * 오염이 된다(dependency-cruiser `no-renderer-core-to-templates`). 그래서 코어는\n * \"섹션을 그리는 함수\" 의 자리만 비워두고, `@roottale/cms-renderer-next/templates`\n * 를 import 하는 쪽에서 채운다(그 배럴이 로드 시 자동 등록).\n *\n * 등록 없이 `section` 노드를 만나면 dev 경고 후 skip — 미지 섹션 타입을 만났을\n * 때와 같은 fail-soft 동작이다.\n */\nimport type { ReactElement, ReactNode } from \"react\";\nimport type { CmsPostContent } from \"@roottale/cms-client/server\";\n\n/** 발행 API 호출에 필요한 최소 컨텍스트(공개 키 + 베이스 URL). */\nexport type CmsBoundContext = { apiKey: string; baseUrl?: string };\n\nexport type BlogListProps = {\n apiKey: string;\n baseUrl?: string;\n limit?: number;\n emptyMessage?: string;\n postHref?: (post: CmsPostContent) => string;\n};\n\nexport type SectionRenderContext = {\n cms: CmsBoundContext | null;\n renderBlogList: (props: BlogListProps) => ReactNode;\n isDev: () => boolean;\n};\n\n/** `section` 노드 하나를 그리는 함수 — templates 쪽 구현이 주입된다. */\nexport type SectionNodeRenderer = (\n node: { type?: string; attrs?: Record<string, unknown> },\n key: number,\n context: SectionRenderContext,\n) => ReactElement | null;\n\nlet sectionNodeRenderer: SectionNodeRenderer | null = null;\n\n/**\n * templates 배럴이 로드되며 호출한다. 소비자가 명시적으로 부를 필요는 없지만,\n * 번들러가 side-effect 를 떨어뜨리는 환경에서는 직접 호출해도 된다.\n */\nexport function setSectionNodeRenderer(renderer: SectionNodeRenderer): void {\n sectionNodeRenderer = renderer;\n}\n\nexport function getSectionNodeRenderer(): SectionNodeRenderer | null {\n return sectionNodeRenderer;\n}\n","import type { ReactElement } from \"react\";\nimport { isAllowedEmbedSrc } from \"@roottale/cms-core\";\n\nimport type { TiptapNode } from \"./tiptap-types.js\";\n\nfunction isSafeFallbackHref(value: unknown): value is string {\n if (typeof value !== \"string\") return false;\n const href = value.trim();\n if (href.length === 0) return false;\n if (href.startsWith(\"/\") || href.startsWith(\"#\") || href.startsWith(\"?\")) {\n return true;\n }\n return /^(https?:|mailto:|tel:)/i.test(href);\n}\n\nexport function renderEmbedNode(\n node: TiptapNode,\n key: number,\n): ReactElement | null {\n const src = node.attrs?.src;\n if (isAllowedEmbedSrc(src)) {\n const provider =\n typeof node.attrs?.provider === \"string\"\n ? node.attrs.provider\n : undefined;\n return (\n <div\n key={key}\n className=\"rt-embed\"\n data-provider={provider}\n style={{ aspectRatio: \"16 / 9\" }}\n >\n <iframe\n src={src}\n title=\"임베드된 영상\"\n loading=\"lazy\"\n allowFullScreen\n referrerPolicy=\"strict-origin-when-cross-origin\"\n allow=\"accelerometer; clipboard-write; encrypted-media; picture-in-picture; web-share\"\n style={{ width: \"100%\", height: \"100%\", border: 0 }}\n />\n </div>\n );\n }\n\n const originalUrl = node.attrs?.originalUrl;\n if (!isSafeFallbackHref(originalUrl)) return null;\n return (\n <p key={key} className=\"rt-embed-fallback\">\n <a href={originalUrl} rel=\"noopener noreferrer\" target=\"_blank\">\n {originalUrl}\n </a>\n </p>\n );\n}\n","export type TiptapMark = {\n readonly type?: string;\n readonly attrs?: Record<string, unknown>;\n};\n\nexport type TiptapNode = {\n readonly type?: string;\n readonly text?: string;\n readonly attrs?: Record<string, unknown>;\n readonly content?: readonly unknown[];\n readonly marks?: readonly unknown[];\n};\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function parseTiptapNode(value: unknown): TiptapNode | null {\n if (!isRecord(value)) return null;\n return {\n type: typeof value.type === \"string\" ? value.type : undefined,\n text: typeof value.text === \"string\" ? value.text : undefined,\n attrs: isRecord(value.attrs) ? value.attrs : undefined,\n content: Array.isArray(value.content) ? value.content : undefined,\n marks: Array.isArray(value.marks) ? value.marks : undefined,\n };\n}\n\nexport function parseTiptapMark(value: unknown): TiptapMark | null {\n if (!isRecord(value)) return null;\n return {\n type: typeof value.type === \"string\" ? value.type : undefined,\n attrs: isRecord(value.attrs) ? value.attrs : undefined,\n };\n}\n","import type { ReactElement } from \"react\";\n\nimport {\n parseTiptapMark,\n type TiptapMark,\n type TiptapNode,\n} from \"./tiptap-types.js\";\n\nfunction isSafeHref(value: unknown): value is string {\n if (typeof value !== \"string\") return false;\n const href = value.trim();\n if (href.length === 0) return false;\n if (href.startsWith(\"/\") || href.startsWith(\"#\") || href.startsWith(\"?\")) {\n return true;\n }\n return /^(https?:|mailto:|tel:)/i.test(href);\n}\n\nfunction applyMark(\n mark: TiptapMark,\n child: ReactElement | string,\n): ReactElement {\n switch (mark.type) {\n case \"bold\":\n return <strong>{child}</strong>;\n case \"italic\":\n return <em>{child}</em>;\n case \"underline\":\n return <u>{child}</u>;\n case \"strike\":\n return <s>{child}</s>;\n case \"code\":\n return <code>{child}</code>;\n case \"highlight\": {\n const color = mark.attrs?.color;\n const style =\n typeof color === \"string\" && color.length > 0\n ? { background: color }\n : undefined;\n return <mark style={style}>{child}</mark>;\n }\n case \"textStyle\": {\n const color = mark.attrs?.color;\n if (typeof color !== \"string\" || color.length === 0) {\n return <>{child}</>;\n }\n return <span style={{ color }}>{child}</span>;\n }\n case \"link\": {\n const rawHref = mark.attrs?.href;\n const href = isSafeHref(rawHref) ? rawHref : \"#\";\n return (\n <a href={href} rel=\"noopener noreferrer\" target=\"_blank\">\n {child}\n </a>\n );\n }\n default:\n return <span>{child}</span>;\n }\n}\n\nexport function renderTextNode(\n node: TiptapNode,\n key: number,\n): ReactElement | string {\n const text = node.text ?? \"\";\n const marks = (node.marks ?? []).flatMap((value) => {\n const mark = parseTiptapMark(value);\n return mark ? [mark] : [];\n });\n if (marks.length === 0) return text;\n\n let element: ReactElement | string = text;\n for (const mark of marks) {\n element = applyMark(mark, element);\n }\n return <span key={key}>{element}</span>;\n}\n","import type { ReactElement } from \"react\";\n\nimport {\n type CmsBoundContext,\n type SectionRenderContext,\n} from \"../section-render-context.js\";\nimport { RootTaleTableOfContents } from \"../TableOfContents.js\";\nimport { attachHeadingIds, extractToc } from \"../toc.js\";\nimport { RootTaleBlogList } from \"./blog-list.js\";\nimport {\n renderTiptapNode,\n type RenderNodeContext,\n} from \"./tiptap-node-renderer.js\";\nimport { isRecord, parseTiptapNode } from \"./tiptap-types.js\";\n\ntype RenderTiptapProps = {\n readonly doc: Record<string, unknown>;\n readonly fields?: Record<string, unknown> | null;\n readonly apiKey?: string;\n readonly baseUrl?: string;\n};\n\nfunction isDevelopmentRuntime(): boolean {\n const processValue = Reflect.get(globalThis, \"process\");\n if (!isRecord(processValue)) return true;\n const env = processValue.env;\n if (!isRecord(env)) return true;\n return env.NODE_ENV !== \"production\";\n}\n\nfunction createSectionContextWithBlogListNetworkFetch(\n apiKey: string | undefined,\n baseUrl: string | undefined,\n): SectionRenderContext {\n const cms: CmsBoundContext | null = apiKey ? { apiKey, baseUrl } : null;\n return {\n cms,\n isDev: isDevelopmentRuntime,\n renderBlogList: (props) => <RootTaleBlogList {...props} />,\n };\n}\n\nfunction contentNodes(doc: Record<string, unknown>): readonly unknown[] {\n return Array.isArray(doc.content) ? doc.content : [];\n}\n\nexport function RenderTiptap({\n doc,\n fields,\n apiKey,\n baseUrl,\n}: RenderTiptapProps): ReactElement {\n const content = contentNodes(doc);\n const hasTableOfContents = content.some(\n (value) => parseTiptapNode(value)?.type === \"tableOfContents\",\n );\n const entries = hasTableOfContents ? extractToc(doc) : [];\n const renderDoc =\n hasTableOfContents && entries.length > 0\n ? attachHeadingIds(doc, entries)\n : doc;\n const context: RenderNodeContext = {\n fields: fields ?? null,\n section: createSectionContextWithBlogListNetworkFetch(apiKey, baseUrl),\n };\n\n return (\n <>\n {contentNodes(renderDoc).map((value, index) => {\n const node = parseTiptapNode(value);\n if (node?.type !== \"tableOfContents\") {\n return renderTiptapNode(value, index, context);\n }\n const title = node.attrs?.title;\n return (\n <RootTaleTableOfContents\n key={index}\n entries={entries}\n title={typeof title === \"string\" ? title : \"목차\"}\n />\n );\n })}\n </>\n );\n}\n","import type { ReactElement } from \"react\";\n\nimport { RootTaleTableOfContents } from \"../TableOfContents.js\";\nimport type { TocEntry } from \"../toc.js\";\nimport { RenderTiptap } from \"./render-tiptap.js\";\n\ntype BlogPostBodyProps = {\n readonly doc: Record<string, unknown>;\n readonly fields: Record<string, unknown> | null;\n readonly apiKey: string;\n readonly baseUrl?: string;\n readonly toc: TocEntry[];\n readonly tocTitle: string;\n readonly tocPosition: string;\n};\n\nexport function BlogPostBody(props: BlogPostBodyProps): ReactElement {\n const {\n doc,\n fields,\n apiKey,\n baseUrl,\n toc,\n tocTitle,\n tocPosition,\n } = props;\n const tableOfContents =\n toc.length > 0 ? (\n <RootTaleTableOfContents entries={toc} title={tocTitle} />\n ) : null;\n const body = (\n <div data-roottale-cms=\"body\" className=\"rt-cms-body\">\n <RenderTiptap\n doc={doc}\n fields={fields}\n apiKey={apiKey}\n baseUrl={baseUrl}\n />\n </div>\n );\n\n if (tocPosition === \"sidebar\" && tableOfContents) {\n return (\n <div className=\"rt-cms-layout rt-cms-layout--toc-side\">\n {body}\n <aside className=\"rt-cms-toc-side\">{tableOfContents}</aside>\n </div>\n );\n }\n return (\n <>\n {tableOfContents}\n {body}\n </>\n );\n}\n","import type { ReactElement } from \"react\";\nimport {\n breadcrumbSchema,\n jsonLdJson,\n type CmsPostContent,\n} from \"@roottale/cms-client/server\";\nimport {\n resolvePostCollection,\n type RouteCollection,\n} from \"@roottale/cms-core\";\n\nimport { defaultCategoryHref } from \"../blog-filter.js\";\nimport { trimSlash } from \"../routes-shared.js\";\nimport type { BlogPostBreadcrumbOptions } from \"./blog-post-types.js\";\n\ntype RenderBlogPostBreadcrumbInput = {\n readonly post: CmsPostContent;\n readonly collections: readonly RouteCollection[] | undefined;\n readonly postHref: (post: CmsPostContent) => string;\n readonly options: BlogPostBreadcrumbOptions | undefined;\n};\n\nfunction absoluteUrl(siteUrl: string, path: string): string {\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${trimSlash(siteUrl)}${normalizedPath}`;\n}\n\nexport function renderBlogPostBreadcrumb(\n input: RenderBlogPostBreadcrumbInput,\n): ReactElement | null {\n const { post, collections, postHref, options } = input;\n if (!options) return null;\n\n const {\n siteUrl,\n homeLabel = \"홈\",\n homeHref = \"/\",\n listLabel = \"블로그\",\n showCategory = true,\n categoryHref = defaultCategoryHref,\n } = options;\n const listHref =\n options.listHref ??\n (collections\n ? resolvePostCollection(post, collections)?.basePath || \"/blog\"\n : \"/blog\");\n const categoryTerm = showCategory\n ? post.terms.find((term) => term.taxonomy === \"category\")\n : undefined;\n const crumbs: { label: string; href: string }[] = [\n { label: homeLabel, href: homeHref },\n { label: listLabel, href: listHref },\n ];\n if (categoryTerm) {\n crumbs.push({\n label: categoryTerm.name,\n href: categoryHref(categoryTerm.slug),\n });\n }\n crumbs.push({ label: post.title, href: postHref(post) });\n\n const jsonLd = siteUrl\n ? breadcrumbSchema(\n crumbs.map((crumb) => ({\n name: crumb.label,\n url: absoluteUrl(siteUrl, crumb.href),\n })),\n )\n : null;\n\n return (\n <>\n <nav aria-label=\"브레드크럼\" className=\"rt-cms-breadcrumb\">\n <ol>\n {crumbs.map((crumb, index) =>\n index === crumbs.length - 1 ? (\n <li key={index} aria-current=\"page\">\n {crumb.label}\n </li>\n ) : (\n <li key={index}>\n <a href={crumb.href}>{crumb.label}</a>\n </li>\n ),\n )}\n </ol>\n </nav>\n {jsonLd ? (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: jsonLdJson(jsonLd) }}\n />\n ) : null}\n </>\n );\n}\n","import type { ReactElement } from \"react\";\nimport {\n jsonLdJson,\n type CmsPostContent,\n type RootTaleBlogSettings,\n} from \"@roottale/cms-client/server\";\nimport { extractFaqEntries, faqPageJsonLd } from \"@roottale/cms-core\";\n\nexport function renderPostCta(\n cta: RootTaleBlogSettings[\"postCta\"],\n): ReactElement | null {\n if (!cta) return null;\n\n const href = cta.buttonHref.trim();\n const isSafeHref =\n href.startsWith(\"/\") ||\n href.startsWith(\"#\") ||\n /^(https?:|mailto:|tel:)/i.test(href);\n if (!isSafeHref) return null;\n\n const isExternal = /^https?:/i.test(href);\n return (\n <aside data-roottale-cms=\"post-cta\" className=\"rt-cms-post-cta\">\n {cta.title ? <p className=\"rt-cms-post-cta__title\">{cta.title}</p> : null}\n {cta.description ? (\n <p className=\"rt-cms-post-cta__desc\">{cta.description}</p>\n ) : null}\n <a\n className=\"rt-cms-post-cta__btn\"\n href={href}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n >\n {cta.buttonLabel}\n </a>\n </aside>\n );\n}\n\nexport function renderRelatedPosts(\n posts: readonly CmsPostContent[],\n href: (post: CmsPostContent) => string,\n title: string,\n): ReactElement | null {\n if (posts.length === 0) return null;\n\n return (\n <nav data-roottale-cms=\"related\" className=\"rt-cms-related\" aria-label={title}>\n <h2 className=\"rt-cms-related-title\">{title}</h2>\n <ul className=\"rt-cms-related-list\">\n {posts.map((post) => (\n <li key={post.id} className=\"rt-cms-related-item\">\n <a className=\"rt-cms-related-link\" href={href(post)}>\n {post.featuredImageUrl ? (\n <img\n className=\"rt-cms-related-thumb\"\n src={post.featuredImageUrl}\n alt=\"\"\n loading=\"lazy\"\n />\n ) : null}\n <span className=\"rt-cms-related-post-title\">{post.title}</span>\n </a>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n\nfunction renderFaqJsonLd(doc: unknown): ReactElement | null {\n const jsonLd = faqPageJsonLd(extractFaqEntries(doc));\n if (!jsonLd) return null;\n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: jsonLdJson(jsonLd) }}\n />\n );\n}\n\nexport function RootTaleFaqJsonLd({\n doc,\n}: {\n readonly doc: unknown;\n}): ReactElement | null {\n return renderFaqJsonLd(doc);\n}\n\nexport { renderFaqJsonLd };\n","import type { ReactElement } from \"react\";\nimport { fetchPost } from \"@roottale/cms-client/server\";\nimport { t } from \"@roottale/cms-i18n\";\n\nimport { RenderTiptap } from \"./render-tiptap.js\";\nimport {\n resolveThemeStyleFailSoft,\n type RootTaleThemeInput,\n} from \"./theme.js\";\n\nexport type RootTalePageProps = {\n apiKey: string;\n slugOrId: string;\n baseUrl?: string;\n notFoundElement?: ReactElement;\n showTitle?: boolean;\n theme?: RootTaleThemeInput;\n locale?: string;\n};\n\nexport async function RootTalePage(\n props: RootTalePageProps,\n): Promise<ReactElement> {\n const {\n apiKey,\n slugOrId,\n baseUrl,\n notFoundElement,\n showTitle = true,\n theme: themeProp,\n locale,\n } = props;\n const [post, themeStyle] = await Promise.all([\n fetchPost({ apiKey, slugOrId, baseUrl, ...(locale ? { locale } : {}) }),\n resolveThemeStyleFailSoft({ themeProp, apiKey, baseUrl }),\n ]);\n\n if (!post) {\n return (\n notFoundElement ?? (\n <div data-roottale-cms=\"page-missing\" style={themeStyle ?? undefined}>\n <p className=\"rt-cms-empty\">{t(locale, \"pageNotFound\")}</p>\n </div>\n )\n );\n }\n\n return (\n <article\n data-roottale-cms=\"page\"\n className=\"rt-cms-article\"\n style={themeStyle ?? undefined}\n >\n {showTitle ? (\n <header className=\"rt-cms-post-header\">\n <h1 className=\"rt-cms-title\">{post.title}</h1>\n </header>\n ) : null}\n <div data-roottale-cms=\"body\" className=\"rt-cms-body\">\n <RenderTiptap\n doc={post.bodyJson}\n fields={post.fields}\n apiKey={apiKey}\n baseUrl={baseUrl}\n />\n </div>\n </article>\n );\n}\n","import type { CSSProperties, ReactElement } from \"react\";\nimport type { SectionCta } from \"../site-config.js\";\n\nexport function sectionThemeStyle(\n theme: Record<string, string> | undefined,\n): CSSProperties | undefined {\n if (!theme) return undefined;\n const style: Record<string, string> = {};\n for (const [key, value] of Object.entries(theme)) {\n if (key.startsWith(\"--\")) style[key] = value;\n }\n return Object.keys(style).length > 0 ? (style as CSSProperties) : undefined;\n}\n\nexport function CtaLink({\n cta,\n className,\n track,\n}: {\n cta: SectionCta;\n className?: string;\n track: \"cta_banner\" | \"cta_hero\";\n}): ReactElement {\n return (\n <a\n className={className ?? \"rt-tpl-btn rt-tpl-btn--primary\"}\n href={cta.href}\n data-track={track}\n >\n {cta.label}\n </a>\n );\n}\n\nexport function ctaTrackForHref(href: string): \"cta_banner\" | \"cta_hero\" {\n return href.startsWith(\"tel:\") ? \"cta_banner\" : \"cta_hero\";\n}\n\n/**\n * `tel:`/`mailto:` 링크 전용 계측(측정 설계 v2 §1 phone_click/email_click) —\n * 기존 `cta_call`/`cta_banner`/`service_card` 관행(다수 스냅샷 테스트가 값을\n * 고정)과는 별개 신규 배선이라, 이미 그 관행으로 추적되고 있던 요소는 건드리지\n * 않고 지금까지 무추적이던 tel:/mailto: 링크에만 additive 로 얹는다.\n * `undefined` 는 \"이 href 는 tel:/mailto: 가 아니다 → 미변경\" 신호.\n */\nexport function contactHrefTrack(\n href: string,\n): \"phone_click\" | \"email_click\" | undefined {\n if (href.startsWith(\"tel:\")) return \"phone_click\";\n if (href.startsWith(\"mailto:\")) return \"email_click\";\n return undefined;\n}\n\n\nexport function telHref(phone: string): string {\n return `tel:${phone.replace(/[^\\d+]/g, \"\")}`;\n}\n","import type { ReactElement } from \"react\";\n\nimport { HeroCarouselViewport } from \"../hero-carousel-client.js\";\nimport type { HeroSection } from \"../site-config.js\";\nimport { CtaLink, sectionThemeStyle } from \"./shared.js\";\n\nfunction TemplateHeroProof({\n proofMetrics,\n}: {\n proofMetrics: HeroSection[\"props\"][\"proofMetrics\"];\n}): ReactElement | null {\n if (!proofMetrics || proofMetrics.items.length === 0) return null;\n return (\n <div\n className=\"rt-tpl-hero-proof\"\n data-position={proofMetrics.position}\n aria-label=\"신뢰 지표\"\n >\n {proofMetrics.items.map((metric) => (\n <div key={`${metric.value}-${metric.label}`} className=\"rt-tpl-hero-proof-item\">\n {metric.imageSrc ? (\n <img\n className=\"rt-tpl-hero-proof-icon\"\n src={metric.imageSrc}\n alt={metric.imageAlt ?? \"\"}\n loading=\"lazy\"\n />\n ) : null}\n <span className=\"rt-tpl-hero-proof-value\">\n {metric.value}\n {metric.unit ? <span>{metric.unit}</span> : null}\n </span>\n <span className=\"rt-tpl-hero-proof-label\">{metric.label}</span>\n {metric.source ? (\n <span className=\"rt-tpl-hero-proof-source\">{metric.source}</span>\n ) : null}\n </div>\n ))}\n </div>\n );\n}\n\n/**\n * `carousel` variant — 풀스크린 배경 캐러셀 + 고정 카피 오버레이(ADR-0073 K3 C1).\n * 카피(h1 `title`/`subtitle`/`eyebrow`/CTA)는 슬라이드 전환과 무관하게\n * 고정이며 서버에서 그린다 — 배경 전환 메커니즘만\n * `HeroCarouselViewport`(\"use client\", hero-carousel-client.tsx)로 격리\n * (M6). h1 은 `title` 하나뿐 — 슬라이드 `caption` 은 h1 이 아니다(publish-gate\n * h1 모델, W6-1 계보 — `publish-gate.ts` `collectH1Labels` 참고).\n */\nfunction TemplateHeroCarousel(section: HeroSection): ReactElement {\n const {\n eyebrow,\n title,\n subtitle,\n cta,\n slides,\n autoplay,\n intervalMs,\n transition,\n proofMetrics,\n scrim,\n } = section.props;\n // slides 는 스키마 superRefine 이 발행 시점에 2-6개를 강제한다 — 런타임\n // 방어값은 빈 배열(캐러셀 자체를 그리지 않음, 카피 오버레이는 유지).\n const safeSlides = slides ?? [];\n return (\n <section\n data-roottale-tpl=\"hero\"\n data-variant=\"carousel\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-hero rt-tpl-hero--carousel\"\n style={sectionThemeStyle(section.theme)}\n >\n {safeSlides.length >= 2 ? (\n <HeroCarouselViewport\n slides={safeSlides}\n autoplay={autoplay ?? true}\n intervalMs={intervalMs ?? 6000}\n scrim={scrim}\n transition={transition}\n />\n ) : null}\n <div className=\"rt-tpl-container rt-tpl-hero-carousel-overlay\">\n {eyebrow ? <p className=\"rt-tpl-hero-eyebrow\">{eyebrow}</p> : null}\n <h1 className=\"rt-tpl-hero-title rt-tpl-hero-carousel-title\">\n {title.split(\"\\n\").map((line, i) => (\n <span key={i} className=\"rt-tpl-hero-title-line\">\n {line}\n </span>\n ))}\n </h1>\n {subtitle ? (\n <p className=\"rt-tpl-hero-desc rt-tpl-hero-carousel-subtitle\">\n {subtitle}\n </p>\n ) : null}\n {cta ? (\n <CtaLink\n cta={cta}\n track=\"cta_hero\"\n className=\"rt-tpl-btn rt-tpl-btn--primary rt-tpl-hero-carousel-cta\"\n />\n ) : null}\n <TemplateHeroProof proofMetrics={proofMetrics} />\n </div>\n </section>\n );\n}\n\nfunction TemplateHeroOverlayPanel(section: HeroSection): ReactElement {\n const { eyebrow, title, description, imageSrc, imageAlt, cta, proofMetrics } =\n section.props;\n return (\n <section\n data-roottale-tpl=\"hero\"\n data-variant=\"overlay-panel\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-hero rt-tpl-hero--overlay-panel\"\n style={sectionThemeStyle(section.theme)}\n >\n <img\n className=\"rt-tpl-hero-overlay-img\"\n src={imageSrc ?? \"\"}\n alt={imageAlt ?? \"\"}\n loading=\"eager\"\n />\n <div className=\"rt-tpl-hero-overlay-scrim\" aria-hidden=\"true\" />\n <div className=\"rt-tpl-container rt-tpl-hero-overlay-inner\">\n <div className=\"rt-tpl-hero-overlay-panel\">\n {eyebrow ? <p className=\"rt-tpl-hero-eyebrow\">{eyebrow}</p> : null}\n <h1 className=\"rt-tpl-hero-title\">\n {title.split(\"\\n\").map((line, i) => (\n <span key={i} className=\"rt-tpl-hero-title-line\">\n {line}\n </span>\n ))}\n </h1>\n {description ? (\n <p className=\"rt-tpl-hero-desc\">{description}</p>\n ) : null}\n {cta ? <CtaLink cta={cta} track=\"cta_hero\" /> : null}\n <TemplateHeroProof proofMetrics={proofMetrics} />\n </div>\n </div>\n </section>\n );\n}\n\n/** 빌트인 `hero`. variant: split(기본) / image / minimal / carousel. */\nexport function TemplateHero(section: HeroSection): ReactElement {\n switch (section.variant) {\n case \"carousel\":\n return TemplateHeroCarousel(section);\n case \"overlay-panel\":\n return TemplateHeroOverlayPanel(section);\n default:\n break;\n }\n\n const { eyebrow, title, description, imageSrc, imageAlt, cta, proofMetrics } =\n section.props;\n const variant = section.variant;\n const showImage = variant !== \"minimal\" && imageSrc;\n return (\n <section\n data-roottale-tpl=\"hero\"\n data-variant={variant}\n id={section.id}\n className=\"rt-tpl-section rt-tpl-hero\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container rt-tpl-hero-inner\">\n <div className=\"rt-tpl-hero-copy\">\n {eyebrow ? <p className=\"rt-tpl-hero-eyebrow\">{eyebrow}</p> : null}\n <h1 className=\"rt-tpl-hero-title\">\n {title.split(\"\\n\").map((line, i) => (\n <span key={i} className=\"rt-tpl-hero-title-line\">\n {line}\n </span>\n ))}\n </h1>\n {description ? (\n <p className=\"rt-tpl-hero-desc\">{description}</p>\n ) : null}\n {cta ? <CtaLink cta={cta} track=\"cta_hero\" /> : null}\n <TemplateHeroProof proofMetrics={proofMetrics} />\n </div>\n {showImage ? (\n <div className=\"rt-tpl-hero-media\">\n <img\n className=\"rt-tpl-hero-img\"\n src={imageSrc}\n alt={imageAlt ?? \"\"}\n loading=\"eager\"\n />\n </div>\n ) : null}\n </div>\n </section>\n );\n}\n\n/** 빌트인 `rich-text`. 문단은 `\\n\\n` 분리. */\n","import type { ReactElement } from \"react\";\n\nimport type { RichTextSection } from \"../site-config.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\n\nexport function TemplateRichText(section: RichTextSection): ReactElement {\n const { heading, body } = section.props;\n return (\n <section\n data-roottale-tpl=\"rich-text\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-rich-text\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {body.split(\"\\n\\n\").map((para, i) => (\n <p key={i} className=\"rt-tpl-rich-text-p\">\n {para}\n </p>\n ))}\n </div>\n </section>\n );\n}\n","import type { ReactElement } from \"react\";\n\nimport type { ServicesSection } from \"../site-config.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\n\nexport function ServicesItemMeta({\n item,\n}: {\n item: ServicesSection[\"props\"][\"items\"][number];\n}): ReactElement | null {\n const hasChips = Boolean(item.chips && item.chips.length > 0);\n const hasMeta = Boolean(item.meta && item.meta.length > 0);\n if (!hasChips && !hasMeta) return null;\n return (\n <div className=\"rt-tpl-services-meta-block\">\n {hasChips ? (\n <ul className=\"rt-tpl-services-chips\" aria-label={`${item.title} 태그`}>\n {(item.chips ?? []).map((chip) => (\n <li key={chip}>{chip}</li>\n ))}\n </ul>\n ) : null}\n {hasMeta ? (\n <ul className=\"rt-tpl-services-meta\" aria-label={`${item.title} 메타`}>\n {(item.meta ?? []).map((meta) => (\n <li key={meta}>{meta}</li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\nexport function ServicesIcon({\n item,\n}: {\n item: ServicesSection[\"props\"][\"items\"][number];\n}): ReactElement | null {\n if (!item.iconSrc) return null;\n return (\n <img\n className=\"rt-tpl-services-icon\"\n src={item.iconSrc}\n alt={item.iconAlt ?? \"\"}\n loading=\"lazy\"\n />\n );\n}\n\nexport function TemplateServicesActionRail(section: ServicesSection): ReactElement {\n const { heading, description, items } = section.props;\n return (\n <section\n data-roottale-tpl=\"services\"\n data-variant=\"action-rail\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-services\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {description ? (\n <p className=\"rt-tpl-section-desc\">{description}</p>\n ) : null}\n <ul className=\"rt-tpl-services-action-rail\">\n {items.map((item, i) => {\n const body = (\n <>\n <ServicesIcon item={item} />\n <span className=\"rt-tpl-services-action-body\">\n <span className=\"rt-tpl-services-title\">{item.title}</span>\n {item.subtitle ? (\n <span className=\"rt-tpl-services-subtitle\">{item.subtitle}</span>\n ) : null}\n {item.description ? (\n <span className=\"rt-tpl-services-desc\">{item.description}</span>\n ) : null}\n <ServicesItemMeta item={item} />\n {item.ctaLabel ? (\n <span className=\"rt-tpl-services-action-label\">\n {item.ctaLabel}\n </span>\n ) : null}\n </span>\n </>\n );\n return (\n <li key={`${item.title}-${i}`} data-kind={item.kind}>\n {item.href ? (\n <a\n className=\"rt-tpl-services-action-card\"\n href={item.href}\n data-track=\"service_card\"\n >\n {body}\n </a>\n ) : (\n <div className=\"rt-tpl-services-action-card\">{body}</div>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n </section>\n );\n}\n\nexport function TemplateServicesPhotoCards(section: ServicesSection): ReactElement {\n const { heading, description, items } = section.props;\n return (\n <section\n data-roottale-tpl=\"services\"\n data-variant=\"photo-cards\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-services\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {description ? (\n <p className=\"rt-tpl-section-desc\">{description}</p>\n ) : null}\n <ul className=\"rt-tpl-services-photo-list\">\n {items.map((item, i) => {\n const card = (\n <article className=\"rt-tpl-services-photo-card\">\n <img\n className=\"rt-tpl-services-photo-img\"\n src={item.imageSrc ?? \"\"}\n alt={item.imageAlt ?? \"\"}\n loading=\"lazy\"\n />\n <div className=\"rt-tpl-services-photo-body\">\n <h3 className=\"rt-tpl-services-title\">{item.title}</h3>\n {item.description ? (\n <p className=\"rt-tpl-services-desc\">{item.description}</p>\n ) : null}\n {item.ctaLabel ? (\n <span className=\"rt-tpl-services-action-label\">\n {item.ctaLabel}\n </span>\n ) : null}\n </div>\n </article>\n );\n return (\n <li key={`${item.title}-${i}`}>\n {item.href ? (\n <a\n className=\"rt-tpl-services-photo-link\"\n href={item.href}\n data-track=\"service_card\"\n >\n {card}\n </a>\n ) : (\n card\n )}\n </li>\n );\n })}\n </ul>\n </div>\n </section>\n );\n}\n\n/**\n * `index-rows` — hairline 인덱스 행 (AI-slop #1/#2 대체: 아이콘 그리드·균등\n * 카드 대신 소형 tabular 번호 + 1px rule). 번호는 순서 위계이지 장식이 아니나\n * `<ol>` 이 이미 순번을 스크린리더에 전달하므로 시각 숫자는 aria-hidden.\n */\n","import type { ReactElement } from \"react\";\n\nimport {\n AnimateOnScroll,\n StaggerGroup,\n StaggerItem,\n} from \"../ui-react-motion-client.js\";\nimport type { ServicesSection } from \"../site-config.js\";\nimport { ServicesItemMeta } from \"./services-base.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\n\nfunction servicesIndexNum(i: number): string {\n return String(i + 1).padStart(2, \"0\");\n}\n\nexport function TemplateServicesIndexRows(section: ServicesSection): ReactElement {\n const { heading, description, items } = section.props;\n return (\n <section\n data-roottale-tpl=\"services\"\n data-variant=\"index-rows\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-services\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {description ? (\n <p className=\"rt-tpl-section-desc\">{description}</p>\n ) : null}\n <StaggerGroup as=\"ol\" className=\"rt-tpl-services-index-list\">\n {items.map((item, i) => {\n const body = (\n <>\n <span className=\"rt-tpl-services-index-num\" aria-hidden=\"true\">\n {servicesIndexNum(i)}\n </span>\n <div className=\"rt-tpl-services-index-body\">\n <h3 className=\"rt-tpl-services-index-title\">{item.title}</h3>\n {item.description ? (\n <p className=\"rt-tpl-services-index-desc\">\n {item.description}\n </p>\n ) : null}\n </div>\n </>\n );\n return (\n <StaggerItem key={i} as=\"li\" className=\"rt-tpl-services-index-row\">\n {item.href ? (\n <a\n className=\"rt-tpl-services-index-link\"\n href={item.href}\n data-track=\"service_card\"\n >\n {body}\n </a>\n ) : (\n <div className=\"rt-tpl-services-index-link\">{body}</div>\n )}\n </StaggerItem>\n );\n })}\n </StaggerGroup>\n </div>\n </section>\n );\n}\n\n/**\n * `split-featured` — 비대칭 5/7(AI-slop #2 대체: 균등 카드 반복 금지). 대표\n * 서비스(`items[0]`) 큰 패널(좌) + 나머지 컴팩트 리스트(우). 모바일은 cqi\n * 컨테이너 쿼리로 1열(별도 미디어쿼리 없음).\n */\nexport function TemplateServicesSplitFeatured(section: ServicesSection): ReactElement {\n const { heading, description, items } = section.props;\n const [featured, ...rest] = items;\n return (\n <section\n data-roottale-tpl=\"services\"\n data-variant=\"split-featured\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-services\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {description ? (\n <p className=\"rt-tpl-section-desc\">{description}</p>\n ) : null}\n <div className=\"rt-tpl-services-split\">\n <AnimateOnScroll\n as=\"div\"\n variant=\"fade-up\"\n className=\"rt-tpl-services-split-featured\"\n >\n {featured ? (\n <>\n <h3 className=\"rt-tpl-services-split-featured-title\">\n {featured.title}\n </h3>\n {featured.subtitle ? (\n <p className=\"rt-tpl-services-subtitle\">{featured.subtitle}</p>\n ) : null}\n {featured.description ? (\n <p className=\"rt-tpl-services-split-featured-desc\">\n {featured.description}\n </p>\n ) : null}\n <ServicesItemMeta item={featured} />\n {featured.href ? (\n <a\n className=\"rt-tpl-btn rt-tpl-btn--primary rt-tpl-services-split-featured-cta\"\n href={featured.href}\n data-track=\"service_card\"\n >\n {featured.ctaLabel ?? \"자세히 보기\"}\n </a>\n ) : null}\n </>\n ) : null}\n </AnimateOnScroll>\n <StaggerGroup as=\"ol\" className=\"rt-tpl-services-split-list\">\n {rest.map((item, i) => {\n const body = (\n <>\n <h4 className=\"rt-tpl-services-split-item-title\">\n {item.title}\n </h4>\n {item.description ? (\n <p className=\"rt-tpl-services-split-item-desc\">\n {item.description}\n </p>\n ) : null}\n <ServicesItemMeta item={item} />\n </>\n );\n return (\n <StaggerItem\n key={i}\n as=\"li\"\n className=\"rt-tpl-services-split-item\"\n >\n {item.href ? (\n <a\n className=\"rt-tpl-services-split-item-link\"\n href={item.href}\n data-track=\"service_card\"\n >\n {body}\n </a>\n ) : (\n body\n )}\n </StaggerItem>\n );\n })}\n </StaggerGroup>\n </div>\n </div>\n </section>\n );\n}\n\n/** 빌트인 `services`. variant: grid(기본) / list / index-rows / split-featured. */\n","import type { ReactElement } from \"react\";\n\nimport { StaggerGroup, StaggerItem } from \"../ui-react-motion-client.js\";\nimport type { ServicesSection } from \"../site-config.js\";\nimport {\n ServicesIcon,\n ServicesItemMeta,\n TemplateServicesActionRail,\n TemplateServicesPhotoCards,\n} from \"./services-base.js\";\nimport {\n TemplateServicesIndexRows,\n TemplateServicesSplitFeatured,\n} from \"./services-variants.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\n\nexport function TemplateServices(section: ServicesSection): ReactElement {\n switch (section.variant) {\n case \"index-rows\":\n return TemplateServicesIndexRows(section);\n case \"split-featured\":\n return TemplateServicesSplitFeatured(section);\n case \"action-rail\":\n return TemplateServicesActionRail(section);\n case \"photo-cards\":\n return TemplateServicesPhotoCards(section);\n default:\n break;\n }\n\n const { heading, description, items } = section.props;\n return (\n <section\n data-roottale-tpl=\"services\"\n data-variant={section.variant}\n id={section.id}\n className=\"rt-tpl-section rt-tpl-services\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {description ? (\n <p className=\"rt-tpl-section-desc\">{description}</p>\n ) : null}\n {/* 카드 그리드 순차 진입(C8) — reduce·SSR 시 <ul>/<li> 그대로(마크업 불변). */}\n <StaggerGroup as=\"ul\" className=\"rt-tpl-services-list\">\n {items.map((item, i) => {\n const body = (\n <>\n <h3 className=\"rt-tpl-services-title\">{item.title}</h3>\n {item.subtitle ? (\n <p className=\"rt-tpl-services-subtitle\">{item.subtitle}</p>\n ) : null}\n {item.description ? (\n <p className=\"rt-tpl-services-desc\">{item.description}</p>\n ) : null}\n <ServicesItemMeta item={item} />\n {item.ctaLabel ? (\n <span className=\"rt-tpl-services-action-label\">\n {item.ctaLabel}\n </span>\n ) : null}\n </>\n );\n return (\n <StaggerItem key={i} as=\"li\" className=\"rt-tpl-services-item\">\n {item.href ? (\n <a\n className=\"rt-tpl-services-link\"\n href={item.href}\n data-track=\"service_card\"\n >\n <ServicesIcon item={item} />\n {body}\n </a>\n ) : (\n <>\n <ServicesIcon item={item} />\n {body}\n </>\n )}\n </StaggerItem>\n );\n })}\n </StaggerGroup>\n </div>\n </section>\n );\n}\n","import type { ReactElement } from \"react\";\n\nimport type { FooterSection } from \"../site-config.js\";\nimport { sectionThemeStyle, telHref } from \"./shared.js\";\n\nfunction FooterBrand(section: FooterSection): ReactElement {\n const { businessName, logo, description } = section.props;\n return (\n <div className=\"rt-tpl-footer-brand\">\n {logo ? (\n <img\n className=\"rt-tpl-footer-logo\"\n src={logo.src}\n alt={logo.alt}\n loading=\"lazy\"\n />\n ) : null}\n <p className=\"rt-tpl-footer-name\">{businessName}</p>\n {description ? (\n <p className=\"rt-tpl-footer-description\">{description}</p>\n ) : null}\n </div>\n );\n}\n\nfunction FooterContact({\n contactInfo,\n}: {\n contactInfo: FooterSection[\"props\"][\"contactInfo\"];\n}): ReactElement | null {\n if (!contactInfo?.address && !contactInfo?.phone && !contactInfo?.email) {\n return null;\n }\n return (\n <address className=\"rt-tpl-footer-contact\">\n {contactInfo.address ? <span>{contactInfo.address}</span> : null}\n {contactInfo.phone ? (\n <a\n href={telHref(contactInfo.phone)}\n data-track=\"phone_click\"\n data-track-placement=\"footer\"\n >\n {contactInfo.phone}\n </a>\n ) : null}\n {contactInfo.email ? (\n <a\n href={`mailto:${contactInfo.email}`}\n data-track=\"email_click\"\n data-track-placement=\"footer\"\n >\n {contactInfo.email}\n </a>\n ) : null}\n </address>\n );\n}\n\nfunction FooterLegal(section: FooterSection): ReactElement {\n const { legalInfo, privacyHref, termsHref, copyright, socialLinks, credit } =\n section.props;\n return (\n <div className=\"rt-tpl-footer-bottom\">\n <div className=\"rt-tpl-footer-legal\">\n {legalInfo ? <p>{legalInfo}</p> : null}\n {copyright ? <p>{copyright}</p> : null}\n </div>\n <nav className=\"rt-tpl-footer-policy\" aria-label=\"법적 고지\">\n {privacyHref ? <a href={privacyHref}>개인정보처리방침</a> : null}\n {termsHref ? <a href={termsHref}>이용약관</a> : null}\n {socialLinks?.map((link) => (\n <a key={`${link.kind}-${link.href}`} href={link.href}>\n {link.kind}\n </a>\n ))}\n </nav>\n {credit === \"hidden\" ? null : (\n <p className=\"rt-tpl-footer-credit\">\n Website by{\" \"}\n <a href=\"https://roottale.com\" target=\"_blank\" rel=\"noopener\">\n RootTale\n </a>\n </p>\n )}\n </div>\n );\n}\n\nfunction TemplateFooterColumns(section: FooterSection): ReactElement {\n const { columns, contactInfo } = section.props;\n return (\n <footer\n role=\"contentinfo\"\n data-roottale-tpl=\"footer\"\n data-variant=\"columns\"\n id={section.id}\n className=\"rt-tpl-footer\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n <div className=\"rt-tpl-footer-columns\">\n <FooterBrand {...section} />\n <nav className=\"rt-tpl-footer-nav\" aria-label=\"푸터 링크\">\n {(columns ?? []).map((column) => (\n <div key={column.title} className=\"rt-tpl-footer-column\">\n <p className=\"rt-tpl-footer-column-title\">{column.title}</p>\n <ul>\n {column.links.map((link) => (\n <li key={`${column.title}-${link.label}-${link.href}`}>\n <a href={link.href}>{link.label}</a>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </nav>\n <FooterContact contactInfo={contactInfo} />\n </div>\n <FooterLegal {...section} />\n </div>\n </footer>\n );\n}\n\nfunction TemplateFooterMinimal(section: FooterSection): ReactElement {\n return (\n <footer\n role=\"contentinfo\"\n data-roottale-tpl=\"footer\"\n data-variant=\"minimal\"\n id={section.id}\n className=\"rt-tpl-footer rt-tpl-footer--minimal\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n <div className=\"rt-tpl-footer-minimal-row\">\n <FooterBrand {...section} />\n <FooterContact contactInfo={section.props.contactInfo} />\n </div>\n <FooterLegal {...section} />\n </div>\n </footer>\n );\n}\n\nexport function TemplateFooter(section: FooterSection): ReactElement {\n if (section.variant === \"minimal\") return TemplateFooterMinimal(section);\n return TemplateFooterColumns(section);\n}\n","import type { ReactElement } from \"react\";\n\nimport type { FaqSection } from \"../site-config.js\";\nimport {\n CtaLink,\n ctaTrackForHref,\n sectionThemeStyle,\n telHref,\n} from \"./shared.js\";\n\nfunction faqItemsForJsonLd(\n section: FaqSection,\n): readonly { question: string; answer: string }[] {\n if (section.props.groups && section.props.groups.length > 0) {\n return section.props.groups.flatMap((group) => group.items);\n }\n return section.props.items ?? [];\n}\n\nfunction TemplateFaqAccordion(section: FaqSection): ReactElement {\n const { heading, items, contact } = section.props;\n const list = items ?? [];\n return (\n <div\n className={\n section.variant === \"with-contact\"\n ? \"rt-tpl-faq-with-contact\"\n : undefined\n }\n >\n <div>\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n <div className=\"rt-tpl-faq-list\">\n {list.map((item, i) => (\n <details key={i} className=\"rt-tpl-faq-item\">\n <summary className=\"rt-tpl-faq-q\">{item.question}</summary>\n <p className=\"rt-tpl-faq-a\">{item.answer}</p>\n </details>\n ))}\n </div>\n </div>\n {section.variant === \"with-contact\" && contact ? (\n <aside className=\"rt-tpl-faq-contact\" aria-label=\"상담 문의\">\n <h3 className=\"rt-tpl-faq-contact-title\">{contact.title}</h3>\n {contact.description ? (\n <p className=\"rt-tpl-faq-contact-desc\">{contact.description}</p>\n ) : null}\n {contact.phone ? (\n <a\n className=\"rt-tpl-faq-contact-phone\"\n href={telHref(contact.phone)}\n data-track=\"cta_call\"\n >\n {contact.phone}\n </a>\n ) : null}\n {contact.cta ? (\n <CtaLink\n cta={contact.cta}\n track={ctaTrackForHref(contact.cta.href)}\n className=\"rt-tpl-btn rt-tpl-btn--primary rt-tpl-faq-contact-cta\"\n />\n ) : null}\n </aside>\n ) : null}\n </div>\n );\n}\n\nfunction TemplateFaqTwoColumn(section: FaqSection): ReactElement {\n const { heading, items, groups } = section.props;\n const hasGroups = Boolean(groups && groups.length > 0);\n return (\n <>\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {hasGroups ? (\n <div className=\"rt-tpl-faq-groups\">\n {(groups ?? []).map((group) => (\n <section key={group.title} className=\"rt-tpl-faq-group\">\n <h3 className=\"rt-tpl-faq-group-title\">{group.title}</h3>\n <div className=\"rt-tpl-faq-two-column-list\">\n {group.items.map((item, i) => (\n <article key={`${group.title}-${i}`} className=\"rt-tpl-faq-open-item\">\n <h4 className=\"rt-tpl-faq-open-q\">{item.question}</h4>\n <p className=\"rt-tpl-faq-open-a\">{item.answer}</p>\n </article>\n ))}\n </div>\n </section>\n ))}\n </div>\n ) : (\n <div className=\"rt-tpl-faq-two-column-list\">\n {(items ?? []).map((item, i) => (\n <article key={i} className=\"rt-tpl-faq-open-item\">\n <h3 className=\"rt-tpl-faq-open-q\">{item.question}</h3>\n <p className=\"rt-tpl-faq-open-a\">{item.answer}</p>\n </article>\n ))}\n </div>\n )}\n </>\n );\n}\n\nfunction TemplateFaqContentAccordion(section: FaqSection): ReactElement {\n const { heading, contentGroups } = section.props;\n return (\n <>\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n <div className=\"rt-tpl-faq-content-groups\">\n {(contentGroups ?? []).map((group) => (\n <section key={group.title} className=\"rt-tpl-faq-content-group\">\n <h3 className=\"rt-tpl-faq-group-title\">{group.title}</h3>\n <div className=\"rt-tpl-faq-list\">\n {group.items.map((item) => (\n <details key={item.title} className=\"rt-tpl-faq-item\">\n <summary className=\"rt-tpl-faq-q\">\n <span>{item.title}</span>\n {item.summary ? <small>{item.summary}</small> : null}\n </summary>\n <div className=\"rt-tpl-faq-a rt-tpl-faq-content-body\">\n <p>{item.body}</p>\n {item.signs && item.signs.length > 0 ? (\n <ul className=\"rt-tpl-faq-content-signs\">\n {item.signs.map((sign) => (\n <li key={sign}>{sign}</li>\n ))}\n </ul>\n ) : null}\n {item.href ? (\n <a className=\"rt-tpl-faq-content-link\" href={item.href}>\n 자세히 보기\n </a>\n ) : null}\n </div>\n </details>\n ))}\n </div>\n </section>\n ))}\n </div>\n </>\n );\n}\n\n/** 빌트인 `faq`. `<details>` 0 JS + FAQPage JSON-LD (기본 on). */\nexport function TemplateFaq(section: FaqSection): ReactElement {\n const { jsonLd } = section.props;\n const jsonLdItems = faqItemsForJsonLd(section);\n return (\n <section\n data-roottale-tpl=\"faq\"\n data-variant={section.variant}\n id={section.id}\n className=\"rt-tpl-section rt-tpl-faq\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {section.variant === \"content-accordion\"\n ? TemplateFaqContentAccordion(section)\n : section.variant === \"two-column\"\n ? TemplateFaqTwoColumn(section)\n : TemplateFaqAccordion(section)}\n </div>\n {section.variant !== \"content-accordion\" && jsonLd && jsonLdItems.length > 0 ? (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify({\n \"@context\": \"https://schema.org\",\n \"@type\": \"FAQPage\",\n mainEntity: jsonLdItems.map((item) => ({\n \"@type\": \"Question\",\n name: item.question,\n acceptedAnswer: { \"@type\": \"Answer\", text: item.answer },\n })),\n }),\n }}\n />\n ) : null}\n </section>\n );\n}\n\n/**\n * `photo-overlay` — 풀블리드 시네마틱 사진 + 다크 오버레이 + 극단 대비 타이포\n * (C10 §1-5). 스키마 superRefine 이 `image`/`imageAlt` 를 발행 시점에 강제\n * 하므로 여기선 항상 채워져 있다고 가정하되, 방어적으로 빈 문자열 fallback.\n */\n","import type { ReactElement } from \"react\";\n\nimport type { CtaBannerSection } from \"../site-config.js\";\nimport { CtaLink, sectionThemeStyle } from \"./shared.js\";\n\nfunction TemplateCtaBannerPhotoOverlay(section: CtaBannerSection): ReactElement {\n const { title, description, cta, image, imageAlt } = section.props;\n return (\n <section\n data-roottale-tpl=\"cta-banner\"\n data-variant=\"photo-overlay\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-cta-banner rt-tpl-cta-banner--photo-overlay\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-cta-banner-photo\">\n <img\n className=\"rt-tpl-cta-banner-photo-img\"\n src={image ?? \"\"}\n alt={imageAlt ?? \"\"}\n loading=\"lazy\"\n />\n <div className=\"rt-tpl-cta-banner-photo-scrim\" aria-hidden=\"true\" />\n <div className=\"rt-tpl-container rt-tpl-cta-banner-photo-inner\">\n <h2 className=\"rt-tpl-cta-banner-photo-title\">{title}</h2>\n {description ? (\n <p className=\"rt-tpl-cta-banner-photo-desc\">{description}</p>\n ) : null}\n {cta ? (\n <CtaLink\n cta={cta}\n track=\"cta_banner\"\n className=\"rt-tpl-btn rt-tpl-btn--primary rt-tpl-cta-banner-photo-cta\"\n />\n ) : null}\n </div>\n </div>\n </section>\n );\n}\n\n/** 빌트인 `cta-banner`. variant: default(기본) / photo-overlay. */\nexport function TemplateCtaBanner(section: CtaBannerSection): ReactElement {\n if (section.variant === \"photo-overlay\")\n return TemplateCtaBannerPhotoOverlay(section);\n\n const { title, description, cta } = section.props;\n return (\n <section\n data-roottale-tpl=\"cta-banner\"\n data-variant={section.variant}\n id={section.id}\n className=\"rt-tpl-section rt-tpl-cta-banner\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container rt-tpl-cta-banner-inner\">\n <h2 className=\"rt-tpl-cta-banner-title\">{title}</h2>\n {description ? (\n <p className=\"rt-tpl-cta-banner-desc\">{description}</p>\n ) : null}\n {cta ? <CtaLink cta={cta} track=\"cta_banner\" /> : null}\n </div>\n </section>\n );\n}\n\n/**\n * `metric.value` 숫자부를 뷰포트 진입 카운트업(ADR-0086 D3 — 구 룰\n * `b2b-component-library.md` §2.2 \"카운트업 모션 금지\"를 supersede)으로 렌더.\n * 선행 숫자를 못 찾으면(전화번호·자유 텍스트 등) 원문을 그대로 정적 렌더 —\n * 절대 깨지지 않는 폴백.\n */\n","/**\n * `metric.value`(z.string()) 는 CMS 저작 데이터라 형식이 자유롭다 — 순수 숫자\n * (\"6\", \"97\", \"12,400\"), 소수(\"4.3\"), 숫자+접미 텍스트가 한 문자열에 섞인 값\n * (\"1:1\", \"3단계\") 이 전부 실존 fixture 다(medical-01 pack, storybook seeds).\n *\n * ADR-0086 P2 D3 트러스트 지표 카운트업 배선을 위해, 선행 숫자부만 분리해\n * `CountUpStat` 에 넘기고 나머지는 그대로 suffix 로 유지한다. 숫자로 시작하지\n * 않는 값(전화번호·자유 텍스트 등)은 `null` 을 반환해 호출부가 기존 정적 렌더로\n * 폴백하게 한다 — 여기서 절대 애니메이션을 강제하지 않는다.\n */\nexport interface ParsedMetricValue {\n /** 애니메이션 목표값(콤마 제거·소수 반영). */\n readonly value: number;\n /** `value` 의 소수 자릿수 — 원문 소수 자릿수를 그대로 보존하기 위함. */\n readonly decimals: number;\n /** 선행 숫자부 이후 남은 원문 그대로(단위·기호 등). 없으면 빈 문자열. */\n readonly suffix: string;\n}\n\nconst LEADING_NUMBER_PATTERN = /^(\\d[\\d,]*)(\\.(\\d+))?/;\n\nexport function parseMetricValue(raw: string): ParsedMetricValue | null {\n const match = LEADING_NUMBER_PATTERN.exec(raw);\n if (!match) {\n return null;\n }\n\n const [matched, integerPart, , fractionPart] = match;\n const integerLiteral = (integerPart ?? \"\").replace(/,/g, \"\");\n const numericLiteral = fractionPart\n ? `${integerLiteral}.${fractionPart}`\n : integerLiteral;\n const value = Number(numericLiteral);\n\n if (!Number.isFinite(value)) {\n return null;\n }\n\n return {\n value,\n decimals: fractionPart?.length ?? 0,\n suffix: raw.slice(matched.length),\n };\n}\n","import type { ReactElement } from \"react\";\n\nimport {\n AnimateOnScroll,\n CountUpStat,\n Marquee,\n} from \"../ui-react-motion-client.js\";\nimport { parseMetricValue } from \"../metric-value.js\";\nimport type { TrustSection } from \"../site-config.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\n\nfunction TrustMetricValue({ value }: { value: string }): ReactElement {\n const parsed = parseMetricValue(value);\n if (!parsed) {\n return <>{value}</>;\n }\n return (\n <CountUpStat\n value={parsed.value}\n decimals={parsed.decimals}\n suffix={parsed.suffix}\n />\n );\n}\n\nfunction TrustCredentialIcon(): ReactElement {\n return (\n <svg\n className=\"rt-cred__icon\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M8 1.75 13 3.5v3.75c0 3-2 5.45-5 7-3-1.55-5-4-5-7V3.5z\" />\n <path d=\"m5.75 8 1.45 1.45 3.2-3.4\" />\n </svg>\n );\n}\n\nexport function TemplateTrust(section: TrustSection): ReactElement {\n const { heading, metrics, credentials, logos, marqueeLogos, chart, disclaimer } =\n section.props;\n const chartMax =\n chart?.points.reduce((max, point) => Math.max(max, point.value), 0) ?? 0;\n return (\n <section\n data-roottale-tpl=\"trust\"\n data-variant={section.variant}\n id={section.id}\n className=\"rt-tpl-section rt-tpl-trust\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container rt-tpl-trust-inner\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {section.variant === \"stat-band\" ? (\n // 수치 밴드 진입 시 fade-up(C8) + 지표 숫자 카운트업(ADR-0086 D3로\n // 채택(구 룰 supersede, 2026-07-17)). reduce·SSR 시 <div> 그대로\n // (마크업 불변) + CountUpStat 자체도 mount 전엔 최종값 정적 표시.\n <AnimateOnScroll as=\"div\" variant=\"fade-up\" className=\"rt-tpl-trust-stat-band\">\n {(metrics ?? []).map((metric) => (\n <div\n key={`${metric.value}-${metric.label}`}\n className=\"rt-stat\"\n data-variant=\"band-item\"\n >\n <span className=\"rt-stat__value\">\n <TrustMetricValue value={metric.value} />\n {metric.unit ? (\n <span className=\"rt-stat__unit\">{metric.unit}</span>\n ) : null}\n </span>\n <span className=\"rt-stat__label\">{metric.label}</span>\n {metric.source ? (\n <span className=\"rt-stat__source\">{metric.source}</span>\n ) : null}\n </div>\n ))}\n </AnimateOnScroll>\n ) : null}\n {section.variant === \"logo-cloud\" ? (\n <ul className=\"rt-tpl-trust-logo-list\">\n {(logos ?? []).map((logo) => (\n <li key={`${logo.src}-${logo.alt}`} className=\"rt-tpl-trust-logo-item\">\n {logo.href ? (\n <a className=\"rt-tpl-trust-logo-link\" href={logo.href}>\n <img\n className=\"rt-tpl-trust-logo\"\n src={logo.src}\n alt={logo.alt}\n loading=\"lazy\"\n />\n </a>\n ) : (\n <img\n className=\"rt-tpl-trust-logo\"\n src={logo.src}\n alt={logo.alt}\n loading=\"lazy\"\n />\n )}\n </li>\n ))}\n </ul>\n ) : null}\n {section.variant === \"feature-grid\" ? (\n <ul className=\"rt-tpl-trust-cred-list\">\n {(credentials ?? []).map((credential) => (\n <li key={`${credential.name}-${credential.issuer ?? \"\"}`}>\n <span className=\"rt-cred\" data-kind={credential.kind}>\n <TrustCredentialIcon />\n <span className=\"rt-cred__label\">{credential.name}</span>\n {credential.issuer ? (\n <span className=\"rt-cred__issuer\">{credential.issuer}</span>\n ) : null}\n </span>\n </li>\n ))}\n </ul>\n ) : null}\n {section.variant === \"logo-marquee\" ? (\n // C8 Marquee 소비(직접 재구현 금지, C10 §1-3). 로고는 흑백/저채도\n // 처리(CSS filter) — hover 시에만 원색 복원.\n <Marquee\n className=\"rt-tpl-trust-marquee\"\n ariaLabel={heading ?? \"파트너/인증 로고\"}\n >\n {(marqueeLogos ?? []).map((logo, i) =>\n logo.href ? (\n <a\n key={`${logo.alt}-${i}`}\n className=\"rt-tpl-trust-marquee-link\"\n href={logo.href}\n >\n <img\n className=\"rt-tpl-trust-marquee-logo\"\n src={logo.src}\n alt={logo.alt}\n loading=\"lazy\"\n />\n </a>\n ) : (\n <img\n key={`${logo.alt}-${i}`}\n className=\"rt-tpl-trust-marquee-logo\"\n src={logo.src}\n alt={logo.alt}\n loading=\"lazy\"\n />\n ),\n )}\n </Marquee>\n ) : null}\n {section.variant === \"credential-list\" ? (\n // hairline 자격·이력·수상 리스트 — 연도는 tabular-nums, 위계는\n // 작은 크기로(AI-slop #3 대체: 장식용 큰 숫자 금지).\n <ol className=\"rt-tpl-trust-credential-list\">\n {(credentials ?? []).map((credential, i) => (\n <li\n key={`${credential.name}-${credential.year ?? i}`}\n className=\"rt-tpl-trust-credential-row\"\n >\n {credential.year ? (\n <span className=\"rt-tpl-trust-credential-year\">\n {credential.year}\n </span>\n ) : null}\n <span className=\"rt-tpl-trust-credential-name\">\n {credential.name}\n </span>\n {credential.issuer ? (\n <span className=\"rt-tpl-trust-credential-issuer\">\n {credential.issuer}\n </span>\n ) : null}\n </li>\n ))}\n </ol>\n ) : null}\n {section.variant === \"dashboard\" && chart ? (\n <div className=\"rt-tpl-trust-dashboard\">\n <div className=\"rt-tpl-trust-dashboard-chart\">\n <div>\n <h3 className=\"rt-tpl-trust-dashboard-title\">{chart.title}</h3>\n {chart.description ? (\n <p className=\"rt-tpl-trust-dashboard-desc\">\n {chart.description}\n </p>\n ) : null}\n </div>\n <ul\n className=\"rt-tpl-trust-dashboard-bars\"\n data-chart-type={chart.type}\n >\n {chart.points.map((point) => {\n const percent =\n chartMax > 0\n ? `${Math.max(4, Math.round((point.value / chartMax) * 100))}%`\n : \"4%\";\n return (\n <li key={point.label}>\n <span>{point.label}</span>\n <span className=\"rt-tpl-trust-dashboard-track\">\n <span\n className=\"rt-tpl-trust-dashboard-bar\"\n style={{ inlineSize: percent }}\n />\n </span>\n <strong>{point.display ?? String(point.value)}</strong>\n </li>\n );\n })}\n </ul>\n </div>\n <ul className=\"rt-tpl-trust-dashboard-metrics\">\n {(metrics ?? []).map((metric) => (\n <li key={`${metric.value}-${metric.label}`} className=\"rt-stat\">\n {metric.imageSrc ? (\n <img\n className=\"rt-tpl-trust-dashboard-icon\"\n src={metric.imageSrc}\n alt={metric.imageAlt ?? \"\"}\n loading=\"lazy\"\n />\n ) : null}\n <span className=\"rt-stat__value\">\n <TrustMetricValue value={metric.value} />\n {metric.unit ? (\n <span className=\"rt-stat__unit\">{metric.unit}</span>\n ) : null}\n </span>\n <span className=\"rt-stat__label\">{metric.label}</span>\n {metric.source ? (\n <span className=\"rt-stat__source\">{metric.source}</span>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n {disclaimer ? (\n <p className=\"rt-tpl-trust-disclaimer\">{disclaimer}</p>\n ) : null}\n </div>\n </section>\n );\n}\n\n/**\n * `editorial-quote` — 대형 인용 타이포 에디토리얼(C11 §1). 인용부호는 이미지/\n * 이모지가 아니라 CSS 타이포(`::before` + `“`, templates.css)로 배경 장식 —\n * 별점 이모지·균등 카드 없음(AI-slop 10항). 1개면 중앙 정렬 스테이지,\n * 2개 이상이면 세로 스택(항목 사이 hairline) — 레이아웃 modifier 클래스로 CSS\n * 분기(`StaggerGroup` 은 `data-*` 를 forward 하지 않으므로 className 사용).\n */\n","import type { ReactElement } from \"react\";\n\nimport { StaggerGroup, StaggerItem } from \"../ui-react-motion-client.js\";\nimport type { TestimonialsSection } from \"../site-config.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\n\nexport function TemplateTestimonialsEditorialQuote(\n section: TestimonialsSection,\n): ReactElement {\n const { heading, description, items, disclaimer } = section.props;\n const layout = items.length > 1 ? \"stack\" : \"single\";\n return (\n <section\n data-roottale-tpl=\"testimonials\"\n data-variant=\"editorial-quote\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-testimonials\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n <h2 className=\"rt-tpl-heading\">{heading}</h2>\n {description ? (\n <p className=\"rt-tpl-section-desc\">{description}</p>\n ) : null}\n <StaggerGroup\n as=\"ul\"\n className={`rt-tpl-testimonials-editorial-list rt-tpl-testimonials-editorial-list--${layout}`}\n >\n {items.map((item, i) => (\n <StaggerItem\n key={`${item.author}-${i}`}\n as=\"li\"\n className=\"rt-tpl-testimonials-editorial-item\"\n >\n <blockquote className=\"rt-tpl-testimonials-editorial-quote\">\n <p className=\"rt-tpl-testimonials-editorial-text\">\n {item.quote}\n </p>\n <footer className=\"rt-tpl-testimonials-editorial-footer\">\n <cite className=\"rt-tpl-testimonials-editorial-author\">\n {item.author}\n </cite>\n {item.context ? (\n <span className=\"rt-tpl-testimonials-editorial-context\">\n {item.context}\n </span>\n ) : null}\n <TestimonialMeta item={item} />\n </footer>\n {item.reply ? (\n <p className=\"rt-tpl-testimonials-reply\">{item.reply}</p>\n ) : null}\n </blockquote>\n </StaggerItem>\n ))}\n </StaggerGroup>\n {disclaimer ? (\n <p className=\"rt-tpl-testimonials-disclaimer\">{disclaimer}</p>\n ) : null}\n </div>\n </section>\n );\n}\n\nexport function TestimonialMeta({\n item,\n}: {\n item: TestimonialsSection[\"props\"][\"items\"][number];\n}): ReactElement | null {\n const values = [\n typeof item.rating === \"number\" ? `평점 ${item.rating.toFixed(1)}` : undefined,\n item.source,\n item.visitedAt,\n item.item,\n ].filter((value): value is string => Boolean(value));\n if (values.length === 0) return null;\n return (\n <span className=\"rt-tpl-testimonials-meta\">\n {values.map((value) => (\n <span key={value}>{value}</span>\n ))}\n </span>\n );\n}\n\n/**\n * `quote-rail` — 가로 스크롤 레일(C11 §2). 카드가 아니라 hairline 좌측\n * 보더 컬럼(`border-inline-start`) + scroll-snap, 스크롤바 숨김. 균등\n * 그림자 카드 금지(AI-slop #2 대체 문법, index-rows/split-featured 계보).\n */\n","import type { ReactElement } from \"react\";\n\nimport { AnimateOnScroll } from \"../ui-react-motion-client.js\";\nimport type { TestimonialsSection } from \"../site-config.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\nimport { TestimonialMeta } from \"./testimonials-editorial.js\";\n\nexport function TemplateTestimonialsQuoteRail(\n section: TestimonialsSection,\n): ReactElement {\n const { heading, description, items, marquee, disclaimer } = section.props;\n return (\n <section\n data-roottale-tpl=\"testimonials\"\n data-variant=\"quote-rail\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-testimonials\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n <h2 className=\"rt-tpl-heading\">{heading}</h2>\n {description ? (\n <p className=\"rt-tpl-section-desc\">{description}</p>\n ) : null}\n <AnimateOnScroll\n as=\"div\"\n variant=\"fade-up\"\n className=\"rt-tpl-testimonials-rail-viewport\"\n >\n <ul\n className={\n marquee\n ? \"rt-tpl-testimonials-rail rt-tpl-testimonials-rail--marquee\"\n : \"rt-tpl-testimonials-rail\"\n }\n data-marquee={marquee ? \"true\" : undefined}\n >\n {items.map((item, i) => (\n <li\n key={`${item.author}-${i}`}\n className=\"rt-tpl-testimonials-rail-item\"\n >\n <blockquote className=\"rt-tpl-testimonials-rail-quote\">\n <p className=\"rt-tpl-testimonials-rail-text\">\n {item.quote}\n </p>\n <footer className=\"rt-tpl-testimonials-rail-footer\">\n <cite className=\"rt-tpl-testimonials-rail-author\">\n {item.author}\n </cite>\n {item.context ? (\n <span className=\"rt-tpl-testimonials-rail-context\">\n {item.context}\n </span>\n ) : null}\n <TestimonialMeta item={item} />\n </footer>\n {item.reply ? (\n <p className=\"rt-tpl-testimonials-reply\">{item.reply}</p>\n ) : null}\n </blockquote>\n </li>\n ))}\n </ul>\n </AnimateOnScroll>\n {disclaimer ? (\n <p className=\"rt-tpl-testimonials-disclaimer\">{disclaimer}</p>\n ) : null}\n </div>\n </section>\n );\n}\n\n/**\n * 별점(0~5) — CSS 타이포 글리프(U+2605) 이중 레이어. 이모지·이미지 금지\n * (AI-slop 10항 유지: ⭐ 이모지가 아니라 텍스트 글리프 + 토큰 색).\n * 채움 폭은 데이터(rating/5)가 `--rt-testimonials-star-fill` 로 주입하고\n * 색은 전부 토큰(variant×토큰 직교) — templates.css 참조.\n */\n","import type { CSSProperties, ReactElement } from \"react\";\n\nimport { StaggerGroup, StaggerItem } from \"../ui-react-motion-client.js\";\nimport type { TestimonialsSection } from \"../site-config.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\n\nfunction StarRating({ rating }: { rating: number }): ReactElement {\n const clamped = Math.min(5, Math.max(0, rating));\n const fill = `${((clamped / 5) * 100).toFixed(0)}%`;\n return (\n <span\n className=\"rt-tpl-testimonials-stars\"\n role=\"img\"\n aria-label={`평점 5점 만점에 ${clamped.toFixed(1)}점`}\n style={{ \"--rt-testimonials-star-fill\": fill } as CSSProperties}\n >\n <span aria-hidden=\"true\" className=\"rt-tpl-testimonials-stars-base\">\n {\"★★★★★\"}\n </span>\n <span aria-hidden=\"true\" className=\"rt-tpl-testimonials-stars-fill\">\n {\"★★★★★\"}\n </span>\n </span>\n );\n}\n\n/**\n * `star-compact` — 별점 중심 컴팩트 그리드(W8-7). 평점이 하나라도 있으면\n * 평균 별점 요약 밴드(대형 tabular-nums 평균 + 별점 + 건수)를 먼저 놓고,\n * 항목은 hairline 상단 보더 행(균등 그림자 카드 금지, index-rows 계보)으로\n * 컴팩트하게 흐른다. 평점 없는 항목은 별점 없이 인용·메타만 렌더.\n */\nexport function TemplateTestimonialsStarCompact(\n section: TestimonialsSection,\n): ReactElement {\n const { heading, description, items, disclaimer } = section.props;\n const rated = items.filter(\n (item): item is typeof item & { rating: number } =>\n typeof item.rating === \"number\",\n );\n const average =\n rated.length > 0\n ? rated.reduce((sum, item) => sum + item.rating, 0) / rated.length\n : undefined;\n return (\n <section\n data-roottale-tpl=\"testimonials\"\n data-variant=\"star-compact\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-testimonials\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n <h2 className=\"rt-tpl-heading\">{heading}</h2>\n {description ? (\n <p className=\"rt-tpl-section-desc\">{description}</p>\n ) : null}\n {average !== undefined ? (\n <div className=\"rt-tpl-testimonials-star-summary\">\n <span className=\"rt-tpl-testimonials-star-average\">\n {average.toFixed(1)}\n </span>\n <StarRating rating={average} />\n <span className=\"rt-tpl-testimonials-star-count\">\n 후기 {items.length}건\n </span>\n </div>\n ) : null}\n <StaggerGroup as=\"ul\" className=\"rt-tpl-testimonials-star-list\">\n {items.map((item, i) => (\n <StaggerItem\n key={`${item.author}-${i}`}\n as=\"li\"\n className=\"rt-tpl-testimonials-star-item\"\n >\n <blockquote className=\"rt-tpl-testimonials-star-quote\">\n {typeof item.rating === \"number\" ? (\n <div className=\"rt-tpl-testimonials-star-head\">\n <StarRating rating={item.rating} />\n <span className=\"rt-tpl-testimonials-star-value\">\n {item.rating.toFixed(1)}\n </span>\n </div>\n ) : null}\n <p className=\"rt-tpl-testimonials-star-text\">{item.quote}</p>\n <footer className=\"rt-tpl-testimonials-star-footer\">\n <cite className=\"rt-tpl-testimonials-star-author\">\n {item.author}\n </cite>\n {item.context ? (\n <span className=\"rt-tpl-testimonials-star-context\">\n {item.context}\n </span>\n ) : null}\n <StarCompactMeta item={item} />\n </footer>\n {item.reply ? (\n <p className=\"rt-tpl-testimonials-reply\">{item.reply}</p>\n ) : null}\n </blockquote>\n </StaggerItem>\n ))}\n </StaggerGroup>\n {disclaimer ? (\n <p className=\"rt-tpl-testimonials-disclaimer\">{disclaimer}</p>\n ) : null}\n </div>\n </section>\n );\n}\n\n/** star-compact 전용 메타 — 별점은 StarRating 이 이미 보여주므로 제외. */\nfunction StarCompactMeta({\n item,\n}: {\n item: TestimonialsSection[\"props\"][\"items\"][number];\n}): ReactElement | null {\n const values = [item.source, item.visitedAt, item.item].filter(\n (value): value is string => Boolean(value),\n );\n if (values.length === 0) return null;\n return (\n <span className=\"rt-tpl-testimonials-star-meta\">\n {values.map((value) => (\n <span key={value}>{value}</span>\n ))}\n </span>\n );\n}\n\n/**\n * 빌트인 `testimonials`(C11 + W8-7). variant: editorial-quote(기본) /\n * quote-rail / star-compact.\n */\n","import type { ReactElement } from \"react\";\n\nimport type { TestimonialsSection } from \"../site-config.js\";\nimport { TemplateTestimonialsEditorialQuote } from \"./testimonials-editorial.js\";\nimport { TemplateTestimonialsQuoteRail } from \"./testimonials-rail.js\";\nimport { TemplateTestimonialsStarCompact } from \"./testimonials-star.js\";\n\nexport function TemplateTestimonials(\n section: TestimonialsSection,\n): ReactElement {\n switch (section.variant) {\n case \"quote-rail\":\n return TemplateTestimonialsQuoteRail(section);\n case \"star-compact\":\n return TemplateTestimonialsStarCompact(section);\n default:\n return TemplateTestimonialsEditorialQuote(section);\n }\n}\n","import type { ReactElement } from \"react\";\n\nimport { StaggerGroup, StaggerItem } from \"../ui-react-motion-client.js\";\nimport { TeamExpandingStageClient } from \"../team-expanding-stage-client.js\";\nimport type { TeamSection } from \"../site-config.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\n\nfunction memberInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n const initials = parts\n .slice(0, 2)\n .map((part) => part.at(0) ?? \"\")\n .join(\"\");\n return initials || \"?\";\n}\nfunction TeamMemberPhoto({\n member,\n featured = false,\n}: {\n member: TeamSection[\"props\"][\"members\"][number];\n featured?: boolean;\n}): ReactElement {\n if (member.photoSrc) {\n return (\n <img\n className={\n featured ? \"rt-tpl-team-photo rt-tpl-team-photo--featured\" : \"rt-tpl-team-photo\"\n }\n src={member.photoSrc}\n alt={member.photoAlt ?? \"\"}\n loading=\"lazy\"\n />\n );\n }\n return (\n <div\n className={\n featured\n ? \"rt-tpl-team-initials rt-tpl-team-initials--featured\"\n : \"rt-tpl-team-initials\"\n }\n aria-hidden=\"true\"\n >\n {memberInitials(member.name)}\n </div>\n );\n}\n\nfunction TeamMemberBody({\n member,\n}: {\n member: TeamSection[\"props\"][\"members\"][number];\n}): ReactElement {\n return (\n <div className=\"rt-tpl-team-body\">\n <h3 className=\"rt-tpl-team-name\">{member.name}</h3>\n <p className=\"rt-tpl-team-title\">{member.title}</p>\n {member.specialties ? (\n <ul className=\"rt-tpl-team-specialties\" aria-label={`${member.name} 전문 분야`}>\n {member.specialties.map((specialty) => (\n <li key={specialty}>{specialty}</li>\n ))}\n </ul>\n ) : null}\n {member.credentials ? (\n <ul className=\"rt-tpl-team-credentials\">\n {member.credentials.map((credential) => (\n <li key={credential}>{credential}</li>\n ))}\n </ul>\n ) : null}\n {member.bio ? <p className=\"rt-tpl-team-bio\">{member.bio}</p> : null}\n {member.href ? (\n <a className=\"rt-tpl-team-cta\" href={member.href}>\n {member.ctaLabel ?? \"프로필 보기\"}\n </a>\n ) : null}\n </div>\n );\n}\n\nfunction TemplateTeamGrid(section: TeamSection): ReactElement {\n const { heading, description, members } = section.props;\n return (\n <section\n data-roottale-tpl=\"team\"\n data-variant=\"grid\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-team\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {description ? <p className=\"rt-tpl-section-desc\">{description}</p> : null}\n <StaggerGroup as=\"ul\" className=\"rt-tpl-team-grid\">\n {members.map((member) => (\n <StaggerItem key={member.name} as=\"li\" className=\"rt-tpl-team-card\">\n <TeamMemberPhoto member={member} />\n <TeamMemberBody member={member} />\n </StaggerItem>\n ))}\n </StaggerGroup>\n </div>\n </section>\n );\n}\n\nfunction TemplateTeamSpotlight(section: TeamSection): ReactElement {\n const { heading, description, members } = section.props;\n const [featured, ...rest] = members;\n return (\n <section\n data-roottale-tpl=\"team\"\n data-variant=\"spotlight\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-team\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {description ? <p className=\"rt-tpl-section-desc\">{description}</p> : null}\n <div className=\"rt-tpl-team-spotlight\">\n {featured ? (\n <article className=\"rt-tpl-team-card rt-tpl-team-card--featured\">\n <TeamMemberPhoto member={featured} featured />\n <TeamMemberBody member={featured} />\n </article>\n ) : null}\n <StaggerGroup as=\"ul\" className=\"rt-tpl-team-spotlight-list\">\n {rest.map((member) => (\n <StaggerItem key={member.name} as=\"li\" className=\"rt-tpl-team-card\">\n <TeamMemberPhoto member={member} />\n <TeamMemberBody member={member} />\n </StaggerItem>\n ))}\n </StaggerGroup>\n </div>\n </div>\n </section>\n );\n}\n\n/**\n * `expanding-stage` variant — 실모션은 `TeamExpandingStageClient`(client\n * island, ADR-0086 P2 D3 chambarun `.staff-stage` 이식)에 위임한다. 이\n * 함수(RSC)는 heading/description 만 서버에서 그리고, hover/focus 확장\n * 인터랙션이 필요한 멤버 리스트 자체는 client 컴포넌트가 전담(M6 서버 우선 —\n * 이 파일의 다른 client island 위임과 동일 계약).\n */\nfunction TemplateTeamExpandingStage(section: TeamSection): ReactElement {\n const { heading, description, members } = section.props;\n return (\n <section\n data-roottale-tpl=\"team\"\n data-variant=\"expanding-stage\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-team\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {description ? <p className=\"rt-tpl-section-desc\">{description}</p> : null}\n <TeamExpandingStageClient members={members} />\n </div>\n </section>\n );\n}\n\nfunction TemplateTeamRow(section: TeamSection): ReactElement {\n const { heading, description, members } = section.props;\n return (\n <section\n data-roottale-tpl=\"team\"\n data-variant=\"row\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-team\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {description ? <p className=\"rt-tpl-section-desc\">{description}</p> : null}\n <StaggerGroup as=\"ul\" className=\"rt-tpl-team-row-list\">\n {members.map((member) => (\n <StaggerItem key={member.name} as=\"li\" className=\"rt-tpl-team-row-item\">\n <article className=\"rt-tpl-team-card rt-tpl-team-card--row\">\n <TeamMemberPhoto member={member} />\n <TeamMemberBody member={member} />\n </article>\n </StaggerItem>\n ))}\n </StaggerGroup>\n </div>\n </section>\n );\n}\n\nexport function TemplateTeam(section: TeamSection): ReactElement {\n if (section.variant === \"expanding-stage\")\n return TemplateTeamExpandingStage(section);\n if (section.variant === \"row\") return TemplateTeamRow(section);\n if (section.variant === \"spotlight\") return TemplateTeamSpotlight(section);\n return TemplateTeamGrid(section);\n}\n","import type { ReactElement } from \"react\";\nimport { isAllowedEmbedSrc, isAllowedMapEmbedSrc } from \"@roottale/cms-core\";\n\nimport { ContactMapClickToLoad } from \"../contact-map-client.js\";\nimport type { ContactSection } from \"../site-config.js\";\nimport { contactHrefTrack } from \"./shared.js\";\n\n/**\n * 지도 슬롯(W8-7) — allowlist 통과 URL 만 실지도 iframe, 그 외는 길찾기 링크\n * 폴백(fail-soft). `isAllowedMapEmbedSrc` = keyless Google/OSM embed,\n * `isAllowedEmbedSrc`(영상 allowlist)는 기존 동작 하위호환으로 유지.\n */\nfunction ContactMap({ url }: { url: string }): ReactElement {\n if (isAllowedMapEmbedSrc(url) || isAllowedEmbedSrc(url)) {\n return (\n <div className=\"rt-tpl-contact-map\">\n <iframe\n src={url}\n title=\"오시는길 지도\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer-when-downgrade\"\n />\n </div>\n );\n }\n return (\n <p className=\"rt-tpl-contact-map-fallback\">\n <a href={url} rel=\"noopener noreferrer\" target=\"_blank\">\n 길찾기\n </a>\n </p>\n );\n}\n/**\n * 지도 블록(W8-7, ADR-0086 P2 D3 확장) — embed URL 이 allowlist 를 통과하면\n * 실지도 iframe 이 facade placeholder 를 **대체**한다. URL 미제공/비허용이면\n * 기존 facade 이미지 + 길찾기 링크 폴백 그대로(fail-soft — 기존 사이트 VRT\n * 불변).\n *\n * `map.mapLoad === \"click\"`(신규, additive) 이고 실지도가 가능하면 iframe 을\n * 즉시 그리지 않고 `ContactMapClickToLoad`(client island) 에 위임 — 정적\n * 프리뷰만 먼저 렌더하고 클릭 시에만 iframe 을 마운트한다(chambarun\n * `.map-facade` 클릭-투-로드 이식). 기본값은 여전히 \"lazy\" — 미지정 시 기존\n * 동작(즉시 iframe) 그대로.\n */\nexport function ContactMapBlock({\n map,\n mapEmbedUrl,\n}: {\n map: ContactSection[\"props\"][\"map\"];\n mapEmbedUrl: string | undefined;\n}): ReactElement | null {\n const embedUrl = map?.embedUrl ?? mapEmbedUrl;\n const externalUrl = map?.externalUrl ?? embedUrl;\n if (!embedUrl && !map?.facadeImageSrc && !externalUrl) return null;\n const liveMap = Boolean(\n embedUrl && (isAllowedMapEmbedSrc(embedUrl) || isAllowedEmbedSrc(embedUrl)),\n );\n const clickToLoad = liveMap && embedUrl && (map?.mapLoad ?? \"lazy\") === \"click\";\n return (\n <div className=\"rt-tpl-contact-map-block\" data-provider={map?.provider}>\n {map?.facadeImageSrc && !liveMap ? (\n <figure className=\"rt-tpl-contact-map-facade\">\n <img\n src={map.facadeImageSrc}\n alt={map.facadeImageAlt ?? \"\"}\n loading=\"lazy\"\n />\n {externalUrl ? (\n <figcaption>\n <a href={externalUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n 지도 크게 보기\n </a>\n </figcaption>\n ) : null}\n </figure>\n ) : null}\n {clickToLoad ? (\n <ContactMapClickToLoad\n embedUrl={embedUrl}\n externalUrl={externalUrl}\n facadeImageSrc={map?.facadeImageSrc}\n facadeImageAlt={map?.facadeImageAlt}\n />\n ) : embedUrl ? (\n <ContactMap url={embedUrl} />\n ) : null}\n </div>\n );\n}\n\nexport function ContactActions({\n actions,\n}: {\n actions: ContactSection[\"props\"][\"actions\"];\n}): ReactElement | null {\n if (!actions || actions.length === 0) return null;\n return (\n <ul className=\"rt-tpl-contact-actions\">\n {actions.map((action) => {\n const track = contactHrefTrack(action.href);\n return (\n <li key={`${action.label}-${action.href}`} data-kind={action.kind}>\n <a\n href={action.href}\n data-track={track}\n data-track-placement={track ? \"contact_actions\" : undefined}\n >\n {action.label}\n </a>\n </li>\n );\n })}\n </ul>\n );\n}\n","import type { ReactElement } from \"react\";\n\nimport type { ContactSection } from \"../site-config.js\";\nimport { ContactActions, ContactMapBlock } from \"./contact-shared.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\n\ntype ContactChannelTracking = {\n track: \"cta_call\" | \"email_click\" | \"cta_banner\";\n placement?: \"contact_channels\";\n};\n\nfunction contactChannelTracking(href: string): ContactChannelTracking {\n if (href.startsWith(\"tel:\")) {\n return { track: \"cta_call\" };\n }\n if (href.startsWith(\"mailto:\")) {\n return { track: \"email_click\", placement: \"contact_channels\" };\n }\n return { track: \"cta_banner\" };\n}\n\nexport function TemplateContactChannelCards(section: ContactSection): ReactElement {\n const { heading, channels, map, mapEmbedUrl, actions } = section.props;\n return (\n <section\n data-roottale-tpl=\"contact\"\n data-variant=\"channel-cards\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-contact\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n <div className=\"rt-tpl-contact-channel-layout\">\n <ul className=\"rt-tpl-contact-channel-list\">\n {(channels ?? []).map((channel) => {\n const tracking = channel.href\n ? contactChannelTracking(channel.href)\n : undefined;\n const content = (\n <>\n <span className=\"rt-tpl-contact-channel-label\">\n {channel.iconSrc ? (\n <img\n className=\"rt-tpl-contact-channel-icon\"\n src={channel.iconSrc}\n alt={channel.iconAlt ?? \"\"}\n loading=\"lazy\"\n />\n ) : null}\n {channel.label}\n </span>\n {channel.value ? (\n <span className=\"rt-tpl-contact-channel-value\">\n {channel.value}\n </span>\n ) : null}\n {channel.description ? (\n <span className=\"rt-tpl-contact-channel-desc\">\n {channel.description}\n </span>\n ) : null}\n {channel.href && channel.actionLabel ? (\n <span className=\"rt-tpl-contact-channel-action\">\n {channel.actionLabel}\n </span>\n ) : null}\n </>\n );\n return (\n <li\n key={`${channel.label}-${channel.value ?? channel.href ?? \"\"}`}\n data-kind={channel.kind}\n >\n {channel.href ? (\n <a\n className=\"rt-tpl-contact-channel-card\"\n href={channel.href}\n data-track={tracking?.track}\n data-track-placement={tracking?.placement}\n >\n {content}\n </a>\n ) : (\n <div className=\"rt-tpl-contact-channel-card\">{content}</div>\n )}\n </li>\n );\n })}\n </ul>\n <div className=\"rt-tpl-contact-channel-side\">\n <ContactMapBlock map={map} mapEmbedUrl={mapEmbedUrl} />\n <ContactActions actions={actions} />\n </div>\n </div>\n </div>\n </section>\n );\n}\n","import type { ReactElement } from \"react\";\n\nimport type { ContactSection } from \"../site-config.js\";\nimport { ContactMapBlock } from \"./contact-shared.js\";\nimport { contactHrefTrack, sectionThemeStyle, telHref } from \"./shared.js\";\n\nfunction ContactHoursSummary({\n hours,\n}: {\n hours: ContactSection[\"props\"][\"hours\"];\n}): ReactElement | null {\n if (!hours || hours.length === 0) return null;\n return (\n <table className=\"rt-tpl-contact-visit-hours\">\n <caption className=\"rt-tpl-sr-only\">진료시간</caption>\n <tbody>\n {hours.map((row) => (\n <tr key={`${row.day}-${row.open}-${row.close}`}>\n <th scope=\"row\">{row.day}</th>\n <td>\n <span>{row.open}</span>\n <span aria-hidden=\"true\">-</span>\n <span>{row.close}</span>\n {row.note ? (\n <span className=\"rt-tpl-contact-hours-note\">{row.note}</span>\n ) : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\nexport function TemplateContactVisitBand(section: ContactSection): ReactElement {\n const { heading, phone, address, hours, map, mapEmbedUrl, actions } =\n section.props;\n const mapAction =\n actions?.find((action) => action.kind === \"map\") ?? actions?.[0];\n const ctaAction =\n actions?.find((action) => action.kind === \"reserve\" || action.kind === \"call\") ??\n actions?.[1] ??\n mapAction;\n const phoneAction = phone ? { label: phone, href: telHref(phone) } : undefined;\n return (\n <section\n data-roottale-tpl=\"contact\"\n data-variant=\"visit-band\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-contact\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n <div className=\"rt-tpl-contact-visit-band\">\n <section className=\"rt-tpl-contact-visit-panel\" aria-label=\"진료시간\">\n <h3 className=\"rt-tpl-contact-visit-title\">진료시간</h3>\n <ContactHoursSummary hours={hours} />\n </section>\n <section className=\"rt-tpl-contact-visit-panel\" aria-label=\"오시는 길\">\n <h3 className=\"rt-tpl-contact-visit-title\">오시는 길</h3>\n <ContactMapBlock map={map} mapEmbedUrl={mapEmbedUrl} />\n {address ? (\n <address className=\"rt-tpl-contact-visit-address\">\n {address}\n </address>\n ) : null}\n {mapAction ? (\n <a\n className=\"rt-tpl-contact-visit-link\"\n href={mapAction.href}\n data-track={contactHrefTrack(mapAction.href)}\n data-track-placement={\n contactHrefTrack(mapAction.href) ? \"visit\" : undefined\n }\n >\n {mapAction.label}\n </a>\n ) : null}\n </section>\n <section className=\"rt-tpl-contact-visit-panel\" aria-label=\"전화\">\n <h3 className=\"rt-tpl-contact-visit-title\">전화</h3>\n {phoneAction ? (\n <a\n className=\"rt-tpl-contact-visit-phone\"\n href={phoneAction.href}\n data-track=\"cta_call\"\n >\n {phoneAction.label}\n </a>\n ) : null}\n {hours ? <ContactHoursSummary hours={hours.slice(0, 2)} /> : null}\n {ctaAction ? (\n <a\n className=\"rt-tpl-btn rt-tpl-btn--primary\"\n href={ctaAction.href}\n data-track={contactHrefTrack(ctaAction.href)}\n data-track-placement={\n contactHrefTrack(ctaAction.href) ? \"visit\" : undefined\n }\n >\n {ctaAction.label}\n </a>\n ) : null}\n </section>\n </div>\n </div>\n </section>\n );\n}\n","import type { ReactElement } from \"react\";\n\nimport { RootTaleLeadForm } from \"../../LeadForm.js\";\nimport type { ContactSection } from \"../site-config.js\";\nimport { TemplateContactChannelCards } from \"./contact-channels.js\";\nimport { ContactActions, ContactMapBlock } from \"./contact-shared.js\";\nimport { TemplateContactVisitBand } from \"./contact-visit.js\";\nimport { sectionThemeStyle, telHref } from \"./shared.js\";\n\nexport function TemplateContact(section: ContactSection): ReactElement {\n switch (section.variant) {\n case \"channel-cards\":\n return TemplateContactChannelCards(section);\n case \"visit-band\":\n return TemplateContactVisitBand(section);\n default:\n break;\n }\n\n const { heading, form, phone, address, hours, map, mapEmbedUrl, actions } =\n section.props;\n return (\n <section\n data-roottale-tpl=\"contact\"\n data-variant={section.variant}\n id={section.id}\n className=\"rt-tpl-section rt-tpl-contact\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container rt-tpl-contact-inner\">\n <div className=\"rt-tpl-contact-info\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {phone ? (\n <a className=\"rt-tpl-contact-phone\" href={telHref(phone)} data-track=\"cta_call\">\n {phone}\n </a>\n ) : null}\n {address ? <address className=\"rt-tpl-contact-address\">{address}</address> : null}\n {hours ? (\n <table className=\"rt-tpl-contact-hours\">\n <caption className=\"rt-tpl-sr-only\">진료시간</caption>\n <tbody>\n {hours.map((row) => (\n <tr key={`${row.day}-${row.open}-${row.close}`}>\n <th scope=\"row\">{row.day}</th>\n <td>\n <span>{row.open}</span>\n <span aria-hidden=\"true\">-</span>\n <span>{row.close}</span>\n {row.note ? (\n <span className=\"rt-tpl-contact-hours-note\">{row.note}</span>\n ) : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n ) : null}\n <ContactMapBlock map={map} mapEmbedUrl={mapEmbedUrl} />\n <ContactActions actions={actions} />\n </div>\n {form.enabled ? (\n <div className=\"rt-tpl-contact-form\">\n <RootTaleLeadForm action=\"/api/inquiry\" vertical={form.vertical} />\n </div>\n ) : null}\n </div>\n </section>\n );\n}\n","import type { ReactElement } from \"react\";\n\nexport function renderPracticeHeader({\n eyebrow,\n heading,\n description,\n}: {\n eyebrow?: string;\n heading?: string;\n description?: string;\n}): ReactElement | null {\n if (!eyebrow && !heading && !description) return null;\n return (\n <header className=\"rt-tpl-practice-header\">\n {eyebrow ? <p className=\"rt-tpl-practice-eyebrow\">{eyebrow}</p> : null}\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {description ? (\n <p className=\"rt-tpl-section-desc\">{description}</p>\n ) : null}\n </header>\n );\n}\n\nexport function renderPracticeDisclaimer(\n disclaimer: string | undefined,\n): ReactElement | null {\n return disclaimer ? (\n <aside className=\"rt-tpl-practice-disclaimer\">{disclaimer}</aside>\n ) : null;\n}\n","import type { ReactElement } from \"react\";\n\nimport type { HoursSection } from \"../site-config.js\";\nimport {\n renderPracticeDisclaimer,\n renderPracticeHeader,\n} from \"./practice-shared.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\n\nfunction renderHoursBadges(\n badges: HoursSection[\"props\"][\"rows\"][number][\"badges\"],\n): ReactElement | null {\n if (!badges) return null;\n const values = [\n badges.lunch,\n badges.evening,\n badges.closed,\n ...(badges.extra ?? []),\n ].filter((value): value is string => Boolean(value));\n if (values.length === 0) return null;\n return (\n <span className=\"rt-tpl-practice-badges\">\n {values.map((value) => (\n <span key={value} className=\"rt-tpl-practice-badge\">\n {value}\n </span>\n ))}\n </span>\n );\n}\n\nfunction TemplateHoursCompact(section: HoursSection): ReactElement {\n const { eyebrow, heading, description, rows, note, disclaimer } = section.props;\n return (\n <section\n data-roottale-tpl=\"hours\"\n data-variant=\"compact\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-practice rt-tpl-hours\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {renderPracticeHeader({ eyebrow, heading, description })}\n <dl className=\"rt-tpl-hours-compact-list\">\n {rows.map((row) => (\n <div key={row.day} className=\"rt-tpl-hours-compact-row\">\n <dt className=\"rt-tpl-hours-compact-day\">{row.label}</dt>\n <dd className=\"rt-tpl-hours-compact-body\">\n <span className=\"rt-tpl-hours-time\">{row.hours}</span>\n {row.lunchHours ? (\n <span className=\"rt-tpl-hours-muted\">{row.lunchHours}</span>\n ) : null}\n {renderHoursBadges(row.badges)}\n {row.note ? (\n <span className=\"rt-tpl-hours-muted\">{row.note}</span>\n ) : null}\n </dd>\n </div>\n ))}\n </dl>\n {note ? <p className=\"rt-tpl-practice-note\">{note}</p> : null}\n {renderPracticeDisclaimer(disclaimer)}\n </div>\n </section>\n );\n}\n\nexport function TemplateHours(section: HoursSection): ReactElement {\n if (section.variant === \"compact\") return TemplateHoursCompact(section);\n\n const { eyebrow, heading, description, rows, note, disclaimer } = section.props;\n return (\n <section\n data-roottale-tpl=\"hours\"\n data-variant={section.variant}\n id={section.id}\n className=\"rt-tpl-section rt-tpl-practice rt-tpl-hours\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {renderPracticeHeader({ eyebrow, heading, description })}\n <div className=\"rt-tpl-practice-table-wrap\">\n <table className=\"rt-tpl-practice-table\">\n <caption className=\"rt-tpl-sr-only\">영업시간</caption>\n <thead>\n <tr>\n <th scope=\"col\">요일</th>\n <th scope=\"col\">시간</th>\n <th scope=\"col\">점심/휴게</th>\n <th scope=\"col\">안내</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.day}>\n <th scope=\"row\" className=\"rt-tpl-practice-primary\">\n {row.label}\n </th>\n <td>{row.hours}</td>\n <td className=\"rt-tpl-practice-muted\">\n {row.lunchHours ?? \"별도 안내\"}\n </td>\n <td>\n {renderHoursBadges(row.badges)}\n {row.note ? (\n <p className=\"rt-tpl-practice-muted\">{row.note}</p>\n ) : null}\n </td>\n </tr>\n ))}\n {note ? (\n <tr className=\"rt-tpl-practice-table-note\">\n <td colSpan={4}>{note}</td>\n </tr>\n ) : null}\n </tbody>\n </table>\n </div>\n {renderPracticeDisclaimer(disclaimer)}\n </div>\n </section>\n );\n}\n","import type { ReactElement } from \"react\";\n\nimport type { PricingSection } from \"../site-config.js\";\nimport { renderPracticeHeader } from \"./practice-shared.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\n\nfunction TemplatePricingCards(section: PricingSection): ReactElement {\n const { eyebrow, heading, description, groups, disclaimer } = section.props;\n return (\n <section\n data-roottale-tpl=\"pricing\"\n data-variant=\"cards\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-practice rt-tpl-pricing\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {renderPracticeHeader({ eyebrow, heading, description })}\n <div className=\"rt-tpl-pricing-card-groups\">\n {groups.map((group) => (\n <section key={group.label} className=\"rt-tpl-pricing-card-group\">\n <h3 className=\"rt-tpl-pricing-group-title\">{group.label}</h3>\n <ul className=\"rt-tpl-pricing-card-list\">\n {group.items.map((item) => (\n <li key={`${group.label}-${item.name}`} className=\"rt-tpl-pricing-card\">\n <div>\n <h4 className=\"rt-tpl-pricing-name\">{item.name}</h4>\n {item.description ? (\n <p className=\"rt-tpl-pricing-desc\">{item.description}</p>\n ) : null}\n </div>\n <p className=\"rt-tpl-pricing-price\">{item.price}</p>\n <p className=\"rt-tpl-pricing-condition\">\n {item.condition ?? \"자료 확인 후 확정\"}\n </p>\n </li>\n ))}\n </ul>\n </section>\n ))}\n </div>\n <aside className=\"rt-tpl-practice-disclaimer\">{disclaimer}</aside>\n </div>\n </section>\n );\n}\n\nexport function TemplatePricing(section: PricingSection): ReactElement {\n if (section.variant === \"cards\") return TemplatePricingCards(section);\n\n const { eyebrow, heading, description, groups, disclaimer } = section.props;\n return (\n <section\n data-roottale-tpl=\"pricing\"\n data-variant={section.variant}\n id={section.id}\n className=\"rt-tpl-section rt-tpl-practice rt-tpl-pricing\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {renderPracticeHeader({ eyebrow, heading, description })}\n <div className=\"rt-tpl-practice-table-wrap\">\n <table className=\"rt-tpl-practice-table\">\n <caption className=\"rt-tpl-sr-only\">요금 안내</caption>\n <thead>\n <tr>\n <th scope=\"col\">항목</th>\n <th scope=\"col\">설명</th>\n <th scope=\"col\">가격</th>\n <th scope=\"col\">조건</th>\n </tr>\n </thead>\n <tbody>\n {groups.flatMap((group) => [\n <tr key={`${group.label}-group`} className=\"rt-tpl-pricing-group-row\">\n <td colSpan={4}>{group.label}</td>\n </tr>,\n ...group.items.map((item) => (\n <tr key={`${group.label}-${item.name}`}>\n <th scope=\"row\" className=\"rt-tpl-practice-primary\">\n {item.name}\n </th>\n <td className=\"rt-tpl-practice-muted\">\n {item.description ?? \"상담 후 범위 확인\"}\n </td>\n <td className=\"rt-tpl-pricing-price\">{item.price}</td>\n <td className=\"rt-tpl-practice-muted\">\n {item.condition ?? \"자료 확인 후 확정\"}\n </td>\n </tr>\n )),\n ])}\n </tbody>\n </table>\n </div>\n <aside className=\"rt-tpl-practice-disclaimer\">{disclaimer}</aside>\n </div>\n </section>\n );\n}\n","import type { ReactElement } from \"react\";\n\nimport type { ProcessSection } from \"../site-config.js\";\nimport {\n renderPracticeDisclaimer,\n renderPracticeHeader,\n} from \"./practice-shared.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\n\nexport function TemplateProcess(section: ProcessSection): ReactElement {\n const { eyebrow, heading, description, items, connector, disclaimer } =\n section.props;\n if (section.variant === \"timeline-marked\") {\n return (\n <section\n data-roottale-tpl=\"process\"\n data-variant=\"timeline-marked\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-practice rt-tpl-process\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {renderPracticeHeader({ eyebrow, heading, description })}\n <ol className=\"rt-tpl-process-marked-list\">\n {items.map((item, index) => {\n const status = item.status ?? \"complete\";\n const mark = item.mark ?? (status === \"complete\" ? \"check\" : \"dot\");\n return (\n <li\n key={`${index}-${item.title}`}\n className=\"rt-tpl-process-marked-item\"\n data-status={status}\n >\n <article className=\"rt-tpl-process-marked-card\">\n <div className=\"rt-tpl-process-marked-icon\" aria-hidden=\"true\">\n <span data-mark={mark} />\n </div>\n <div className=\"rt-tpl-process-marked-body\">\n <p className=\"rt-tpl-process-marked-step\">\n {item.eyebrow ?? `step ${String(index + 1).padStart(2, \"0\")}`}\n </p>\n <h3 className=\"rt-tpl-process-title\">{item.title}</h3>\n <p className=\"rt-tpl-process-desc\">{item.description}</p>\n {item.duration || item.statusLabel ? (\n <p className=\"rt-tpl-process-duration\">\n {item.statusLabel ?? item.duration}\n </p>\n ) : null}\n </div>\n </article>\n </li>\n );\n })}\n </ol>\n {renderPracticeDisclaimer(disclaimer)}\n </div>\n </section>\n );\n }\n return (\n <section\n data-roottale-tpl=\"process\"\n data-variant={section.variant}\n id={section.id}\n className=\"rt-tpl-section rt-tpl-practice rt-tpl-process\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {renderPracticeHeader({ eyebrow, heading, description })}\n <ol\n className=\"rt-tpl-process-list\"\n data-connector={connector ?? \"line\"}\n >\n {items.map((item, index) => (\n <li key={`${index}-${item.title}`} className=\"rt-tpl-process-item\">\n <article className=\"rt-tpl-process-content\">\n {item.imageSrc ? (\n <img\n className=\"rt-tpl-process-image\"\n src={item.imageSrc}\n alt={item.imageAlt ?? \"\"}\n loading=\"lazy\"\n />\n ) : null}\n <p className=\"rt-tpl-process-step\">\n {item.eyebrow ?? `step ${String(index + 1).padStart(2, \"0\")}`}\n </p>\n <h3 className=\"rt-tpl-process-title\">{item.title}</h3>\n <p className=\"rt-tpl-process-desc\">{item.description}</p>\n {item.duration ? (\n <p className=\"rt-tpl-process-duration\">{item.duration}</p>\n ) : null}\n </article>\n </li>\n ))}\n </ol>\n {renderPracticeDisclaimer(disclaimer)}\n </div>\n </section>\n );\n}\n","import type { ReactElement } from \"react\";\n\nimport { BeforeAfterSlider } from \"../before-after-client.js\";\nimport type { BeforeAfterSection } from \"../site-config.js\";\nimport {\n renderPracticeDisclaimer,\n renderPracticeHeader,\n} from \"./practice-shared.js\";\nimport { sectionThemeStyle } from \"./shared.js\";\n\nfunction TemplateBeforeAfterSideBySide(\n section: BeforeAfterSection,\n): ReactElement {\n const { beforeImage, afterImage, beforeLabel, afterLabel } = section.props;\n return (\n <div className=\"rt-tpl-before-after-pair\">\n <figure className=\"rt-tpl-before-after-figure\">\n <img\n className=\"rt-tpl-before-after-img\"\n src={beforeImage.src}\n alt={beforeImage.alt}\n loading=\"lazy\"\n />\n <figcaption className=\"rt-tpl-before-after-caption\">\n {beforeLabel}\n </figcaption>\n </figure>\n <figure className=\"rt-tpl-before-after-figure\">\n <img\n className=\"rt-tpl-before-after-img\"\n src={afterImage.src}\n alt={afterImage.alt}\n loading=\"lazy\"\n />\n <figcaption className=\"rt-tpl-before-after-caption\">\n {afterLabel}\n </figcaption>\n </figure>\n </div>\n );\n}\n\nexport function TemplateBeforeAfter(\n section: BeforeAfterSection,\n): ReactElement {\n const {\n heading,\n description,\n beforeImage,\n afterImage,\n beforeLabel,\n afterLabel,\n disclaimer,\n } = section.props;\n return (\n <section\n data-roottale-tpl=\"before-after\"\n data-variant={section.variant}\n id={section.id}\n className=\"rt-tpl-section rt-tpl-practice rt-tpl-before-after\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n {renderPracticeHeader({ heading, description })}\n {section.variant === \"side-by-side\" ? (\n <TemplateBeforeAfterSideBySide {...section} />\n ) : (\n <BeforeAfterSlider\n beforeImage={beforeImage}\n afterImage={afterImage}\n beforeLabel={beforeLabel}\n afterLabel={afterLabel}\n />\n )}\n {renderPracticeDisclaimer(disclaimer)}\n </div>\n </section>\n );\n}\n","import type { ReactElement } from \"react\";\n\nimport { ConcernsFigureMap } from \"./concerns-client.js\";\nimport { ExpertiseTabStage } from \"./expertise-client.js\";\nimport { SpacesStage } from \"./spaces-client.js\";\nimport type {\n ConcernsSection,\n ExpertiseSection,\n SpacesSection,\n} from \"./site-config.js\";\nimport { sectionThemeStyle } from \"./sections.js\";\n\nfunction SectionHeader({\n heading,\n description,\n}: {\n readonly heading?: string;\n readonly description?: string;\n}): ReactElement | null {\n if (!heading && !description) return null;\n return (\n <header className=\"rt-tpl-client-section-header\">\n {heading ? <h2 className=\"rt-tpl-heading\">{heading}</h2> : null}\n {description ? <p className=\"rt-tpl-section-desc\">{description}</p> : null}\n </header>\n );\n}\n\nfunction TagList({\n tags,\n label,\n}: {\n readonly tags?: readonly string[];\n readonly label: string;\n}): ReactElement | null {\n if (!tags || tags.length === 0) return null;\n return (\n <ul className=\"rt-tpl-client-tags\" aria-label={label}>\n {tags.map((tag) => (\n <li key={tag}>{tag}</li>\n ))}\n </ul>\n );\n}\n\nfunction TemplateExpertiseCards(section: ExpertiseSection): ReactElement {\n const { heading, description, items } = section.props;\n return (\n <section\n data-roottale-tpl=\"expertise\"\n data-variant=\"cards\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-expertise\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n <SectionHeader heading={heading} description={description} />\n <ul className=\"rt-tpl-expertise-card-grid\">\n {items.map((item) => (\n <li key={item.id} className=\"rt-tpl-expertise-card\">\n {item.imageSrc ? (\n <img\n className=\"rt-tpl-expertise-card-img\"\n src={item.imageSrc}\n alt={item.imageAlt ?? \"\"}\n loading=\"lazy\"\n />\n ) : null}\n <div className=\"rt-tpl-expertise-card-body\">\n {item.kicker ? (\n <p className=\"rt-tpl-expertise-kicker\">{item.kicker}</p>\n ) : null}\n <h3 className=\"rt-tpl-expertise-title\">{item.title}</h3>\n <p className=\"rt-tpl-expertise-body\">{item.body}</p>\n <TagList tags={item.tags} label={`${item.title} 태그`} />\n {item.href ? (\n <a className=\"rt-tpl-expertise-cta\" href={item.href}>\n {item.ctaLabel ?? \"자세히 보기\"}\n </a>\n ) : null}\n </div>\n </li>\n ))}\n </ul>\n </div>\n </section>\n );\n}\n\nexport function TemplateExpertise(section: ExpertiseSection): ReactElement {\n const { heading, description, items } = section.props;\n if (section.variant === \"cards\") return TemplateExpertiseCards(section);\n return (\n <section\n data-roottale-tpl=\"expertise\"\n data-variant=\"tab-stage\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-expertise\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n <SectionHeader heading={heading} description={description} />\n <ExpertiseTabStage items={items} />\n </div>\n </section>\n );\n}\n\nfunction TemplateSpacesMosaic(section: SpacesSection): ReactElement {\n const { heading, description, spaces, disclaimer } = section.props;\n return (\n <section\n data-roottale-tpl=\"spaces\"\n data-variant=\"mosaic\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-spaces\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n <SectionHeader heading={heading} description={description} />\n <ul className=\"rt-tpl-spaces-mosaic\">\n {spaces.map((space) => (\n <li key={space.id} className=\"rt-tpl-spaces-tile\">\n <img src={space.imageSrc} alt={space.imageAlt} loading=\"lazy\" />\n <div className=\"rt-tpl-spaces-tile-caption\">\n {space.kicker ? (\n <span className=\"rt-tpl-spaces-kicker\">{space.kicker}</span>\n ) : null}\n <h3>{space.title ?? space.label}</h3>\n {space.description ? <p>{space.description}</p> : null}\n <TagList tags={space.tags} label={`${space.label} 태그`} />\n </div>\n </li>\n ))}\n </ul>\n {disclaimer ? (\n <aside className=\"rt-tpl-client-disclaimer\">{disclaimer}</aside>\n ) : null}\n </div>\n </section>\n );\n}\n\nexport function TemplateSpaces(section: SpacesSection): ReactElement {\n const { heading, description, spaces, disclaimer } = section.props;\n if (section.variant === \"mosaic\") return TemplateSpacesMosaic(section);\n return (\n <section\n data-roottale-tpl=\"spaces\"\n data-variant=\"stage\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-spaces\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n <SectionHeader heading={heading} description={description} />\n <SpacesStage spaces={spaces} />\n {disclaimer ? (\n <aside className=\"rt-tpl-client-disclaimer\">{disclaimer}</aside>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction TemplateConcernsList(section: ConcernsSection): ReactElement {\n const { heading, description, regions, disclaimer } = section.props;\n return (\n <section\n data-roottale-tpl=\"concerns\"\n data-variant=\"list\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-concerns\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n <SectionHeader heading={heading} description={description} />\n <ul className=\"rt-tpl-concerns-list\">\n {regions.map((region) => (\n <li key={region.id} className=\"rt-tpl-concerns-card\">\n <p className=\"rt-tpl-concerns-label\">{region.label}</p>\n <h3 className=\"rt-tpl-concerns-title\">{region.title}</h3>\n <p className=\"rt-tpl-concerns-desc\">{region.description}</p>\n {region.items ? (\n <ul className=\"rt-tpl-concerns-items\">\n {region.items.map((item) => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n ) : null}\n {region.href ? (\n <a className=\"rt-tpl-concerns-cta\" href={region.href}>\n {region.ctaLabel ?? \"자세히 보기\"}\n </a>\n ) : null}\n </li>\n ))}\n </ul>\n <aside className=\"rt-tpl-client-disclaimer\">{disclaimer}</aside>\n </div>\n </section>\n );\n}\n\nexport function TemplateConcerns(section: ConcernsSection): ReactElement {\n const {\n heading,\n description,\n figureImage,\n figureAlt,\n regions,\n disclaimer,\n } = section.props;\n if (section.variant === \"list\") return TemplateConcernsList(section);\n return (\n <section\n data-roottale-tpl=\"concerns\"\n data-variant=\"figure-map\"\n id={section.id}\n className=\"rt-tpl-section rt-tpl-concerns\"\n style={sectionThemeStyle(section.theme)}\n >\n <div className=\"rt-tpl-container\">\n <SectionHeader heading={heading} description={description} />\n <ConcernsFigureMap\n figureImage={figureImage ?? \"\"}\n figureAlt={figureAlt ?? \"\"}\n regions={regions}\n />\n <aside className=\"rt-tpl-client-disclaimer\">{disclaimer}</aside>\n </div>\n </section>\n );\n}\n","/**\n * `section` 노드 → 템플릿 컴포넌트 매핑. ADR-0040 P2 단방향 계약에 따라 코어가\n * 아니라 templates 계층에 산다 — 코어(`section-render-context.ts`)는 이 함수의\n * 자리만 비워두고, templates 배럴이 로드되며 주입한다.\n */\nimport type { ReactElement } from \"react\";\n\nimport type { SectionRenderContext } from \"../section-render-context.js\";\nimport { RootTaleLeadForm } from \"../LeadForm.js\";\nimport {\n SectionSchema,\n type BeforeAfterSection,\n type BlogListSection,\n type ConcernsSection,\n type ContactSection,\n type CtaBannerSection,\n type ExpertiseSection,\n type FaqSection,\n type FooterSection,\n type HeroSection,\n type HoursSection,\n type LeadFormSection,\n type PricingSection,\n type ProcessSection,\n type RichTextSection,\n type ServicesSection,\n type SpacesSection,\n type TeamSection,\n type TestimonialsSection,\n type TrustSection,\n} from \"./site-config.js\";\nimport {\n TemplateConcerns,\n TemplateExpertise,\n TemplateSpaces,\n} from \"./professional-sections.js\";\nimport {\n TemplateBeforeAfter,\n TemplateContact,\n TemplateCtaBanner,\n TemplateFaq,\n TemplateFooter,\n TemplateHero,\n TemplateHours,\n TemplatePricing,\n TemplateProcess,\n TemplateRichText,\n TemplateServices,\n TemplateTeam,\n TemplateTestimonials,\n TemplateTrust,\n sectionThemeStyle,\n} from \"./sections.js\";\n\ntype TiptapNode = {\n type?: string;\n attrs?: Record<string, unknown>;\n};\n\nfunction warnSkippedCmsBound(sectionType: string, isDev: () => boolean): void {\n if (isDev()) {\n console.warn(\n `[cms-renderer-next] section 노드 sectionType=${sectionType} 는 apiKey 컨텍스트가 없어 렌더 skip`,\n );\n }\n}\n\nexport function renderSectionNode(\n node: TiptapNode,\n key: number,\n context: SectionRenderContext,\n): ReactElement | null {\n const attrs = node.attrs ?? {};\n const input = {\n type: typeof attrs.sectionType === \"string\" ? attrs.sectionType : \"\",\n variant: attrs.variant ?? undefined,\n theme: attrs.theme ?? undefined,\n props: attrs.props ?? {},\n };\n const parsed = SectionSchema.safeParse(input);\n if (!parsed.success) {\n if (context.isDev()) {\n console.warn(\n `[cms-renderer-next] section 노드 parse 실패 (sectionType=${input.type}) — 렌더 skip:`,\n parsed.error.issues,\n );\n }\n return null;\n }\n const section = parsed.data;\n switch (section.type) {\n case \"hero\":\n return <TemplateHero key={key} {...(section as HeroSection)} />;\n case \"rich-text\":\n return <TemplateRichText key={key} {...(section as RichTextSection)} />;\n case \"services\":\n return <TemplateServices key={key} {...(section as ServicesSection)} />;\n case \"faq\":\n return <TemplateFaq key={key} {...(section as FaqSection)} />;\n case \"footer\":\n return <TemplateFooter key={key} {...(section as FooterSection)} />;\n case \"cta-banner\":\n return <TemplateCtaBanner key={key} {...(section as CtaBannerSection)} />;\n case \"trust\":\n return <TemplateTrust key={key} {...(section as TrustSection)} />;\n case \"hours\":\n return <TemplateHours key={key} {...(section as HoursSection)} />;\n case \"pricing\":\n return <TemplatePricing key={key} {...(section as PricingSection)} />;\n case \"process\":\n return <TemplateProcess key={key} {...(section as ProcessSection)} />;\n case \"before-after\":\n return (\n <TemplateBeforeAfter key={key} {...(section as BeforeAfterSection)} />\n );\n case \"testimonials\":\n return (\n <TemplateTestimonials key={key} {...(section as TestimonialsSection)} />\n );\n case \"team\":\n return <TemplateTeam key={key} {...(section as TeamSection)} />;\n case \"expertise\":\n return <TemplateExpertise key={key} {...(section as ExpertiseSection)} />;\n case \"spaces\":\n return <TemplateSpaces key={key} {...(section as SpacesSection)} />;\n case \"concerns\":\n return <TemplateConcerns key={key} {...(section as ConcernsSection)} />;\n case \"contact\":\n if (!context.cms) {\n warnSkippedCmsBound(section.type, context.isDev);\n return null;\n }\n return <TemplateContact key={key} {...(section as ContactSection)} />;\n case \"blog-list\": {\n if (!context.cms) {\n warnSkippedCmsBound(section.type, context.isDev);\n return null;\n }\n const s = section as BlogListSection;\n const base = s.props.blogBasePath ?? \"/blog\";\n return (\n <section\n key={key}\n data-roottale-tpl=\"blog-list\"\n data-roottale-cms=\"list\"\n id={s.id}\n className=\"rt-tpl-section rt-tpl-blog-list\"\n style={sectionThemeStyle(s.theme)}\n >\n <div className=\"rt-tpl-container\">\n {s.props.heading ? (\n <h2 className=\"rt-tpl-heading\">{s.props.heading}</h2>\n ) : null}\n {context.renderBlogList({\n apiKey: context.cms.apiKey,\n baseUrl: context.cms.baseUrl,\n limit: s.props.limit,\n emptyMessage: s.props.emptyMessage,\n postHref: (post) => `${base}/${post.slug}`,\n })}\n </div>\n </section>\n );\n }\n case \"lead-form\": {\n if (!context.cms) {\n warnSkippedCmsBound(section.type, context.isDev);\n return null;\n }\n const s = section as LeadFormSection;\n return (\n <section\n key={key}\n data-roottale-tpl=\"lead-form\"\n data-roottale-cms=\"lead-form\"\n id={s.id}\n className=\"rt-tpl-section rt-tpl-lead-form\"\n style={sectionThemeStyle(s.theme)}\n >\n <div className=\"rt-tpl-container\">\n <RootTaleLeadForm\n action={s.props.action}\n vertical={s.props.vertical}\n heading={s.props.heading}\n description={s.props.description}\n submitLabel={s.props.submitLabel}\n />\n </div>\n </section>\n );\n }\n default:\n if (context.isDev()) {\n console.warn(\n `[cms-renderer-next] section 노드 sectionType=${section.type} 는 renderNode 위임 대상이 아님(cms-bound/미지) — skip`,\n );\n }\n return null;\n }\n}\n","/**\n * 섹션 템플릿 주입 — 코어의 빈 자리(`section-render-context.ts`)를 채운다.\n *\n * 배럴(`index.ts`)이 아니라 별도 모듈인 이유: composition root(`server.tsx`)가\n * 등록만 하려고 templates 배럴 전체(SiteRenderer·seo 유틸 등)를 끌어오면\n * `/server` 진입점 번들이 불필요하게 커진다. 여기서는 섹션 매핑 하나만 잇는다.\n */\nimport { setSectionNodeRenderer } from \"../section-render-context.js\";\nimport { renderSectionNode } from \"./render-section-node.js\";\n\nexport function registerSectionTemplates(): void {\n setSectionNodeRenderer(renderSectionNode);\n}\n","export { RootTalePostCard, type RootTalePostCardProps } from \"./PostCard.js\";\nexport {\n RootTaleTableOfContents,\n type RootTaleTableOfContentsProps,\n} from \"./TableOfContents.js\";\nexport { themeToCssVars, type RootTaleCssVars } from \"./theme-css-vars.js\";\nexport {\n RootTaleFloatingCta,\n type RootTaleFloatingCtaProps,\n type CtaButton,\n type CtaButtonType,\n type FloatingCtaPosition,\n} from \"./FloatingCta.js\";\nexport {\n RootTaleLeadForm,\n type RootTaleLeadFormProps,\n type LeadFormVertical,\n} from \"./LeadForm.js\";\nexport { renderBlock, renderBlocks, renderBoundBlocks } from \"./block-to-react.js\";\nexport {\n collectCategories,\n collectCategoriesWithCounts,\n filterPostsByCategory,\n defaultCategoryHref,\n type BlogCategory,\n type BlogCategoryWithCount,\n} from \"./blog-filter.js\";\nexport {\n attachHeadingIds,\n extractToc,\n headingToId,\n type TocEntry,\n} from \"./toc.js\";\nexport type { RootTaleTheme } from \"@roottale/cms-client/server\";\n\nexport {\n RootTaleBlogList,\n type RootTaleBlogListProps,\n} from \"./server/blog-list.js\";\nexport {\n RootTaleBlogCategories,\n type RootTaleBlogCategoriesProps,\n} from \"./server/blog-categories.js\";\nexport { RootTaleBlogPost } from \"./server/blog-post.js\";\nexport type {\n BlogPostBreadcrumbOptions,\n RootTaleBlogPostProps,\n} from \"./server/blog-post-types.js\";\nexport { RootTaleFaqJsonLd } from \"./server/blog-post-footer.js\";\nexport { RootTalePage, type RootTalePageProps } from \"./server/page.js\";\nexport { RenderTiptap } from \"./server/render-tiptap.js\";\nexport {\n RootTaleThemeProvider,\n type RootTaleThemeInput,\n} from \"./server/theme.js\";\n\n/**\n * 이 진입점은 코어 렌더러와 섹션 템플릿을 **조립하는 자리**(composition root)다.\n * 본문(tiptap) 안의 `section` 노드를 그리려면 둘이 만나야 하는데, 만나는 지점을\n * 여기 한 곳으로 고정해 두면 나머지 코어 모듈은 templates 를 몰라도 된다\n * (ADR-0040 P2 단방향 계약 — dependency-cruiser 가 이 파일만 예외로 허용).\n *\n * 왜 소비자에게 맡기지 않았나: `RenderTiptap` 만 import 하고 templates 배럴은\n * 안 쓰는 소비자(예: 스타터의 `app/[locale]/page.tsx`)가 실재한다. 주입을\n * 소비자 몫으로 두면 그런 경로에서 섹션이 조용히 사라진다.\n */\nimport { registerSectionTemplates } from \"./templates/register.js\";\n\nregisterSectionTemplates();\n"],"mappings":"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","names":["t","jsx","jsxs","themeToCssVars","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","themeToCssVars","jsx","jsxs","fetchPosts","jsx","jsxs","fetchPosts","fetchPosts","resolvePostDisplay","jsx","jsxs","jsx","Fragment","jsx","jsx","Fragment","jsx","Fragment","jsx","jsxs","resolvePostCollection","Fragment","jsx","jsxs","resolvePostCollection","jsonLdJson","jsx","jsxs","isSafeHref","jsx","jsxs","fetchPosts","formatPublishedDate","resolvePostDisplay","fetchPost","jsx","jsxs","fetchPost","jsx","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","isAllowedEmbedSrc","jsx","jsxs","isAllowedEmbedSrc","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs"]}