{isKo?'다양한 산업군의 대기업·공공기관이 삼에스소프트와 함께합니다.':'Leading enterprises and public institutions across industries trust 3ES Soft.'}
{t.references.map((r,i)=>(
{r.name}
{r.industry}
{r.solution}
{r.size} {isKo?'명':'users'}
{r.result}
))}
);
};
// ─── Custom Section ───────────────────────────────────────────────────────────
const CustomSection = ({ t, lang }) => {
const [form, setForm] = React.useState({});
const [sent, setSent] = React.useState(false);
const isKo = lang === 'ko';
const detailFields = isKo ? [
{ k:'company', label:'회사명', ph:'㈜예시', half:true },
{ k:'name', label:'담당자', ph:'홍길동', half:true },
{ k:'phone', label:'연락처', ph:'010-0000-0000', half:true },
{ k:'email', label:'이메일', ph:'you@company.com', half:true },
{ k:'field', label:'개발 분야', ph:'예: 메일 연동, 로그 분석, 정책 자동화', half:false },
{ k:'env', label:'현재 환경 / 연동 대상', ph:'예: 그룹웨어, AD, 기존 보안장비 등', half:false },
{ k:'detail', label:'요구사항 상세', ph:'원하시는 기능과 목적을 자유롭게 적어주세요. 내용에 맞춰 개발 가능 여부와 방향을 회신드립니다.', area:true },
] : [
{ k:'company', label:'Company', ph:'Acme Inc.', half:true },
{ k:'name', label:'Contact', ph:'John Doe', half:true },
{ k:'phone', label:'Phone', ph:'+82-10-0000-0000', half:true },
{ k:'email', label:'Email', ph:'you@company.com', half:true },
{ k:'field', label:'Development Area', ph:'e.g. mail integration, log analysis', half:false },
{ k:'env', label:'Current Environment', ph:'e.g. groupware, AD, existing appliances', half:false },
{ k:'detail', label:'Requirements', ph:'Describe the features and goals. We reply with feasibility and approach.', area:true },
];
const steps = isKo
? [['📝','요구사항 접수','원하는 기능·환경·목적을 남겨주세요.'],['🔎','분석·검토','담당 엔지니어가 실현 가능성과 범위를 검토합니다.'],['🤝','제안·회신','개발 방향, 일정, 예상 비용을 회신드립니다.']]
: [['📝','Submit','Tell us the features, environment, and goals.'],['🔎','Review','Our engineers assess feasibility and scope.'],['🤝','Proposal','We reply with approach, timeline, and estimate.']];
const handleSubmit = async () => {
const msg = `🔧 맞춤 솔루션 개발 문의\n${detailFields.map(f=>f.label+': '+(form[f.k]||'-')).join('\n')}`;
await sendTelegram(msg);
setSent(true);
};
return (
CUSTOM DEVELOPMENT
{t.custom.title}
{t.custom.sub}
{/* How it works */}
{steps.map(([ic,ti,de],i)=>(
STEP {i+1}
{ti}
{de}
))}
{sent ? (
{isKo?'요구사항이 접수되었습니다. 담당 엔지니어가 검토 후 개발 가능 여부와 방향을 회신드립니다.':(lang==='ja'?'ご要望を受け付けました。担当エンジニアが検討のうえご返信します。':'Received. Our engineer will review and reply with feasibility and approach.')}
{isKo?'지금 필요한 보안부터 함께 설계하겠습니다':(lang==='ja'?'今必要なところから一緒に設計します':"Let's start with what you need now")}
{isKo?'제품 선택이 어렵거나 현재 보안 환경을 점검하고 싶다면 삼에스소프트 보안 전문가에게 문의하세요.':'If choosing is hard or you want your current setup reviewed, talk to a 3ES specialist.'}
{isKo?'문의가 접수되었습니다. 빠르게 연락드리겠습니다.':(lang==='ja'?'お問い合わせを受け付けました。速やかにご連絡いたします。':'Your message has been sent. We\'ll get back to you shortly.')}
{isKo?`📮 ${kinds[kind].to} 담당자에게 전달되었습니다.`:(lang==='ja'?`📮 ${kinds[kind].to} 宛に送信されました。`:`📮 Routed to ${kinds[kind].to}.`)}
{ticket &&
{isKo?'문의번호':'Ticket'}: {ticket}
}
):(
<>
{isKo?' 표시는 필수 입력 항목입니다.':(lang==='ja'?' は必須項目です。':' Required fields.')}
up('company',e.target.value)}/>
up('name',e.target.value)}/>
up('phone',e.target.value)}/>
up('email',e.target.value)}/>
{kind==='sales' && (
up('solutionText',e.target.value)}/>
)}
up('_agree',v)} onOpenPolicy={()=>setPage('privacy')}
purpose={isKo?(kind==='tech'?'기술·장애 지원 문의의 접수·처리 및 결과 회신':'제품 도입 상담, 견적 요청, 보안 컨설팅 문의의 접수·처리 및 결과 회신'):undefined}/>
{errs._submit && (
{errs._submit}
)}
>
)}
);
};
// ─── Footer ───────────────────────────────────────────────────────────────────
const Footer = ({ t, setPage, lang }) => {
const isKo = lang === 'ko';
return (
);
};
// ─── Solution Hero Visual — 카테고리별 애니메이션 모티프 ────────────────────────
const SolHeroVisual = ({ solKey, color }) => {
const c = color || '#06B6D4';
const motif = (()=>{
if (['email','spamout','checkout','mailinsight'].includes(solKey)) return 'email';
if (['network','nac','netwitness'].includes(solKey)) return 'network';
if (['data','dbsafer','arch5'].includes(solKey)) return 'data';
if (['privacy','catchsecu'].includes(solKey)) return 'privacy';
if (solKey==='ai') return 'ai';
if (['mdr'].includes(solKey)) return 'radar';
return 'shield'; // system, edr, eset, endpoint, solidstep 등
})();
const ring = ;
const ring2 = ;
const core = {
email: ,
network: {[[105,95],[240,100],[95,205],[238,200],[170,72]].map(([x,y],i)=>())},
data: ,
privacy: {[112,130,148].map((y,i)=>())},
ai: AI{[[130,130],[130,170],[210,130],[210,170],[150,110],[190,110],[150,190],[190,190]].map(([x,y],i)=>{const dx=x===130?-26:x===210?26:0;const dy=y===110?-26:y===190?26:0;return ;})},
radar: ,
shield: ,
}[motif];
return (
);
};
// ─── Solution Detail Page ─────────────────────────────────────────────────────
const SolutionDetailPage = ({ t, solKey, setPage, openQuote, openDemo, lang }) => {
useScrollReveal();
const isKo = lang === 'ko';
const solData = {
system:{
whys:[
{t:isKo?'랜섬웨어 급증':'Ransomware Surge',d:isKo?'2026년 기업 대상 랜섬웨어 공격이 전년 대비 280% 증가했습니다.':'Ransomware attacks on enterprises increased 280% YoY in 2026.'},
{t:isKo?'내부자 위협':'Insider Threats',d:isKo?'전체 보안 사고의 34%는 내부 직원의 실수나 악의적 행위로 발생합니다.':'34% of security incidents are caused by insider threats or errors.'},
{t:isKo?'규정 준수 강화':'Compliance Requirements',d:isKo?'개인정보보호법, ISMS-P 등 규정 미준수 시 막대한 과징금이 부과됩니다.':'Non-compliance with PIPA and ISMS-P results in heavy fines.'},
],
features:[
{icon:'🖥️',t:isKo?'엔드포인트 탐지·대응':'EDR',d:isKo?'AI 기반 이상 행위 탐지 및 격리':'AI-based anomaly detection and isolation'},
{icon:'🔐',t:isKo?'접근 제어':'Access Control',d:isKo?'최소 권한 원칙 기반 접근 정책':'Least privilege access policy management'},
{icon:'🔍',t:isKo?'취약점 분석':'Vulnerability Scan',d:isKo?'정기 스캔 및 패치 자동화':'Periodic scanning and patch automation'},
{icon:'📱',t:'MDM',d:isKo?'기업 모바일 기기 중앙 통제':'Centralized corporate device management'},
],
faqs:[
{q:isKo?'도입 기간은 얼마나 걸리나요?':'How long does deployment take?',a:isKo?'규모에 따라 다르지만, 일반적으로 2~4주 내에 구축 완료됩니다.':'Typically 2–4 weeks depending on scale.'},
{q:isKo?'기존 시스템과 호환되나요?':'Compatible with existing systems?',a:isKo?'대부분의 OS 및 인프라 환경과 호환됩니다. 사전 호환성 검토를 진행합니다.':'Compatible with most OS environments. Pre-deployment compatibility review is conducted.'},
{q:isKo?'클라우드 환경에도 적용 가능한가요?':'Does it work in cloud environments?',a:isKo?'AWS, Azure, GCP 등 주요 클라우드 환경을 모두 지원합니다.':'Supports AWS, Azure, GCP, and other major cloud platforms.'},
],
},
email:{
whys:[
{t:isKo?'이메일 = 최다 침투 경로':'Email = #1 Attack Vector',d:isKo?'전체 사이버 공격의 91%가 이메일로 시작됩니다.':'91% of all cyberattacks begin with email.'},
{t:isKo?'BEC 공격 피해 급증':'BEC Attack Losses Surge',d:isKo?'업무 이메일 침해(BEC)로 인한 피해액이 연간 수조 원에 달합니다.':'Business Email Compromise losses reach trillions of won annually.'},
{t:isKo?'정교해지는 피싱':'Sophisticated Phishing',d:isKo?'AI를 활용한 스피어 피싱으로 기존 필터를 우회하는 공격이 증가 중입니다.':'AI-powered spear phishing increasingly bypasses traditional filters.'},
],
features:[
{icon:'🛑',t:isKo?'APT/스피어피싱 차단':'APT/Spear Phishing Block',d:isKo?'AI 엔진으로 알려지지 않은 위협도 차단':'AI engine blocks unknown threats'},
{icon:'🔒',t:isKo?'이메일 암호화':'Email Encryption',d:isKo?'S/MIME, PGP 기반 전송 구간 암호화':'S/MIME and PGP based transport encryption'},
{icon:'📤',t:'DLP',d:isKo?'민감 정보 외부 전송 자동 차단':'Automatic blocking of sensitive data exfiltration'},
{icon:'✉️',t:isKo?'악성 첨부파일 분석':'Attachment Analysis',d:isKo?'샌드박스 기반 첨부파일 동적 분석':'Sandbox-based dynamic attachment analysis'},
],
faqs:[
{q:isKo?'기존 이메일 서버와 연동되나요?':'Integrates with existing mail servers?',a:isKo?'Exchange, Gmail, Office 365 등 대부분의 메일 서버와 연동됩니다.':'Integrates with Exchange, Gmail, Office 365, and most mail servers.'},
{q:isKo?'정상 메일이 차단되지 않나요?':'Will legitimate emails be blocked?',a:isKo?'머신러닝 기반 정밀 분류로 오탐률을 최소화합니다.':'ML-based precision classification minimizes false positives.'},
],
},
network:{
whys:[
{t:isKo?'내부망 침해 증가':'Internal Network Breaches Rise',d:isKo?'한번 침투한 공격자가 횡이동으로 전체 망을 장악하는 사례가 급증합니다.':'Once inside, attackers use lateral movement to compromise entire networks.'},
{t:isKo?'원격 근무 환경 확대':'Remote Work Expansion',d:isKo?'재택/하이브리드 근무 확대로 기업 네트워크 경계가 무너지고 있습니다.':'Remote/hybrid work has dissolved traditional network perimeters.'},
{t:isKo?'OT/IT 융합 위협':'OT/IT Convergence Threats',d:isKo?'제조업·의료 분야의 OT 시스템이 IT와 연결되며 새로운 공격 표면이 생겼습니다.':'OT systems connected to IT create new attack surfaces.'},
],
features:[
{icon:'🌐',t:'ZTNA',d:isKo?'Zero Trust 네트워크 접근 제어':'Zero Trust Network Access control'},
{icon:'🔎',t:'IDS/IPS',d:isKo?'실시간 침입 탐지 및 차단':'Real-time intrusion detection and prevention'},
{icon:'🏢',t:'NAC',d:isKo?'비인가 단말 접속 차단':'Block unauthorized device connections'},
{icon:'📊',t:isKo?'트래픽 분석':'Traffic Analysis',d:isKo?'AI 기반 이상 트래픽 탐지':'AI-based anomalous traffic detection'},
],
faqs:[
{q:isKo?'Zero Trust 도입이 어렵지 않나요?':'Isn\'t Zero Trust hard to implement?',a:isKo?'삼에스소프트는 단계별 Zero Trust 전환 로드맵을 제공합니다.':'3ES Soft provides a phased Zero Trust transition roadmap.'},
],
},
ai:{
whys:[
{t:isKo?'AI 위협 탐지 한계':'Rule-Based Detection Limits',d:isKo?'기존 규칙 기반 탐지는 알려지지 않은 신종 공격에 무력합니다.':'Traditional rule-based detection is powerless against novel attacks.'},
{t:isKo?'보안 인력 부족':'Security Talent Shortage',d:isKo?'국내 보안 전문 인력 부족 상황에서 AI 자동화가 필수입니다.':'With a shortage of security professionals, AI automation is essential.'},
{t:isKo?'위협 복잡도 증가':'Increasing Threat Complexity',d:isKo?'APT, AI 피싱, 제로데이 등 복잡한 위협에 AI만이 실시간 대응 가능합니다.':'Only AI can respond in real-time to APTs, AI phishing, and zero-days.'},
],
features:[
{icon:'🤖',t:isKo?'AI 이상 탐지':'AI Anomaly Detection',d:isKo?'행동 기반 ML로 미지의 위협 탐지':'Behavior-based ML detects unknown threats'},
{icon:'⚡',t:isKo?'자동 위협 대응':'Automated Response',d:isKo?'공격 탐지 즉시 자동 격리·차단':'Instant automatic isolation on detection'},
{icon:'📈',t:'AI SIEM',d:isKo?'모든 로그를 AI로 통합 분석':'AI-powered unified log analysis'},
{icon:'🔮',t:isKo?'위협 인텔리전스':'Threat Intelligence',d:isKo?'글로벌 위협 정보 실시간 연동':'Real-time global threat intelligence'},
],
faqs:[
{q:isKo?'AI 보안은 오탐이 많지 않나요?':'Does AI security have high false positives?',a:isKo?'지속 학습으로 오탐률을 5% 이하로 유지합니다.':'Continuous learning keeps false positives below 5%.'},
{q:isKo?'데이터 학습에 우리 데이터가 사용되나요?':'Is our data used for AI training?',a:isKo?'고객 데이터는 외부 학습에 절대 사용하지 않습니다. 온프레미스 배포로 데이터 주권을 보장합니다.':'Customer data is never used for external training. On-premise deployment guarantees data sovereignty.'},
],
},
privacy:{
whys:[
{t:isKo?'국외 데이터 이전 위험':'Cross-Border Data Risk',d:isKo?'구글폼 데이터는 해외 서버에 저장됩니다. 개인정보보호법 위반 시 매출의 3% 과징금.':'Google Forms store data on overseas servers. PIPA violations result in fines up to 3% of revenue.'},
{t:isKo?'동의서 미비':'Insufficient Consent Docs',d:isKo?'수기 동의서·엑셀 관리는 법적 효력이 불충분합니다. 감사 시 즉각 문제가 됩니다.':'Handwritten consent forms and Excel management lack legal validity.'},
{t:isKo?'파기 의무 이행 불가':'Cannot Execute Data Disposal',d:isKo?'보유기간 초과 후 수동 파기는 사실상 불가능합니다. 미파기 시 과태료 3,000만원.':'Manual disposal after retention periods is practically impossible. Non-disposal fines reach ₩30M.'},
],
features:[
{icon:'📝',t:isKo?'동의서 자동 생성':'Auto Consent Forms',d:isKo?'법적 요건을 충족하는 동의서를 클릭 몇 번으로 즉시 생성':'Generate legally compliant consent forms in a few clicks'},
{icon:'🔐',t:isKo?'AES-256 암호화':'AES-256 Encryption',d:isKo?'모든 개인정보를 국내 서버에 암호화 저장':'All personal data encrypted and stored on domestic servers'},
{icon:'⏰',t:isKo?'보유기간 자동 파기':'Auto Data Disposal',d:isKo?'보유기간 도래 시 자동 파기 및 이력 보관':'Automatic disposal and archival when retention period ends'},
{icon:'📊',t:isKo?'실시간 모니터링':'Real-time Monitoring',d:isKo?'수집 현황·파기 예정·동의 이력 대시보드':'Dashboard for collection status, disposal schedule, and consent history'},
],
faqs:[
{q:isKo?'구글폼 데이터 마이그레이션이 가능한가요?':'Can existing Google Forms data be migrated?',a:isKo?'네, 기존 구글폼·네이버폼 데이터를 안전하게 이관해드립니다.':'Yes, we safely migrate your existing Google Forms and Naver Forms data.'},
{q:isKo?'공공기관도 도입 가능한가요?':'Is it available for public institutions?',a:isKo?'네, 행안부 개인정보보호 지침 완전 준수. 공공기관 납품 실적 보유.':'Yes, full MOIS compliance with proven public institution track record.'},
{q:isKo?'법령 개정 시 자동 대응되나요?':'Does it auto-update for regulation changes?',a:isKo?'네, 개인정보보호법 개정 시 자동 업데이트됩니다.':'Yes, it automatically updates when PIPA is amended.'},
],
},
edr:{
whys:[
{t:isKo?'엔드포인트가 최전선':'Endpoints Are the Front Line',d:isKo?'랜섬웨어·악성코드 공격의 대부분은 사용자 PC와 서버 등 엔드포인트에서 시작됩니다.':'Most ransomware and malware attacks begin at endpoints such as user PCs and servers.'},
{t:isKo?'알려지지 않은 위협':'Unknown Threats',d:isKo?'백신만으로는 탐지되지 않는 신종·변종 위협에 대한 행위 기반 탐지가 필요합니다.':'Behavior-based detection is needed for novel and variant threats that antivirus alone misses.'},
{t:isKo?'사고 대응 가시성 부족':'Limited Incident Visibility',d:isKo?'침해 발생 시 경로 추적과 원인 분석이 어려워 확산을 막기 어렵습니다.':'Without trace and root-cause visibility, containing a breach is difficult.'},
],
features:[
{icon:'🖥️',t:isKo?'엔드포인트 위협 탐지':'Endpoint Detection',d:isKo?'프로세스·파일·네트워크 행위를 실시간 모니터링합니다.':'Real-time monitoring of process, file, and network behavior.'},
{icon:'⚡',t:isKo?'자동 대응':'Automated Response',d:isKo?'위협 탐지 시 격리·차단·롤백을 수행합니다.':'Isolate, block, and roll back on detection.'},
{icon:'🔍',t:isKo?'사고 추적':'Incident Tracing',d:isKo?'공격 경로와 영향 범위를 타임라인으로 분석합니다.':'Analyze attack paths and impact on a timeline.'},
{icon:'📊',t:isKo?'위협 인텔리전스':'Threat Intelligence',d:isKo?'위협 정보 연동으로 탐지 정확도를 높입니다.':'Improves detection accuracy via threat intelligence.'},
],
faqs:[
{q:isKo?'기존 백신과 함께 사용할 수 있나요?':'Can it run alongside existing antivirus?',a:isKo?'네, 백신과 병행하여 행위 기반 탐지·대응 레이어로 동작합니다.':'Yes, it operates as a behavior-based detection layer alongside antivirus.'},
{q:isKo?'도입 후 운영 지원은 어떻게 되나요?':'What about post-deployment support?',a:isKo?'제조사와 삼에스소프트가 협력하여 정책 설계·운영·사고 대응을 지속 지원합니다.':'The manufacturer and 3ES Soft collaborate on policy design, operations, and incident response.'},
],
},
mdr:{
whys:[
{t:isKo?'보안 인력 부족':'Security Staffing Gap',d:isKo?'24/7 위협 모니터링과 대응을 자체 인력만으로 운영하기 어렵습니다.':'Running 24/7 threat monitoring and response with in-house staff alone is hard.'},
{t:isKo?'탐지만으로는 부족':'Detection Alone Isn\'t Enough',d:isKo?'경보가 쌓여도 분석·대응이 늦으면 피해로 이어집니다.':'Alerts pile up; slow analysis and response lead to damage.'},
{t:isKo?'전문 분석 필요':'Expert Analysis Needed',d:isKo?'정탐·오탐 판별과 대응 판단에는 전문 분석 역량이 필요합니다.':'Distinguishing true/false positives and deciding response requires expertise.'},
],
features:[
{icon:'🛰️',t:isKo?'24/7 보안 관제':'24/7 Monitoring',d:isKo?'전문 분석가가 상시 위협을 모니터링합니다.':'Analysts monitor threats around the clock.'},
{icon:'🧭',t:isKo?'위협 헌팅':'Threat Hunting',d:isKo?'잠재 위협을 선제적으로 탐색합니다.':'Proactively hunts for latent threats.'},
{icon:'🚨',t:isKo?'사고 대응':'Incident Response',d:isKo?'탐지부터 대응·복구까지 전 과정을 지원합니다.':'Supports the full detect–respond–recover cycle.'},
{icon:'📑',t:isKo?'정기 리포트':'Regular Reporting',d:isKo?'보안 현황과 개선 권고를 정기 보고합니다.':'Periodic reports on posture and recommendations.'},
],
faqs:[
{q:isKo?'자체 보안팀이 없어도 되나요?':'Do we need our own security team?',a:isKo?'네, 전문 관제팀이 모니터링·대응을 대행하므로 소규모 조직도 운영할 수 있습니다.':'No — a managed team handles monitoring and response, suitable even for small teams.'},
{q:isKo?'EDR과 함께 운영할 수 있나요?':'Can it run with EDR?',a:isKo?'네, EDR 등 보안 솔루션과 연계해 관제 효과를 높입니다.':'Yes, it integrates with EDR and other tools to strengthen managed detection.'},
],
},
};
const sol = t.solutions.items.find(s=>s.key===solKey);
const data = solData[solKey];
const [openFaq, setOpenFaq] = React.useState(null);
if (!sol||!data) return null;
return (
setPage('home')}> {isKo?'홈으로':'Back to Home'}
{solIcons[solKey]} {sol.eng}
{sol.title}
{sol.desc}
{/* 왜 필요한가 */}
{isKo?'이 솔루션이 필요한 이유':'Why This Solution'}
{data.whys.map((w,i)=>(
0{i+1}
{w.t}
{w.d}
))}
{/* 가격 가이드 */}
{isKo?'가격 가이드':'Pricing Guide'}
💰 {isKo?`${sol.title} 가격 범위`:`${sol.title} Price Range`}
{/* 도입 시나리오 (해당 솔루션) */}
{/* 조달 등재 정보 */}
{window.hasG2B && window.hasG2B(solKey) && (
)}
{isKo?'도입 문의':'Get Started'}
{isKo?`${sol.title} 도입을 검토 중이신가요?`:`Considering ${sol.title}?`}
{isKo?'보안 전문가가 무료로 환경을 분석하고 최적의 솔루션을 제안합니다.':'Our security experts will analyze your environment and propose the optimal solution for free.'}
);
};
const AdminPage = ({ t, lang, setPage }) => {
const [tab, setTab] = React.useState('dashboard');
const isKo = lang === 'ko';
// ⚠️ 비밀번호를 프론트에 두지 않습니다. 서버 인증(세션) 도입 전까지 화면 자체를 차단합니다.
const adminEnabled = !!(window.SITE_CONFIG && window.SITE_CONFIG.SHOW_ADMIN);
const [authed, setAuthed] = React.useState(false);
const [pw, setPw] = React.useState('');
const [pwErr, setPwErr] = React.useState(false);
const [inquiries, setInquiries] = React.useState(() => LS.get('3es_inquiries', [
{id:1,company:'삼성전자',name:'김민수',date:'2026.05.04',type:'이메일 보안',status:'new',message:'이메일 보안 솔루션 도입 검토 중입니다.'},
{id:2,company:'LG화학',name:'이지현',date:'2026.05.03',type:'시스템 보안',status:'pending',message:'EDR 솔루션 견적 요청드립니다.'},
{id:3,company:'현대모비스',name:'박준혁',date:'2026.05.02',type:'AI 보안',status:'done',message:'AI SIEM 구축 문의드립니다.'},
]));
const [newsItems, setNewsItems] = React.useState(() => LS.get('3es_news', []));
const [newNews, setNewNews] = React.useState({title:'',cat:'보안 뉴스',desc:''});
const [newSol, setNewSol] = React.useState({title:'',desc:'',tags:''});
const [solutions, setSolutions] = React.useState(() => LS.get('3es_solutions', []));
const [uploadResult, setUploadResult] = React.useState('');
const [uploading, setUploading] = React.useState(false);
const [draft, setDraft] = React.useState(null);
const [imgPrompt, setImgPrompt] = React.useState('');
const [genPages, setGenPages] = React.useState(() => LS.get('3es_gen_pages', []));
const fileInputRef = React.useRef(null);
const statusMap = {
ai: {label:isKo?'AI 상담':'AI chat', cls:'ai'},
new: {label:isKo?'상담 접수':'Received', cls:'new'},
kakao: {label:isKo?'카카오톡 전환':'KakaoTalk',cls:'kakao'},
pending: {label:isKo?'담당자 확인':'In review', cls:'pending'},
done: {label:isKo?'상담 완료':'Closed', cls:'done'},
};
const updateStatus = (id, status) => {
const updated = inquiries.map(q => q.id===id ? {...q,status} : q);
setInquiries(updated);
LS.set('3es_inquiries', updated);
};
const addNews = () => {
if (!newNews.title) return;
const item = {...newNews, id:Date.now(), date:new Date().toLocaleDateString('ko-KR').replace(/\. /g,'.').replace('.',''), hot:false};
const updated = [item, ...newsItems];
setNewsItems(updated);
LS.set('3es_news', updated);
setNewNews({title:'',cat:'보안 뉴스',desc:''});
};
const deleteNews = (id) => {
const updated = newsItems.filter(n=>n.id!==id);
setNewsItems(updated);
LS.set('3es_news', updated);
};
const addSolution = () => {
if (!newSol.title) return;
const item = {...newSol, id:Date.now(), tags:newSol.tags.split(',').map(t=>t.trim())};
const updated = [item, ...solutions];
setSolutions(updated);
LS.set('3es_solutions', updated);
setNewSol({title:'',desc:'',tags:''});
};
const handleFileUpload = async (e) => {
const file = e.target.files[0];
if (!file) return;
setUploading(true);
setUploadResult(''); setDraft(null);
try {
const raw = await window.claude.complete({
messages:[{role:'user', content:`제안서 파일명: "${file.name}"\n\n이 파일명과 보안 업계 맥락을 근거로, B2B 보안 솔루션 상세 페이지 초안을 JSON으로만 출력하세요. 설명 문장이나 코드펜스 없이 순수 JSON만 반환합니다.\n\n{\n "product":"제품명",\n "tagline":"한 줄 정의(20자 내외)",\n "category":"email|system|network|endpoint|data|privacy|ai 중 하나",\n "accent":"#RRGGBB",\n "summary":["3줄 요약1","2","3"],\n "problems":[{"t":"문제 제목","d":"설명 1~2문장"}],\n "features":[{"t":"기능명","d":"설명 1문장"}],\n "benefits":[{"t":"효과 제목","d":"설명 1문장"}],\n "faqs":[{"q":"질문","a":"답변"}],\n "imagePrompt":"제품 히어로 비주얼용 이미지 생성 프롬프트(영문)"\n}\n\n규칙: problems 3개, features 4~6개, benefits 3~4개, faqs 4개. 과장 표현("100% 차단","완전 방어") 금지. 근거 없는 수치·인증번호 금지. 한국어로 작성.`}]
});
let json = null;
try { json = JSON.parse(raw.replace(/^[\s\S]*?\{/, '{').replace(/\}[^}]*$/, '}')); } catch {}
if (json && json.product) {
setDraft({ ...json, file:file.name, id:Date.now() });
setImgPrompt(json.imagePrompt || '');
}
const reply = (json && json.product) ? '' : await window.claude.complete({
messages:[{role:'user', content:`You are a security product documentation expert. The user uploaded a file named "${file.name}". Based on the filename and context, generate a professional product description for a B2B IT security company website. Include: 1) Product overview (2-3 sentences), 2) Key features (4 bullet points), 3) Target audience, 4) Expected benefits. Keep it concise and professional. Respond in Korean if the filename looks Korean, otherwise in English.`}]
});
setUploadResult(reply);
} catch {
setUploadResult(isKo?'AI 요약 생성 실패. 다시 시도해 주세요.':'AI summary generation failed. Please try again.');
}
setUploading(false);
};
const publishDraft = () => {
if (!draft) return;
const page = { ...draft, imagePrompt:imgPrompt, createdAt:new Date().toISOString(), status:'draft' };
const updated = [page, ...genPages];
setGenPages(updated); LS.set('3es_gen_pages', updated);
const sol = { id:page.id, title:page.product, desc:page.tagline, tags:(page.features||[]).slice(0,3).map(f=>f.t), color:page.accent, category:page.category, generated:true };
const su = [sol, ...solutions];
setSolutions(su); LS.set('3es_solutions', su);
setDraft(null); setUploadResult(''); setImgPrompt('');
setTab('pages');
};
const removePage = (id) => {
const u = genPages.filter(x=>x.id!==id); setGenPages(u); LS.set('3es_gen_pages', u);
const s = solutions.filter(x=>x.id!==id); setSolutions(s); LS.set('3es_solutions', s);
};
const navItems = [
{key:'dashboard',label:isKo?'대시보드':'Dashboard',icon:'📊'},
{key:'inquiries',label:isKo?'문의 관리':'Inquiries',icon:'📬'},
{key:'solutions',label:isKo?'솔루션 관리':'Solutions',icon:'🛡️'},
{key:'news',label:isKo?'뉴스 관리':'News',icon:'📰'},
{key:'upload',label:isKo?'파일 업로드':'File Upload',icon:'📎'},
{key:'pages',label:isKo?'생성 페이지':'Generated Pages',icon:'✨'},
{key:'settings',label:isKo?'알림 설정':'Notifications',icon:'⚙️'},
];
if (!adminEnabled) {
return (
{isKo?'관리자 화면은 현재 사용할 수 없습니다':'The admin console is currently unavailable'}
{isKo?'서버 인증 적용 전까지 접근이 차단되어 있습니다. 문의 내역은 담당자 메일로 전달됩니다.'
:'Access is disabled until server-side authentication is in place. Inquiries are delivered by email.'}
🤖 {isKo?'AI 생성 제품 설명':'AI-Generated Product Description'}
{uploadResult}
{isKo?'구조화 초안 생성에 실패했습니다. 다시 업로드하면 재시도합니다.':'Structured draft failed. Re-upload to retry.'}
)}
)}
{/* GENERATED PAGES */}
{tab==='pages'&&(
<>
✨ {isKo?'AI 생성 제품 페이지':'AI-Generated Product Pages'}
{isKo?'파일 업로드 탭에서 제안서를 올리면 AI가 구조화된 초안을 만들고, 여기에 제품 페이지로 등록됩니다. 등록된 페이지는 솔루션 관리 목록에도 함께 반영됩니다.':'Upload a proposal in the File Upload tab — AI builds a structured draft that lands here as a product page and is reflected in the solutions list.'}
{isKo?<>홈페이지에서 접수된 문의는 서버(api/lead.php)를 거쳐 담당자 이메일로 발송됩니다.
받는 주소와 보내는 주소는 서버의 api/config.php 파일에서 관리합니다.>
:<>Inquiries are relayed by the server (api/lead.php) and delivered by email.
Sender and recipient addresses are configured in api/config.php on the server.>}
{isKo?'주소를 바꾸려면 서버의 api/config.php 를 수정한 뒤 업로드하세요. 이 화면에서는 현재 설정만 확인할 수 있습니다.'
:'To change these, edit api/config.php on the server and re-upload. This screen is read-only.'}
)}
);
};
// ─── Support Page (고객지원) ──────────────────────────────────────────────────
const SupportPage = ({ t, lang, setPage }) => {
const isKo = lang === 'ko';
React.useEffect(()=>{ const els=document.querySelectorAll('.reveal'); const o=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting)e.target.classList.add('revealed')}),{threshold:0.1}); els.forEach(el=>o.observe(el)); return ()=>o.disconnect(); });
const steps = isKo ? [
{ n:'01', ic:'📥', t:'접수', d:'전화 또는 이메일로 장애·문의를 접수합니다. 전담 라우팅으로 담당 엔지니어에게 즉시 배정됩니다.' },
{ n:'02', ic:'🔎', t:'1차 진단', d:'접수 즉시 원격으로 상황을 진단하고 긴급도를 분류합니다.' },
{ n:'03', ic:'🛠️', t:'대응·조치', d:'경미한 건은 즉시 처리, 필요 시 개발사와 협업하여 근본 원인을 해결합니다.' },
{ n:'04', ic:'🔁', t:'임시 대체·복구', d:'복구가 길어질 경우 중간 대체 방안을 먼저 제공해 업무 공백을 최소화합니다.' },
{ n:'05', ic:'✅', t:'완료·리포트', d:'처리 결과와 재발 방지 방안을 리포트로 정리해 전달합니다.' },
] : [
{ n:'01', ic:'📥', t:'Intake', d:'Report issues via phone or email. Dedicated routing assigns your engineer immediately.' },
{ n:'02', ic:'🔎', t:'Triage', d:'We diagnose remotely on receipt and classify urgency.' },
{ n:'03', ic:'🛠️', t:'Response', d:'Minor issues resolved instantly; we collaborate with vendors for root-cause fixes.' },
{ n:'04', ic:'🔁', t:'Interim & Recovery', d:'If recovery takes longer, we provide an interim workaround first to minimize downtime.' },
{ n:'05', ic:'✅', t:'Report', d:'We deliver a report on the resolution and prevention measures.' },
];
const sla = isKo ? [
{ t:'경미한 장애', d:'원격으로 즉시 ~ 2–3시간 내 대응', c:'#0F9650' },
{ t:'중대 장애', d:'하루 ~ 이틀 내 솔루션 확보 및 복구', c:'#F59E0B' },
{ t:'서버 교체 필요', d:'약 1일 ~ 3일 (중간 대체 방안 제공)', c:'#2563EB' },
{ t:'현장 출동', d:'24시간 365일 긴급 출동', c:'#EF4444' },
{ t:'긴급 보안 패치', d:'상시 · 확인 즉시 적용', c:'#7C3AED' },
] : [
{ t:'Minor Issue', d:'Remote, instant ~ within 2–3 hours', c:'#0F9650' },
{ t:'Critical Issue', d:'Solution secured & recovered within 1–2 days', c:'#F59E0B' },
{ t:'Server Replacement', d:'~1 to 3 days (interim workaround provided)', c:'#2563EB' },
{ t:'On-site Dispatch', d:'24/7/365 emergency dispatch', c:'#EF4444' },
{ t:'Urgent Security Patch', d:'Always-on · applied on confirmation', c:'#7C3AED' },
];
return (
CUSTOMER SUPPORT
{isKo?'고객지원':'Customer Support'}
{isKo?'접수부터 복구까지, 명확한 프로세스로 신속하게 대응합니다. 24시간 365일 긴급 출동과 상시 보안 패치를 지원합니다.':'From intake to recovery, we respond quickly with a clear process — including 24/7/365 emergency dispatch and always-on security patching.'}
{/* Support flow diagram */}
SUPPORT PROCESS
{isKo?'지원 처리 프로세스':'Support Process'}
{isKo?'모든 문의는 아래 단계를 따라 투명하게 처리됩니다.':'Every request is handled transparently through these steps.'}
{steps.map((s,i)=>(
{s.n}
{s.t}
{s.d}
{i›
}
))}
{/* Monitoring team + SLA */}
{/* Monitoring visual */}
24/7 MONITORING
{isKo?'전담 모니터링 팀':'Dedicated Monitoring Team'}
{isKo?'전문 엔지니어가 실시간으로 고객 시스템을 모니터링하고, 이상 징후 발생 시 즉시 대응합니다.':'Expert engineers monitor your systems in real time and respond immediately to anomalies.'}
{isKo?<>수신부터 발신, 분석까지 이메일 보안의 전 주기를 책임집니다>:<>From inbound to outbound to intelligence, the full email security lifecycle>}
{isKo?'삼에스소프트는 들어오는 위협 차단(SpamOut), 나가는 정보 통제(CheckOut), 전체 메일 원본 보존(Arch5)까지 하나의 라인업으로 제공합니다.':'3ES Soft delivers a single lineup: block inbound threats (SpamOut), control outbound data (CheckOut), and preserve all mail (Arch5).'}