← back to Model Arena
data/artifacts/035b7009e366/hermes3-8b.html
194 lines
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Designer Wallcoverings</title>
<style>
:root {
--bg-color: #faf8f4;
--surface-color: #ffffff;
--text-color: #1c1a17;
--muted-color: #9b948a;
--accent-color: #b0472e;
--accent-hover: #2f4c39;
--line-color: #f5f2ea;
--shadow-color: rgba(0, 0, 0, .12);
--hover-shadow: rgba(0, 0, 0, .18);
--ease-in-out-quart: cubic-bezier(.22, 1, .36, 1);
}
body {
background-color: var(--bg-color);
color: var(--text-color);
font-family: -apple-system, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
display: flex;
justify-content: center;
margin: 0;
padding-top: 60px;
}
.wall {
background-color: var(--surface-color);
box-shadow: 0 8px 24px var(--shadow-color);
display: flex;
align-items: center;
position: relative;
width: 100vw;
}
.roller {
background-color: var(--accent-color);
border-radius: 50%;
box-shadow: 0 0 24px rgba(var(--accent-hover), 35%);
cursor: grab;
display: block;
height: 80px;
position: absolute;
width: 80px;
}
.roll {
animation: roll 1s infinite linear;
background-color: var(--surface-color);
box-shadow: 0 16px 48px var(--hover-shadow);
border-radius: 50%;
cursor: pointer;
display: block;
height: 100px;
position: absolute;
width: 100px;
}
.obstacle {
background-color: var(--muted-color);
box-shadow: 0 8px 24px var(--shadow-color);
border-radius: 50%;
cursor: default;
display: block;
height: 120px;
position: absolute;
width: 120px;
}
.pattern {
background-color: var(--accent-hover);
box-shadow: 0 8px 24px var(--shadow-color);
border-radius: 50%;
cursor: pointer;
display: block;
height: 80px;
position: absolute;
width: 80px;
}
.overlay {
background-color: rgba(0, 0, 0, .7);
color: var(--text-color);
display: none;
justify-content: center;
left: 0;
opacity: 0;
padding: 20px;
position: fixed;
right: 0;
top: 0;
text-align: center;
}
.overlay.visible {
display: flex;
opacity: 1;
}
@keyframes roll {
from {transform: rotate(0deg);}
to {transform: rotate(360deg);}
}
@keyframes fadeUp {
from {opacity: 0; transform: translateY(28px);}
to {opacity: 1; transform: translateY(0);}
}
</style>
<body>
<div class="wall" style="--surface-color:#fff9f1">
<div class="roller" style="top:50vh;"></div>
<span class="score">Score: 0</span>
<div class="score">Best: 0</div>
<div class="roll" style="left:100vw;"></div>
<div class="obstacle" style="right:5vw;"></div>
<div class="pattern" style="left:10vw; bottom:20vh;"></div>
<div class="pattern" style="right:15vw; top:30vh;"></div>
<div class="pattern" style="left:25vw; bottom:10vh;"></div>
</div>
<div class="overlay">
Game Over
</div>
<script>
document.addEventListener("DOMContentLoaded", () => {
const wall = document.querySelector(".wall");
let score = 0;
let bestScore = 0;
function rollRoller() {
if (Math.random() < 0.1) {
score++;
wall.querySelectorAll(".pattern").forEach((p, i) => {
p.style.animationName = `roll`;
setTimeout(() => {
p.style.animationName = ``;
p.style.transform = `translate(${Math.random()*100}vw, ${Math.random()*50}vh)`;
}, (i === 0 ? 500 : 0));
});
} else {
score = Math.max(score, ++bestScore);
}
document.querySelector(".score").textContent = `Score: ${score}`;
document.querySelector(".score:last-child").textContent = `Best: ${bestScore}`;
const roll = wall.querySelector(".roll");
if (Math.random() < 0.02) {
roll.style.animationName = ``;
roll.style.transform = `translate(${Math.random()*100}vw, ${Math.random()*50}vh)`;
setTimeout(() => {
roll.style.animationName = `roll`;
roll.style.transform = `translate(0, 50%)`;
}, 600);
}
}
setInterval(() => {
const obstacles = Array.from(wall.querySelectorAll(".obstacle")).filter(o => !o.classList.contains("collected"));
if (obs) {
obs.forEach((o, i) => o.style.transform = `translate(${Math.random()*50}vw, ${Math.random()*20}vh)`);
setTimeout(() => {
obs.forEach(o => o.classList.add("collected"));
wall.querySelector(".obstacle:last-child").remove();
}, (i === 0 ? 500 : 0));
}
if (!obs.length && score >= bestScore) rollRoller();
}, 150);
wall.addEventListener("click", (e) => {
if (e.target.matches(".pattern")) e.target.style.display = "none";
else if (e.target.matches(".roll") || e.target.matches(".obstacle")) return;
const obs = Array.from(wall.querySelectorAll(".obstacle")).filter(o => !o.classList.contains("collected"));
if (obs.length && score >= bestScore) {
obs[0].classList.add("collected");
setTimeout(() => {
obs.forEach((o, i) => o.style.transform = `translate(${Math.random()*50}vw, ${Math.random()*20}vh)`);
wall.querySelector(".obstacle:last-child").remove();
}, 100);
}
});
wall.addEventListener("gameover", () => {
document.querySelector(".overlay").classList.add("visible");
});
});
</script>
</body>
</html>