Files
soleprint/docs/viewer.html
2026-04-14 10:32:05 -03:00

57 lines
2.3 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Graph | soleprint</title>
<style>
* { margin: 0; padding: 0; }
body { background: #0a0a0a; overflow: hidden; width: 100vw; height: 100vh; }
#container { width: 100vw; height: 100vh; overflow: hidden; cursor: grab; }
#container.dragging { cursor: grabbing; }
img { transform-origin: 0 0; user-select: none; -webkit-user-drag: none; }
.back { position: fixed; top: 1rem; left: 1rem; color: #d4a574; text-decoration: none; font-family: system-ui; font-size: 0.85rem; z-index: 10; }
.back:hover { text-decoration: underline; }
</style>
</head>
<body>
<a class="back" href="index.html">← docs</a>
<div id="container"><img id="img"></div>
<script>
var src = new URLSearchParams(location.search).get('src');
var img = document.getElementById('img');
var container = document.getElementById('container');
img.src = src;
var scale = 1, x = 0, y = 0, dragging = false, startX, startY, startPanX, startPanY;
function apply() { img.style.transform = 'translate(' + x + 'px,' + y + 'px) scale(' + scale + ')'; }
img.onload = function() {
var sw = window.innerWidth / img.naturalWidth;
var sh = window.innerHeight / img.naturalHeight;
scale = Math.min(sw, sh) * 0.9;
x = (window.innerWidth - img.naturalWidth * scale) / 2;
y = (window.innerHeight - img.naturalHeight * scale) / 2;
apply();
};
container.addEventListener('wheel', function(e) {
e.preventDefault();
var factor = e.deltaY < 0 ? 1.12 : 0.89;
var rect = container.getBoundingClientRect();
var mx = e.clientX - rect.left, my = e.clientY - rect.top;
x = mx - (mx - x) * factor; y = my - (my - y) * factor;
scale *= factor; apply();
}, { passive: false });
container.addEventListener('mousedown', function(e) {
if (e.button !== 0) return;
dragging = true; startX = e.clientX; startY = e.clientY;
startPanX = x; startPanY = y;
container.classList.add('dragging'); e.preventDefault();
});
window.addEventListener('mousemove', function(e) {
if (!dragging) return;
x = startPanX + (e.clientX - startX); y = startPanY + (e.clientY - startY); apply();
});
window.addEventListener('mouseup', function() { dragging = false; container.classList.remove('dragging'); });
container.addEventListener('dblclick', function() { img.onload(); });
</script>
</body>
</html>