Spaces:
Running
Running
| <html lang="en" data-theme="dark"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |
| <title>POCKET-Image โ Perfect text, any language, in any image</title> | |
| <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." /> | |
| <style> | |
| :root{ | |
| --bg:#0b0b10; --bg-2:#101017; --panel:#15161f; --panel-2:#1b1c27; | |
| --line:rgba(255,255,255,.09); --line-2:rgba(255,255,255,.14); | |
| --ink:#f3f2f8; --ink-dim:#b9b6c7; --muted:#8b88a0; | |
| --g1:#19e39b; --g2:#7c5cff; --g3:#ff5d8f; --amber:#f5b740; | |
| --grad:linear-gradient(115deg,var(--g1),var(--g2) 54%,var(--g3)); | |
| --radius:18px; --maxw:1180px; | |
| --kr:"Pretendard","Apple SD Gothic Neo","Malgun Gothic","Noto Sans KR",sans-serif; | |
| --sans:system-ui,-apple-system,"Segoe UI",Roboto,var(--kr); | |
| --mono:ui-monospace,"SF Mono","JetBrains Mono",Menlo,monospace; | |
| } | |
| @media (prefers-color-scheme:light){ | |
| :root{ --bg:#f4f4f8; --bg-2:#ffffff; --panel:#ffffff; --panel-2:#f6f6fb; | |
| --line:rgba(20,18,30,.10); --line-2:rgba(20,18,30,.16); | |
| --ink:#16151d; --ink-dim:#43414f; --muted:#6b6880; } | |
| } | |
| :root[data-theme="light"]{ --bg:#f4f4f8; --bg-2:#ffffff; --panel:#ffffff; --panel-2:#f6f6fb; | |
| --line:rgba(20,18,30,.10); --line-2:rgba(20,18,30,.16); | |
| --ink:#16151d; --ink-dim:#43414f; --muted:#6b6880; } | |
| :root[data-theme="dark"]{ --bg:#0b0b10; --bg-2:#101017; --panel:#15161f; --panel-2:#1b1c27; | |
| --line:rgba(255,255,255,.09); --line-2:rgba(255,255,255,.14); | |
| --ink:#f3f2f8; --ink-dim:#b9b6c7; --muted:#8b88a0; } | |
| *{box-sizing:border-box} | |
| html{scroll-behavior:smooth} | |
| body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans); | |
| -webkit-font-smoothing:antialiased;line-height:1.55;overflow-x:hidden} | |
| a{color:inherit;text-decoration:none} | |
| .wrap{max-width:var(--maxw);margin:0 auto;padding:0 24px} | |
| .grad-text{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent} | |
| .eyebrow{font:600 12px/1 var(--sans);letter-spacing:.22em;text-transform:uppercase;color:var(--muted)} | |
| /* NAV */ | |
| nav{position:sticky;top:0;z-index:50;backdrop-filter:blur(14px); | |
| background:color-mix(in srgb,var(--bg) 78%,transparent);border-bottom:1px solid var(--line)} | |
| .nav-in{display:flex;align-items:center;justify-content:space-between;height:64px} | |
| .brand{display:flex;align-items:center;gap:10px;font-weight:800;letter-spacing:-.02em;font-size:18px} | |
| .dot{width:22px;height:22px;border-radius:7px;background:var(--grad);box-shadow:0 0 22px rgba(124,92,255,.5)} | |
| .nav-r{display:flex;align-items:center;gap:8px} | |
| .btn{font:600 14px/1 var(--sans);border-radius:11px;padding:11px 16px;border:1px solid var(--line-2); | |
| background:var(--panel);color:var(--ink);cursor:pointer;transition:.18s;display:inline-flex;align-items:center;gap:8px} | |
| .btn:hover{border-color:var(--g2);transform:translateY(-1px)} | |
| .btn-primary{background:var(--grad);border:none;color:#0a0a12;font-weight:800;box-shadow:0 8px 30px rgba(124,92,255,.35)} | |
| .btn-primary:hover{filter:brightness(1.06);transform:translateY(-1px)} | |
| .lang{display:flex;border:1px solid var(--line-2);border-radius:10px;overflow:hidden} | |
| .lang button{background:transparent;border:0;color:var(--muted);font:700 12px/1 var(--sans);padding:9px 11px;cursor:pointer} | |
| .lang button.on{background:var(--panel-2);color:var(--ink)} | |
| /* HERO / CONSOLE (input at very top) */ | |
| header{position:relative;padding:46px 0 20px} | |
| .hero-head{max-width:760px} | |
| .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} | |
| .hero-head p{font-size:clamp(16px,2vw,19px);color:var(--ink-dim);max-width:60ch;margin:0} | |
| .console{margin-top:30px;display:grid;grid-template-columns:1.05fr .95fr;gap:22px; | |
| background:linear-gradient(180deg,var(--panel),var(--panel-2));border:1px solid var(--line); | |
| border-radius:calc(var(--radius) + 6px);padding:22px;box-shadow:0 30px 80px rgba(0,0,0,.35)} | |
| .console .pane-label{display:flex;align-items:center;gap:8px;margin-bottom:14px} | |
| .console .pane-label b{font-size:13px;letter-spacing:.02em} | |
| .console .pane-label .pill{font:700 10px/1 var(--sans);letter-spacing:.14em;text-transform:uppercase; | |
| color:var(--g1);border:1px solid color-mix(in srgb,var(--g1) 45%,transparent);border-radius:99px;padding:5px 8px} | |
| .field{margin-bottom:14px} | |
| .field label{display:block;font:600 12px/1 var(--sans);letter-spacing:.06em;text-transform:uppercase;color:var(--muted);margin-bottom:7px} | |
| .field .hint{font-weight:500;letter-spacing:0;text-transform:none;color:var(--muted);opacity:.8} | |
| textarea,select,input[type=text]{width:100%;background:var(--bg-2);color:var(--ink);border:1px solid var(--line-2); | |
| border-radius:12px;padding:13px 14px;font:500 15px/1.4 var(--sans);resize:vertical;transition:.16s} | |
| textarea:focus,select:focus{outline:none;border-color:var(--g2);box-shadow:0 0 0 3px rgba(124,92,255,.22)} | |
| textarea{min-height:60px} | |
| .row{display:flex;gap:12px} | |
| .row>*{flex:1} | |
| .gen{width:100%;margin-top:4px;justify-content:center;font-size:16px;padding:15px} | |
| .gen[disabled]{opacity:.6;cursor:progress} | |
| .stage{position:relative;border-radius:var(--radius);overflow:hidden;background:#0e0e15; | |
| border:1px solid var(--line);aspect-ratio:1/1;display:flex;align-items:center;justify-content:center} | |
| .stage img{width:100%;height:100%;object-fit:cover;display:block} | |
| .demo-poster{position:absolute;inset:0;display:grid;place-items:center; | |
| background:linear-gradient(135deg,#0f9d6e,#3b3ba0 46%,#a13a7a);animation:hue 18s linear infinite} | |
| @keyframes hue{to{filter:hue-rotate(360deg)}} | |
| .demo-poster span{font-family:var(--kr);font-weight:800;color:#fff;font-size:clamp(30px,7vw,58px); | |
| text-shadow:0 4px 24px rgba(0,0,0,.35);letter-spacing:-.01em} | |
| .stage-status{position:absolute;inset:auto 0 0 0;padding:10px 14px;font:600 12px/1.3 var(--sans); | |
| color:var(--ink);background:linear-gradient(0deg,rgba(0,0,0,.7),transparent);display:none} | |
| .spin{position:absolute;inset:0;display:none;place-items:center;background:rgba(6,6,12,.66);backdrop-filter:blur(3px);z-index:2} | |
| .spin.on{display:grid} | |
| .ring{width:46px;height:46px;border-radius:50%;border:3px solid rgba(255,255,255,.18); | |
| border-top-color:var(--g1);animation:spin .9s linear infinite} | |
| @keyframes spin{to{transform:rotate(360deg)}} | |
| .spin p{position:absolute;margin-top:82px;font:600 13px/1 var(--sans);color:var(--ink-dim)} | |
| /* MARQUEE / trust */ | |
| .strip{border-top:1px solid var(--line);border-bottom:1px solid var(--line);margin-top:44px;padding:16px 0;background:var(--bg-2)} | |
| .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)} | |
| .strip b{color:var(--ink)} | |
| /* SECTION scaffolding */ | |
| section{padding:76px 0} | |
| .sec-head{max-width:640px;margin-bottom:38px} | |
| .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} | |
| .sec-head p{color:var(--ink-dim);font-size:17px;margin:0} | |
| /* PROBLEM before/after */ | |
| .ba{display:grid;grid-template-columns:1fr 1fr;gap:20px} | |
| .ba .card{border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;background:var(--panel)} | |
| .ba .tile{aspect-ratio:16/10;display:grid;place-items:center;position:relative} | |
| .ba .fail{background:#111;} | |
| .ba .fail span{font-family:var(--kr);font-weight:800;font-size:clamp(26px,5vw,46px);color:#e9e9ee;letter-spacing:.02em;filter:blur(.4px)} | |
| .ba .win{background:linear-gradient(135deg,#15b184,#5a51d6 50%,#d64f86)} | |
| .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)} | |
| .ba .cap{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;font:600 14px/1 var(--sans)} | |
| .ba .cap .k{display:inline-flex;align-items:center;gap:8px;color:var(--muted)} | |
| .ba .cap .v{font-family:var(--mono);font-size:13px} | |
| .tag-bad{color:#ff8098}.tag-good{color:var(--g1)} | |
| /* FEATURES grid */ | |
| .grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px} | |
| .feat{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:24px;transition:.2s; | |
| position:relative;overflow:hidden} | |
| .feat:hover{transform:translateY(-4px);border-color:var(--line-2)} | |
| .feat .ic{width:42px;height:42px;border-radius:12px;display:grid;place-items:center;font-size:20px;margin-bottom:16px; | |
| background:color-mix(in srgb,var(--g2) 16%,var(--panel-2));border:1px solid var(--line)} | |
| .feat h3{margin:0 0 8px;font-size:18px;letter-spacing:-.01em;font-weight:750} | |
| .feat p{margin:0;color:var(--ink-dim);font-size:14.5px} | |
| .feat .kr-sample{font-family:var(--kr);font-weight:800;font-size:20px;margin-top:12px} | |
| .feat .kr-sample .bad{color:#ff7d96;text-decoration:line-through;text-decoration-color:rgba(255,125,150,.5);margin-right:10px;font-weight:700} | |
| .feat .kr-sample .good{color:transparent;background:var(--grad);-webkit-background-clip:text;background-clip:text} | |
| /* HARDWARE band */ | |
| .hw{background:var(--bg-2);border-top:1px solid var(--line);border-bottom:1px solid var(--line)} | |
| .hw-in{display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:center} | |
| .hw-list{display:flex;flex-direction:column;gap:14px;margin-top:22px} | |
| .hw-item{display:flex;gap:14px;align-items:flex-start} | |
| .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} | |
| .hw-item b{display:block;font-size:15px} | |
| .hw-item p{margin:2px 0 0;color:var(--ink-dim);font-size:14px} | |
| .box{aspect-ratio:4/3;border-radius:22px;border:1px solid var(--line-2);position:relative;overflow:hidden; | |
| background:radial-gradient(120% 140% at 30% 20%,#1c1d2b,#0c0c12);display:grid;place-items:center} | |
| :root[data-theme="light"] .box{background:radial-gradient(120% 140% at 30% 20%,#fff,#ececf5)} | |
| .box .cube{width:46%;aspect-ratio:1;border-radius:20px;background:var(--grad);box-shadow:0 30px 70px rgba(124,92,255,.4); | |
| 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)} | |
| .box .cube small{display:block;font-weight:700;font-size:11px;opacity:.72;margin-top:4px;letter-spacing:.06em} | |
| /* STATS */ | |
| .stats{display:grid;grid-template-columns:repeat(4,1fr);gap:18px} | |
| .stat{text-align:center;border:1px solid var(--line);border-radius:var(--radius);padding:28px 16px;background:var(--panel)} | |
| .stat .n{font-size:clamp(30px,4.4vw,46px);font-weight:850;letter-spacing:-.03em;font-variant-numeric:tabular-nums} | |
| .stat .l{color:var(--muted);font-size:13px;margin-top:6px;letter-spacing:.02em} | |
| /* CTA */ | |
| .cta{text-align:center;border:1px solid var(--line);border-radius:26px;padding:56px 24px; | |
| background:radial-gradient(120% 160% at 50% 0%,color-mix(in srgb,var(--g2) 20%,var(--panel)),var(--panel))} | |
| .cta h2{font-size:clamp(28px,4vw,44px);letter-spacing:-.03em;font-weight:850;margin:0 0 12px;text-wrap:balance} | |
| .cta p{color:var(--ink-dim);font-size:17px;margin:0 auto 26px;max-width:52ch} | |
| .cta .row{max-width:440px;margin:0 auto} | |
| footer{border-top:1px solid var(--line);padding:34px 0;color:var(--muted);font-size:13px} | |
| .foot-in{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between} | |
| .reveal{opacity:0;transform:translateY(18px);transition:.7s cubic-bezier(.2,.7,.2,1)} | |
| .reveal.in{opacity:1;transform:none} | |
| @media (prefers-reduced-motion:reduce){*{animation:none;transition:none}.reveal{opacity:1;transform:none}} | |
| @media (max-width:900px){ | |
| .console{grid-template-columns:1fr} | |
| .hw-in{grid-template-columns:1fr;gap:26px} | |
| .grid{grid-template-columns:1fr 1fr} | |
| .stats{grid-template-columns:1fr 1fr} | |
| } | |
| @media (max-width:560px){ | |
| .grid,.ba,.stats{grid-template-columns:1fr} | |
| .nav-r .btn.hideSm{display:none} | |
| } | |
| :focus-visible{outline:2px solid var(--g2);outline-offset:2px;border-radius:6px} | |
| </style> | |
| </head> | |
| <body> | |
| <nav> | |
| <div class="wrap nav-in"> | |
| <div class="brand"><span class="dot"></span>POCKET-Image</div> | |
| <div class="nav-r"> | |
| <div class="lang" role="group" aria-label="Language"> | |
| <button id="lang-en" class="on" onclick="setLang('en')">EN</button> | |
| <button id="lang-ko" onclick="setLang('ko')">ํ๊ตญ์ด</button> | |
| </div> | |
| <button class="btn hideSm" onclick="toggleTheme()" aria-label="Toggle theme" id="themeBtn">โ</button> | |
| <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> | |
| </div> | |
| </div> | |
| </nav> | |
| <!-- HERO โ input console at the very top --> | |
| <header> | |
| <div class="wrap"> | |
| <div class="hero-head"> | |
| <span class="eyebrow" data-i18n="hero_eyebrow">On-device generative typography</span> | |
| <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> | |
| <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> | |
| </div> | |
| <div class="console"> | |
| <!-- INPUT (top-most interactive element) --> | |
| <form class="inputs" onsubmit="return doGen(event)"> | |
| <div class="pane-label"><span class="pill" data-i18n="con_input">Input</span><b data-i18n="con_input_b">Compose your poster</b></div> | |
| <div class="field"> | |
| <label data-i18n="lb_prompt">Describe your image</label> | |
| <textarea id="prompt" data-i18n-ph="ph_prompt" placeholder="e.g. sunset over a calm sea ยท cozy cafe interior ยท neon city night"></textarea> | |
| </div> | |
| <div class="field"> | |
| <label>Text โ any language <span class="hint" data-i18n="lb_text_hint">(optional โ leave empty for pure image)</span></label> | |
| <textarea id="ktext" data-i18n-ph="ph_text" placeholder="์: ๊ฐ์ฌํฉ๋๋ค ยท ๊ฐ์ง ์ ๋ฌผ ยท ์ต๊ณ ์ ํ๋ฃจ">๊ฐ์ฌํฉ๋๋ค</textarea> | |
| </div> | |
| <div class="row"> | |
| <div class="field" style="margin-bottom:0"> | |
| <label data-i18n="lb_style">Style</label> | |
| <select id="style"> | |
| <option>๐จ Auto (prompt only)</option> | |
| <option>๐ Vivid color</option> | |
| <option>โช Minimal</option> | |
| <option>๐ธ Pastel</option> | |
| <option>๐ค Dark luxury</option> | |
| <option>๐ Neon</option> | |
| <option selected>๐ท Photoreal</option> | |
| </select> | |
| </div> | |
| </div> | |
| <button class="btn btn-primary gen" id="genBtn" type="submit" data-i18n="btn_gen">โฆ Generate</button> | |
| </form> | |
| <!-- OUTPUT --> | |
| <div> | |
| <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> | |
| <div class="stage" id="stage"> | |
| <div class="demo-poster" id="demoPoster"><span>์๋ ํ์ธ์</span></div> | |
| <img id="resultImg" alt="Generated result" style="display:none" /> | |
| <div class="spin" id="spin"><div class="ring"></div><p data-i18n="gen_wait">Renderingโฆ first run wakes the engine (~30s)</p></div> | |
| <div class="stage-status" id="status"></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </header> | |
| <div class="strip"> | |
| <div class="wrap"> | |
| <span data-i18n="strip_1"><b>11,172</b> Hangul blocks ยท every script</span> | |
| <span data-i18n="strip_2"><b>0</b> GPU ยท <b>0</b> NPU required</span> | |
| <span data-i18n="strip_3">From <b>4.5 GB</b></span> | |
| <span data-i18n="strip_4"><b>Windows ยท macOS ยท Linux</b></span> | |
| <span data-i18n="strip_5"><b>Fully local</b>, no cloud</span> | |
| </div> | |
| </div> | |
| <!-- PROBLEM --> | |
| <section> | |
| <div class="wrap"> | |
| <div class="sec-head reveal"> | |
| <span class="eyebrow" data-i18n="prob_eyebrow">The hard part everyone skips</span> | |
| <h2 data-i18n="prob_h2">Global models can't spell the world.</h2> | |
| <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> | |
| </div> | |
| <div class="ba reveal"> | |
| <div class="card"> | |
| <div class="tile fail"><span>์​ใ ​๊ธฐ ํ​์ฒ​์</span></div> | |
| <div class="cap"><span class="k">๐ <span data-i18n="prob_others">Typical models</span></span><span class="v tag-bad">gibberish โ</span></div> | |
| </div> | |
| <div class="card"> | |
| <div class="tile win"><span>์๋ ํ์ธ์</span></div> | |
| <div class="cap"><span class="k">โฆ POCKET-Image</span><span class="v tag-good">exact โ</span></div> | |
| </div> | |
| </div> | |
| <div class="lang-row reveal"> | |
| <div class="lp"><b>ํ๊ตญ์ด</b><span>๊ฐ์ฌํฉ๋๋ค</span></div> | |
| <div class="lp"><b>ไธญๆ</b><span>่ฐข่ฐข</span></div> | |
| <div class="lp"><b>ๆฅๆฌ่ช</b><span>ใใใใจใ</span></div> | |
| <div class="lp"><b>ุงูุนุฑุจูุฉ</b><span>ุดูุฑุง</span></div> | |
| <div class="lp"><b>เนเธเธข</b><span>เธเธญเธเธเธธเธ</span></div> | |
| <div class="lp"><b>Latin</b><span>Thank you</span></div> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- FEATURES --> | |
| <section style="padding-top:0"> | |
| <div class="wrap"> | |
| <div class="sec-head reveal"> | |
| <span class="eyebrow" data-i18n="feat_eyebrow">Why teams choose it</span> | |
| <h2 data-i18n="feat_h2">Built for text that has to be right.</h2> | |
| </div> | |
| <div class="grid"> | |
| <div class="feat reveal"> | |
| <div class="ic">๐ฏ</div> | |
| <h3 data-i18n="f1_h">Character-perfect, any script</h3> | |
| <p data-i18n="f1_p">Korean, CJK, Arabic, Thai, Cyrillic, Latin โ every glyph exact, with right-to-left and complex shaping handled.</p> | |
| <div class="kr-sample"><span class="bad">์ใ ๊ธฐ</span><span class="good">์๋ ํ์ธ์</span></div> | |
| </div> | |
| <div class="feat reveal"> | |
| <div class="ic">๐ผ๏ธ</div> | |
| <h3 data-i18n="f2_h">Any scene, one prompt</h3> | |
| <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> | |
| </div> | |
| <div class="feat reveal"> | |
| <div class="ic">๐</div> | |
| <h3 data-i18n="f3_h">Fully local & private</h3> | |
| <p data-i18n="f3_p">Runs on your own machine. Prompts never leave the device โ no cloud, no account, no telemetry.</p> | |
| </div> | |
| <div class="feat reveal"> | |
| <div class="ic">โก</div> | |
| <h3 data-i18n="f4_h">No GPU. No NPU.</h3> | |
| <p data-i18n="f4_p">The POCKET-Core engine runs on plain CPU and RAM. No graphics card, no accelerator required.</p> | |
| </div> | |
| <div class="feat reveal"> | |
| <div class="ic">๐ชถ</div> | |
| <h3 data-i18n="f5_h">Featherweight footprint</h3> | |
| <p data-i18n="f5_p">Runs in as little as 4.5 GB โ light enough for a laptop, not a server rack.</p> | |
| </div> | |
| <div class="feat reveal"> | |
| <div class="ic">๐ป</div> | |
| <h3 data-i18n="f6_h">Runs everywhere</h3> | |
| <p data-i18n="f6_p">Windows, macOS and Linux โ RTX or Apple Silicon deliver the same exact text.</p> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- HARDWARE / POCKET-BOX --> | |
| <div class="hw"> | |
| <section> | |
| <div class="wrap hw-in"> | |
| <div class="reveal"> | |
| <span class="eyebrow" data-i18n="hw_eyebrow">Powered by POCKET-Core</span> | |
| <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> | |
| <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> | |
| <div class="hw-list"> | |
| <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> | |
| <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> | |
| <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> | |
| </div> | |
| </div> | |
| <div class="box reveal"><div class="cube">POCKET-Box<small data-i18n="box_small">NO GPU ยท NO NPU</small></div></div> | |
| </div> | |
| </section> | |
| </div> | |
| <!-- STATS --> | |
| <section> | |
| <div class="wrap"> | |
| <div class="stats"> | |
| <div class="stat reveal"><div class="n grad-text">100%</div><div class="l" data-i18n="s1">Text accuracy</div></div> | |
| <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> | |
| <div class="stat reveal"><div class="n">0</div><div class="l" data-i18n="s3">GPU / NPU needed</div></div> | |
| <div class="stat reveal"><div class="n">3</div><div class="l" data-i18n="s4">Platforms supported</div></div> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- CTA --> | |
| <section style="padding-top:0"> | |
| <div class="wrap"> | |
| <div class="cta reveal"> | |
| <span class="eyebrow" data-i18n="cta_eyebrow">Try it now</span> | |
| <h2 data-i18n="cta_h2">Type Korean. Get a poster.</h2> | |
| <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> | |
| <div class="row"> | |
| <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> | |
| <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> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <footer> | |
| <div class="wrap foot-in"> | |
| <div class="brand" style="font-size:15px"><span class="dot" style="width:16px;height:16px"></span>POCKET-Image ยท VIDRAFT</div> | |
| <div data-i18n="foot">ยฉ 2026 VIDRAFT โ POCKET line. Character-perfect Korean, on-device.</div> | |
| </div> | |
| </footer> | |
| <script> | |
| /* ---------- theme ---------- */ | |
| function toggleTheme(){ | |
| const r=document.documentElement; | |
| const cur=r.getAttribute('data-theme')|| (matchMedia('(prefers-color-scheme:dark)').matches?'dark':'light'); | |
| r.setAttribute('data-theme', cur==='dark'?'light':'dark'); | |
| } | |
| /* ---------- i18n ---------- */ | |
| const KO={ | |
| nav_try:"๋ชจ๋ธ ์นด๋ โ", | |
| hero_eyebrow:"์จ๋๋ฐ์ด์ค ์์ฑํ ํ์ดํฌ๊ทธ๋ํผ", | |
| hero_h1a:"์๋ฒฝํ ํ ์คํธ, ๋ชจ๋ ์ธ์ด.", hero_h1b:"์ด๋ค ์ด๋ฏธ์ง ์์๋.", | |
| hero_sub:"ํ๊ตญ์ดยท์ค๊ตญ์ดยท์ผ๋ณธ์ดยท์๋์ดยทํ๊ตญ์ด๊น์ง โ ๋ค๋ฅธ ๋ชจ๋ธ์ด ๋น๋ผํด ๋ฌธ์๋ฅผ ๋ญ๊ฐค ๋, ๋ชจ๋ ๊ธ์๊ฐ ์ ํํฉ๋๋ค. ์ฅ๋ฉด์ ์ ๋ ฅํ๊ณ ๋ฌธ๊ตฌ๋ฅผ ๋ฃ์ผ๋ฉด ์ ๋ช ํ๊ฒ ์๊ฒจ์ง๋๋ค. ๋ด ์ปดํจํฐ์์, GPU๋ ํด๋ผ์ฐ๋๋ ์์ด.", | |
| con_input:"์ ๋ ฅ", con_input_b:"ํฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ์ธ์", | |
| lb_prompt:"์ด๋ฏธ์ง ํ๋กฌํํธ", ph_prompt:"์: ๋ ธ์ ์ง๋ ์์ํ ๋ฐ๋ท๊ฐ ยท ๊ฐ์ฑ ์นดํ ์ธํ ๋ฆฌ์ด ยท ๋ค์จ ๋์์ ๋ฐค", | |
| lb_text_hint:"(์ ํ โ ๋น์ฐ๋ฉด ์์ ์ด๋ฏธ์ง ์์ฑ)", ph_text:"์: ๊ฐ์ฌํฉ๋๋ค ยท ๊ฐ์ง ์ ๋ฌผ ยท ์ต๊ณ ์ ํ๋ฃจ", | |
| lb_style:"์คํ์ผ", btn_gen:"โฆ ์์ฑ", | |
| con_out:"๊ฒฐ๊ณผ", con_out_b:"๋ชจ๋ ์ธ์ด 100% ์ ํ", | |
| gen_wait:"์์ฑ ์คโฆ ์ฒซ ์คํ์ ์์ง์ ๊นจ์๋๋ค (~30์ด)", | |
| strip_1:"<b>11,172</b> ํ๊ธ ์์ ยท ๋ชจ๋ ๋ฌธ์", strip_2:"<b>0</b> GPU ยท <b>0</b> NPU ํ์", | |
| strip_3:"์ต์ <b>4.5 GB</b>", strip_4:"<b>Windows ยท macOS ยท Linux</b>", strip_5:"<b>์์ ๋ก์ปฌ</b>, ํด๋ผ์ฐ๋ ์์", | |
| prob_eyebrow:"๋ชจ๋๊ฐ ํผํด๊ฐ ๋์ ", | |
| prob_h2:"๊ธ๋ก๋ฒ ๋ชจ๋ธ์ ์ธ๊ณ์ ๊ธ์๋ฅผ ๋ชป ์๋๋ค.", | |
| prob_p:"ํ๊ธ 11,172 ์์ ๋ถํฐ ์๋์ด ์ฐ๊ฒฐ๋ฌธ์, ํ๊ตญ์ด ๊ฒน๊ธฐํธ๊น์ง โ ๋ํจ์ ๋ชจ๋ธ์ ๋ฌธ์๋ฅผ '๊ทธ๋ฆผ'์ผ๋ก ๊ทธ๋ ค ๋ญ๊ฐญ๋๋ค. POCKET-Image๋ ์ด๋ค ์ธ์ดยท์ด๋ค ํฌ๊ธฐยท์ด๋ค ์ฅ๋ฉด์์๋ ๋ชจ๋ ๊ธ์๋ฅผ ์ ํํ ๋ ๋ํฉ๋๋ค.", | |
| prob_others:"์ผ๋ฐ ๋ชจ๋ธ", | |
| feat_eyebrow:"ํ์ด ์ ํํ๋ ์ด์ ", feat_h2:"ํ๋ฆฌ๋ฉด ์ ๋๋ ํ ์คํธ๋ฅผ ์ํด.", | |
| f1_h:"๋ชจ๋ ๋ฌธ์ ์๋ฒฝ", f1_p:"ํ๊ตญ์ดยทCJKยท์๋์ดยทํ๊ตญ์ดยทํค๋ฆดยท๋ผํด โ ๋ชจ๋ ๊ธ์ ์ ํ, RTL๊ณผ ๋ณตํฉ ์ ฐ์ดํ๊น์ง.", | |
| f2_h:"์ฅ๋ฉด ํ๋๋ฉด ๋", f2_p:"์ํ๋ ๋ฐฐ๊ฒฝ์ ๋ฌ์ฌํ๋ฉด ๊ทธ ์์ ๊ธ์๊ฐ ์ ๋ช ํ ์ฌ๋ผ๊ฐ๋๋ค. ๋ฌธ๊ตฌ๋ฅผ ๋น์ฐ๋ฉด ์์ ์ด๋ฏธ์ง.", | |
| f3_h:"์์ ๋ก์ปฌยทํ๋ผ์ด๋ฒ์", f3_p:"๋ด ๊ธฐ๊ธฐ์์ ์คํ. ํ๋กฌํํธ๋ ๋ฐ์ผ๋ก ์ ๋๊ฐ๋๋ค โ ํด๋ผ์ฐ๋ยท๊ณ์ ยท์์ง ์์.", | |
| f4_h:"GPU๋ NPU๋ ์์ด", f4_p:"POCKET-Core ์์ง์ ์ผ๋ฐ CPUยทRAM๋ง์ผ๋ก ๋์. ๊ทธ๋ํฝ์นด๋๋ ๊ฐ์๊ธฐ๋ ๋ถํ์.", | |
| f5_h:"๊นํธ์ฒ๋ผ ๊ฐ๋ณ๊ฒ", f5_p:"์ต์ 4.5 GB๋ก ๊ตฌ๋ โ ์๋ฒ ๋์ด ์๋๋ผ ๋ ธํธ๋ถ์ ๋ง๋ ํฌ๊ธฐ.", | |
| f6_h:"์ด๋์๋ ๋์ผํ๊ฒ", f6_p:"WindowsยทmacOSยทLinux โ RTX๋ ์ ํ ์ค๋ฆฌ์ฝ์ด๋ ๊ฐ์ ์ ํํ ๊ฒฐ๊ณผ.", | |
| hw_eyebrow:"POCKET-Core ๊ธฐ๋ฐ", | |
| hw_h2:"๊ฐ์๊ธฐ ์๋ ์ง๋ฅ.", | |
| hw_p:"์ด ๋ฐ๋ชจ๋ฅผ ๋๋ฆฌ๋ ๋ฐ๋ก ๊ทธ ์์ง์ด, ์ต์ CPU์ RAM๋ง์ผ๋ก 250B๊ธ ๋ชจ๋ธ์ ๊ตฌ๋ํฉ๋๋ค โ ์๋ฐ๋ฅ ํฌ๊ธฐ POCKET-Box์ ์ฌ์ฅ.", | |
| hw1_b:"ํฐ ๋ชจ๋ธ, ์์ ํ๋์จ์ด", hw1_p:"๊ทธ๋ํฝ์นด๋์ ๋ด๊ธฐ์ง๋ ์๋ ํ๋๊ทธ์ญ๊ธ ๋ชจ๋ธ์ ๋ก์ปฌ์์.", | |
| hw2_b:"ํ๊ตญ์ด ๋ค์ดํฐ๋ธ", hw2_p:"์ ๋ ฅ๋ถํฐ ์ถ๋ ฅ๊น์ง ํ๊ตญ์ด์ ์ต์ ํ โ ๋ค๊ตญ์ด๋ ์์ ์ง์.", | |
| hw3_b:"๋ฌด์์ยท์คํ๋ผ์ธ", hw3_p:"ํฌ๋ฆฌ์ค ๊ฐ๋ฅ, ํด๋ผ์ฐ๋ ํ๋ฆฌ. ๋ฐ์ดํฐ๋ ์์ฑ๋ฌผ๋ ์จ์ ํ ๋ด ๊ฒ.", | |
| box_small:"GPU ์์ ยท NPU ์์", | |
| s1:"ํ ์คํธ ์ ํ๋", s2:"์ต์ ์ฉ๋", s3:"ํ์ํ GPU/NPU", s4:"์ง์ ํ๋ซํผ", | |
| cta_eyebrow:"์ง๊ธ ์ฌ์ฉํด ๋ณด์ธ์", cta_h2:"ํ๊ธ์ ์ ๋ ฅํ๋ฉด, ํฌ์คํฐ๊ฐ ๋์ต๋๋ค.", | |
| cta_p:"์๋ก ์ฌ๋ผ๊ฐ ์ฅ๋ฉด์ ๋ฌ์ฌํ๊ณ ์์ฑํ์ธ์ โ ๋๋ ์ ์ฒด ๋ผ์ด๋ธ ๋ฐ๋ชจ๋ฅผ ์ฌ์ธ์. ๊ฐ์ ๋ ์นด๋๋ ์์ต๋๋ค.", | |
| cta_b1:"โฆ ๊ตฌ์ฑ ์์", cta_b2:"๋ชจ๋ธ ์นด๋ โ", | |
| foot:"ยฉ 2026 VIDRAFT โ POCKET ๋ผ์ธ. ์จ๋๋ฐ์ด์ค, ํ๊ธ ์๋ฒฝ ๋ ๋๋ง." | |
| }; | |
| let EN={}; | |
| function snapshotEN(){ | |
| document.querySelectorAll('[data-i18n]').forEach(el=>EN[el.getAttribute('data-i18n')]=el.innerHTML); | |
| document.querySelectorAll('[data-i18n-ph]').forEach(el=>EN['__ph_'+el.getAttribute('data-i18n-ph')]=el.getAttribute('placeholder')); | |
| } | |
| function setLang(l){ | |
| document.getElementById('lang-en').classList.toggle('on',l==='en'); | |
| document.getElementById('lang-ko').classList.toggle('on',l==='ko'); | |
| document.documentElement.lang=l==='ko'?'ko':'en'; | |
| document.querySelectorAll('[data-i18n]').forEach(el=>{ | |
| const k=el.getAttribute('data-i18n'); const v=l==='ko'?KO[k]:EN[k]; if(v!=null) el.innerHTML=v; | |
| }); | |
| document.querySelectorAll('[data-i18n-ph]').forEach(el=>{ | |
| const k=el.getAttribute('data-i18n-ph'); | |
| el.placeholder = l==='ko' ? (KO[k]||el.placeholder) : (EN['__ph_'+k]||el.placeholder); | |
| }); | |
| } | |
| /* ---------- reveal on scroll ---------- */ | |
| const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target)}}),{threshold:.14}); | |
| document.querySelectorAll('.reveal').forEach(el=>io.observe(el)); | |
| /* ---------- live generate (calls the hosted demo API; method stays server-side) ---------- */ | |
| const SPACE="https://final-bench-pocket-image.hf.space"; | |
| async function doGen(ev){ | |
| ev.preventDefault(); | |
| const btn=document.getElementById('genBtn'), spin=document.getElementById('spin'), | |
| status=document.getElementById('status'), img=document.getElementById('resultImg'), | |
| demo=document.getElementById('demoPoster'); | |
| const text=document.getElementById('ktext').value, prompt=document.getElementById('prompt').value, | |
| style=document.getElementById('style').value; | |
| if(!text.trim() && !prompt.trim()){ flash(status,(document.documentElement.lang==='ko')?"๋ฌธ๊ตฌ ๋๋ ํ๋กฌํํธ๋ฅผ ์ ๋ ฅํ์ธ์":"Enter a prompt or Korean text"); return false; } | |
| btn.disabled=true; spin.classList.add('on'); status.style.display='none'; | |
| try{ | |
| const r=await fetch(SPACE+"/gradio_api/call/generate",{method:"POST",headers:{"Content-Type":"application/json"}, | |
| body:JSON.stringify({data:[text,prompt,style,30,Math.floor(1+Math.random()*99998)]})}); | |
| if(!r.ok) throw new Error("submit "+r.status); | |
| const {event_id}=await r.json(); | |
| const s=await fetch(SPACE+"/gradio_api/call/generate/"+event_id); | |
| const reader=s.body.getReader(), dec=new TextDecoder(); let buf="",out=null; | |
| while(true){const {done,value}=await reader.read(); if(done)break; buf+=dec.decode(value,{stream:true});} | |
| buf.split("\n").forEach(line=>{ if(line.startsWith("data:")){ try{ const j=JSON.parse(line.slice(5).trim()); | |
| if(Array.isArray(j)&&j[0]&&(j[0].url||typeof j[0]==="string")) out=j; }catch(e){} }}); | |
| if(out){ const it=out[0]; img.src=it.url||it; img.style.display='block'; demo.style.display='none'; } | |
| else throw new Error("no output"); | |
| }catch(err){ | |
| flash(status,(document.documentElement.lang==='ko')?"๋ฐ๋ชจ ์ค๋น ์ค์ผ ์ ์์ด์ โ ๋ผ์ด๋ธ ๋ฐ๋ชจ์์ ๋ค์ ์๋ํ์ธ์ โ":"Demo may be waking up โ try the live demo โ"); | |
| }finally{ btn.disabled=false; spin.classList.remove('on'); } | |
| return false; | |
| } | |
| function flash(el,msg){el.textContent=msg;el.style.display='block';setTimeout(()=>el.style.display='none',6000);} | |
| snapshotEN(); | |
| </script> | |
| </body> | |
| </html> | |