'use client'; import { useState, useEffect, useCallback } from 'react'; const ASSETS = [ { file: '/marketing/thumb-homepage-A.svg', name: '홈페이지 제작 썸네일 A', desc: '신뢰형 — 브라우저 목업 + 경력 강조', size: '1200 × 675', platform: '크몽 메인', color: '#2563eb', service: '홈페이지 제작', price: '스타터 50만원~', }, { file: '/marketing/thumb-homepage-B.svg', name: '홈페이지 제작 썸네일 B', desc: '스펙 강조형 — 3플랜 카드 비교', size: '1200 × 675', platform: '크몽 서브', color: '#7c3aed', service: '홈페이지 제작', price: '스타터 50만원~', }, { file: '/marketing/thumb-automation.svg', name: '업무 자동화 썸네일', desc: '시간 절약형 — 자동화 플로우 다이어그램', size: '1200 × 675', platform: '크몽 메인', color: '#10b981', service: '업무 자동화', price: '33만원~', }, { file: '/marketing/thumb-prompt.svg', name: '프롬프트 엔지니어링 썸네일', desc: 'Before/After 비교형 — AI 최적화 결과 시각화', size: '1200 × 675', platform: '크몽 메인', color: '#7c3aed', service: '프롬프트 엔지니어링', price: '10만원~', }, { file: '/marketing/thumb-stock.svg', name: '주식 자동매매 썸네일', desc: '폰 목업 + 텔레그램 알림 UI', size: '1200 × 675', platform: '크몽 메인', color: '#22c55e', service: '주식 자동매매', price: '9만9천원~', }, { file: '/marketing/thumb-lotto.svg', name: '로또 번호 추천 썸네일', desc: '빅데이터 분석형 — 번호 통계 시각화', size: '1200 × 675', platform: '크몽 메인', color: '#f59e0b', service: '로또 번호 추천', price: '900원~/월', }, { file: '/marketing/thumb-saju.svg', name: 'AI 사주 분석 썸네일', desc: '사주팔자 + AI 해석 — 전통+현대 비주얼', size: '1200 × 675', platform: '크몽 메인', color: '#8b5cf6', service: 'AI 사주 분석', price: '4,900원', }, { file: '/marketing/banner-homepage.svg', name: '홈페이지 제작 배너', desc: '가로형 배너 — 블로그/SNS 활용', size: '1200 × 400', platform: '블로그/SNS', color: '#2563eb', service: '홈페이지 제작', price: '스타터 50만원~', }, ]; const CHECKLIST_ITEMS = { design: [ '시각적 위계가 명확하다 (헤드라인 → 서브 → 기능 → 가격)', '색상 대비가 가독성 기준을 충족한다 (어두운 배경/밝은 텍스트)', '브랜드 색상이 사이트와 일관되게 사용되었다', '정보가 과밀하지 않고 여백이 충분하다', '폰트 크기가 썸네일 목록에서도 가독성이 있다 (헤드 52px+)', '오른쪽 비주얼(목업)이 서비스 내용과 직결된다', ], pm: [ '서비스명이 한눈에 들어온다 (1초 이내 파악)', '핵심 가치 제안이 1~2줄 이내로 명확히 전달된다', '가격 또는 플랜이 뱃지 형태로 명확히 표시된다', 'URL 또는 브랜드명이 하단에 포함된다', '대상 고객의 니즈가 암묵적으로 전달된다', '파일 사이즈가 플랫폼 요구사항(1200×675)을 충족한다', ], quality: [ '텍스트에 오탈자·맞춤법 오류가 없다', '가격 정보가 실제 서비스 가격과 일치한다', '깨진 이미지나 렌더링 오류가 없다', '동일 색상/레이아웃을 다른 썸네일과 중복 사용하지 않는다', '법적 문제(허위광고, 저작권) 소지가 없다', 'PNG 변환 후에도 품질이 유지된다 (벡터 기반)', ], marketing: [ '타겟 고객의 핵심 페인포인트를 헤드라인에서 직접 해소한다', '"납기 100% · 연락두절 없음" 등 약속 기반 차별화 요소가 포함된다', '경쟁사 대비 명확한 차별점이 드러난다', '첫 3초 안에 무슨 서비스인지 파악 가능하다', '클릭 충동을 자극하는 강력한 헤드라인이다', '크몽 검색 목록에서 눈에 띄는 디자인이다', ], }; type CheckKey = string; export default function MarketingPage() { const [preview, setPreview] = useState(null); const [copied, setCopied] = useState(null); const [checks, setChecks] = useState>({}); const [showGuide, setShowGuide] = useState(false); const [activeTab, setActiveTab] = useState<'design' | 'pm' | 'quality' | 'marketing'>('design'); useEffect(() => { const saved = localStorage.getItem('marketing_checks'); if (saved) setChecks(JSON.parse(saved)); }, []); const toggleCheck = useCallback((key: string) => { setChecks(prev => { const next = { ...prev, [key]: !prev[key] }; localStorage.setItem('marketing_checks', JSON.stringify(next)); return next; }); }, []); const getCheckScore = (assetFile: string, category: keyof typeof CHECKLIST_ITEMS) => { const items = CHECKLIST_ITEMS[category]; const done = items.filter((_, i) => checks[`${assetFile}_${category}_${i}`]).length; return { done, total: items.length }; }; const getTotalScore = (assetFile: string) => { const all = Object.keys(CHECKLIST_ITEMS).flatMap(cat => CHECKLIST_ITEMS[cat as keyof typeof CHECKLIST_ITEMS].map((_, i) => checks[`${assetFile}_${cat}_${i}`]) ); return { done: all.filter(Boolean).length, total: all.length }; }; function copyPath(file: string) { const url = `${window.location.origin}${file}`; navigator.clipboard.writeText(url); setCopied(file); setTimeout(() => setCopied(null), 2000); } function download(file: string, name: string) { const a = document.createElement('a'); a.href = file; a.download = name.replace(/\s/g, '_') + '.svg'; a.click(); } const TABS = [ { key: 'design', label: '디자인', icon: '🎨', color: 'blue' }, { key: 'pm', label: 'PM', icon: '📋', color: 'violet' }, { key: 'quality', label: '품질', icon: '✅', color: 'emerald' }, { key: 'marketing', label: '마케팅', icon: '📣', color: 'amber' }, ] as const; const tabColors: Record = { blue: 'bg-blue-500/20 text-blue-300 border-blue-500/50', violet: 'bg-violet-500/20 text-violet-300 border-violet-500/50', emerald: 'bg-emerald-500/20 text-emerald-300 border-emerald-500/50', amber: 'bg-amber-500/20 text-amber-300 border-amber-500/50', }; return (
{/* 헤더 */}

마케팅 에셋

크몽·숨고 등록용 썸네일 및 배너 — 4대 전문가 품질 체크리스트 포함

{/* 통계 */}
{[ { label: '전체 에셋', value: ASSETS.length, unit: '개', color: 'text-white' }, { label: '썸네일', value: ASSETS.filter(a => a.size.includes('675')).length, unit: '개', color: 'text-blue-400' }, { label: '배너', value: ASSETS.filter(a => a.size.includes('400')).length, unit: '개', color: 'text-violet-400' }, { label: '크몽 등록 가능', value: ASSETS.length, unit: '개', color: 'text-emerald-400' }, ].map(stat => (

{stat.label}

{stat.value}{stat.unit}

))}
{/* 크몽 등록 가이드 */} {showGuide && (

크몽 썸네일 등록 완전 가이드

1️⃣ SVG → PNG 변환

  1. SVG 파일 다운로드
  2. 브라우저에서 SVG 파일 열기
  3. 우클릭 → 이미지로 저장 (PNG)
  4. 또는Figma에 드래그 후 Export
크몽은 JPG/PNG만 허용합니다. SVG 직접 업로드 불가.

2️⃣ 크몽 서비스 등록 체크

    {['썸네일: 1200×675px (권장)', '파일 크기: 10MB 이하', '형식: JPG, PNG', '서비스 카테고리 정확히 선택', '가격 설정: 기본/스탠다드/프리미엄', '패키지 설명 500자 이상'].map(item => (
  • {item}
  • ))}

3️⃣ 전문가 검토 순서

{TABS.map(tab => (
{tab.icon}
{tab.label} 전문가

{tab.key === 'design' && '시각 위계·색상·가독성 검토'} {tab.key === 'pm' && '정보 완전성·CTA·플랫폼 요건'} {tab.key === 'quality' && '오탈자·가격 정확성·파일 품질'} {tab.key === 'marketing' && '전환율·차별화·클릭 유도'}

))}
)} {/* 에셋 그리드 */}
{ASSETS.map((asset) => { const score = getTotalScore(asset.file); const pct = score.total > 0 ? Math.round((score.done / score.total) * 100) : 0; const isReady = pct >= 80; return (
{/* 미리보기 */} {/* 카드 정보 */}

{asset.name}

{asset.desc}

{asset.platform}
{asset.size}px · {asset.price}
{/* 체크리스트 진행 바 */}
품질 체크 {score.done}/{score.total}
0 ? '#f59e0b' : '#334155' }} />
{/* 4대 전문가 점수 */}
{TABS.map(tab => { const s = getCheckScore(asset.file, tab.key); const ok = s.done === s.total && s.total > 0; return (
{tab.icon}
{s.done}/{s.total}
); })}
{/* 액션 버튼 */}
); })}
{/* 모달 — 크게 보기 + 체크리스트 */} {preview && (
setPreview(null)} >
e.stopPropagation()}> {/* 모달 헤더 */}

