feat: add zensebels.de — Zen/meditation onepager, japanese aesthetics

This commit is contained in:
m
2026-04-02 14:53:21 +02:00
parent 596ccac889
commit 8af8d3d35f
2 changed files with 388 additions and 0 deletions

View File

@@ -0,0 +1,384 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ZenSebels — 静けさ</title>
<meta name="description" content="ZenSebels — Stille. Klarheit. Praxis.">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🪷</text></svg>">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif+JP:wght@200;300;400;500;600&family=Inter:wght@200;300;400&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
:root {
--stone: #1c1b1a;
--stone-soft: #3a3835;
--stone-faint: #6b6660;
--stone-ghost: #a09a92;
--washi: #f7f3ed;
--washi-warm: #efe9df;
--washi-dark: #e8e0d4;
--sumi: #2c2a28;
--matcha: #7a9a6a;
--matcha-glow: rgba(122, 154, 106, 0.1);
--sand: #c4b69c;
--sand-glow: rgba(196, 182, 156, 0.12);
}
html { scroll-behavior: smooth; }
body {
font-family: 'Inter', -apple-system, sans-serif;
background: var(--washi);
color: var(--stone);
line-height: 1.7;
-webkit-font-smoothing: antialiased;
overflow-x: hidden;
}
.jp { font-family: 'Noto Serif JP', serif; }
/* === HERO === */
.hero {
min-height: 100vh;
display: flex; flex-direction: column;
align-items: center; justify-content: center;
text-align: center;
padding: 80px 32px;
position: relative;
}
.hero::before {
content: '';
position: absolute; inset: 0;
background: radial-gradient(ellipse at 50% 35%, var(--sand-glow) 0%, transparent 55%);
pointer-events: none;
}
.enso {
width: 180px; height: 180px;
margin-bottom: 48px;
position: relative;
opacity: 0;
animation: fadeIn 2s ease-out 0.3s forwards;
}
.enso svg {
width: 100%; height: 100%;
}
.enso-circle {
fill: none;
stroke: var(--stone);
stroke-width: 2.5;
stroke-linecap: round;
stroke-dasharray: 580;
stroke-dashoffset: 580;
animation: drawEnso 3s ease-in-out 0.5s forwards;
}
@keyframes drawEnso {
to { stroke-dashoffset: 45; }
}
.kanji {
font-family: 'Noto Serif JP', serif;
font-size: clamp(2.5rem, 6vw, 4rem);
font-weight: 200;
color: var(--stone-ghost);
letter-spacing: 0.4em;
margin-bottom: 32px;
opacity: 0;
animation: fadeIn 1.5s ease-out 1.5s forwards;
}
h1 {
font-family: 'Noto Serif JP', serif;
font-size: clamp(2rem, 5vw, 3.2rem);
font-weight: 400;
letter-spacing: 0.08em;
line-height: 1.2;
margin-bottom: 24px;
opacity: 0;
animation: fadeIn 1.5s ease-out 2s forwards;
}
.subtitle {
font-size: 0.95rem;
color: var(--stone-faint);
font-weight: 300;
letter-spacing: 0.12em;
text-transform: uppercase;
opacity: 0;
animation: fadeIn 1.5s ease-out 2.5s forwards;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
/* === DIVIDER === */
.breath {
padding: 80px 0;
text-align: center;
}
.breath-dot {
width: 6px; height: 6px;
background: var(--sand);
border-radius: 50%;
margin: 0 auto;
animation: breathe 6s ease-in-out infinite;
}
@keyframes breathe {
0%, 100% { transform: scale(1); opacity: 0.4; }
50% { transform: scale(2.5); opacity: 1; }
}
/* === WISDOM === */
.wisdom {
max-width: 640px;
margin: 0 auto;
padding: 0 32px 120px;
}
.wisdom-item {
padding: 64px 0;
border-top: 1px solid var(--washi-dark);
text-align: center;
opacity: 0;
transform: translateY(16px);
transition: opacity 1s ease, transform 1s ease;
}
.wisdom-item.visible {
opacity: 1;
transform: translateY(0);
}
.wisdom-jp {
font-family: 'Noto Serif JP', serif;
font-size: 1.6rem;
font-weight: 300;
color: var(--stone-ghost);
margin-bottom: 16px;
letter-spacing: 0.15em;
}
.wisdom-text {
font-family: 'Noto Serif JP', serif;
font-size: clamp(1.2rem, 3vw, 1.6rem);
font-weight: 400;
color: var(--stone);
line-height: 1.8;
margin-bottom: 12px;
}
.wisdom-source {
font-size: 0.8rem;
color: var(--stone-faint);
font-weight: 300;
letter-spacing: 0.08em;
}
/* === PRACTICE === */
.practice {
background: var(--washi-warm);
padding: 100px 32px;
text-align: center;
}
.practice h2 {
font-family: 'Noto Serif JP', serif;
font-size: clamp(1.5rem, 4vw, 2.2rem);
font-weight: 400;
margin-bottom: 48px;
letter-spacing: 0.05em;
}
.practice-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 40px;
max-width: 720px;
margin: 0 auto;
}
.practice-card {
text-align: center;
}
.practice-icon {
font-size: 2rem;
margin-bottom: 16px;
opacity: 0.7;
}
.practice-name {
font-family: 'Noto Serif JP', serif;
font-size: 1rem;
font-weight: 500;
margin-bottom: 8px;
letter-spacing: 0.05em;
}
.practice-desc {
font-size: 0.82rem;
color: var(--stone-faint);
font-weight: 300;
line-height: 1.6;
}
/* === BREATHING === */
.breathing {
padding: 120px 32px;
text-align: center;
}
.breathing-label {
font-size: 0.75rem;
color: var(--stone-ghost);
letter-spacing: 0.2em;
text-transform: uppercase;
margin-bottom: 32px;
}
.breathing-circle {
width: 100px; height: 100px;
border: 1.5px solid var(--sand);
border-radius: 50%;
margin: 0 auto 32px;
animation: breatheCircle 8s ease-in-out infinite;
}
@keyframes breatheCircle {
0%, 100% { transform: scale(0.6); opacity: 0.3; }
30% { transform: scale(1.2); opacity: 0.8; }
50% { transform: scale(1.2); opacity: 0.8; }
80% { transform: scale(0.6); opacity: 0.3; }
}
.breathing-text {
font-family: 'Noto Serif JP', serif;
font-size: 0.9rem;
color: var(--stone-faint);
font-weight: 300;
animation: breatheText 8s ease-in-out infinite;
}
@keyframes breatheText {
0%, 100% { opacity: 0; }
5% { opacity: 1; }
25% { opacity: 1; }
30% { opacity: 0; }
50% { opacity: 0; }
55% { opacity: 1; }
75% { opacity: 1; }
80% { opacity: 0; }
}
/* === FOOTER === */
footer {
padding: 48px 32px;
text-align: center;
border-top: 1px solid var(--washi-dark);
}
footer p {
font-size: 0.75rem;
color: var(--stone-ghost);
font-weight: 300;
letter-spacing: 0.1em;
}
/* === RESPONSIVE === */
@media (max-width: 640px) {
.practice-grid { grid-template-columns: 1fr; gap: 32px; }
.wisdom-item { padding: 48px 0; }
.enso { width: 140px; height: 140px; }
}
</style>
</head>
<body>
<section class="hero">
<div class="enso">
<svg viewBox="0 0 200 200">
<circle class="enso-circle" cx="100" cy="100" r="88" />
</svg>
</div>
<div class="kanji"></div>
<h1>ZenSebels</h1>
<p class="subtitle">Stille · Klarheit · Praxis</p>
</section>
<div class="breath">
<div class="breath-dot"></div>
</div>
<section class="wisdom">
<div class="wisdom-item">
<p class="wisdom-jp">初心</p>
<p class="wisdom-text">Im Geist des Anfängers gibt es viele Möglichkeiten. Im Geist des Experten nur wenige.</p>
<p class="wisdom-source">Shunryū Suzuki</p>
</div>
<div class="wisdom-item">
<p class="wisdom-jp">一期一会</p>
<p class="wisdom-text">Jede Begegnung ist einmalig und kann nicht wiederholt werden.</p>
<p class="wisdom-source">Teezeremonie-Weisheit</p>
</div>
<div class="wisdom-item">
<p class="wisdom-jp">無為</p>
<p class="wisdom-text">Nicht Nichtstun. Sondern tun, ohne zu erzwingen.</p>
<p class="wisdom-source">Laozi</p>
</div>
</section>
<section class="practice">
<h2 class="jp">三つの柱</h2>
<div class="practice-grid">
<div class="practice-card">
<div class="practice-icon">🧘</div>
<p class="practice-name">Zazen</p>
<p class="practice-desc">Sitzen. Atmen. Loslassen. Die einfachste und schwierigste Übung zugleich.</p>
</div>
<div class="practice-card">
<div class="practice-icon">🍵</div>
<p class="practice-name">Chadō</p>
<p class="practice-desc">Der Weg des Tees. Jede Bewegung bewusst. Jeder Moment vollständig.</p>
</div>
<div class="practice-card">
<div class="practice-icon">✍️</div>
<p class="practice-name">Shodō</p>
<p class="practice-desc">Der Weg der Schrift. Ein Strich, unwiderruflich. Kontrolle durch Loslassen.</p>
</div>
</div>
</section>
<section class="breathing">
<p class="breathing-label">Atme mit</p>
<div class="breathing-circle"></div>
<p class="breathing-text jp">吸う — 吐く</p>
</section>
<footer>
<p>zensebels.de — 2026</p>
</footer>
<script>
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) entry.target.classList.add('visible');
});
}, { threshold: 0.2 });
document.querySelectorAll('.wisdom-item').forEach(el => observer.observe(el));
</script>
</body>
</html>

View File

@@ -0,0 +1,4 @@
domain: zensebels.de
template: custom
title: "ZenSebels"
description: "Stille. Klarheit. Praxis."