'use client'; import Link from 'next/link'; import { useState, useEffect, useRef } from 'react'; const samples = [ { type: 'corporate', title: '기업 홈페이지', subtitle: '테크솔루션㈜', desc: '신뢰감 있는 기업 브랜드를 구축하는 전문 비즈니스 사이트', gradient: 'linear-gradient(135deg, #0a192f 0%, #112240 50%, #1a3a6c 100%)', accent: '#4fc3f7', tags: ['기업', 'B2B', '신뢰'], icon: '🏢', }, { type: 'bakery', title: '베이커리 홈페이지', subtitle: '르 쁘띠 포르', desc: '따뜻하고 감성적인 분위기로 고객의 마음을 사로잡는 매장 사이트', gradient: 'linear-gradient(135deg, #78350f 0%, #92400e 50%, #d97706 100%)', accent: '#fbbf24', tags: ['F&B', '로컬', '감성'], icon: '🥐', }, { type: 'portfolio', title: '개인 포트폴리오', subtitle: 'Kim Jisu', desc: '크리에이티브한 개성을 드러내는 임팩트 있는 포트폴리오 사이트', gradient: 'linear-gradient(135deg, #000000 0%, #0d0d0d 50%, #001a00 100%)', accent: '#00ff88', tags: ['크리에이터', '디자이너', '개발자'], icon: '✦', }, { type: 'dashboard', title: '관리자 대시보드', subtitle: 'DataFlow SaaS', desc: '데이터를 한눈에 파악하는 직관적인 SaaS 대시보드 시스템', gradient: 'linear-gradient(135deg, #0f172a 0%, #1e293b 50%, #0f2a3a 100%)', accent: '#38bdf8', tags: ['SaaS', '분석', '관리'], icon: '📊', }, { type: 'game', title: '게임 매칭 시스템', subtitle: 'NEXUS ARENA', desc: '플레이어를 흥분시키는 사이버펑크 스타일의 게임 매칭 플랫폼', gradient: 'linear-gradient(135deg, #000000 0%, #0a0a1a 50%, #0d0029 100%)', accent: '#a855f7', tags: ['게임', '멀티플레이', '랭킹'], icon: '⚡', }, { type: 'interior', title: '인테리어 업체 소개', subtitle: 'AURUM Interior', desc: '따뜻한 감성과 고급스러운 감각을 담은 인테리어 포트폴리오 사이트', gradient: 'linear-gradient(135deg, #2C1810 0%, #4A3728 50%, #6B4E37 100%)', accent: '#D4A853', tags: ['인테리어', '포트폴리오', '럭셔리'], icon: '◈', }, { type: 'reading', title: '독서 기록 노트', subtitle: '나의 독서 기록', desc: '읽은 책과 감상을 아름답게 기록하는 나만의 독서 저널 페이지', gradient: 'linear-gradient(135deg, #0C0B09 0%, #1A1710 50%, #2A2218 100%)', accent: '#D4A853', tags: ['라이프', '독서', '기록'], icon: '◻', }, { type: 'shopping', title: '개인 쇼핑몰', subtitle: 'MELLOW STUDIO', desc: '감각적인 브랜드 스토리텔링과 미니멀 레이아웃으로 완성한 패션·라이프스타일 쇼핑몰', gradient: 'linear-gradient(135deg, #2A2018 0%, #4A3C2C 50%, #7A6A52 100%)', accent: '#C4A882', tags: ['쇼핑몰', '패션', '라이프'], icon: '◇', }, ]; const processSteps = [ { step: '01', title: '무료 상담', desc: '요구사항 파악 및 방향성 논의', icon: '💬' }, { step: '02', title: '기획', desc: '사이트맵 & 와이어프레임', icon: '📋' }, { step: '03', title: '디자인', desc: 'UI/UX 시안 제작', icon: '🎨' }, { step: '04', title: '개발', desc: '반응형 퍼블리싱 & 기능 구현', icon: '⚙️' }, { step: '05', title: '납품', desc: '검수 완료 후 도메인 배포', icon: '🚀' }, ]; const plans = [ { name: '스타터', price: '20', unit: '만원~', color: '#38bdf8', features: ['5페이지 이내', '반응형 디자인', '기본 SEO 설정', '1개월 유지보수', '3~5영업일 납품'], note: '개인 블로그, 소규모 소개 사이트', }, { name: '비즈니스', price: '100', unit: '만원~', color: '#818cf8', featured: true, features: ['10페이지 이내', '반응형 디자인', '관리자 페이지', 'SEO 최적화', '3개월 유지보수', '1~2주 납품'], note: '기업 사이트, 브랜드 페이지', }, { name: '프리미엄', price: '200', unit: '만원~', color: '#f472b6', features: ['페이지 수 무제한', '맞춤 디자인', '결제/회원 시스템', 'DB 연동', '6개월 유지보수', '일정 협의'], note: '쇼핑몰, SaaS, 복합 시스템', }, ]; const faqs = [ { q: '제작 기간은 얼마나 걸리나요?', a: '규모에 따라 다르지만, 스타터는 3~5영업일, 비즈니스는 1~2주, 프리미엄은 협의 후 결정합니다. 빠른 납품이 필요한 경우 별도 상담해 주세요.', }, { q: '수정은 몇 번까지 가능한가요?', a: '기획 확정 후 디자인 시안 수정은 2회, 개발 완료 후 기능 수정은 유지보수 기간 내 자유롭게 가능합니다. 추가 기능 개발은 별도 견적으로 진행합니다.', }, { q: '도메인과 호스팅도 도와주시나요?', a: '네, 도메인 구매부터 서버 세팅, 배포까지 전 과정을 도와드립니다. Vercel, AWS, 카페24 등 원하시는 플랫폼에 맞춰 배포해 드립니다.', }, ]; function useReveal() { const ref = useRef(null); useEffect(() => { const el = ref.current; if (!el) return; const scroller = (document.querySelector('.main-content') as HTMLElement | null) ?? document.documentElement; const obs = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) { el.classList.add('ws-visible'); obs.disconnect(); } }, { threshold: 0.1, root: scroller === document.documentElement ? null : scroller } ); obs.observe(el); return () => obs.disconnect(); }, []); return ref; } export default function WebsiteServicePage() { const [openFaq, setOpenFaq] = useState(null); const [showTop, setShowTop] = useState(false); useEffect(() => { const scroller = (document.querySelector('.main-content') as HTMLElement | null) ?? document.documentElement; const onScroll = () => setShowTop(scroller.scrollTop > 400); scroller.addEventListener('scroll', onScroll, { passive: true }); return () => scroller.removeEventListener('scroll', onScroll); }, []); const samplesRef = useReveal(); const processRef = useReveal(); const pricingRef = useReveal(); const faqRef = useReveal(); const ctaRef = useReveal(); return (