File size: 39,869 Bytes
3037806
 
 
b3ca1d5
 
2acc9c6
b3ca1d5
 
 
 
2acc9c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b3ca1d5
 
2acc9c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b3ca1d5
2acc9c6
 
 
 
 
 
 
 
 
 
 
b3ca1d5
2acc9c6
b3ca1d5
2acc9c6
b3ca1d5
2acc9c6
 
 
 
 
 
 
 
 
 
 
 
 
b3ca1d5
2acc9c6
 
 
 
b3ca1d5
2acc9c6
 
b3ca1d5
2acc9c6
 
b3ca1d5
 
2acc9c6
 
 
 
 
b3ca1d5
2acc9c6
 
 
b3ca1d5
 
 
 
2acc9c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b3ca1d5
 
2acc9c6
 
 
 
 
 
b3ca1d5
 
 
 
2acc9c6
b3ca1d5
 
2acc9c6
 
 
 
 
 
 
 
 
 
 
 
eb156b6
 
 
 
2acc9c6
 
eb156b6
2acc9c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
732d915
eb156b6
2acc9c6
 
eb156b6
2acc9c6
 
 
 
 
 
 
b3ca1d5
2acc9c6
 
 
 
 
b3ca1d5
eb156b6
2acc9c6
 
eb156b6
2acc9c6
 
 
eb156b6
2acc9c6
 
b3ca1d5
2acc9c6
 
 
 
 
b3ca1d5
eb156b6
2acc9c6
 
 
 
 
 
 
 
 
3037806
2acc9c6
 
 
 
 
3037806
2acc9c6
 
 
 
3037806
 
 
 
2acc9c6
3037806
 
2acc9c6
3037806
 
 
 
 
 
2acc9c6
 
 
 
 
 
 
 
 
 
 
 
 
3037806
 
2acc9c6
3037806
2acc9c6
 
 
4012e49
2acc9c6
591d0a0
2acc9c6
 
4012e49
2acc9c6
 
4012e49
2acc9c6
3037806
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
<!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>