CoolFace
Apppublic

bep40/POCKET-Image-Studio

sourceHugging Faceapache-2.0updated 2mo agoView on Hugging Face
0likes
index.html489 linesDownload Raw Back to root
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>안&#8203;ㅐ&#8203;기 하&#8203;웲&#8203;소</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 &amp; 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 &amp; 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