Add HTML on-device UI preview for flasher catalog.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-19 22:10:15 +08:00
parent 652f4a0499
commit 69d37005b7
2 changed files with 64 additions and 2 deletions

View File

@@ -0,0 +1,59 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>POMO</title>
<style>
*{box-sizing:border-box;margin:0;padding:0}
html,body{width:100%;height:100%;overflow:hidden;background:#000}
.bezel{width:100%;height:100%;display:grid;place-items:center;background:#1a1408}
.screen{width:320px;height:240px;background:#0A1016;color:#EAF0F6;font:12px/1.2 system-ui,sans-serif;
position:relative;overflow:hidden;transform-origin:center;transform:scale(var(--s,1))}
.title{position:absolute;left:12px;top:4px;color:#E85D4C;font-size:20px;font-weight:700}
.chip{position:absolute;right:12px;top:8px;color:#7A8B9C}
.pm{position:absolute;left:12px;top:32px;width:40px;height:44px;border:0;border-radius:8px;background:#243140;color:#EAF0F6;font-size:18px}
.pp{left:auto;right:12px}
.timer{position:absolute;left:0;right:0;top:34px;text-align:center;font-size:28px;font-weight:700;color:#4FC3F7}
.status{position:absolute;left:0;right:0;top:74px;text-align:center;color:#7A8B9C}
.presets{position:absolute;left:12px;right:12px;top:94px;display:flex;gap:6px}
.presets button{flex:1;height:30px;border:0;border-radius:6px;background:#15202C;color:#EAF0F6;font-weight:600}
.presets button.on{background:#1E3A4A}
.snd{position:absolute;left:12px;top:134px;color:#7A8B9C}
.sndrow{position:absolute;left:68px;right:12px;top:128px;display:flex;gap:4px;align-items:center}
.sndrow button{height:28px;border:0;border-radius:6px;background:#15202C;color:#EAF0F6;min-width:32px}
.sndrow .name{flex:1;height:28px;border-radius:6px;background:#15202C;display:grid;place-items:center}
.vol{position:absolute;left:12px;top:164px;color:#7A8B9C}
.slider{position:absolute;left:52px;right:56px;top:168px;height:14px;border-radius:4px;background:#1C2A38;overflow:hidden}
.slider>i{display:block;height:100%;width:40%;background:#3DDC97}
.volpct{position:absolute;right:12px;top:164px}
.audio{position:absolute;left:12px;top:188px;color:#7A8B9C;font-size:11px}
.acts{position:absolute;left:12px;right:12px;bottom:10px;display:flex;gap:8px}
.acts button{flex:1;height:32px;border:0;border-radius:8px;font-weight:700;color:#EAF0F6}
.start{background:#1A4A6E}.reset{background:#243140}
</style>
</head>
<body>
<div class="bezel"><div class="screen" id="s">
<div class="title">POMO</div><div class="chip">TF OK</div>
<button class="pm" type="button">-</button>
<div class="timer">05:00</div>
<button class="pm pp" type="button">+</button>
<div class="status">5m - READY</div>
<div class="presets">
<button type="button">1</button><button type="button">3</button>
<button class="on" type="button">5</button><button type="button">10</button>
<button type="button">Set</button>
</div>
<div class="snd">SOUND</div>
<div class="sndrow"><button type="button">&lt;</button><div class="name">Alarm</div><button type="button">&gt;</button></div>
<div class="vol">VOL</div><div class="slider"><i></i></div><div class="volpct">40%</div>
<div class="audio">Speaker OFF</div>
<div class="acts"><button class="start" type="button">START</button><button class="reset" type="button">RESET</button></div>
</div></div>
<script>
(function(){function fit(){var s=document.getElementById('s');var r=s.parentElement.getBoundingClientRect();
s.style.setProperty('--s',Math.min(r.width/320,r.height/240));}
fit();addEventListener('resize',fit);})();
</script>
</body>
</html>

View File

@@ -2,6 +2,9 @@
"boardId": "esp32-2432s028",
"name": "CYD Pomodoro",
"summary": "Landscape Pomodoro timer with touch, speaker, and TF status",
"description": "Presets 1/3/5/10 minutes, custom duration, alarm sound picker, volume slider on GPIO26. SoftSPI touch calibrated.",
"tags": ["pomodoro", "touch", "speaker", "timer"]
"description": "Presets 1/3/5/10 minutes, custom duration, alarm sound picker, volume slider on GPIO26.",
"tags": ["pomodoro", "touch", "speaker", "timer"],
"media": {
"preview": "media/preview.html"
}
}