import {Check} from 'lucide-react'; import type {TemplateItem} from '@o2o/shared'; import {INDUSTRY_CONFIGS} from '@/data/industryData'; import {queueSiteTemplateSave} from '@/features/publish/siteTemplate'; import {cn} from '@/lib/utils'; import {useBuilderStore} from '@/stores/builder'; import {useWizardStep} from './wizardUrl'; import {WizardFooter} from './WizardFooter'; import {WizardSteps} from './WizardSteps'; /** * 템플릿 미리보기 — 그 템플릿의 서체·모서리·테두리·그림자로 **실제로** 그린다. * * ★ 예전에는 회색 막대 세 줄과 색 동그라미였다. 다섯 템플릿이 전부 같은 그림이라 * 무엇을 고르는지 알 수 없었고, 그래서 아무거나 골랐다. */ function TemplatePreview({template}: {template: TemplateItem}) { const {look, colors} = template; return (

Section

오래 머무는 자리

제목은 {template.fontStyle}, 본문은 이 서체로 나갑니다.

카드 · 모서리 {look.radius === '0px' ? '각짐' : '둥금'} · 그림자{' '} {look.shadow === 'none' ? '없음' : '있음'}
예약 문의
); } export function Step4Template() { const industry = useBuilderStore((s) => s.industry); const templateId = useBuilderStore((s) => s.templateId); const placeId = useBuilderStore((s) => s.placeId); const selectTemplate = useBuilderStore((s) => s.selectTemplate); const [, goToStep] = useWizardStep(); const startGenerating = useBuilderStore((s) => s.startGenerating); const config = INDUSTRY_CONFIGS[industry]; /** * 고른 순간 서버에도 남긴다. * * ★ 화면 상태로만 두면 발행 잡이 읽을 곳이 없어 업종 기본 템플릿으로 굽는다 — * 사장님이 고른 디자인과 실제 발행본이 갈린다. 저장은 화면을 기다리게 하지 않는다. */ const chooseTemplate = (id: string) => { selectTemplate(id); queueSiteTemplateSave(placeId, id); }; return (

원하시는 디자인 스타일을 선택해주세요

{config.name}에 맞춘 템플릿입니다. 색상과 서체는 에디터에서 언제든 바꿀 수 있고, 어떤 템플릿을 골라도 구조화 데이터와 필수 섹션은 동일하게 들어갑니다.

{config.templates.map((template) => { const isSelected = templateId === template.id; return ( ); })}
goToStep('collect')} onNext={() => { // ★ 아무것도 안 누르고 넘어가는 경우(첫 템플릿이 이미 선택돼 있다)도 서버에 남긴다 — // 화면이 보여준 그 템플릿이 발행본이 되어야 한다. 같은 값이면 서버가 재빌드 표시도 찍지 않는다. queueSiteTemplateSave(placeId, templateId); startGenerating(); goToStep('generating'); }} nextLabel="이 템플릿으로 사이트 생성하기" />
); }