import { useState, useRef } from "react"; const SECTIONS = ["히어로 배너","헤더/네비","푸터","메뉴/상품 목록","상품 상세","장바구니","로그인/회원가입","대시보드","차트/통계","검색","필터/정렬","페이지네이션","모달/팝업","폼/입력","리뷰/별점","갤러리","예약 시스템","지도 연동","블로그 목록","SNS 공유"]; const MOODS = ["미니멀 & 클린","모던 & 세련된","럭셔리 & 고급스러운","감성적 & 따뜻한","트렌디 & 힙한","다크 테마","전통 & 한국적","귀엽고 캐주얼"]; const UPGRADE_OPTS = ["기술 스택 구체화","UI/UX 상세 명시","반응형 추가","성능 최적화","접근성 기준","에러 처리","애니메이션 추가","SEO 포함"]; const EXAMPLES = ["로그인/회원가입 소셜 로그인 포함 인증 페이지","실시간 차트와 KPI 카드가 있는 관리자 대시보드","상품 목록, 장바구니, 결제 포함 이커머스","반응형 포트폴리오 사이트 스크롤 애니메이션 포함","음식점 메뉴 소개 및 예약 기능 광고 웹사이트","게시판 CRUD 기능이 있는 커뮤니티 웹앱"]; const SYSTEM = `당신은 세계 최고의 웹 개발 프롬프트 엔지니어입니다. 사용자의 개발 요구사항을 분석하고 Claude가 완벽한 웹사이트/웹앱을 만들 수 있도록 최적화된 프롬프트를 생성합니다. 반드시 아래 JSON 형식만 출력하세요 (마크다운 코드블록 없이): { "mainPrompt": "Claude에게 전달할 완성된 프롬프트 (매우 상세, 기술스택/디자인/기능/구조 전부 포함, 한국어)", "score": "완성도 점수 예: 97/100", "breakdown": "분석 내용: 프로젝트 파악, 기술스택 선택 이유, UI 전략, 주의사항 (줄바꿈 \\n 사용)", "var1Title": "변형1 제목", "var1": "변형 프롬프트 1", "var2Title": "변형2 제목", "var2": "변형 프롬프트 2" } mainPrompt 규칙: 기술스택 명확히, 레이아웃/색상/타이포/컴포넌트 구체적으로, 반응형/접근성/성능 포함, 파일 구조 및 완성 기준 명시, Claude가 바로 코딩 시작할 수 있을 정도로 상세하게.`; export default function App() { const [mode, setMode] = useState("quick"); const [resultTab, setResultTab] = useState("main"); const [loading, setLoading] = useState(false); const [result, setResult] = useState(null); const [error, setError] = useState(""); const [copied, setCopied] = useState(false); const [expandedVar, setExpandedVar] = useState({}); // Quick mode state const [quickInput, setQuickInput] = useState(""); const [qStack, setQStack] = useState("자동 판단"); const [qDetail, setQDetail] = useState("매우 상세하게"); // Guided mode state const [gType, setGType] = useState(""); const [gStack, setGStack] = useState("AI가 최적 선택"); const [gFeatures, setGFeatures] = useState(""); const [gDesign, setGDesign] = useState(""); const [gResponsive, setGResponsive] = useState("모바일 우선 반응형"); const [gExtra, setGExtra] = useState(""); const [gSections, setGSections] = useState(new Set(["히어로 배너","헤더/네비","푸터"])); // Upgrade mode state const [upgradeInput, setUpgradeInput] = useState(""); const [upgradeOpts, setUpgradeOpts] = useState(new Set(["기술 스택 구체화","UI/UX 상세 명시"])); const loadingMsgs = ["요구사항 분석 중...","기술 스택 결정 중...","UI/UX 구조 설계 중...","최적 프롬프트 작성 중...","검토 및 마무리 중..."]; const [loadingMsg, setLoadingMsg] = useState(loadingMsgs[0]); const timerRef = useRef(null); function toggleSet(set, setter, val) { const next = new Set(set); next.has(val) ? next.delete(val) : next.add(val); setter(next); } async function generate() { let userReq = ""; if (mode === "quick") { if (!quickInput.trim()) { setError("요구사항을 입력해주세요"); return; } userReq = `[개발 요구사항]\n${quickInput}\n\n[기술 스택 선호]: ${qStack}\n[상세도]: ${qDetail}`; } else if (mode === "guided") { userReq = `[프로젝트 유형]: ${gType||"미선택"}\n[기술 스택]: ${gStack}\n[핵심 기능]: ${gFeatures||"미입력"}\n[디자인 스타일]: ${gDesign||"미선택"}\n[반응형]: ${gResponsive}\n[포함 섹션]: ${[...gSections].join(", ")||"미선택"}\n[특별 요구사항]: ${gExtra||"없음"}`; } else { if (!upgradeInput.trim()) { setError("프롬프트를 붙여넣어주세요"); return; } userReq = `[업그레이드할 기존 프롬프트]\n${upgradeInput}\n\n[업그레이드 방향]: ${[...upgradeOpts].join(", ")||"전반적 개선"}`; } setError(""); setLoading(true); setResult(null); let i = 0; setLoadingMsg(loadingMsgs[0]); timerRef.current = setInterval(() => { i = (i + 1) % loadingMsgs.length; setLoadingMsg(loadingMsgs[i]); }, 1800); try { const res = await fetch("https://api.anthropic.com/v1/messages", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ model: "claude-sonnet-4-20250514", max_tokens: 1000, system: SYSTEM, messages: [{ role: "user", content: userReq }] }) }); const data = await res.json(); if (data.error) throw new Error(data.error.message); const raw = data.content.map(b => b.text || "").join(""); const clean = raw.replace(/```json|```/g, "").trim(); const parsed = JSON.parse(clean); setResult(parsed); setResultTab("main"); } catch (e) { setError("생성 중 오류가 발생했어요: " + e.message); } finally { clearInterval(timerRef.current); setLoading(false); } } function copyPrompt() { navigator.clipboard.writeText(result?.mainPrompt || ""); setCopied(true); setTimeout(() => setCopied(false), 2000); } const TabBtn = ({ id, label }) => ( ); const RTabBtn = ({ id, label }) => ( ); const Tag = ({ label, active, onToggle, activeColor = "#dbeafe", activeText = "#1d4ed8" }) => ( ); const sel = { width: "100%", padding: "7px 10px", fontSize: 13, border: "1px solid #e2e8f0", borderRadius: 8, background: "#fff", color: "#0f172a", outline: "none" }; const inp = { width: "100%", boxSizing: "border-box", padding: "8px 11px", fontSize: 13, border: "1px solid #e2e8f0", borderRadius: 8, background: "#fff", color: "#0f172a", outline: "none", fontFamily: "inherit" }; const btn = { width: "100%", padding: "11px", fontSize: 14, fontWeight: 600, border: "1px solid #1d4ed8", borderRadius: 9, background: "#1d4ed8", color: "#fff", cursor: "pointer", transition: "all 0.15s" }; return (
{/* Header */}

웹 개발 프롬프트 자동화 AI

어떤 개발 요구사항이든 → 완벽한 프롬프트로 자동 변환

{/* Mode Tabs */}
{/* Quick Mode */} {mode === "quick" && (