12<html lang="en">3<head>4 <meta charset="utf-8">5 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, interactive-widget=resizes-content">6 <script src="./viewport.js"></script>7 <meta name="theme-color" content="#1a1a1a">8 <meta name="description" content="Error level analysis for JPEGs. Runs on your device.">9 <meta name="apple-mobile-web-app-capable" content="yes">10 <meta name="mobile-web-app-capable" content="yes">11 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">12 <meta name="apple-mobile-web-app-title" content="gud.pics">13 <link rel="manifest" href="./manifest.webmanifest">14 <link rel="icon" href="./assets/icon.svg" type="image/svg+xml">15 <link rel="apple-touch-icon" href="./assets/icon-192.png">16 <link rel="stylesheet" href="./style.css">17 <title>ELA</title>18</head>19<body class="tool-body">20 <div class="tool" id="tool" data-state="empty">21 <header class="nav">22 <a class="nav-btn" href="./" aria-label="Tools"><svg width="24" height="24" viewBox="0 0 24 24" aria-hidden="true"><path d="M15 5l-7 7 7 7" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/></svg></a>23 <h1 class="nav-title">ELA</h1>24 <button class="nav-btn" id="save" aria-label="Save" disabled><svg width="24" height="24" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v12m-5-5l5 5 5-5M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></button>25 </header>2627 <section class="stage" id="stage" aria-label="Analysis">28 <div class="canvas-wrap"><canvas id="canvas" aria-label="Error level map"></canvas><canvas id="photo" aria-label="Original" hidden></canvas></div>29 <button class="empty" id="open-empty" aria-label="Open photo">30 <svg width="72" height="72" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 7V5a2 2 0 0 1 2-2h2"/><path d="M17 3h2a2 2 0 0 1 2 2v2"/><path d="M21 17v2a2 2 0 0 1-2 2h-2"/><path d="M7 21H5a2 2 0 0 1-2-2v-2"/><circle cx="12" cy="12" r="3"/><path d="m16 16-1.9-1.9"/></svg>31 <svg class="plus" width="28" height="28" viewBox="0 0 28 28" aria-hidden="true"><path d="M14 5v18M5 14h18" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round"/></svg>32 </button>33 <div class="hud">34 <span class="chip" id="info"></span>35 <button class="compare" id="compare" aria-pressed="false" aria-label="Show original" disabled><svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M10 2v16M7 5H3v10h4M13 5h4v10h-4" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/></svg></button>36 </div>37 <div class="toast" id="status" role="status" aria-live="polite" hidden></div>38 <div class="busy" id="busy" hidden><span class="spinner"></span></div>39 </section>4041 <section class="panel" aria-label="Analysis controls">42 <div class="slider" id="quality-row"><label for="quality">Quality</label><output id="quality-value" for="quality">95</output><input id="quality" type="range" min="50" max="100" value="95" disabled></div>43 <div class="slider" id="scale-row"><label for="scale">Amplify</label><output id="scale-value" for="scale">15x</output><input id="scale" type="range" min="1" max="50" value="15" disabled></div>44 <div class="toolbar">45 <button class="tb" id="open" aria-label="Open"><svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="5" width="18" height="14" rx="2.5" fill="none" stroke="currentColor" stroke-width="1.8"/><circle cx="8.5" cy="10" r="1.8" fill="currentColor"/><path d="M4 17l5-5 4 4 2.5-2.5L20 18" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"/></svg></button>46 <button class="tb" id="reset" aria-label="Reset" disabled><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 12a8 8 0 1 0 2.3-5.7" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/><path d="M4 4v5h5" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/></svg></button>47 <button class="tb" id="share" aria-label="Share" disabled hidden><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v13M8 7l4-4 4 4M5 12v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-7" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/></svg></button>48 </div>49 </section>50 <input id="file" type="file" accept="image/jpeg,image/png,image/webp" hidden>51 </div>52 <script type="module" src="./ela.mjs"></script>53</body>54</html>