{preview.name}

{preview.size}px · {preview.desc}

{/* 미리보기 */}
{preview.name}
{TABS.map(tab => { const s = getCheckScore(preview.file, tab.key); const pct2 = Math.round((s.done / s.total) * 100); return (
{tab.icon}
{tab.label}
{s.done}/{s.total} 항목
); })}
{/* 체크리스트 패널 */}
{TABS.map(tab => ( ))}
t.key === activeTab)?.color ?? 'blue']}`}> {TABS.find(t => t.key === activeTab)?.icon} {TABS.find(t => t.key === activeTab)?.label} 전문가 관점
    {CHECKLIST_ITEMS[activeTab].map((item, i) => { const key = `${preview.file}_${activeTab}_${i}`; const checked = !!checks[key]; return (
  • ); })}
{/* 전체 점수 */}
{(() => { const s = getTotalScore(preview.file); const pct3 = Math.round((s.done / s.total) * 100); return (
전체 품질 점수 = 80 ? 'text-emerald-400' : pct3 >= 50 ? 'text-amber-400' : 'text-slate-400'}`}> {pct3}% ({s.done}/{s.total})
= 80 ? '#10b981' : pct3 >= 50 ? '#f59e0b' : '#64748b' }} />
{pct3 >= 80 && (
🎉 크몽 등록 준비 완료!
)} {pct3 < 80 && pct3 > 0 && (
추가 검토 후 등록을 권장합니다
)}
); })()}
)}
); }