feat: music player redesign, candle section, impressum

MusicPlayer:
- Beautiful inline section with numbered track list + click-to-play
- Animated waveform bars on playing track
- Time display (elapsed / duration) on progress bar
- Floating mini-player with track name + time, shows after first play
- Play/pause in mini-player, close button

CandleSection:
- 7 hand-coded CSS/Framer Motion candle flames with organic flicker
- Layered flame (outer glow + main + inner core) + wax drip highlight
- "Ruhe in Frieden" text with subtle glow

Impressum:
- New /impressum page with TMG §5 structure (placeholder address)
- Privacy notice (no cookies/tracking, voluntary memory data)
- Copyright, liability disclaimer
- Consistent cream design with Cormorant/Lora typography

page.tsx:
- CandleSection added between VideoGallery and MusicPlayer
- Musik nav link (conditional on tracks)
- Footer Impressum link
- MemorySection wrapped in id="erinnerungen" section for nav anchor

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
denshooter
2026-02-16 02:08:28 +01:00
parent 279a07e4eb
commit 4aeb08cb57
4 changed files with 582 additions and 94 deletions
+41 -19
View File
@@ -5,6 +5,7 @@ import PhotoSlideshow from '@/components/PhotoSlideshow'
import PhotoGallery from '@/components/PhotoGallery'
import MemorySection from '@/components/MemorySection'
import WriteSection from '@/components/WriteSection'
import CandleSection from '@/components/CandleSection'
import MusicPlayer from '@/components/MusicPlayer'
import VideoGallery from '@/components/VideoGallery'
@@ -31,7 +32,7 @@ export default async function HomePage() {
{/* Hero */}
<HeroSection heroPhoto={photos[0]?.filename ?? null} />
{/* Navigation anchors */}
{/* Navigation */}
<nav className="sticky top-0 z-20 bg-cream/80 backdrop-blur-sm border-b border-warm-border">
<div className="max-w-4xl mx-auto px-4 py-3 flex items-center justify-center gap-6 sm:gap-10">
{photos.length > 0 && (
@@ -42,14 +43,12 @@ export default async function HomePage() {
Bilder
</a>
)}
{memories.length > 0 && (
<a
href="#erinnerungen"
className="text-warm-brown-light hover:text-warm-gold text-sm font-cormorant italic transition-colors"
>
Erinnerungen
</a>
)}
<a
href="#erinnerungen"
className="text-warm-brown-light hover:text-warm-gold text-sm font-cormorant italic transition-colors"
>
Erinnerungen
</a>
{videos.length > 0 && (
<a
href="#videos"
@@ -58,6 +57,14 @@ export default async function HomePage() {
Videos
</a>
)}
{music.length > 0 && (
<a
href="#musik"
className="text-warm-brown-light hover:text-warm-gold text-sm font-cormorant italic transition-colors"
>
Musik
</a>
)}
</div>
</nav>
@@ -86,11 +93,16 @@ export default async function HomePage() {
<WriteSection />
{/* Memories */}
<MemorySection memories={memories} />
<section id="erinnerungen">
<MemorySection memories={memories} />
</section>
{/* Videos */}
<VideoGallery videos={videos} />
{/* Candle section */}
<CandleSection />
{/* Music player */}
<MusicPlayer tracks={music} />
@@ -117,16 +129,26 @@ export default async function HomePage() {
<p className="font-cormorant italic text-warm-brown-light/60 text-lg">
Du bist nicht fort, nur ein Schritt voraus."
</p>
</div>
{/* Hidden admin link */}
<a
href="/admin"
className="mt-10 inline-block text-warm-border/30 hover:text-warm-border/60 text-xs transition-colors"
title="Verwaltung"
>
·
</a>
{/* Footer links */}
<div className="mt-10 flex items-center justify-center gap-6">
<a
href="/impressum"
className="text-warm-brown-light/40 hover:text-warm-brown-light/70 text-xs font-lora tracking-wider transition-colors duration-200"
>
Impressum
</a>
<span className="text-warm-border/40 text-xs">·</span>
{/* Hidden admin link */}
<a
href="/admin"
className="text-warm-border/30 hover:text-warm-border/60 text-xs transition-colors"
title="Verwaltung"
>
·
</a>
</div>
</div>
</footer>
</main>
)