<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="/assets/main.css" />
<title>{{ title }}</title>
</head>
<body>
<header class="site-header">
<a class="brand" href="/">{{ brand }}</a>
<nav aria-label="Hauptmenü"> … </nav>
</header>
<main class="hero">
<h1 class="hero__title" data-reveal>{{ headline }}</h1>
</main>
</body>
</html>
/* assets/main.css */
:root { --accent: #2b6fff; --ink: #0b0c0d }
.hero { min-height: 100vh; display: grid; place-items: center }
.hero__title { font-weight: 800; letter-spacing: -.03em; line-height: 1 }
@keyframes reveal { from { opacity: 0; transform: translateY(40px) } to { opacity: 1 } }
.reveal { animation: reveal .9s cubic-bezier(.16, 1, .3, 1) both }
// app.js
const items = document.querySelectorAll("[data-reveal]");
const io = new IntersectionObserver((entries) => {
for (const e of entries)
if (e.isIntersecting) e.target.classList.add("reveal");
});
items.forEach((el) => io.observe(el));
async function load() {
const res = await fetch("/data/content.json");
render(await res.json());
}
load();
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="/assets/main.css" />
<title>{{ title }}</title>
</head>
<body>
<header class="site-header">
<a class="brand" href="/">{{ brand }}</a>
<nav aria-label="Hauptmenü"> … </nav>
</header>
<main class="hero">
<h1 class="hero__title" data-reveal>{{ headline }}</h1>
</main>
</body>
</html>
/* assets/main.css */
:root { --accent: #2b6fff; --ink: #0b0c0d }
.hero { min-height: 100vh; display: grid; place-items: center }
.hero__title { font-weight: 800; letter-spacing: -.03em; line-height: 1 }
@keyframes reveal { from { opacity: 0; transform: translateY(40px) } to { opacity: 1 } }
.reveal { animation: reveal .9s cubic-bezier(.16, 1, .3, 1) both }
// app.js
const items = document.querySelectorAll("[data-reveal]");
const io = new IntersectionObserver((entries) => {
for (const e of entries)
if (e.isIntersecting) e.target.classList.add("reveal");
});
items.forEach((el) => io.observe(el));
async function load() {
const res = await fetch("/data/content.json");
render(await res.json());
}
load();
Hier begleiten wir Projekte vom Entwurf bis kurz vor dem Launch — diskret, präzise, kreativ. Sie denken über eine eigene Website oder eine Beratung nach? Sprechen wir darüber.