bep40/POCKET-Image-Studio
0
1<!DOCTYPE html>2<html lang="en" data-theme="dark">3<head>4<meta charset="UTF-8" />5<meta name="viewport" content="width=device-width, initial-scale=1.0" />6<title>POCKET-Image — Perfect text, any language, in any image</title>7<meta name="description" content="Character-perfect text in any language — Korean, Chinese, Japanese, Arabic, Thai and more. Runs fully local. No GPU. No NPU. No cloud." />8<style>9 :root{10 --bg:#0b0b10; --bg-2:#101017; --panel:#15161f; --panel-2:#1b1c27;11 --line:rgba(255,255,255,.09); --line-2:rgba(255,255,255,.14);12 --ink:#f3f2f8; --ink-dim:#b9b6c7; --muted:#8b88a0;13 --g1:#19e39b; --g2:#7c5cff; --g3:#ff5d8f; --amber:#f5b740;14 --grad:linear-gradient(115deg,var(--g1),var(--g2) 54%,var(--g3));15 --radius:18px; --maxw:1180px;16 --kr:"Pretendard","Apple SD Gothic Neo","Malgun Gothic","Noto Sans KR",sans-serif;17 --sans:system-ui,-apple-system,"Segoe UI",Roboto,var(--kr);18 --mono:ui-monospace,"SF Mono","JetBrains Mono",Menlo,monospace;19 }20 @media (prefers-color-scheme:light){21 :root{ --bg:#f4f4f8; --bg-2:#ffffff; --panel:#ffffff; --panel-2:#f6f6fb;22 --line:rgba(20,18,30,.10); --line-2:rgba(20,18,30,.16);23 --ink:#16151d; --ink-dim:#43414f; --muted:#6b6880; }24 }25 :root[data-theme="light"]{ --bg:#f4f4f8; --bg-2:#ffffff; --panel:#ffffff; --panel-2:#f6f6fb;26 --line:rgba(20,18,30,.10); --line-2:rgba(20,18,30,.16);27 --ink:#16151d; --ink-dim:#43414f; --muted:#6b6880; }28 :root[data-theme="dark"]{ --bg:#0b0b10; --bg-2:#101017; --panel:#15161f; --panel-2:#1b1c27;29 --line:rgba(255,255,255,.09); --line-2:rgba(255,255,255,.14);30 --ink:#f3f2f8; --ink-dim:#b9b6c7; --muted:#8b88a0; }31 32 *{box-sizing:border-box}33 html{scroll-behavior:smooth}34 body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);35 -webkit-font-smoothing:antialiased;line-height:1.55;overflow-x:hidden}36 a{color:inherit;text-decoration:none}37 .wrap{max-width:var(--maxw);margin:0 auto;padding:0 24px}38 .grad-text{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}39 .eyebrow{font:600 12px/1 var(--sans);letter-spacing:.22em;text-transform:uppercase;color:var(--muted)}40 41 /* NAV */42 nav{position:sticky;top:0;z-index:50;backdrop-filter:blur(14px);43 background:color-mix(in srgb,var(--bg) 78%,transparent);border-bottom:1px solid var(--line)}44 .nav-in{display:flex;align-items:center;justify-content:space-between;height:64px}45 .brand{display:flex;align-items:center;gap:10px;font-weight:800;letter-spacing:-.02em;font-size:18px}46 .dot{width:22px;height:22px;border-radius:7px;background:var(--grad);box-shadow:0 0 22px rgba(124,92,255,.5)}47 .nav-r{display:flex;align-items:center;gap:8px}48 .btn{font:600 14px/1 var(--sans);border-radius:11px;padding:11px 16px;border:1px solid var(--line-2);49 background:var(--panel);color:var(--ink);cursor:pointer;transition:.18s;display:inline-flex;align-items:center;gap:8px}50 .btn:hover{border-color:var(--g2);transform:translateY(-1px)}51 .btn-primary{background:var(--grad);border:none;color:#0a0a12;font-weight:800;box-shadow:0 8px 30px rgba(124,92,255,.35)}52 .btn-primary:hover{filter:brightness(1.06);transform:translateY(-1px)}53 .lang{display:flex;border:1px solid var(--line-2);border-radius:10px;overflow:hidden}54 .lang button{background:transparent;border:0;color:var(--muted);font:700 12px/1 var(--sans);padding:9px 11px;cursor:pointer}55 .lang button.on{background:var(--panel-2);color:var(--ink)}56 57 /* HERO / CONSOLE (input at very top) */58 header{position:relative;padding:46px 0 20px}59 .hero-head{max-width:760px}60 .hero-head h1{font-size:clamp(30px,5.4vw,60px);line-height:1.02;letter-spacing:-.035em;font-weight:850;margin:16px 0 12px;text-wrap:balance}61 .hero-head p{font-size:clamp(16px,2vw,19px);color:var(--ink-dim);max-width:60ch;margin:0}62 63 .console{margin-top:30px;display:grid;grid-template-columns:1.05fr .95fr;gap:22px;64 background:linear-gradient(180deg,var(--panel),var(--panel-2));border:1px solid var(--line);65 border-radius:calc(var(--radius) + 6px);padding:22px;box-shadow:0 30px 80px rgba(0,0,0,.35)}66 .console .pane-label{display:flex;align-items:center;gap:8px;margin-bottom:14px}67 .console .pane-label b{font-size:13px;letter-spacing:.02em}68 .console .pane-label .pill{font:700 10px/1 var(--sans);letter-spacing:.14em;text-transform:uppercase;69 color:var(--g1);border:1px solid color-mix(in srgb,var(--g1) 45%,transparent);border-radius:99px;padding:5px 8px}70 .field{margin-bottom:14px}71 .field label{display:block;font:600 12px/1 var(--sans);letter-spacing:.06em;text-transform:uppercase;color:var(--muted);margin-bottom:7px}72 .field .hint{font-weight:500;letter-spacing:0;text-transform:none;color:var(--muted);opacity:.8}73 textarea,select,input[type=text]{width:100%;background:var(--bg-2);color:var(--ink);border:1px solid var(--line-2);74 border-radius:12px;padding:13px 14px;font:500 15px/1.4 var(--sans);resize:vertical;transition:.16s}75 textarea:focus,select:focus{outline:none;border-color:var(--g2);box-shadow:0 0 0 3px rgba(124,92,255,.22)}76 textarea{min-height:60px}77 .row{display:flex;gap:12px}78 .row>*{flex:1}79 .gen{width:100%;margin-top:4px;justify-content:center;font-size:16px;padding:15px}80 .gen[disabled]{opacity:.6;cursor:progress}81 82 .stage{position:relative;border-radius:var(--radius);overflow:hidden;background:#0e0e15;83 border:1px solid var(--line);aspect-ratio:1/1;display:flex;align-items:center;justify-content:center}84 .stage img{width:100%;height:100%;object-fit:cover;display:block}85 .demo-poster{position:absolute;inset:0;display:grid;place-items:center;86 background:linear-gradient(135deg,#0f9d6e,#3b3ba0 46%,#a13a7a);animation:hue 18s linear infinite}87 @keyframes hue{to{filter:hue-rotate(360deg)}}88 .demo-poster span{font-family:var(--kr);font-weight:800;color:#fff;font-size:clamp(30px,7vw,58px);89 text-shadow:0 4px 24px rgba(0,0,0,.35);letter-spacing:-.01em}90 .stage-status{position:absolute;inset:auto 0 0 0;padding:10px 14px;font:600 12px/1.3 var(--sans);91 color:var(--ink);background:linear-gradient(0deg,rgba(0,0,0,.7),transparent);display:none}92 .spin{position:absolute;inset:0;display:none;place-items:center;background:rgba(6,6,12,.66);backdrop-filter:blur(3px);z-index:2}93 .spin.on{display:grid}94 .ring{width:46px;height:46px;border-radius:50%;border:3px solid rgba(255,255,255,.18);95 border-top-color:var(--g1);animation:spin .9s linear infinite}96 @keyframes spin{to{transform:rotate(360deg)}}97 .spin p{position:absolute;margin-top:82px;font:600 13px/1 var(--sans);color:var(--ink-dim)}98 99 /* MARQUEE / trust */100 .strip{border-top:1px solid var(--line);border-bottom:1px solid var(--line);margin-top:44px;padding:16px 0;background:var(--bg-2)}101 .strip .wrap{display:flex;flex-wrap:wrap;gap:12px 34px;align-items:center;justify-content:center;color:var(--muted);font:600 13px/1 var(--sans)}102 .strip b{color:var(--ink)}103 104 /* SECTION scaffolding */105 section{padding:76px 0}106 .sec-head{max-width:640px;margin-bottom:38px}107 .sec-head h2{font-size:clamp(26px,3.6vw,40px);line-height:1.08;letter-spacing:-.03em;font-weight:820;margin:12px 0 10px;text-wrap:balance}108 .sec-head p{color:var(--ink-dim);font-size:17px;margin:0}109 110 /* PROBLEM before/after */111 .ba{display:grid;grid-template-columns:1fr 1fr;gap:20px}112 .ba .card{border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;background:var(--panel)}113 .ba .tile{aspect-ratio:16/10;display:grid;place-items:center;position:relative}114 .ba .fail{background:#111;}115 .ba .fail span{font-family:var(--kr);font-weight:800;font-size:clamp(26px,5vw,46px);color:#e9e9ee;letter-spacing:.02em;filter:blur(.4px)}116 .ba .win{background:linear-gradient(135deg,#15b184,#5a51d6 50%,#d64f86)}117 .ba .win span{font-family:var(--kr);font-weight:800;font-size:clamp(26px,5vw,46px);color:#fff;text-shadow:0 3px 18px rgba(0,0,0,.3)}118 .ba .cap{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;font:600 14px/1 var(--sans)}119 .ba .cap .k{display:inline-flex;align-items:center;gap:8px;color:var(--muted)}120 .ba .cap .v{font-family:var(--mono);font-size:13px}121 .tag-bad{color:#ff8098}.tag-good{color:var(--g1)}122 123 /* FEATURES grid */124 .grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}125 .feat{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:24px;transition:.2s;126 position:relative;overflow:hidden}127 .feat:hover{transform:translateY(-4px);border-color:var(--line-2)}128 .feat .ic{width:42px;height:42px;border-radius:12px;display:grid;place-items:center;font-size:20px;margin-bottom:16px;129 background:color-mix(in srgb,var(--g2) 16%,var(--panel-2));border:1px solid var(--line)}130 .feat h3{margin:0 0 8px;font-size:18px;letter-spacing:-.01em;font-weight:750}131 .feat p{margin:0;color:var(--ink-dim);font-size:14.5px}132 .feat .kr-sample{font-family:var(--kr);font-weight:800;font-size:20px;margin-top:12px}133 .feat .kr-sample .bad{color:#ff7d96;text-decoration:line-through;text-decoration-color:rgba(255,125,150,.5);margin-right:10px;font-weight:700}134 .feat .kr-sample .good{color:transparent;background:var(--grad);-webkit-background-clip:text;background-clip:text}135 136 /* HARDWARE band */137 .hw{background:var(--bg-2);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}138 .hw-in{display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:center}139 .hw-list{display:flex;flex-direction:column;gap:14px;margin-top:22px}140 .hw-item{display:flex;gap:14px;align-items:flex-start}141 .hw-item .b{width:34px;height:34px;flex:0 0 34px;border-radius:9px;display:grid;place-items:center;background:var(--panel-2);border:1px solid var(--line);font-size:17px}142 .hw-item b{display:block;font-size:15px}143 .hw-item p{margin:2px 0 0;color:var(--ink-dim);font-size:14px}144 .box{aspect-ratio:4/3;border-radius:22px;border:1px solid var(--line-2);position:relative;overflow:hidden;145 background:radial-gradient(120% 140% at 30% 20%,#1c1d2b,#0c0c12);display:grid;place-items:center}146 :root[data-theme="light"] .box{background:radial-gradient(120% 140% at 30% 20%,#fff,#ececf5)}147 .box .cube{width:46%;aspect-ratio:1;border-radius:20px;background:var(--grad);box-shadow:0 30px 70px rgba(124,92,255,.4);148 display:grid;place-items:center;color:#0a0a12;font-weight:850;letter-spacing:-.02em;font-size:clamp(15px,2.4vw,22px);text-align:center;transform:rotate(-6deg)}149 .box .cube small{display:block;font-weight:700;font-size:11px;opacity:.72;margin-top:4px;letter-spacing:.06em}150 151 /* STATS */152 .stats{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}153 .stat{text-align:center;border:1px solid var(--line);border-radius:var(--radius);padding:28px 16px;background:var(--panel)}154 .stat .n{font-size:clamp(30px,4.4vw,46px);font-weight:850;letter-spacing:-.03em;font-variant-numeric:tabular-nums}155 .stat .l{color:var(--muted);font-size:13px;margin-top:6px;letter-spacing:.02em}156 157 /* CTA */158 .cta{text-align:center;border:1px solid var(--line);border-radius:26px;padding:56px 24px;159 background:radial-gradient(120% 160% at 50% 0%,color-mix(in srgb,var(--g2) 20%,var(--panel)),var(--panel))}160 .cta h2{font-size:clamp(28px,4vw,44px);letter-spacing:-.03em;font-weight:850;margin:0 0 12px;text-wrap:balance}161 .cta p{color:var(--ink-dim);font-size:17px;margin:0 auto 26px;max-width:52ch}162 .cta .row{max-width:440px;margin:0 auto}163 164 footer{border-top:1px solid var(--line);padding:34px 0;color:var(--muted);font-size:13px}165 .foot-in{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between}166 167 .reveal{opacity:0;transform:translateY(18px);transition:.7s cubic-bezier(.2,.7,.2,1)}168 .reveal.in{opacity:1;transform:none}169 @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}.reveal{opacity:1;transform:none}}170 171 @media (max-width:900px){172 .console{grid-template-columns:1fr}173 .hw-in{grid-template-columns:1fr;gap:26px}174 .grid{grid-template-columns:1fr 1fr}175 .stats{grid-template-columns:1fr 1fr}176 }177 @media (max-width:560px){178 .grid,.ba,.stats{grid-template-columns:1fr}179 .nav-r .btn.hideSm{display:none}180 }181 :focus-visible{outline:2px solid var(--g2);outline-offset:2px;border-radius:6px}182</style>183</head>184<body>185<nav>186 <div class="wrap nav-in">187 <div class="brand"><span class="dot"></span>POCKET-Image</div>188 <div class="nav-r">189 <div class="lang" role="group" aria-label="Language">190 <button id="lang-en" class="on" onclick="setLang('en')">EN</button>191 <button id="lang-ko" onclick="setLang('ko')">한국어</button>192 </div>193 <button class="btn hideSm" onclick="toggleTheme()" aria-label="Toggle theme" id="themeBtn">◐</button>194 <a class="btn btn-primary" href="https://huggingface.co/FINAL-Bench/POCKET-Image-Zimage" target="_blank" rel="noopener" data-i18n="nav_try">Model card ↗</a>195 </div>196 </div>197</nav>198 199<!-- HERO — input console at the very top -->200<header>201 <div class="wrap">202 <div class="hero-head">203 <span class="eyebrow" data-i18n="hero_eyebrow">On-device generative typography</span>204 <h1><span data-i18n="hero_h1a">Perfect text, any language.</span><br><span class="grad-text" data-i18n="hero_h1b">On any image.</span></h1>205 <p data-i18n="hero_sub">Korean, Chinese, Japanese, Arabic, Thai and more — every glyph exact, where other models smear non-Latin scripts. Type a scene, drop in your text, and it lands sharp. Runs on your own machine. No GPU, no cloud.</p>206 </div>207 208 <div class="console">209 <!-- INPUT (top-most interactive element) -->210 <form class="inputs" onsubmit="return doGen(event)">211 <div class="pane-label"><span class="pill" data-i18n="con_input">Input</span><b data-i18n="con_input_b">Compose your poster</b></div>212 213 <div class="field">214 <label data-i18n="lb_prompt">Describe your image</label>215 <textarea id="prompt" data-i18n-ph="ph_prompt" placeholder="e.g. sunset over a calm sea · cozy cafe interior · neon city night"></textarea>216 </div>217 <div class="field">218 <label>Text — any language <span class="hint" data-i18n="lb_text_hint">(optional — leave empty for pure image)</span></label>219 <textarea id="ktext" data-i18n-ph="ph_text" placeholder="예: 감사합니다 · 값진 선물 · 최고의 하루">감사합니다</textarea>220 </div>221 <div class="row">222 <div class="field" style="margin-bottom:0">223 <label data-i18n="lb_style">Style</label>224 <select id="style">225 <option>🎨 Auto (prompt only)</option>226 <option>🌈 Vivid color</option>227 <option>⚪ Minimal</option>228 <option>🌸 Pastel</option>229 <option>🖤 Dark luxury</option>230 <option>🌃 Neon</option>231 <option selected>📷 Photoreal</option>232 </select>233 </div>234 </div>235 <button class="btn btn-primary gen" id="genBtn" type="submit" data-i18n="btn_gen">✦ Generate</button>236 </form>237 238 <!-- OUTPUT -->239 <div>240 <div class="pane-label"><span class="pill" style="color:var(--g3);border-color:color-mix(in srgb,var(--g3) 45%,transparent)" data-i18n="con_out">Result</span><b data-i18n="con_out_b">100% correct text</b></div>241 <div class="stage" id="stage">242 <div class="demo-poster" id="demoPoster"><span>안녕하세요</span></div>243 <img id="resultImg" alt="Generated result" style="display:none" />244 <div class="spin" id="spin"><div class="ring"></div><p data-i18n="gen_wait">Rendering… first run wakes the engine (~30s)</p></div>245 <div class="stage-status" id="status"></div>246 </div>247 </div>248 </div>249 </div>250</header>251 252<div class="strip">253 <div class="wrap">254 <span data-i18n="strip_1"><b>11,172</b> Hangul blocks · every script</span>255 <span data-i18n="strip_2"><b>0</b> GPU · <b>0</b> NPU required</span>256 <span data-i18n="strip_3">From <b>4.5 GB</b></span>257 <span data-i18n="strip_4"><b>Windows · macOS · Linux</b></span>258 <span data-i18n="strip_5"><b>Fully local</b>, no cloud</span>259 </div>260</div>261 262<!-- PROBLEM -->263<section>264 <div class="wrap">265 <div class="sec-head reveal">266 <span class="eyebrow" data-i18n="prob_eyebrow">The hard part everyone skips</span>267 <h2 data-i18n="prob_h2">Global models can't spell the world.</h2>268 <p data-i18n="prob_p">From Hangul's 11,172 syllable blocks to Arabic's connected letters and Thai's stacked marks — diffusion models draw scripts as shapes, so they smear. POCKET-Image renders every glyph exactly, in any language, at any size, in any scene.</p>269 </div>270 <div class="ba reveal">271 <div class="card">272 <div class="tile fail"><span>안​ㅐ​기 하​웲​소</span></div>273 <div class="cap"><span class="k">🌐 <span data-i18n="prob_others">Typical models</span></span><span class="v tag-bad">gibberish ✕</span></div>274 </div>275 <div class="card">276 <div class="tile win"><span>안녕하세요</span></div>277 <div class="cap"><span class="k">✦ POCKET-Image</span><span class="v tag-good">exact ✓</span></div>278 </div>279 </div>280 <div class="lang-row reveal">281 <div class="lp"><b>한국어</b><span>감사합니다</span></div>282 <div class="lp"><b>中文</b><span>谢谢</span></div>283 <div class="lp"><b>日本語</b><span>ありがとう</span></div>284 <div class="lp"><b>العربية</b><span>شكرا</span></div>285 <div class="lp"><b>ไทย</b><span>ขอบคุณ</span></div>286 <div class="lp"><b>Latin</b><span>Thank you</span></div>287 </div>288 </div>289</section>290 291<!-- FEATURES -->292<section style="padding-top:0">293 <div class="wrap">294 <div class="sec-head reveal">295 <span class="eyebrow" data-i18n="feat_eyebrow">Why teams choose it</span>296 <h2 data-i18n="feat_h2">Built for text that has to be right.</h2>297 </div>298 <div class="grid">299 <div class="feat reveal">300 <div class="ic">🎯</div>301 <h3 data-i18n="f1_h">Character-perfect, any script</h3>302 <p data-i18n="f1_p">Korean, CJK, Arabic, Thai, Cyrillic, Latin — every glyph exact, with right-to-left and complex shaping handled.</p>303 <div class="kr-sample"><span class="bad">안ㅐ기</span><span class="good">안녕하세요</span></div>304 </div>305 <div class="feat reveal">306 <div class="ic">🖼️</div>307 <h3 data-i18n="f2_h">Any scene, one prompt</h3>308 <p data-i18n="f2_p">Describe the background you want; your text lands on it, crisp and legible. Leave the text blank for a pure image.</p>309 </div>310 <div class="feat reveal">311 <div class="ic">🔒</div>312 <h3 data-i18n="f3_h">Fully local & private</h3>313 <p data-i18n="f3_p">Runs on your own machine. Prompts never leave the device — no cloud, no account, no telemetry.</p>314 </div>315 <div class="feat reveal">316 <div class="ic">⚡</div>317 <h3 data-i18n="f4_h">No GPU. No NPU.</h3>318 <p data-i18n="f4_p">The POCKET-Core engine runs on plain CPU and RAM. No graphics card, no accelerator required.</p>319 </div>320 <div class="feat reveal">321 <div class="ic">🪶</div>322 <h3 data-i18n="f5_h">Featherweight footprint</h3>323 <p data-i18n="f5_p">Runs in as little as 4.5 GB — light enough for a laptop, not a server rack.</p>324 </div>325 <div class="feat reveal">326 <div class="ic">💻</div>327 <h3 data-i18n="f6_h">Runs everywhere</h3>328 <p data-i18n="f6_p">Windows, macOS and Linux — RTX or Apple Silicon deliver the same exact text.</p>329 </div>330 </div>331 </div>332</section>333 334<!-- HARDWARE / POCKET-BOX -->335<div class="hw">336 <section>337 <div class="wrap hw-in">338 <div class="reveal">339 <span class="eyebrow" data-i18n="hw_eyebrow">Powered by POCKET-Core</span>340 <h2 style="font-size:clamp(26px,3.6vw,40px);letter-spacing:-.03em;font-weight:820;margin:12px 0 6px" data-i18n="hw_h2">Intelligence without the accelerator.</h2>341 <p style="color:var(--ink-dim);font-size:17px;margin:0" data-i18n="hw_p">The same engine that powers this demo runs 250B-class models on nothing but a modern CPU and RAM — the heart of the palm-sized POCKET-Box.</p>342 <div class="hw-list">343 <div class="hw-item"><span class="b">🧠</span><div><b data-i18n="hw1_b">Large models, small hardware</b><p data-i18n="hw1_p">Flagship-scale models run locally where a graphics card can't even hold them.</p></div></div>344 <div class="hw-item"><span class="b">🈶</span><div><b data-i18n="hw2_b">Korean-first, natively</b><p data-i18n="hw2_p">Tuned for Korean input and output end to end — with full multilingual support.</p></div></div>345 <div class="hw-item"><span class="b">🔇</span><div><b data-i18n="hw3_b">Silent & offline</b><p data-i18n="hw3_p">Fanless-capable, cloud-free. Your data and your generations stay yours.</p></div></div>346 </div>347 </div>348 <div class="box reveal"><div class="cube">POCKET-Box<small data-i18n="box_small">NO GPU · NO NPU</small></div></div>349 </div>350 </section>351</div>352 353<!-- STATS -->354<section>355 <div class="wrap">356 <div class="stats">357 <div class="stat reveal"><div class="n grad-text">100%</div><div class="l" data-i18n="s1">Text accuracy</div></div>358 <div class="stat reveal"><div class="n">4.5<span style="font-size:.5em">GB</span></div><div class="l" data-i18n="s2">Minimum footprint</div></div>359 <div class="stat reveal"><div class="n">0</div><div class="l" data-i18n="s3">GPU / NPU needed</div></div>360 <div class="stat reveal"><div class="n">3</div><div class="l" data-i18n="s4">Platforms supported</div></div>361 </div>362 </div>363</section>364 365<!-- CTA -->366<section style="padding-top:0">367 <div class="wrap">368 <div class="cta reveal">369 <span class="eyebrow" data-i18n="cta_eyebrow">Try it now</span>370 <h2 data-i18n="cta_h2">Type Korean. Get a poster.</h2>371 <p data-i18n="cta_p">Scroll back up, describe a scene, and generate — or open the full live demo. No sign-up, no card.</p>372 <div class="row">373 <a class="btn btn-primary" style="justify-content:center;padding:15px" href="#top" onclick="document.getElementById('prompt').focus()" data-i18n="cta_b1">✦ Start composing</a>374 <a class="btn" style="justify-content:center;padding:15px" href="https://huggingface.co/FINAL-Bench/POCKET-Image-Zimage" target="_blank" rel="noopener" data-i18n="cta_b2">Model card ↗</a>375 </div>376 </div>377 </div>378</section>379 380<footer>381 <div class="wrap foot-in">382 <div class="brand" style="font-size:15px"><span class="dot" style="width:16px;height:16px"></span>POCKET-Image · VIDRAFT</div>383 <div data-i18n="foot">© 2026 VIDRAFT — POCKET line. Character-perfect Korean, on-device.</div>384 </div>385</footer>386 387<script>388 /* ---------- theme ---------- */389 function toggleTheme(){390 const r=document.documentElement;391 const cur=r.getAttribute('data-theme')|| (matchMedia('(prefers-color-scheme:dark)').matches?'dark':'light');392 r.setAttribute('data-theme', cur==='dark'?'light':'dark');393 }394 395 /* ---------- i18n ---------- */396 const KO={397 nav_try:"모델 카드 ↗",398 hero_eyebrow:"온디바이스 생성형 타이포그래피",399 hero_h1a:"완벽한 텍스트, 모든 언어.", hero_h1b:"어떤 이미지 위에도.",400 hero_sub:"한국어·중국어·일본어·아랍어·태국어까지 — 다른 모델이 비라틴 문자를 뭉갤 때, 모든 글자가 정확합니다. 장면을 입력하고 문구를 넣으면 선명하게 새겨집니다. 내 컴퓨터에서, GPU도 클라우드도 없이.",401 con_input:"입력", con_input_b:"포스터를 구성하세요",402 lb_prompt:"이미지 프롬프트", ph_prompt:"예: 노을 지는 잔잔한 바닷가 · 감성 카페 인테리어 · 네온 도시의 밤",403 lb_text_hint:"(선택 — 비우면 순수 이미지 생성)", ph_text:"예: 감사합니다 · 값진 선물 · 최고의 하루",404 lb_style:"스타일", btn_gen:"✦ 생성",405 con_out:"결과", con_out_b:"모든 언어 100% 정확",406 gen_wait:"생성 중… 첫 실행은 엔진을 깨웁니다 (~30초)",407 strip_1:"<b>11,172</b> 한글 음절 · 모든 문자", strip_2:"<b>0</b> GPU · <b>0</b> NPU 필요",408 strip_3:"최소 <b>4.5 GB</b>", strip_4:"<b>Windows · macOS · Linux</b>", strip_5:"<b>완전 로컬</b>, 클라우드 없음",409 prob_eyebrow:"모두가 피해간 난제",410 prob_h2:"글로벌 모델은 세계의 글자를 못 씁니다.",411 prob_p:"한글 11,172 음절부터 아랍어 연결문자, 태국어 겹기호까지 — 디퓨전 모델은 문자를 '그림'으로 그려 뭉갭니다. POCKET-Image는 어떤 언어·어떤 크기·어떤 장면에서도 모든 글자를 정확히 렌더합니다.",412 prob_others:"일반 모델",413 feat_eyebrow:"팀이 선택하는 이유", feat_h2:"틀리면 안 되는 텍스트를 위해.",414 f1_h:"모든 문자 완벽", f1_p:"한국어·CJK·아랍어·태국어·키릴·라틴 — 모든 글자 정확, RTL과 복합 셰이핑까지.",415 f2_h:"장면 하나면 끝", f2_p:"원하는 배경을 묘사하면 그 위에 글자가 선명히 올라갑니다. 문구를 비우면 순수 이미지.",416 f3_h:"완전 로컬·프라이버시", f3_p:"내 기기에서 실행. 프롬프트는 밖으로 안 나갑니다 — 클라우드·계정·수집 없음.",417 f4_h:"GPU도 NPU도 없이", f4_p:"POCKET-Core 엔진은 일반 CPU·RAM만으로 동작. 그래픽카드도 가속기도 불필요.",418 f5_h:"깃털처럼 가볍게", f5_p:"최소 4.5 GB로 구동 — 서버 랙이 아니라 노트북에 맞는 크기.",419 f6_h:"어디서든 동일하게", f6_p:"Windows·macOS·Linux — RTX든 애플 실리콘이든 같은 정확한 결과.",420 hw_eyebrow:"POCKET-Core 기반",421 hw_h2:"가속기 없는 지능.",422 hw_p:"이 데모를 돌리는 바로 그 엔진이, 최신 CPU와 RAM만으로 250B급 모델을 구동합니다 — 손바닥 크기 POCKET-Box의 심장.",423 hw1_b:"큰 모델, 작은 하드웨어", hw1_p:"그래픽카드에 담기지도 않는 플래그십급 모델을 로컬에서.",424 hw2_b:"한국어 네이티브", hw2_p:"입력부터 출력까지 한국어에 최적화 — 다국어도 완전 지원.",425 hw3_b:"무소음·오프라인", hw3_p:"팬리스 가능, 클라우드 프리. 데이터도 생성물도 온전히 내 것.",426 box_small:"GPU 없음 · NPU 없음",427 s1:"텍스트 정확도", s2:"최소 용량", s3:"필요한 GPU/NPU", s4:"지원 플랫폼",428 cta_eyebrow:"지금 사용해 보세요", cta_h2:"한글을 입력하면, 포스터가 나옵니다.",429 cta_p:"위로 올라가 장면을 묘사하고 생성하세요 — 또는 전체 라이브 데모를 여세요. 가입도 카드도 없습니다.",430 cta_b1:"✦ 구성 시작", cta_b2:"모델 카드 ↗",431 foot:"© 2026 VIDRAFT — POCKET 라인. 온디바이스, 한글 완벽 렌더링."432 };433 let EN={};434 function snapshotEN(){435 document.querySelectorAll('[data-i18n]').forEach(el=>EN[el.getAttribute('data-i18n')]=el.innerHTML);436 document.querySelectorAll('[data-i18n-ph]').forEach(el=>EN['__ph_'+el.getAttribute('data-i18n-ph')]=el.getAttribute('placeholder'));437 }438 function setLang(l){439 document.getElementById('lang-en').classList.toggle('on',l==='en');440 document.getElementById('lang-ko').classList.toggle('on',l==='ko');441 document.documentElement.lang=l==='ko'?'ko':'en';442 document.querySelectorAll('[data-i18n]').forEach(el=>{443 const k=el.getAttribute('data-i18n'); const v=l==='ko'?KO[k]:EN[k]; if(v!=null) el.innerHTML=v;444 });445 document.querySelectorAll('[data-i18n-ph]').forEach(el=>{446 const k=el.getAttribute('data-i18n-ph');447 el.placeholder = l==='ko' ? (KO[k]||el.placeholder) : (EN['__ph_'+k]||el.placeholder);448 });449 }450 451 /* ---------- reveal on scroll ---------- */452 const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target)}}),{threshold:.14});453 document.querySelectorAll('.reveal').forEach(el=>io.observe(el));454 455 /* ---------- live generate (calls the hosted demo API; method stays server-side) ---------- */456 const SPACE="https://final-bench-pocket-image.hf.space";457 async function doGen(ev){458 ev.preventDefault();459 const btn=document.getElementById('genBtn'), spin=document.getElementById('spin'),460 status=document.getElementById('status'), img=document.getElementById('resultImg'),461 demo=document.getElementById('demoPoster');462 const text=document.getElementById('ktext').value, prompt=document.getElementById('prompt').value,463 style=document.getElementById('style').value;464 if(!text.trim() && !prompt.trim()){ flash(status,(document.documentElement.lang==='ko')?"문구 또는 프롬프트를 입력하세요":"Enter a prompt or Korean text"); return false; }465 btn.disabled=true; spin.classList.add('on'); status.style.display='none';466 try{467 const r=await fetch(SPACE+"/gradio_api/call/generate",{method:"POST",headers:{"Content-Type":"application/json"},468 body:JSON.stringify({data:[text,prompt,style,30,Math.floor(1+Math.random()*99998)]})});469 if(!r.ok) throw new Error("submit "+r.status);470 const {event_id}=await r.json();471 const s=await fetch(SPACE+"/gradio_api/call/generate/"+event_id);472 const reader=s.body.getReader(), dec=new TextDecoder(); let buf="",out=null;473 while(true){const {done,value}=await reader.read(); if(done)break; buf+=dec.decode(value,{stream:true});}474 buf.split("\n").forEach(line=>{ if(line.startsWith("data:")){ try{ const j=JSON.parse(line.slice(5).trim());475 if(Array.isArray(j)&&j[0]&&(j[0].url||typeof j[0]==="string")) out=j; }catch(e){} }});476 if(out){ const it=out[0]; img.src=it.url||it; img.style.display='block'; demo.style.display='none'; }477 else throw new Error("no output");478 }catch(err){479 flash(status,(document.documentElement.lang==='ko')?"데모 준비 중일 수 있어요 — 라이브 데모에서 다시 시도하세요 ↗":"Demo may be waking up — try the live demo ↗");480 }finally{ btn.disabled=false; spin.classList.remove('on'); }481 return false;482 }483 function flash(el,msg){el.textContent=msg;el.style.display='block';setTimeout(()=>el.style.display='none',6000);}484 485 snapshotEN();486</script>487</body>488</html>489 