Spaces:
Runtime error
Runtime error
<html> | |
<head> | |
<meta charset="utf-8" /> | |
<meta name="viewport" content="width=device-width, initial-scale=1" /> | |
<title>Create 3D Icon</title> | |
<style> | |
* { | |
position: relative; | |
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; | |
} | |
html, | |
body { | |
margin: 0; | |
padding: 0; | |
height: 100%; | |
width: 100%; | |
overflow: hidden; | |
} | |
#app { | |
height: 100%; | |
width: 100%; | |
overflow-y: auto; | |
} | |
#container { | |
display: flex; | |
flex-direction: column; | |
align-items: center; | |
} | |
#container > div { | |
display: flex; | |
flex-direction: row; | |
align-items: center; | |
justify-content: center; | |
width: 100%; | |
height: 100%; | |
} | |
#in { | |
flex: 1; | |
display: flex; | |
flex-direction: column; | |
align-items: center; | |
justify-content: center; | |
padding: 1rem; | |
} | |
#out { | |
flex: 1; | |
display: flex; | |
flex-direction: column; | |
align-items: center; | |
justify-content: center; | |
padding: 1rem; | |
} | |
img { | |
width: 100%; | |
} | |
</style> | |
</head> | |
<body> | |
<div id="app"> | |
<div id="container"> | |
<div> | |
<h1>Create 3D Icon</h1> | |
</div> | |
<div> | |
<div id="in"> | |
<input type="file" id="file" accept="image/svg+xml" /> | |
<p id="status">Select an SVG file to create a 3D icon</p> | |
</div> | |
<div id="out"> | |
<img id="img" /> | |
</div> | |
</div> | |
</div> | |
</div> | |
<script> | |
const input = document.querySelector("#file"); | |
const img = document.querySelector("#img"); | |
const status = document.querySelector("#status"); | |
let running = false; | |
async function run() { | |
if (running) { | |
alert("Still running"); | |
return; | |
} | |
running = true; | |
input.disabled = true; | |
status.innerText = "Creating icon ..."; | |
try { | |
const files = input.files; | |
if (files.length === 0) { | |
throw new Error("No file selected"); | |
} | |
const file = files[0]; | |
const reader = new FileReader(); | |
reader.readAsText(file); | |
const svg = await new Promise((resolve, reject) => { | |
reader.onload = () => resolve(reader.result); | |
reader.onerror = reject; | |
}); | |
const res = await fetch("/create", { | |
method: "POST", | |
headers: { | |
"Content-Type": "application/json", | |
}, | |
body: JSON.stringify({ | |
svg, | |
size: 1024, | |
distance: 0.8, | |
light_x: 0.3, | |
light_strength: 3, | |
rotate_x: 10, | |
rotate_z: 10, | |
}), | |
}); | |
if (!res.ok) { | |
throw new Error("Failed to create icon"); | |
} | |
const data = await res.blob(); | |
const url = URL.createObjectURL(data); | |
img.src = url; | |
status.innerText = "Done!"; | |
} catch (err) { | |
alert(err.message); | |
status.innerText = "Error! " + err.message; | |
} finally { | |
running = false; | |
input.disabled = false; | |
} | |
} | |
input.addEventListener("change", run); | |
</script> | |
</body> | |
</html> | |