mirror of
https://github.com/koodiklinikka/nimilaput.git
synced 2026-01-26 03:14:03 +00:00
185 lines
4.5 KiB
HTML
185 lines
4.5 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>Koodiklinikka nimilappu generaattori</title>
|
|
<style>
|
|
@import url("https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap");
|
|
|
|
* {
|
|
box-sizing: border-box;
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
|
|
body {
|
|
margin: 10mm;
|
|
font-family:
|
|
Inter,
|
|
system-ui,
|
|
-apple-system,
|
|
BlinkMacSystemFont,
|
|
"Segoe UI",
|
|
Roboto,
|
|
Oxygen,
|
|
Ubuntu,
|
|
Cantarell,
|
|
"Open Sans",
|
|
"Helvetica Neue",
|
|
sans-serif;
|
|
}
|
|
|
|
.laput {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 5mm;
|
|
}
|
|
|
|
.lisalappu {
|
|
width: 85mm;
|
|
height: 54mm;
|
|
color: #aaa;
|
|
background: transparent;
|
|
border: 1px dashed #aaa;
|
|
font-size: 3em;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.lisalappu:hover {
|
|
background: #f0f0f0;
|
|
}
|
|
|
|
@media print {
|
|
.lisalappu {
|
|
display: none;
|
|
}
|
|
|
|
body {
|
|
margin: unset;
|
|
}
|
|
|
|
input {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
.lappu {
|
|
width: 85mm;
|
|
height: 54mm;
|
|
border: 1px solid black;
|
|
padding: 10mm;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
.lappu figure {
|
|
position: relative;
|
|
user-select: none;
|
|
width: 30%;
|
|
aspect-ratio: 1/1;
|
|
margin: 0 auto;
|
|
border-radius: 100%;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.lappu figure input {
|
|
position: absolute;
|
|
width: 100%;
|
|
height: 100%;
|
|
opacity: 0;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.lappu .username {
|
|
font-size: 16px;
|
|
font-weight: 400;
|
|
opacity: 0.8;
|
|
margin-top: 0.5rem;
|
|
}
|
|
|
|
.lappu .nimi {
|
|
font-size: 21px;
|
|
margin-top: 1rem;
|
|
}
|
|
</style>
|
|
<script>
|
|
function handleImage(file, element) {
|
|
if (file && file.type.startsWith("image/")) {
|
|
const reader = new FileReader();
|
|
reader.onload = (event) => {
|
|
if (event.target) {
|
|
element.src = event.target.result;
|
|
}
|
|
};
|
|
reader.readAsDataURL(file);
|
|
} else {
|
|
alert("Please drop an image file.");
|
|
}
|
|
}
|
|
|
|
function handleUpload(event) {
|
|
event.preventDefault();
|
|
const element = event.target.parentElement.querySelector("img");
|
|
handleImage(event.target.files[0], element);
|
|
}
|
|
|
|
const handleDrop = (e) => {
|
|
e.preventDefault();
|
|
const element = e.currentTarget;
|
|
const file = e.dataTransfer.files[0];
|
|
handleImage(file, element);
|
|
};
|
|
|
|
const handleDragOver = (e) => {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
};
|
|
|
|
const handleAdd = () => {
|
|
const laput = document.querySelector(".laput");
|
|
const template = document.querySelector("#lappu-template");
|
|
const lisalappuButton = document.querySelector(".lisalappu");
|
|
const clone = template.content.cloneNode(true);
|
|
laput.insertBefore(clone, lisalappuButton);
|
|
};
|
|
|
|
const handleYeet = (event) => {
|
|
const lappu = event.target;
|
|
if (lappu.classList.contains("lappu")) {
|
|
lappu.parentNode.removeChild(lappu);
|
|
event.preventDefault();
|
|
}
|
|
};
|
|
|
|
const handleBoot = () => {
|
|
handleAdd();
|
|
};
|
|
</script>
|
|
</head>
|
|
<body onload="handleBoot()">
|
|
<div class="laput">
|
|
<button class="lisalappu" onclick="handleAdd()">+</button>
|
|
</div>
|
|
<template id="lappu-template">
|
|
<div class="lappu" ondblclick="handleYeet(event)">
|
|
<div style="text-align: center">
|
|
<figure>
|
|
<input type="file" onchange="handleUpload(event)" />
|
|
<img
|
|
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M/wHwAEBgIApD5fRAAAAABJRU5ErkJggg=="
|
|
alt="Matti Meikäläinen"
|
|
style="width: 100%; height: 100%; object-fit: cover"
|
|
onDrop="handleDrop(event)"
|
|
onDragOver="handleDragOver(event)"
|
|
/>
|
|
</figure>
|
|
<h1 contenteditable class="nimi">Matti Meikäläinen</h1>
|
|
<h2 class="username" contenteditable>@mattimeikalainen</h2>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</body>
|
|
</html>
|