mirror of
https://github.com/HolgerHatGarKeineNode/einundzwanzig-nostr.git
synced 2026-01-28 07:43:18 +00:00
359 lines
11 KiB
Markdown
359 lines
11 KiB
Markdown
# PRD: Einundzwanzig Portal - Cinematic Presentation Video
|
|
|
|
## Executive Summary
|
|
|
|
**Produkt:** 90-Sekunden kinoreifes Präsentationsvideo des Einundzwanzig Portals
|
|
**Technologie:** Remotion 4.0.409 + React Three Fiber + Tailwind CSS v4
|
|
**Auflösung:** 1920x1080 (Desktop) + 1080x1920 (Mobile)
|
|
**Ziel:** Das Portal als lebendige, wachsende Bitcoin-Community-Infrastruktur präsentieren
|
|
|
|
---
|
|
|
|
## Vision
|
|
|
|
Das Video zeigt nicht einfach eine Website — es **enthüllt** eine Bewegung. Jede Animation verstärkt die Botschaft: Die deutschsprachige Bitcoin-Community ist organisiert, aktiv und wächst. Das Portal ist das Nervenzentrum.
|
|
|
|
---
|
|
|
|
## Verfügbare Assets
|
|
|
|
### Logos
|
|
- `public/einundzwanzig-square-inverted.svg` — Hauptlogo
|
|
- `public/einundzwanzig-horizontal-inverted.svg` — Horizontal Logo
|
|
- `public/bitcoin-logo.svg` — Bitcoin Symbol
|
|
- `public/einundzwanzig-wallpaper.png` — Background
|
|
|
|
### Meetup-Logos (100+)
|
|
- `public/logos/EinundzwanzigKempten.png`
|
|
- `public/logos/EinundzwanzigFrankfurtAmMain.png`
|
|
- `public/logos/EinundzwanzigSaarland.png`
|
|
- `public/logos/EinundzwanzigDarmstadt.png`
|
|
- `public/logos/EinundzwanzigTrier.png`
|
|
- ... (vollständige Liste in `public/logos/`)
|
|
|
|
### Audio
|
|
- `public/music/background-music.mp3`
|
|
- `public/sfx/` — 17 Sound Effects (logo-whoosh, typing, card-slide, etc.)
|
|
|
|
### Bestehende Komponenten (wiederverwendbar)
|
|
- `src/components/AnimatedLogo.tsx` — 3D Logo mit Glow
|
|
- `src/components/BitcoinEffect.tsx` — Fallende Bitcoin-Partikel
|
|
- `src/components/AudioManager.tsx` — Audio-Orchestrierung
|
|
|
|
---
|
|
|
|
## Szenen-Übersicht
|
|
|
|
| # | Szene | Dauer | Frames | Fokus |
|
|
|---|-------|-------|--------|-------|
|
|
| 1 | Logo Reveal | 6s | 0-180 | Brand Impact |
|
|
| 2 | Portal Title | 4s | 180-300 | Erwartung setzen |
|
|
| 3 | Dashboard Overview | 12s | 300-660 | Full Picture |
|
|
| 4 | Meine Meetups | 12s | 660-1020 | Persönliche Verbindung |
|
|
| 5 | Top Länder | 12s | 1020-1380 | Geografische Reichweite |
|
|
| 6 | Top Meetups | 10s | 1380-1680 | Community Chapters |
|
|
| 7 | Activity Feed | 10s | 1680-1980 | Live Pulse |
|
|
| 8 | Call to Action | 12s | 1980-2340 | Conversion |
|
|
| 9 | Outro | 12s | 2340-2700 | Brand Cement |
|
|
|
|
**Total: 90 Sekunden = 2700 Frames @ 30fps**
|
|
|
|
---
|
|
|
|
## Milestones
|
|
|
|
### Milestone 1: Foundation Setup
|
|
**Ziel:** Projektstruktur und Basis-Komponenten
|
|
**Deliverables:**
|
|
- [ ] Ordnerstruktur `src/scenes/portal/` erstellen
|
|
- [ ] Ordnerstruktur `src/components/portal/` erstellen
|
|
- [ ] `PortalPresentation.tsx` Hauptkomposition (Skeleton)
|
|
- [ ] Root.tsx mit neuen Compositions aktualisieren
|
|
- [ ] Basis-Test: Leere Composition rendert ohne Fehler
|
|
|
|
**Verifikation:** `npm run dev` → "PortalPresentation" auswählbar, schwarzer Bildschirm
|
|
|
|
---
|
|
|
|
### Milestone 2: Reusable UI Components
|
|
**Ziel:** Dashboard-Elemente als wiederverwendbare Komponenten
|
|
**Deliverables:**
|
|
- [ ] `StatsCounter.tsx` — Animierte Zahlen (0 → 204)
|
|
- [ ] `SparklineChart.tsx` — SVG Linien-Animation
|
|
- [ ] `MeetupCard.tsx` — Meetup-Karte mit Logo, Name, Location
|
|
- [ ] `CountryBar.tsx` — Land + Flag + User-Count + Bar
|
|
- [ ] `ActivityItem.tsx` — Aktivitäts-Feed Eintrag
|
|
- [ ] `DashboardSidebar.tsx` — Komplette Sidebar Recreation
|
|
|
|
**Verifikation:** Jede Komponente einzeln in einer Test-Composition sichtbar
|
|
|
|
---
|
|
|
|
### Milestone 3: Scene 1+2 — Intro & Title
|
|
**Ziel:** Kinoqualität Einstieg
|
|
**Deliverables:**
|
|
- [ ] `PortalIntroScene.tsx` — Logo Reveal (6s)
|
|
- AnimatedLogo von 0 auf 100% mit Particles
|
|
- Wallpaper Background mit Zoom
|
|
- Audio: logo-whoosh → logo-reveal
|
|
- [ ] `PortalTitleScene.tsx` — Title Card (4s)
|
|
- "EINUNDZWANZIG PORTAL" Typing-Animation
|
|
- Subtitle Fade-in
|
|
- Audio: typing → ui-appear
|
|
|
|
**Verifikation:** Frame 0-300 zeigt Logo-Animation + Titel
|
|
|
|
---
|
|
|
|
### Milestone 4: Scene 3 — Dashboard Overview
|
|
**Ziel:** Das vollständige Dashboard erscheint
|
|
**Deliverables:**
|
|
- [ ] `DashboardOverviewScene.tsx` (12s)
|
|
- 3D Perspective Entrance (von oben, kippt zu flat)
|
|
- Sidebar slides in (spring, von links)
|
|
- Header animiert ein
|
|
- Content Cards staggered reveal (5 Frames Delay)
|
|
- Sidebar Badges zählen hoch (Meetups: 204, etc.)
|
|
- Audio: card-slide (mehrfach, gestaffelt)
|
|
|
|
**Verifikation:** Frame 300-660 zeigt komplettes Dashboard
|
|
|
|
---
|
|
|
|
### Milestone 5: Scene 4 — Meine Meetups
|
|
**Ziel:** Persönliche Verbindung zum Nutzer
|
|
**Deliverables:**
|
|
- [ ] `MeetupShowcaseScene.tsx` (12s)
|
|
- Camera zoom in auf "Meine nächsten Meetup Termine"
|
|
- "Einundzwanzig Kempten" Karte hebt sich (3D Shadow)
|
|
- Echtes Logo: `EinundzwanzigKempten.png`
|
|
- Location + Datum animieren ein
|
|
- "Meine Meetups" Liste: Kempten, Memmingen, Friedrichshafen
|
|
- Action Buttons erscheinen
|
|
- Audio: slide-in, badge-appear
|
|
|
|
**Verifikation:** Frame 660-1020 zeigt Meetup-Details
|
|
|
|
---
|
|
|
|
### Milestone 6: Scene 5 — Top Länder
|
|
**Ziel:** Geografische Reichweite visualisieren
|
|
**Deliverables:**
|
|
- [ ] `CountryStatsScene.tsx` (12s)
|
|
- Smooth transition vom Dashboard
|
|
- Länder erscheinen sequentiell:
|
|
1. 🇩🇪 Germany — 458 User
|
|
2. 🇦🇹 Austria — 59 User
|
|
3. 🇨🇭 Switzerland — 34 User
|
|
4. 🇱🇺 Luxembourg — 8 User
|
|
5. 🇧🇬 Bulgaria — 7 User
|
|
6. 🇪🇸 Spain — 3 User
|
|
- Zahlen zählen hoch (StatsCounter)
|
|
- Progress Bars füllen sich (spring)
|
|
- SparklineCharts animieren
|
|
- Audio: success-chime pro Land
|
|
|
|
**Verifikation:** Frame 1020-1380 zeigt Länder-Statistiken
|
|
|
|
---
|
|
|
|
### Milestone 7: Scene 6 — Top Meetups
|
|
**Ziel:** Lokale Chapters sind aktiv
|
|
**Deliverables:**
|
|
- [ ] `TopMeetupsScene.tsx` (10s)
|
|
- Top Meetups Liste animiert:
|
|
1. Einundzwanzig Saarland — 26 User
|
|
2. Einundzwanzig Frankfurt am Main — 26 User
|
|
3. Einundzwanzig Kempten — 20 User
|
|
4. Einundzwanzig Pfalz — 17 User
|
|
5. Einundzwanzig Trier — 15 User
|
|
- Echte Logos aus public/logos/
|
|
- SparklineCharts zeigen Wachstum
|
|
- Hervorhebung des führenden Meetups
|
|
- Audio: checkmark-pop sequentiell
|
|
|
|
**Verifikation:** Frame 1380-1680 zeigt Top Meetups
|
|
|
|
---
|
|
|
|
### Milestone 8: Scene 7 — Activity Feed
|
|
**Ziel:** Echtzeit Community-Puls
|
|
**Deliverables:**
|
|
- [ ] `ActivityFeedScene.tsx` (10s)
|
|
- "Aktivitäten" Spalte im Fokus
|
|
- Items sliden von rechts ein:
|
|
- "Neuer Termin" Badge bounces
|
|
- Meetup Name types out
|
|
- Timestamp fades in
|
|
- Stack-Effekt: Neue Items pushen alte nach unten
|
|
- Events aus Screenshot:
|
|
- Einundzwanzig Kempten (vor 13 Stunden)
|
|
- Einundzwanzig Darmstadt (vor 21 Stunden)
|
|
- Einundzwanzig Vulkaneifel (vor 2 Tagen)
|
|
- BitcoinWalk Würzburg (vor 2 Tagen)
|
|
- Audio: button-click pro Item
|
|
|
|
**Verifikation:** Frame 1680-1980 zeigt Activity Feed
|
|
|
|
---
|
|
|
|
### Milestone 9: Scene 8 — Call to Action
|
|
**Ziel:** Conversion
|
|
**Deliverables:**
|
|
- [ ] `CallToActionScene.tsx` (12s)
|
|
- Dashboard blurt + zoomt leicht raus
|
|
- Overlay erscheint mit Glassmorphism
|
|
- "Werde Teil der Community" — spring entrance
|
|
- URL types: `portal.einundzwanzig.space`
|
|
- URL pulst orange
|
|
- Optional: QR Code materializes
|
|
- EINUNDZWANZIG Logo center mit Glow
|
|
- Audio: success-fanfare
|
|
|
|
**Verifikation:** Frame 1980-2340 zeigt CTA
|
|
|
|
---
|
|
|
|
### Milestone 10: Scene 9 — Outro
|
|
**Ziel:** Brand Cement
|
|
**Deliverables:**
|
|
- [ ] `PortalOutroScene.tsx` (12s)
|
|
- Fade to wallpaper background
|
|
- Horizontal Logo fade in (center)
|
|
- BitcoinEffect particles
|
|
- "Einundzwanzig e.V." text
|
|
- Background music fade out (3s)
|
|
- Audio: final-chime
|
|
|
|
**Verifikation:** Frame 2340-2700 zeigt Outro
|
|
|
|
---
|
|
|
|
### Milestone 11: Audio Integration
|
|
**Ziel:** Vollständige Audio-Synchronisation
|
|
**Deliverables:**
|
|
- [ ] `PortalAudioManager.tsx` — Audio für alle Szenen
|
|
- Background Music: Frame 0-2700, fade in/out
|
|
- SFX Timeline synchronisiert mit Szenen
|
|
- [ ] Audio-Test: Volle Composition mit Sound
|
|
|
|
**Verifikation:** Audio spielt korrekt zu allen Animationen
|
|
|
|
---
|
|
|
|
### Milestone 12: Mobile Version
|
|
**Ziel:** 1080x1920 Portrait-Variante
|
|
**Deliverables:**
|
|
- [ ] `PortalPresentationMobile.tsx`
|
|
- [ ] Mobile Szenen-Adaptionen (Layout-Anpassungen)
|
|
- [ ] Mobile in Root.tsx registriert
|
|
|
|
**Verifikation:** Mobile Composition rendert korrekt
|
|
|
|
---
|
|
|
|
### Milestone 13: Polish & Final Render
|
|
**Ziel:** Produktionsreif
|
|
**Deliverables:**
|
|
- [ ] Timing Fine-Tuning aller Übergänge
|
|
- [ ] Frame-genaue Audio-Sync Überprüfung
|
|
- [ ] Test-Render: `npx remotion render PortalPresentation --frames=0-300`
|
|
- [ ] Full Render: `npx remotion render PortalPresentation`
|
|
- [ ] Mobile Render: `npx remotion render PortalPresentationMobile`
|
|
|
|
**Verifikation:** MP4 Dateien in `/out` ohne Fehler
|
|
|
|
---
|
|
|
|
## Technische Architektur
|
|
|
|
### Dateistruktur (Final)
|
|
```
|
|
src/
|
|
├── PortalPresentation.tsx # Desktop Composition
|
|
├── PortalPresentationMobile.tsx # Mobile Composition
|
|
├── components/
|
|
│ ├── AnimatedLogo.tsx # (existing)
|
|
│ ├── BitcoinEffect.tsx # (existing)
|
|
│ ├── AudioManager.tsx # (existing)
|
|
│ └── portal/
|
|
│ ├── StatsCounter.tsx
|
|
│ ├── SparklineChart.tsx
|
|
│ ├── MeetupCard.tsx
|
|
│ ├── CountryBar.tsx
|
|
│ ├── ActivityItem.tsx
|
|
│ └── DashboardSidebar.tsx
|
|
├── scenes/
|
|
│ ├── IntroScene.tsx # (existing)
|
|
│ └── portal/
|
|
│ ├── PortalIntroScene.tsx
|
|
│ ├── PortalTitleScene.tsx
|
|
│ ├── DashboardOverviewScene.tsx
|
|
│ ├── MeetupShowcaseScene.tsx
|
|
│ ├── CountryStatsScene.tsx
|
|
│ ├── TopMeetupsScene.tsx
|
|
│ ├── ActivityFeedScene.tsx
|
|
│ ├── CallToActionScene.tsx
|
|
│ └── PortalOutroScene.tsx
|
|
└── Root.tsx # +2 Compositions
|
|
```
|
|
|
|
### Animation Patterns
|
|
|
|
**Spring Configs (wiederverwendbar):**
|
|
```tsx
|
|
const SMOOTH = { damping: 200 }; // Sanft, kein Bounce
|
|
const SNAPPY = { damping: 20, stiffness: 200 }; // Schnell, minimal Bounce
|
|
const BOUNCY = { damping: 12 }; // Verspielt, Bounce
|
|
```
|
|
|
|
**Staggered Reveal:**
|
|
```tsx
|
|
const STAGGER_DELAY = 5; // Frames zwischen Items
|
|
items.map((item, i) => {
|
|
const itemSpring = spring({
|
|
frame: frame - (i * STAGGER_DELAY),
|
|
fps,
|
|
config: SNAPPY,
|
|
});
|
|
// ...
|
|
});
|
|
```
|
|
|
|
**3D Perspective Entrance:**
|
|
```tsx
|
|
const perspectiveX = interpolate(frame, [0, 60], [30, 0], { extrapolateRight: 'clamp' });
|
|
const zoom = interpolate(frame, [0, 60], [0.85, 1], { extrapolateRight: 'clamp' });
|
|
style={{
|
|
transform: `perspective(1000px) rotateX(${perspectiveX}deg) scale(${zoom})`,
|
|
}}
|
|
```
|
|
|
|
---
|
|
|
|
## Erfolgskriterien
|
|
|
|
1. **Technisch:** Alle Milestones abgeschlossen, keine Render-Fehler
|
|
2. **Visuell:** Jede Szene hat mindestens 2 aktive Animationen
|
|
3. **Audio:** Jeder Szenenübergang hat korrespondierenden Sound
|
|
4. **Performance:** Render-Zeit < 5 Minuten für Full HD
|
|
5. **Qualität:** Video wirkt professionell, nicht "zusammengestückelt"
|
|
|
|
---
|
|
|
|
## Risiken & Mitigations
|
|
|
|
| Risiko | Mitigation |
|
|
|--------|------------|
|
|
| Logo-Formate inkonsistent (jpg/png/svg) | Img-Komponente mit fallback handling |
|
|
| Performance bei vielen Animationen | Premounting für smooth transitions |
|
|
| Audio Sync drift | Frame-genaue Sequence-Platzierung |
|
|
| Mobile Layout bricht | Separate Scene-Varianten pro Format |
|
|
|
|
---
|
|
|
|
## Nächster Schritt
|
|
|
|
Nach Genehmigung dieser PRD:
|
|
1. Milestone 1 beginnen: Foundation Setup
|