TeXray-backup / index.html
openfree's picture
Update index.html
eb156b6 verified
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TeXray β€” AI κΈ€ νŒλ³„κΈ°</title>
<link href="https://fonts.googleapis.com/css2?family=Sora:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&family=Noto+Sans+KR:wght@300;400;500;700;900&display=swap" rel="stylesheet">
<style>
*{margin:0;padding:0;box-sizing:border-box;}
:root{
--bg:#f8f9fc;--bg-deep:#f0f2f8;--surface:#ffffff;--surface-alt:#f5f6fa;
--border:#e2e5f0;--border-hover:#c7cce0;
--shadow-sm:0 1px 3px rgba(15,23,42,0.04),0 1px 2px rgba(15,23,42,0.06);
--shadow:0 4px 16px rgba(15,23,42,0.06),0 1px 3px rgba(15,23,42,0.08);
--shadow-lg:0 12px 40px rgba(15,23,42,0.08),0 4px 12px rgba(15,23,42,0.06);
--text:#0f172a;--text-sec:#475569;--text-muted:#94a3b8;
--accent:#6366f1;--accent-light:#818cf8;--accent-bg:rgba(99,102,241,0.06);
--teal:#0d9488;--teal-bg:rgba(13,148,136,0.06);
--rose:#e11d48;--rose-bg:rgba(225,29,72,0.06);
--amber:#d97706;--amber-bg:rgba(217,119,6,0.06);
--green:#16a34a;
--radius:16px;--radius-sm:10px;--radius-xs:6px;
--font-display:'Sora','Noto Sans KR',sans-serif;
--font-body:'Noto Sans KR','Sora',sans-serif;
--font-mono:'JetBrains Mono',monospace;
--tr:0.25s cubic-bezier(0.4,0,0.2,1);
}
html{scroll-behavior:smooth;}
body{font-family:var(--font-body);background:var(--bg);color:var(--text);min-height:100vh;overflow-x:hidden;-webkit-font-smoothing:antialiased;}
::-webkit-scrollbar{width:6px;}::-webkit-scrollbar-track{background:transparent;}
::-webkit-scrollbar-thumb{background:rgba(99,102,241,0.2);border-radius:10px;}
::selection{background:rgba(99,102,241,0.15);}
.bg-pattern{position:fixed;inset:0;z-index:0;pointer-events:none;
background:radial-gradient(ellipse 80% 50% at 20% 10%,rgba(99,102,241,0.04),transparent 50%),
radial-gradient(ellipse 60% 40% at 80% 90%,rgba(13,148,136,0.03),transparent 50%);}
.app-wrapper{position:relative;z-index:1;display:flex;flex-direction:column;min-height:100vh;max-width:900px;margin:0 auto;padding:24px 24px 48px;}
/* HEADER */
.header{text-align:center;padding:40px 0 32px;animation:fadeIn .8s ease-out;}
@keyframes fadeIn{from{opacity:0;transform:translateY(-16px)}to{opacity:1;transform:translateY(0)}}
.header-eyebrow{font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:5px;text-transform:uppercase;color:var(--accent);margin-bottom:10px;}
.header-title{font-family:var(--font-display);font-size:48px;font-weight:800;line-height:1.15;letter-spacing:-1.5px;margin-bottom:12px;}
.gradient-text{background:linear-gradient(135deg,#6366f1,#0ea5e9 40%,#0d9488 70%,#6366f1);background-size:200% 200%;-webkit-background-clip:text;-webkit-text-fill-color:transparent;animation:shimmer 6s ease-in-out infinite;}
@keyframes shimmer{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
.header-sub{font-size:14px;color:var(--text-sec);line-height:1.7;max-width:540px;margin:0 auto 18px;}
.header-sub b{color:var(--text);font-weight:600;}
.pill-row{display:flex;gap:6px;justify-content:center;flex-wrap:wrap;animation:fadeUp .8s .2s ease-out both;}
@keyframes fadeUp{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
.pill{padding:4px 12px;background:var(--surface);border:1px solid var(--border);border-radius:20px;font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--text-muted);transition:var(--tr);box-shadow:var(--shadow-sm);}
.pill:hover{border-color:var(--accent);color:var(--accent);}
/* NAV */
.nav{display:flex;gap:4px;background:var(--surface);border:1px solid var(--border);border-radius:14px;padding:4px;margin-bottom:24px;position:sticky;top:12px;z-index:100;box-shadow:var(--shadow);animation:fadeUp .8s .3s ease-out both;}
.nav-item{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;border-radius:var(--radius-sm);cursor:pointer;font-size:13px;font-weight:600;color:var(--text-muted);transition:var(--tr);user-select:none;}
.nav-item:hover{color:var(--text-sec);background:var(--surface-alt);}
.nav-item.active{color:#fff;background:linear-gradient(135deg,#6366f1,#4f46e5);box-shadow:0 4px 16px rgba(99,102,241,0.3),inset 0 1px 0 rgba(255,255,255,0.15);}
.nav-icon{font-size:14px;}
/* PANELS */
.panel{display:none;animation:panelIn .4s ease-out;}.panel.active{display:block;}
@keyframes panelIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}
/* CARD */
.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:28px;margin-bottom:20px;box-shadow:var(--shadow-sm);transition:all .3s;}
.card:hover{box-shadow:var(--shadow);border-color:var(--border-hover);}
.card-header{display:flex;align-items:center;gap:12px;margin-bottom:6px;}
.card-icon{width:38px;height:38px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0;}
.card-icon.purple{background:var(--accent-bg);border:1px solid rgba(99,102,241,0.15);}
.card-icon.teal{background:var(--teal-bg);border:1px solid rgba(13,148,136,0.15);}
.card-icon.amber{background:var(--amber-bg);border:1px solid rgba(217,119,6,0.15);}
.card-title{font-family:var(--font-display);font-size:17px;font-weight:700;}
.card-desc{font-size:12.5px;color:var(--text-muted);line-height:1.65;margin-bottom:18px;padding-left:50px;}
/* TEXTAREA */
.input-group{margin-bottom:18px;}.textarea-wrap{position:relative;}
textarea{width:100%;min-height:200px;padding:18px 20px 32px;background:var(--surface-alt);border:1.5px solid var(--border);border-radius:var(--radius-sm);color:var(--text);font-family:var(--font-body);font-size:14px;line-height:1.8;resize:vertical;outline:none;transition:border-color .3s,box-shadow .3s;}
textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(99,102,241,0.1);}
textarea::placeholder{color:var(--text-muted);font-size:13px;}
.char-counter{position:absolute;bottom:10px;right:16px;font-family:var(--font-mono);font-size:10px;color:var(--text-muted);background:var(--surface);padding:2px 8px;border-radius:4px;pointer-events:none;}
/* BUTTONS */
.btn-group{display:flex;gap:8px;flex-wrap:wrap;align-items:center;}
.btn{padding:11px 22px;border:none;border-radius:var(--radius-sm);cursor:pointer;font-family:var(--font-body);font-weight:600;font-size:13px;transition:all .25s;letter-spacing:0.2px;}
.btn-primary{background:linear-gradient(135deg,#6366f1,#4f46e5);color:#fff;box-shadow:0 4px 16px rgba(99,102,241,0.25);}
.btn-primary:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(99,102,241,0.3);}
.btn-primary:active{transform:translateY(0);}.btn-primary:disabled{opacity:0.45;cursor:not-allowed;transform:none!important;}
.btn-ghost{padding:9px 16px;background:var(--surface);color:var(--text-muted);border:1px solid var(--border);font-size:12px;border-radius:var(--radius-xs);}
.btn-ghost:hover{background:var(--accent-bg);color:var(--accent);border-color:rgba(99,102,241,0.3);}
/* LOADING */
.loader{display:none;text-align:center;padding:48px 24px;}.loader.active{display:block;}
.loader-ring{width:44px;height:44px;border:3px solid rgba(99,102,241,0.12);border-top-color:var(--accent);border-radius:50%;animation:spin .9s linear infinite;margin:0 auto 16px;position:relative;}
.loader-ring::after{content:'';position:absolute;inset:4px;border:2px solid transparent;border-top-color:var(--teal);border-radius:50%;animation:spin 1.4s linear infinite reverse;}
@keyframes spin{to{transform:rotate(360deg)}}
.loader-text{font-size:13px;color:var(--text-sec);animation:breathe 2s ease-in-out infinite;}
.loader-dots{display:inline-flex;gap:4px;margin-top:8px;}
.loader-dots span{width:4px;height:4px;border-radius:50%;background:var(--accent);opacity:0.3;animation:dotP 1.2s ease-in-out infinite;}
.loader-dots span:nth-child(2){animation-delay:.15s;}.loader-dots span:nth-child(3){animation-delay:.3s;}
@keyframes dotP{0%,100%{opacity:0.2;transform:scale(0.8)}50%{opacity:1;transform:scale(1.2)}}
@keyframes breathe{0%,100%{opacity:1}50%{opacity:0.5}}
/* RESULT */
.result-html{border-radius:var(--radius);overflow:hidden;margin-top:16px;animation:rIn .5s ease-out;}
.result-html:empty{display:none;}
@keyframes rIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}
.log-box{background:var(--surface-alt);border:1px solid var(--border);border-radius:var(--radius-xs);padding:14px 18px;font-family:var(--font-mono);font-size:11px;color:var(--text-muted);line-height:1.7;white-space:pre-wrap;margin-top:10px;}
.log-box:empty{display:none;}
/* FOOTER */
.footer{text-align:center;margin-top:48px;padding:24px 0;border-top:1px solid var(--border);}
.footer-brand{font-family:var(--font-display);font-size:13px;font-weight:600;color:var(--text-muted);margin-bottom:6px;}
.footer-tech{font-family:var(--font-mono);font-size:10px;color:var(--text-muted);opacity:0.6;letter-spacing:1px;}
.footer-line{width:40px;height:2px;background:linear-gradient(90deg,transparent,var(--accent),transparent);margin:10px auto;border-radius:2px;opacity:0.4;}
/* FILE */
.btn-file{position:relative;overflow:hidden;}.btn-file input[type=file]{position:absolute;inset:0;opacity:0;cursor:pointer;font-size:0;}
.file-status{display:none;padding:8px 14px;background:var(--accent-bg);border:1px solid rgba(99,102,241,0.15);border-radius:var(--radius-sm);margin-top:10px;font-size:11px;color:var(--accent);align-items:center;gap:8px;}
.file-status.active{display:flex;}
.file-status .fname{font-weight:600;color:var(--text);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.file-status .fsize{color:var(--text-muted);font-family:var(--font-mono);font-size:10px;}
.file-status .fclose{cursor:pointer;color:var(--rose);margin-left:auto;font-size:13px;padding:0 4px;}
.file-loading{display:inline-block;width:12px;height:12px;border:2px solid var(--accent);border-top-color:transparent;border-radius:50%;animation:spin .6s linear infinite;}
/* ═══ COMPETITION TAB ═══ */
@keyframes cmpUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}
@keyframes cmpBar{from{width:0%}}
@keyframes cmpGlow{0%,100%{box-shadow:0 0 0 2px rgba(99,102,241,0.08)}50%{box-shadow:0 0 0 4px rgba(99,102,241,0.15)}}
@keyframes cmpPulse{0%,100%{transform:scale(1)}50%{transform:scale(1.03)}}
.cmp-hero{background:linear-gradient(135deg,#4f46e5,#6366f1 40%,#818cf8 70%,#a5b4fc);border-radius:var(--radius);padding:32px 28px;margin-bottom:16px;position:relative;overflow:hidden;animation:cmpUp .6s ease-out;}
.cmp-hero::before{content:'';position:absolute;top:-60%;right:-20%;width:50%;height:200%;background:radial-gradient(circle,rgba(255,255,255,0.08),transparent 60%);transform:rotate(20deg);}
.cmp-hero-title{font-family:var(--font-display);font-size:24px;font-weight:900;color:#fff;position:relative;}
.cmp-hero-sub{font-size:12px;color:rgba(255,255,255,0.8);line-height:1.7;margin-top:6px;position:relative;}
.cmp-hero-badge{display:inline-block;background:rgba(255,255,255,0.2);backdrop-filter:blur(8px);color:#fff;font-size:10px;font-weight:800;padding:5px 14px;border-radius:20px;margin-top:10px;animation:cmpPulse 2.5s ease-in-out infinite;position:relative;border:1px solid rgba(255,255,255,0.25);}
.cmp-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:16px;animation:cmpUp .8s .1s ease-out both;}
.cmp-stat{background:var(--surface);border:1.5px solid var(--border);border-radius:var(--radius-sm);padding:16px 8px;text-align:center;transition:all .3s;box-shadow:var(--shadow-sm);}
.cmp-stat:hover{transform:translateY(-3px);border-color:var(--accent);box-shadow:var(--shadow);}
.cmp-stat-num{font-size:26px;font-weight:900;font-family:var(--font-display);color:var(--accent);}
.cmp-stat-label{font-size:9px;color:var(--text-muted);margin-top:3px;font-weight:600;line-height:1.4;}
.cmp-tw{animation:cmpUp .9s .2s ease-out both;margin-bottom:16px;overflow-x:auto;border-radius:var(--radius-sm);box-shadow:var(--shadow);}
.cmp-t{width:100%;border-collapse:collapse;background:var(--surface);}
.cmp-t thead th{background:linear-gradient(135deg,#4f46e5,#6366f1);color:#fff;padding:11px 7px;font-size:10px;font-weight:700;text-align:center;white-space:nowrap;}
.cmp-t thead th:first-child{text-align:left;padding-left:14px;min-width:120px;}
.cmp-t thead th.co{background:linear-gradient(135deg,#dc2626,#ef4444);font-size:11px;}
.cmp-t tbody td{padding:9px 7px;font-size:10px;text-align:center;color:var(--text-sec);border-bottom:1px solid var(--border);}
.cmp-t tbody tr:hover td{background:rgba(99,102,241,0.03);}
.cmp-t tbody td:first-child{text-align:left;padding-left:14px;font-weight:600;color:var(--text);}
.cmp-t tbody td:nth-child(2){background:rgba(99,102,241,0.04);font-weight:700;}
.cmp-t tbody tr:last-child td{border-bottom:none;}
.ck{color:#16a34a;font-weight:800;font-size:14px;}.cx{color:#dc2626;font-weight:700;font-size:12px;}
.cp{color:#d97706;font-weight:700;font-size:11px;}.cs{color:#6366f1;font-weight:900;font-size:13px;}
.cmp-dg{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:16px;animation:cmpUp 1s .4s ease-out both;}
.cmp-d{background:var(--surface);border:1.5px solid var(--border);border-radius:var(--radius-sm);padding:16px;transition:all .3s;position:relative;overflow:hidden;box-shadow:var(--shadow-sm);}
.cmp-d:hover{transform:translateY(-2px);box-shadow:var(--shadow);border-color:var(--border-hover);}
.cmp-d::after{content:'';position:absolute;top:0;left:0;right:0;height:3px;}
.cmp-d:nth-child(1)::after{background:linear-gradient(90deg,#6366f1,#a78bfa);}
.cmp-d:nth-child(2)::after{background:linear-gradient(90deg,#e11d48,#f97316);}
.cmp-d:nth-child(3)::after{background:linear-gradient(90deg,#0d9488,#06b6d4);}
.cmp-d:nth-child(4)::after{background:linear-gradient(90deg,#2563eb,#818cf8);}
.cmp-di{font-size:24px;margin-bottom:5px;}.cmp-dt{font-size:13px;font-weight:800;color:var(--text);margin-bottom:4px;}
.cmp-dd{font-size:9.5px;color:var(--text-muted);line-height:1.55;}
.cmp-dv{display:inline-block;background:var(--rose-bg);color:var(--rose);font-size:8.5px;font-weight:700;padding:2px 7px;border-radius:4px;margin-top:5px;}
.cmp-atk{animation:cmpUp 1.1s .6s ease-out both;margin-bottom:16px;}
.cmp-atk-title{font-size:13px;font-weight:800;color:var(--text);margin-bottom:10px;}
.cmp-ai{margin-bottom:8px;}.cmp-al{display:flex;justify-content:space-between;align-items:center;margin-bottom:3px;}
.cmp-an{font-size:10px;font-weight:600;color:var(--text-sec);}.cmp-aw{font-size:9px;color:var(--teal);font-weight:600;}
.cmp-ab{height:7px;background:var(--surface-alt);border:1px solid var(--border);border-radius:4px;overflow:hidden;}
.cmp-af{height:100%;border-radius:3px;animation:cmpBar 1.8s ease-out;}
.cmp-slogan{background:linear-gradient(135deg,#f5f3ff,#ede9fe,#e0e7ff);border:2px solid #c7d2fe;border-radius:var(--radius);padding:22px;text-align:center;animation:cmpGlow 3s ease-in-out infinite;}
.cmp-sm{font-family:var(--font-display);font-size:15px;font-weight:900;color:#4338ca;margin-bottom:6px;}
.cmp-ss{font-size:10.5px;color:#6366f1;line-height:1.8;}.cmp-ss b{color:#0d9488;}
@media(max-width:640px){
.app-wrapper{padding:12px 12px 32px;}.header{padding:24px 0 18px;}.header-title{font-size:32px;}
.nav{flex-wrap:wrap;position:static;}.nav-item{font-size:11px;padding:10px 6px;}
.card{padding:20px 16px;}.card-desc{padding-left:0;margin-top:8px;}
textarea{min-height:160px;font-size:13px;padding:14px 16px 28px;}.btn{padding:10px 16px;font-size:12px;}
.cmp-stats{grid-template-columns:repeat(2,1fr);}.cmp-dg{grid-template-columns:1fr;}
.cmp-stat-num{font-size:20px;}.cmp-hero-title{font-size:18px;}
}
</style>
</head>
<body>
<div class="bg-pattern"></div>
<div class="app-wrapper">
<header class="header">
<div class="header-eyebrow">AI Text Detector</div>
<h1 class="header-title"><span class="gradient-text">TeXray</span></h1>
<p class="header-sub"><b>5μΆ•+Perplexity+Humanizer탐지+λͺ¨λΈμΆ”μ •</b> Β· <b>ν’ˆμ§ˆ μΈ‘μ •</b> Β· <b>LLM ꡐ차검증</b> Β· <b>ν‘œμ ˆ 검사</b></p>
<div class="pill-row">
<span class="pill" style="background:linear-gradient(135deg,rgba(239,68,68,0.08),rgba(249,115,22,0.08));border-color:rgba(239,68,68,0.25);color:#dc2626;font-weight:700;">πŸ”₯ v5.1</span>
<span class="pill">Perplexity ν™•λ₯ </span><span class="pill">Humanizer 탐지</span>
<span class="pill">λͺ¨λΈ μΆ”μ •</span><span class="pill">LLM 3쀑 검증</span><span class="pill">PDFΒ·DOCXΒ·HWP</span>
</div>
</header>
<nav class="nav">
<div class="nav-item active" data-tab="compare" onclick="switchTab('compare')"><span class="nav-icon">βš–οΈ</span><span>μ„œλΉ„μŠ€ 비ꡐ</span></div>
<div class="nav-item" data-tab="detect" onclick="switchTab('detect')"><span class="nav-icon">πŸ”</span><span>생성 AI μ—¬λΆ€ νŒλ³„</span></div>
<div class="nav-item" data-tab="highlight" onclick="switchTab('highlight')"><span class="nav-icon">πŸ“Š</span><span>ꡬ간별 뢄석</span></div>
<div class="nav-item" data-tab="plagiarism" onclick="switchTab('plagiarism')"><span class="nav-icon">πŸ“‹</span><span>ν‘œμ ˆ 검사</span></div>
</nav>
<!-- μ„œλΉ„μŠ€ 비ꡐ -->
<div class="panel active" id="panel-compare">
<div class="cmp-hero">
<div class="cmp-hero-title">πŸ‡°πŸ‡· ν•œκ΅­μ–΄ AI νŒλ³„ No.1</div>
<div class="cmp-hero-sub">μΉ΄ν”Όν‚¬λŸ¬ Β· GPTZero Β· Turnitin Β· JustDone Β· Originality.ai λ“±<br>κΈ€λ‘œλ²Œ 8개 경쟁 μ„œλΉ„μŠ€ μ •λ°€ 뢄석 ν›„ μ„€κ³„λœ μ°¨μ„ΈλŒ€ νŒλ³„κΈ°</div>
<div class="cmp-hero-badge">πŸ”¬ v5.1 β€” 3λŒ€ ν‚¬λŸ¬ κΈ°λŠ₯ νƒ‘μž¬</div>
</div>
<div class="cmp-stats">
<div class="cmp-stat"><div class="cmp-stat-num">8μΆ•</div><div class="cmp-stat-label">탐지 차원<br>(업계 μ΅œλ‹€)</div></div>
<div class="cmp-stat"><div class="cmp-stat-num">100%</div><div class="cmp-stat-label">ν…ŒμŠ€νŠΈ 정확도<br>(11/11 μƒ˜ν”Œ)</div></div>
<div class="cmp-stat"><div class="cmp-stat-num">무료</div><div class="cmp-stat-label">μ™„μ „ 무료<br>(횟수 λ¬΄μ œν•œ)</div></div>
<div class="cmp-stat"><div class="cmp-stat-num">4μ’…</div><div class="cmp-stat-label">λͺ¨λΈ μΆ”μ •<br>(GPT/Claude/Gemini/PPX)</div></div>
</div>
<div class="cmp-tw">
<table class="cmp-t"><thead><tr>
<th>κΈ°λŠ₯</th><th class="co">πŸ”Ž TeXray v5.1</th><th>πŸ“‹ μΉ΄ν”Όν‚¬λŸ¬</th><th>πŸ…Ή JustDone</th><th>πŸ” GPTZero</th><th>πŸ…Ύ Originality</th><th>πŸ…ƒ Turnitin</th>
</tr></thead><tbody>
<tr><td>🎯 ν•œκ΅­μ–΄ ν˜•νƒœμ†Œ</td><td><span class="cs">β˜… μ „μš©</span></td><td><span class="ck">βœ“</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="cp">β–³</span></td></tr>
<tr><td>πŸ“Š 탐지 μΆ• 수</td><td><span class="cs">8μΆ•</span></td><td>1~2</td><td>1</td><td>2</td><td>1</td><td>1</td></tr>
<tr><td>🧠 Perplexity 뢄석</td><td><span class="ck">βœ“</span> 4쀑</td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="ck">βœ“</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td></tr>
<tr><td>πŸ›‘οΈ Humanizer 탐지</td><td><span class="ck">βœ“</span> 6μ‹œκ·Έλ„</td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="ck">βœ“</span></td><td><span class="ck">βœ“</span></td></tr>
<tr><td>🎯 AI λͺ¨λΈ μΆ”μ •</td><td><span class="cs">β˜… 4λͺ¨λΈ</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="cp">β–³</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td></tr>
<tr><td>πŸ€– LLM ꡐ차검증</td><td><span class="cs">β˜… 3λͺ¨λΈ</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td></tr>
<tr><td>πŸ“ κ·Όκ±° 투λͺ… 곡개</td><td><span class="cs">β˜… 8좕별</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="cp">β–³</span></td><td><span class="cp">β–³</span></td><td><span class="cx">βœ—</span></td></tr>
<tr><td>🎨 λ¬Έμž₯별 ν•˜μ΄λΌμ΄νŠΈ</td><td><span class="ck">βœ“</span> 5단계</td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="ck">βœ“</span></td><td><span class="ck">βœ“</span></td><td><span class="ck">βœ“</span></td></tr>
<tr><td>πŸ“„ HWP/HWPX</td><td><span class="ck">βœ“</span></td><td><span class="ck">βœ“</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td></tr>
<tr><td>πŸ“ κΈ€ ν’ˆμ§ˆ μΈ‘μ •</td><td><span class="ck">βœ“</span> 6ν•­λͺ©</td><td><span class="cx">βœ—</span></td><td><span class="cp">β–³</span></td><td><span class="cx">βœ—</span></td><td><span class="ck">βœ“</span></td><td><span class="cx">βœ—</span></td></tr>
<tr><td>πŸ” ν‘œμ ˆ 검사</td><td><span class="ck">βœ“</span> 5μ†ŒμŠ€</td><td><span class="ck">βœ“</span> DB</td><td><span class="ck">βœ“</span></td><td><span class="cx">βœ—</span></td><td><span class="cx">βœ—</span></td><td><span class="ck">βœ“</span></td></tr>
<tr><td>πŸ’° 가격</td><td><b style="color:#16a34a">μ™„μ „ 무료</b></td><td style="color:var(--text-muted)">9,900원/건</td><td style="color:var(--text-muted)">$7.99~/μ›”</td><td style="color:var(--text-muted)">$8.33~/μ›”</td><td style="color:var(--text-muted)">$14.95/μ›”</td><td style="color:var(--text-muted)">κΈ°κ΄€ μ „μš©</td></tr>
<tr><td>🎯 λŒ€μƒ λͺ¨λΈ</td><td><b style="color:#6366f1">μ „ AI λͺ¨λΈ</b></td><td style="color:#dc2626">GPT만</td><td>λ²”μš©</td><td>λ²”μš©</td><td>λ²”μš©</td><td>λ²”μš©</td></tr>
<tr><td>⚠️ 핡심 약점</td><td style="font-size:8px;color:#6366f1">κ·œμΉ™ 기반<br>(ML 미적용)</td><td style="font-size:8px;color:#dc2626">GPT만·89%뢈만</td><td style="font-size:8px;color:#dc2626">30%+편차</td><td style="font-size:8px;color:#dc2626">ν˜Όν•©41%</td><td style="font-size:8px;color:#dc2626">$14.95/μ›”</td><td style="font-size:8px;color:#dc2626">κΈ°κ΄€λ§Œ</td></tr>
</tbody></table>
</div>
<div class="cmp-dg">
<div class="cmp-d"><div class="cmp-di">🧠</div><div class="cmp-dt">Perplexity ν™•λ₯  뢄석</div><div class="cmp-dd">GPTZero 핡심 κΈ°μˆ μ„ ν•œκ΅­μ–΄ νŠΉν™”. 문자 μ—”νŠΈλ‘œν”Ό + Burstiness + TTR편차 + μ’…κ²°μ—”νŠΈλ‘œν”Ό 4쀑 뢄석</div><div class="cmp-dv">vs GPTZero: ν•œκ΅­μ–΄ ν˜•νƒœμ†Œ 기반 β†’ 더 μ •ν™•</div></div>
<div class="cmp-d"><div class="cmp-di">πŸ›‘οΈ</div><div class="cmp-dt">Humanizer/Bypasser 탐지</div><div class="cmp-dd">QuillBot λ“± νŒ¨λŸ¬ν”„λ ˆμ΄μ¦ˆ λ„κ΅¬λ‘œ μˆ˜μ •λœ AI κΈ€μ˜ μž”μ‘΄ 흔적 6κ°€μ§€ μ‹œκ·Έλ„λ‘œ 탐지</div><div class="cmp-dv">vs Turnitin: ν•œκ΅­μ–΄ 졜초 Humanizer 탐지</div></div>
<div class="cmp-d"><div class="cmp-di">🎯</div><div class="cmp-dt">AI λͺ¨λΈ μΆ”μ • (업계 유일)</div><div class="cmp-dd">GPTΒ·ClaudeΒ·GeminiΒ·Perplexity 4λͺ¨λΈ 고유 지문을 볡합 증거둜 뢄석</div><div class="cmp-dv">vs μ „ κ²½μŸμ‚¬: λͺ¨λΈ μΆ”μ • κΈ°λŠ₯ μ—†μŒ</div></div>
<div class="cmp-d"><div class="cmp-di">πŸ€–</div><div class="cmp-dt">LLM 3쀑 ꡐ차검증 (업계 유일)</div><div class="cmp-dd">GPT-OSS-120B Β· Qwen3-32B Β· Kimi-K2 β€” 3개 독립 AI 직접 νŒλ… + λ‹€μˆ˜κ²° νˆ¬ν‘œ</div><div class="cmp-dv">vs μ „ κ²½μŸμ‚¬: LLM ꡐ차검증 미보유</div></div>
</div>
<div class="cmp-atk">
<div class="cmp-atk-title">βš”οΈ κ²½μŸμ‚¬ 취약점 vs 우리의 강점</div>
<div class="cmp-ai"><div class="cmp-al"><span class="cmp-an">πŸ“‹ μΉ΄ν”Όν‚¬λŸ¬ β€” GPT만 탐지, 89% 뢈만율</span><span class="cmp-aw">β†’ μ „ AI λͺ¨λΈ + 8μΆ• 투λͺ… κ·Όκ±°</span></div><div class="cmp-ab"><div class="cmp-af" style="width:92%;background:linear-gradient(90deg,#6366f1,#a78bfa)"></div></div></div>
<div class="cmp-ai"><div class="cmp-al"><span class="cmp-an">πŸ…Ή JustDone β€” 동일 ν…μŠ€νŠΈ 30%+ 점수 편차</span><span class="cmp-aw">β†’ 결정둠적 점수 보μž₯</span></div><div class="cmp-ab"><div class="cmp-af" style="width:95%;background:linear-gradient(90deg,#e11d48,#f97316)"></div></div></div>
<div class="cmp-ai"><div class="cmp-al"><span class="cmp-an">πŸ” GPTZero β€” ν˜Όν•©ν…μŠ€νŠΈ 41%, νŽΈμ§‘AI 35%</span><span class="cmp-aw">β†’ Humanizer 탐지 + μ„Ήμ…˜ 뢄리</span></div><div class="cmp-ab"><div class="cmp-af" style="width:88%;background:linear-gradient(90deg,#0d9488,#06b6d4)"></div></div></div>
<div class="cmp-ai"><div class="cmp-al"><span class="cmp-an">πŸ…ƒ Turnitin β€” κΈ°κ΄€ μ „μš©, 학생 사전검사 λΆˆκ°€</span><span class="cmp-aw">β†’ λˆ„κ΅¬λ‚˜ 무료 μ¦‰μ‹œ μ‚¬μš©</span></div><div class="cmp-ab"><div class="cmp-af" style="width:90%;background:linear-gradient(90deg,#2563eb,#818cf8)"></div></div></div>
<div class="cmp-ai"><div class="cmp-al"><span class="cmp-an">πŸ…Ύ Originality β€” $14.95/μ›”, λΉ„μ˜μ–΄ μ·¨μ•½</span><span class="cmp-aw">β†’ μ™„μ „ 무료 + ν•œκ΅­μ–΄ μ „λ¬Έ</span></div><div class="cmp-ab"><div class="cmp-af" style="width:94%;background:linear-gradient(90deg,#7c3aed,#ec4899)"></div></div></div>
</div>
<div class="cmp-slogan">
<div class="cmp-sm">πŸ‡°πŸ‡· ν•œκ΅­μ–΄ AI 글을 κ°€μž₯ μ •ν™•ν•˜κ²Œ, κ°€μž₯ 투λͺ…ν•˜κ²Œ, μ™„μ „ 무료둜</div>
<div class="cmp-ss">vs μΉ΄ν”Όν‚¬λŸ¬: "GPT만이 μ•„λ‹Œ, <b>λͺ¨λ“  AI</b>λ₯Ό νƒμ§€ν•©λ‹ˆλ‹€" Β· vs GPTZero: "ν•œκ΅­μ–΄ <b>ν˜•νƒœμ†Œ 뢄석</b>으둜 더 μ •ν™•ν•©λ‹ˆλ‹€"<br>vs Turnitin: "λˆ„κ΅¬λ‚˜, <b>무료</b>둜, μ§€κΈˆ λ°”λ‘œ" Β· vs JustDone: "항상 <b>λ™μΌν•œ κ²°κ³Ό</b>λ₯Ό 보μž₯ν•©λ‹ˆλ‹€"</div>
</div>
</div>
<!-- 생성 AI μ—¬λΆ€ νŒλ³„ -->
<div class="panel" id="panel-detect">
<div class="card">
<div class="card-header"><div class="card-icon purple">πŸ“„</div><div class="card-title">생성 AI μ—¬λΆ€ νŒλ³„</div></div>
<div class="card-desc">8μΆ• 앙상블(ν†΅κ³„Β·λ¬Έμ²΄Β·λ°˜λ³΅Β·κ΅¬μ‘°Β·μ§€λ¬ΈΒ·PerplexityΒ·HumanizerΒ·λͺ¨λΈμΆ”μ •) + 6ν•­λͺ© ν’ˆμ§ˆ μΈ‘μ • + LLM 3λͺ¨λΈ ꡐ차검증<br><span style="display:inline-flex;align-items:center;gap:4px;margin-top:6px;padding:4px 10px;background:var(--accent-bg);border:1px solid rgba(99,102,241,0.12);border-radius:6px;font-size:10px;color:var(--accent);font-weight:600;">πŸ“Ž PDF Β· DOCX Β· HWP Β· HWPX Β· TXT Β· MD Β· CSV 파일 μ—…λ‘œλ“œ 지원</span></div>
<div class="input-group"><div class="textarea-wrap"><textarea id="input-detect" placeholder="AI νŒλ³„ν•  ν…μŠ€νŠΈλ₯Ό μž…λ ₯ν•˜μ„Έμš” (μ΅œμ†Œ 50자)" oninput="uc('input-detect','count-detect')"></textarea><div class="char-counter" id="count-detect">0자</div></div></div>
<div class="btn-group">
<button class="btn btn-primary" id="btn-detect" onclick="runDetect()">πŸš€ AI νŒλ³„ + ν’ˆμ§ˆ 뢄석</button>
<button class="btn btn-ghost btn-file">πŸ“ 파일 μ—…λ‘œλ“œ<input type="file" accept=".pdf,.docx,.hwp,.hwpx,.txt,.md,.csv" onchange="loadFile(this,'input-detect','fs-detect')"></button>
<button class="btn btn-ghost" onclick="ls('input-detect','ai')">πŸ“ AI μ˜ˆμ‹œ</button>
<button class="btn btn-ghost" onclick="ls('input-detect','human')">✍️ 인간 μ˜ˆμ‹œ</button>
</div>
<div class="file-status" id="fs-detect"><span class="fname"></span><span class="fsize"></span><span class="fclose" onclick="clearInline('input-detect','fs-detect')">βœ•</span></div>
</div>
<div class="loader" id="loader-detect"><div class="loader-ring"></div><div class="loader-text">8μΆ• 뢄석 + LLM ꡐ차검증 쀑</div><div class="loader-dots"><span></span><span></span><span></span></div></div>
<div class="result-html" id="result-detect"></div><div class="log-box" id="log-detect"></div>
</div>
<!-- ꡬ간별 뢄석 -->
<div class="panel" id="panel-highlight">
<div class="card">
<div class="card-header"><div class="card-icon teal">πŸ“Š</div><div class="card-title">ꡬ간별 뢄석</div></div>
<div class="card-desc">λ¬Έμž₯별 AI ν™•λ₯ μ„ 5단계 μƒ‰μƒμœΌλ‘œ ν‘œμ‹œν•©λ‹ˆλ‹€. 마우슀 μ˜€λ²„ μ‹œ νŒμ • κ·Όκ±°λ₯Ό ν™•μΈν•˜μ„Έμš”.<br><span style="display:inline-flex;align-items:center;gap:4px;margin-top:6px;padding:4px 10px;background:var(--teal-bg);border:1px solid rgba(13,148,136,0.12);border-radius:6px;font-size:10px;color:var(--teal);font-weight:600;">πŸ“Ž PDF Β· DOCX Β· HWP Β· HWPX Β· TXT Β· MD Β· CSV 파일 μ—…λ‘œλ“œ 지원</span></div>
<div class="input-group"><div class="textarea-wrap"><textarea id="input-highlight" placeholder="λ¬Έμž₯별 AI ν™•λ₯  색상 ν‘œμ‹œ (μ΅œμ†Œ 30자)" oninput="uc('input-highlight','count-highlight')"></textarea><div class="char-counter" id="count-highlight">0자</div></div></div>
<div class="btn-group">
<button class="btn btn-primary" id="btn-highlight" onclick="runHighlight()">πŸ“Š ꡬ간별 뢄석</button>
<button class="btn btn-ghost btn-file">πŸ“ 파일 μ—…λ‘œλ“œ<input type="file" accept=".pdf,.docx,.hwp,.hwpx,.txt,.md,.csv" onchange="loadFile(this,'input-highlight','fs-highlight')"></button>
<button class="btn btn-ghost" onclick="ls('input-highlight','ai')">πŸ“ AI μ˜ˆμ‹œ</button>
</div>
<div class="file-status" id="fs-highlight"><span class="fname"></span><span class="fsize"></span><span class="fclose" onclick="clearInline('input-highlight','fs-highlight')">βœ•</span></div>
</div>
<div class="loader" id="loader-highlight"><div class="loader-ring"></div><div class="loader-text">λ¬Έμž₯ 뢄석 쀑</div><div class="loader-dots"><span></span><span></span><span></span></div></div>
<div class="result-html" id="result-highlight"></div>
</div>
<!-- ν‘œμ ˆ 검사 -->
<div class="panel" id="panel-plagiarism">
<div class="card">
<div class="card-header"><div class="card-icon amber">πŸ“‹</div><div class="card-title">ν‘œμ ˆ 검사</div></div>
<div class="card-desc">Brave Search 병렬(μ΅œλŒ€ 20) + KCI Β· RISS Β· arXiv ν•™μˆ DB + Gemini Google Search 톡합 검사<br><span style="display:inline-flex;align-items:center;gap:4px;margin-top:6px;padding:4px 10px;background:var(--amber-bg);border:1px solid rgba(217,119,6,0.12);border-radius:6px;font-size:10px;color:var(--amber);font-weight:600;">πŸ“Ž PDF Β· DOCX Β· HWP Β· HWPX Β· TXT Β· MD Β· CSV 파일 μ—…λ‘œλ“œ 지원</span></div>
<div class="input-group"><div class="textarea-wrap"><textarea id="input-plagiarism" placeholder="ν‘œμ ˆ 검사할 ν…μŠ€νŠΈ (μ΅œμ†Œ 50자)" oninput="uc('input-plagiarism','count-plagiarism')"></textarea><div class="char-counter" id="count-plagiarism">0자</div></div></div>
<div class="btn-group">
<button class="btn btn-primary" id="btn-plagiarism" onclick="runPlagiarism()">πŸ“‹ ν‘œμ ˆ 검사 μ‹œμž‘</button>
<button class="btn btn-ghost btn-file">πŸ“ 파일 μ—…λ‘œλ“œ<input type="file" accept=".pdf,.docx,.hwp,.hwpx,.txt,.md,.csv" onchange="loadFile(this,'input-plagiarism','fs-plagiarism')"></button>
<button class="btn btn-ghost" onclick="ls('input-plagiarism','ai')">πŸ“ AI μ˜ˆμ‹œ</button>
</div>
<div class="file-status" id="fs-plagiarism"><span class="fname"></span><span class="fsize"></span><span class="fclose" onclick="clearInline('input-plagiarism','fs-plagiarism')">βœ•</span></div>
</div>
<div class="loader" id="loader-plagiarism"><div class="loader-ring"></div><div class="loader-text">웹검색 + ν•™μˆ DB + λ³΄κ³ μ„œ 생성</div><div class="loader-dots"><span></span><span></span><span></span></div></div>
<div id="result-plagiarism-area" style="display:none;"><div class="result-html" id="result-plagiarism"></div><div class="log-box" id="result-plagiarism-log"></div></div>
</div>
<footer class="footer">
<div class="footer-brand">TeXray</div><div style="font-size:11px;color:var(--text-muted);margin-bottom:4px;">개발: <a href="https://vidraft.net" target="_blank" style="color:var(--accent);text-decoration:none;font-weight:600;">Vidraft.net</a></div><div class="footer-line"></div>
<div class="footer-tech">v5.1 Β· KIWI Β· GROQ Β· BRAVE Β· KCI Β· RISS Β· ARXIV Β· GEMINI</div>
</footer>
</div>
<script>
const B=window.location.origin;
const SA=`인곡지λŠ₯ κΈ°μˆ μ€ ν˜„λŒ€ μ‚¬νšŒμ—μ„œ 맀우 μ€‘μš”ν•œ 역할을 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 특히 μžμ—°μ–΄ 처리 λΆ„μ•Όμ—μ„œμ˜ λ°œμ „μ€ λˆˆλΆ€μ‹  μ„±κ³Όλ₯Ό 거두고 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 기술의 λ°œμ „μ€ λ‹€μ–‘ν•œ μ‚°μ—… 뢄야에 긍정적인 영ν–₯을 미치고 있으며, ν–₯ν›„ λ”μš± λ°œμ „ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒλ©λ‹ˆλ‹€.\n\nλ˜ν•œ μƒμ„±ν˜• AI의 λ“±μž₯으둜 μ½˜ν…μΈ  μ œμž‘ 방식이 크게 λ³€ν™”ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 기업듀은 효율적인 μ½˜ν…μΈ  생산이 κ°€λŠ₯ν•΄μ‘ŒμœΌλ©°, 개인 μ‚¬μš©μžλ“€λ„ λ‹€μ–‘ν•œ μ°½μž‘ ν™œλ™μ— AIλ₯Ό ν™œμš©ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.\n\nλ‚˜μ•„κ°€ AI μœ€λ¦¬μ™€ κ·œμ œμ— λŒ€ν•œ λ…Όμ˜λ„ ν™œλ°œνžˆ μ§„ν–‰λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€.`;
const SH=`μ•„ μ§„μ§œ μš”μ¦˜ AI λ•Œλ¬Έμ— 머리 μ•„ν”„λ‹€γ…‹γ…‹γ…‹ μ–΄μ œ chatgptν•œν…Œ 레포트 써달라고 ν–ˆλŠ”λ° μ™„μ „ κ΅κ³Όμ„œ 같은 κΈ€λ§Œ μ¨μ€˜μ„œ κ·Έλƒ₯ λ‚΄κ°€ λ‹€μ‹œ 썼음;;\n\n근데 생각해보면 AIκ°€ μ“΄ κΈ€μ΄λž‘ μ‚¬λžŒμ΄ μ“΄ 글이 ν™•μ‹€νžˆ λ‹€λ₯΄κΈ΄ ν•΄. λ­”κ°€... λ„ˆλ¬΄ κΉ”λ”ν•˜λ‹¬κΉŒ?\n\nκ΅μˆ˜λ‹˜μ΄ AI 탐지기 λŒλ¦°λ‹€κ³  ν•΄μ„œ μ’€ λ¬΄μ„œμš΄λ° γ… γ…  κ±±μ •λœλ‹€ μ§„μ‹¬μœΌλ‘œ.`;
function switchTab(t){document.querySelectorAll('.nav-item').forEach(e=>e.classList.remove('active'));document.querySelectorAll('.panel').forEach(e=>e.classList.remove('active'));document.querySelector(`[data-tab="${t}"]`).classList.add('active');document.getElementById(`panel-${t}`).classList.add('active');}
function uc(a,b){document.getElementById(b).textContent=document.getElementById(a).value.length+'자';}
function ls(id,t){const e=document.getElementById(id);e.value=t==='ai'?SA:SH;e.dispatchEvent(new Event('input'));}
function sw(id){document.getElementById(id).classList.add('active');}
function hw(id){document.getElementById(id).classList.remove('active');}
async function gc(api,data){
const urls=[`${B}/gradio/gradio_api/call${api}`,`${B}/gradio/api${api}`,`${B}/gradio_api/call${api}`,`${B}/api${api}`];
for(const u of urls){
try{const r=await fetch(u,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({data})});
if(!r.ok)continue;const j=await r.json();if(!j.event_id)continue;
return new Promise((ok,no)=>{const es=new EventSource(`${u}/${j.event_id}`);let d=false;
const h=e=>{if(d)return;try{const raw=JSON.parse(e.data);const p=Array.isArray(raw)?raw:(raw&&raw.data?raw.data:null);if(p){d=true;es.close();ok(p);}}catch{}};
es.onmessage=h;es.addEventListener('complete',h);
es.addEventListener('process_completed',e=>{if(d)return;try{const raw=JSON.parse(e.data);const out=raw&&raw.output&&raw.output.data?raw.output.data:null;if(out){d=true;es.close();ok(out);}}catch{}});
es.onerror=()=>{if(!d){d=true;es.close();no(new Error('μ—°κ²° 였λ₯˜'));}};
setTimeout(()=>{if(!d){d=true;es.close();no(new Error('μ‹œκ°„ 초과'));}},120000);
});
}catch(e){continue;}
}throw new Error('API μ—°κ²° μ‹€νŒ¨');
}
function showError(el,msg){el.innerHTML=`<div style="padding:28px;text-align:center;color:var(--rose);font-size:14px;background:var(--surface);border:1px solid rgba(225,29,72,0.2);border-radius:var(--radius);">⚠️ ${msg}</div>`;}
async function runDetect(){const t=document.getElementById('input-detect').value;if(!t||t.length<50){alert('μ΅œμ†Œ 50자 이상 μž…λ ₯ν•΄μ£Όμ„Έμš”.');return;}const b=document.getElementById('btn-detect');b.disabled=true;document.getElementById('result-detect').innerHTML='';document.getElementById('log-detect').textContent='';sw('loader-detect');try{const d=await gc('/run_detection',[t]);hw('loader-detect');document.getElementById('result-detect').innerHTML=d[0]||'';document.getElementById('log-detect').textContent=d[1]||'';}catch(e){hw('loader-detect');showError(document.getElementById('result-detect'),e.message);}b.disabled=false;}
async function runHighlight(){const t=document.getElementById('input-highlight').value;if(!t||t.length<30){alert('ν…μŠ€νŠΈλ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.');return;}const b=document.getElementById('btn-highlight');b.disabled=true;sw('loader-highlight');try{const d=await gc('/run_highlight',[t]);hw('loader-highlight');document.getElementById('result-highlight').innerHTML=d[0]||'';}catch(e){hw('loader-highlight');showError(document.getElementById('result-highlight'),e.message);}b.disabled=false;}
async function runPlagiarism(){const t=document.getElementById('input-plagiarism').value;if(!t||t.length<50){alert('μ΅œμ†Œ 50자 이상 μž…λ ₯ν•΄μ£Όμ„Έμš”.');return;}const b=document.getElementById('btn-plagiarism');b.disabled=true;document.getElementById('result-plagiarism-area').style.display='none';sw('loader-plagiarism');try{const d=await gc('/run_plagiarism',[t]);hw('loader-plagiarism');document.getElementById('result-plagiarism-area').style.display='block';document.getElementById('result-plagiarism').innerHTML=d[0]||'';document.getElementById('result-plagiarism-log').textContent=d[1]||'';}catch(e){hw('loader-plagiarism');document.getElementById('result-plagiarism-area').style.display='block';showError(document.getElementById('result-plagiarism'),e.message);}b.disabled=false;}
document.addEventListener('keydown',e=>{if(e.ctrlKey&&e.key==='Enter'){const a=document.querySelector('.panel.active');if(a){const btn=a.querySelector('.btn-primary');if(btn&&!btn.disabled)btn.click();}}});
async function uploadFileToGradio(file){const fd=new FormData();fd.append('files',file);const urls=[`${B}/gradio/gradio_api/upload`,`${B}/gradio/upload`,`${B}/gradio_api/upload`,`${B}/upload`];for(const u of urls){try{const r=await fetch(u,{method:'POST',body:fd});if(r.ok){const j=await r.json();return Array.isArray(j)?j[0]:j;}}catch{}}throw new Error('파일 μ—…λ‘œλ“œ μ‹€νŒ¨');}
function makeFileData(p,n){return{path:p,meta:{_type:'gradio.FileData'},orig_name:n||'',mime_type:''};}
async function loadFile(input,tid,sid){const file=input.files&&input.files[0];if(!file)return;const fn=file.name,fs=Math.round(file.size/1024)+'KB';const se=document.getElementById(sid),ta=document.getElementById(tid);se.classList.add('active');se.querySelector('.fname').innerHTML=`<span class="file-loading"></span> ${fn} μΆ”μΆœ 쀑...`;se.querySelector('.fsize').textContent=fs;try{const up=await uploadFileToGradio(file);const res=await gc('/extract_file_text',[makeFileData(up,fn)]);const text=res[0]||'';if(text.startsWith('⚠️')){se.querySelector('.fname').textContent='❌ '+text;se.querySelector('.fname').style.color='var(--rose)';return;}ta.value=text;ta.dispatchEvent(new Event('input'));se.querySelector('.fname').textContent='βœ… '+fn;se.querySelector('.fname').style.color='var(--teal)';se.querySelector('.fsize').textContent=fs+' Β· '+text.length+'자';}catch(e){se.querySelector('.fname').textContent='❌ '+e.message;se.querySelector('.fname').style.color='var(--rose)';}input.value='';}
function clearInline(t,s){document.getElementById(s).classList.remove('active');document.getElementById(s).querySelector('.fname').style.color='';}
[{ta:'input-detect',fs:'fs-detect'},{ta:'input-highlight',fs:'fs-highlight'},{ta:'input-plagiarism',fs:'fs-plagiarism'}].forEach(({ta,fs})=>{const el=document.getElementById(ta);if(!el)return;el.addEventListener('dragover',e=>{e.preventDefault();el.style.borderColor='var(--accent)';el.style.background='rgba(99,102,241,0.03)';});el.addEventListener('dragleave',()=>{el.style.borderColor='';el.style.background='';});el.addEventListener('drop',e=>{e.preventDefault();el.style.borderColor='';el.style.background='';const f=e.dataTransfer.files&&e.dataTransfer.files[0];if(!f)return;if(!['pdf','docx','hwp','hwpx','txt','md','csv'].includes(f.name.split('.').pop().toLowerCase()))return;loadFile({files:[f],value:f.name},ta,fs);});});
</script>
</body>
</html>