Files
playground/public/who-let-the-ghost-out/index.html
T
cursor 80529b54f8 fix: trim ghost onepager per issue #8 feedback
Remove Dienstag-Doku line, Ohrwurm button, and Quäl-👻 ad line; add Pinguin-Knie sponsor footer.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-08 07:05:03 +00:00

465 lines
15 KiB
HTML

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Who let the ghost out? — Der offizielle Quäl-👻-Ohrwurm.">
<title>Who let the ghost out?</title>
<style>
:root {
--bg: #0a0612;
--surface: #140f1e;
--border: #2e2440;
--text: #f3eef8;
--muted: #a894c4;
--glow: #7cff6b;
--purple: #b366ff;
--lime: #c8ff00;
--max: 44rem;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.65;
font-size: 1.05rem;
overflow-x: hidden;
}
/* —— floating background 👻 —— */
.haunt-bg {
position: fixed;
inset: 0;
pointer-events: none;
z-index: 0;
overflow: hidden;
}
.haunt-bg span {
position: absolute;
font-size: clamp(1.5rem, 4vw, 2.5rem);
opacity: 0.12;
animation: drift linear infinite;
}
.haunt-bg span:nth-child(1) { left: 8%; top: 12%; animation-duration: 18s; }
.haunt-bg span:nth-child(2) { left: 72%; top: 8%; animation-duration: 22s; animation-delay: -4s; }
.haunt-bg span:nth-child(3) { left: 45%; top: 55%; animation-duration: 16s; animation-delay: -8s; }
.haunt-bg span:nth-child(4) { left: 88%; top: 70%; animation-duration: 20s; animation-delay: -2s; }
.haunt-bg span:nth-child(5) { left: 15%; top: 78%; animation-duration: 24s; animation-delay: -11s; }
@keyframes drift {
0%, 100% { transform: translate(0, 0) rotate(-5deg); }
25% { transform: translate(12px, -20px) rotate(5deg); }
50% { transform: translate(-8px, -35px) rotate(-3deg); }
75% { transform: translate(15px, -15px) rotate(8deg); }
}
.wrap { position: relative; z-index: 1; }
/* —— hero + main ghost —— */
.hero {
text-align: center;
padding: 2.5rem 1.25rem 2rem;
background:
radial-gradient(ellipse 80% 55% at 50% 0%, rgba(179, 102, 255, 0.22), transparent),
radial-gradient(ellipse 40% 30% at 80% 60%, rgba(124, 255, 107, 0.08), transparent),
var(--bg);
}
.ghost-stage {
position: relative;
width: min(100%, 18rem);
height: 14rem;
margin: 0 auto 1.25rem;
}
.ghost-svg {
position: absolute;
left: 50%;
bottom: 0;
transform: translateX(-50%);
width: 9rem;
height: auto;
filter: drop-shadow(0 0 24px rgba(179, 102, 255, 0.55));
animation: ghost-bob 2.4s ease-in-out infinite, ghost-wiggle 0.8s ease-in-out infinite;
}
@keyframes ghost-bob {
0%, 100% { transform: translateX(-50%) translateY(0); }
50% { transform: translateX(-50%) translateY(-18px); }
}
@keyframes ghost-wiggle {
0%, 100% { rotate: -4deg; }
50% { rotate: 4deg; }
}
.ghost-emoji {
position: absolute;
font-size: 2.2rem;
animation: emoji-orbit 3s ease-in-out infinite;
}
.ghost-emoji.e1 { left: 5%; top: 30%; animation-delay: 0s; }
.ghost-emoji.e2 { right: 8%; top: 20%; animation-delay: -1s; font-size: 1.6rem; }
.ghost-emoji.e3 { left: 22%; bottom: 15%; animation-delay: -2s; font-size: 1.4rem; }
@keyframes emoji-orbit {
0%, 100% { transform: translateY(0) scale(1); opacity: 0.9; }
50% { transform: translateY(-12px) scale(1.15); opacity: 1; }
}
.motto {
font-size: clamp(1.85rem, 7vw, 3.2rem);
font-weight: 900;
letter-spacing: -0.03em;
line-height: 1.08;
text-transform: uppercase;
background: linear-gradient(135deg, var(--lime), var(--glow), var(--purple));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 0.5rem;
animation: motto-pulse 1.2s ease-in-out infinite;
}
@keyframes motto-pulse {
0%, 100% { filter: brightness(1); }
50% { filter: brightness(1.25); }
}
.sub-de {
color: var(--muted);
font-size: 1.05rem;
max-width: 28rem;
margin: 0 auto 1.5rem;
}
/* —— earworm chorus —— */
.chorus-box {
max-width: 36rem;
margin: 0 auto 2rem;
padding: 1.25rem 1rem;
background: var(--surface);
border: 2px solid var(--purple);
border-radius: 1rem;
box-shadow: 0 0 40px rgba(179, 102, 255, 0.2);
}
.chorus-label {
font-size: 0.72rem;
text-transform: uppercase;
letter-spacing: 0.16em;
color: var(--glow);
margin-bottom: 0.75rem;
}
.chorus-line {
font-size: clamp(1.1rem, 4.5vw, 1.55rem);
font-weight: 800;
margin-bottom: 0.35rem;
}
.chorus-line.en { color: var(--lime); }
.chorus-barks {
display: flex;
justify-content: center;
gap: 0.35rem;
flex-wrap: wrap;
margin-top: 0.6rem;
}
.chorus-barks span {
display: inline-block;
font-size: 1.8rem;
animation: bark 0.55s ease-in-out infinite;
}
.chorus-barks span:nth-child(1) { animation-delay: 0s; }
.chorus-barks span:nth-child(2) { animation-delay: 0.14s; }
.chorus-barks span:nth-child(3) { animation-delay: 0.28s; }
.chorus-barks span:nth-child(4) { animation-delay: 0.42s; }
@keyframes bark {
0%, 100% { transform: scale(1) translateY(0); }
50% { transform: scale(1.35) translateY(-6px); }
}
/* —— images —— */
.scene-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 0.65rem;
max-width: 32rem;
margin: 0 auto 2rem;
padding: 0 1rem;
}
.scene-card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 0.75rem;
overflow: hidden;
aspect-ratio: 4/3;
}
.scene-card.wide {
grid-column: span 2;
aspect-ratio: 16/7;
}
.scene-card svg {
display: block;
width: 100%;
height: 100%;
}
.scene-caption {
text-align: center;
font-size: 0.78rem;
color: var(--muted);
padding: 0.35rem 0.5rem 0.5rem;
background: var(--surface);
}
main {
max-width: var(--max);
margin: 0 auto;
padding: 0 1.25rem 3.5rem;
}
section { margin-bottom: 2.25rem; }
h2 {
font-size: 0.82rem;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--glow);
margin-bottom: 0.7rem;
}
p { margin-bottom: 1rem; }
.lyrics {
list-style: none;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 0.75rem;
padding: 1rem 1.15rem;
}
.lyrics li {
padding: 0.45rem 0;
border-bottom: 1px dashed var(--border);
font-size: 0.98rem;
}
.lyrics li:last-child { border-bottom: none; }
.lyrics .hook {
color: var(--lime);
font-weight: 700;
font-size: 1.05rem;
}
.faq {
display: grid;
gap: 0.65rem;
}
.faq dt {
font-weight: 700;
color: var(--purple);
}
.faq dd {
margin: 0 0 0.75rem 0;
color: var(--muted);
padding-left: 0.5rem;
border-left: 3px solid var(--glow);
}
.warning {
text-align: center;
padding: 1.5rem;
background: rgba(200, 255, 0, 0.06);
border: 1px dashed var(--lime);
border-radius: 0.75rem;
font-size: 0.95rem;
}
.warning strong { color: var(--lime); }
footer {
text-align: center;
padding: 1.25rem;
border-top: 1px solid var(--border);
color: var(--muted);
font-size: 0.8rem;
}
footer a { color: var(--purple); }
footer .sponsor {
margin-top: 0.85rem;
color: var(--lime);
font-size: 0.9rem;
font-weight: 600;
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
}
}
</style>
</head>
<body>
<div class="haunt-bg" aria-hidden="true">
<span>👻</span><span>👻</span><span>👻</span><span>👻</span><span>👻</span>
</div>
<div class="wrap">
<header class="hero">
<div class="ghost-stage" aria-hidden="true">
<span class="ghost-emoji e1">👻</span>
<span class="ghost-emoji e2">👻</span>
<span class="ghost-emoji e3">Quäl-👻</span>
<svg class="ghost-svg" viewBox="0 0 120 140" role="img" aria-label="Animierter Quäl-👻">
<defs>
<radialGradient id="gBody" cx="50%" cy="35%" r="55%">
<stop offset="0%" stop-color="#f8f4ff"/>
<stop offset="100%" stop-color="#d4c4f0"/>
</radialGradient>
</defs>
<ellipse cx="60" cy="118" rx="38" ry="8" fill="rgba(124,255,107,0.15)"/>
<path fill="url(#gBody)" d="M30 55 C30 25 90 25 90 55 L90 95 C90 95 78 88 68 95 C58 102 52 88 42 95 C32 102 30 95 30 95 Z"/>
<circle cx="48" cy="52" r="7" fill="#1a0a2e"/>
<circle cx="72" cy="52" r="7" fill="#1a0a2e"/>
<circle cx="50" cy="50" r="2.5" fill="#fff"/>
<circle cx="74" cy="50" r="2.5" fill="#fff"/>
<ellipse cx="60" cy="68" rx="5" ry="7" fill="#1a0a2e"/>
<path d="M52 78 Q60 86 68 78" stroke="#1a0a2e" stroke-width="2" fill="none" stroke-linecap="round"/>
</svg>
</div>
<h1 class="motto">Who let the ghost out?</h1>
<p class="sub-de">
Der Quäl-👻 ist draußen.
Niemand will zugeben, wer die Tür aufgemacht hat.
</p>
<div class="chorus-box">
<p class="chorus-label">Ohrwurm — nicht abschaltbar</p>
<p class="chorus-line en">Who let the ghost out?</p>
<p class="chorus-line">Wer hat den Quäl-👻 rausgelassen?</p>
<div class="chorus-barks" aria-hidden="true">
<span>👻</span><span>👻</span><span>👻</span><span>👻</span>
</div>
</div>
</header>
<div class="scene-grid" aria-label="Bilder vom Quäl-👻-Vorfall">
<figure class="scene-card wide">
<svg viewBox="0 0 640 280" preserveAspectRatio="xMidYMid slice">
<rect width="640" height="280" fill="#0d0818"/>
<circle cx="520" cy="60" r="45" fill="#f0e6a0" opacity="0.9"/>
<rect x="80" y="120" width="200" height="140" fill="#1a1228" stroke="#3d2d55" stroke-width="2"/>
<polygon points="70,120 180,40 290,120" fill="#241a35"/>
<rect x="145" y="175" width="50" height="85" fill="#0a0612"/>
<rect x="100" y="150" width="35" height="45" fill="#7cff6b" opacity="0.3"/>
<text x="320" y="200" font-size="48" fill="#b366ff">👻</text>
<text x="380" y="160" font-size="32" fill="#c8ff00" opacity="0.8">👻</text>
<text x="450" y="220" font-size="28">👻</text>
<text x="200" y="250" fill="#a894c4" font-size="14" font-family="system-ui">Tür offen. Quäl-👻 weg.</text>
</svg>
<figcaption class="scene-caption">Szene 1 — Das Haus, 23:59 Uhr</figcaption>
</figure>
<figure class="scene-card">
<svg viewBox="0 0 320 240" preserveAspectRatio="xMidYMid slice">
<rect width="320" height="240" fill="#120a1c"/>
<ellipse cx="160" cy="200" rx="120" ry="25" fill="#1a1028"/>
<text x="110" y="130" font-size="64">👻</text>
<text x="60" y="80" font-size="28" opacity="0.5">👻</text>
<path d="M40 200 L280 200" stroke="#7cff6b" stroke-width="2" stroke-dasharray="8 6"/>
<text x="50" y="225" fill="#a894c4" font-size="11" font-family="system-ui">Fluchtweg</text>
</svg>
<figcaption class="scene-caption">Szene 2 — Flucht</figcaption>
</figure>
<figure class="scene-card">
<svg viewBox="0 0 320 240" preserveAspectRatio="xMidYMid slice">
<rect width="320" height="240" fill="#0f0a18"/>
<rect x="40" y="60" width="240" height="140" rx="8" fill="#1e1430" stroke="#b366ff"/>
<text x="70" y="110" fill="#c8ff00" font-size="13" font-family="monospace">ALARM: 👻 OUT</text>
<text x="70" y="140" fill="#a894c4" font-size="11" font-family="monospace">Status: Ohrwurm aktiv</text>
<text x="70" y="170" fill="#7cff6b" font-size="11" font-family="monospace">Repeat: ∞</text>
<text x="230" y="100" font-size="40">👻</text>
</svg>
<figcaption class="scene-caption">Szene 3 — Systemmeldung</figcaption>
</figure>
</div>
<main>
<section>
<h2>Was ist passiert?</h2>
<p>
Kurz vor Mitternacht ging im Keller die Kette — und plötzlich war der Quäl-👻
nicht mehr im Regal, sondern im Flur, im WLAN und in deinem Kopf.
Zeugen berichten von einem Refrain, der sich wie ein 2000er-Hitfest
an die Hirnrinde klammert.
</p>
<p>
Die Ermittlung läuft. Verdächtig: die Katze, der Wind, und jeder,
der jemals „nur kurz“ die Terrassentür offen gelassen hat.
</p>
</section>
<section>
<h2>Der Ohrwurm (deutsche Fassung)</h2>
<ul class="lyrics">
<li class="hook">Who let the ghost out? — Wer hat den Quäl-👻 rausgelassen?</li>
<li>👻 👻 👻 👻 (vier Mal, wie früher „woof woof“)</li>
<li>Der Nachbar fragt: „Ist das ein Song oder ein Polterfall?“</li>
<li>Die Antwort: Beides. Der Quäl-👻 tanzt den Moonwalk durch die Küche.</li>
<li class="hook">Who let the ghost out? — Im Kopf, auf Dauerschleife.</li>
<li>Niemand gibt zu, wer die Tür aufgemacht hat. Alle nicken im Takt.</li>
</ul>
</section>
<section>
<h2>Häufige Fragen</h2>
<dl class="faq">
<dt>Wer hat den Quäl-👻 rausgelassen?</dt>
<dd>Unbekannt. Die Kamera zeigt nur ein grinsendes 👻 und dann Static.</dd>
<dt>Kann ich den Ohrwurm stoppen?</dt>
<dd>Theoretisch ja. Praktisch: Du liest diese Seite. Du kennst den Refrain schon.</dd>
<dt>Ist das der Hund von Baha Men?</dt>
<dd>Nein. Das ist der Quäl-👻. Gleicher Beat-Gefühl, andere Spezies, mehr Spuk.</dd>
</dl>
</section>
<section>
<div class="warning">
<strong>Warnung:</strong> Nach dem Besuch dieser Seite summst du
„Who let the ghost out?“ mindestens bis Freitag.
</div>
</section>
</main>
<footer>
Erstellt von @cursor · Gitea Issue #8 ·
<a href="https://gitea.schwenk.online/froxxxy/playground/issues/8">froxxxy/playground</a>
· Inspiriert von einem bestimmten Hund-Hit aus dem Jahr 2000
<p class="sponsor">Diese Seite wurde gesponsert von Pinguin-Knie!</p>
</footer>
</div>
</body>
</html>