- Reworked the tenant admin login page

- Updated the User model to implement Filament’s tenancy contracts
- Seeded a ready-to-use demo tenant (user, tenant, active package, purchase)
- Introduced a branded, translated 403 error page to replace the generic forbidden message for unauthorised admin hits
- Removed the public “Register” links from the marketing header
- hardened join event logic and improved error handling in the guest pwa.
This commit is contained in:
Codex Agent
2025-10-13 12:50:46 +02:00
parent 9394c3171e
commit 64a5411fb9
69 changed files with 5447 additions and 588 deletions

View File

@@ -0,0 +1,23 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720">
<defs>
<linearGradient id="heroGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#f43f5e"/>
<stop offset="50%" stop-color="#d946ef"/>
<stop offset="100%" stop-color="#6366f1"/>
</linearGradient>
</defs>
<rect width="1280" height="720" fill="url(#heroGradient)"/>
<text x="80" y="180" font-size="64" font-family="Inter, Arial, sans-serif" font-weight="700" fill="#ffffff">
Willkommen im Event-Erlebnisstudio
</text>
<text x="80" y="260" font-size="28" font-family="Inter, Arial, sans-serif" fill="#fdf2f8">
Führe Gäste durch Fotochallenges, Likes und Erinnerungen alles in einer Admin-App.
</text>
<rect x="80" y="320" width="320" height="72" rx="36" fill="#111827" opacity="0.9"/>
<text x="120" y="368" font-size="28" font-family="Inter, Arial, sans-serif" fill="#ffffff">
Pakete entdecken
</text>
<text x="80" y="420" font-size="22" font-family="Inter, Arial, sans-serif" fill="#fef2f2">
oder Demo überspringen
</text>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,33 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720">
<rect width="1280" height="720" fill="#0f172a"/>
<text x="80" y="120" font-size="56" font-family="Inter, Arial, sans-serif" font-weight="700" fill="#f8fafc">
So funktioniert es
</text>
<g transform="translate(80,180)">
<rect width="320" height="360" rx="32" fill="#1e293b"/>
<text x="40" y="80" font-size="36" font-family="Inter, Arial, sans-serif" font-weight="600" fill="#f472b6">
Momente festhalten
</text>
<text x="40" y="130" font-size="22" font-family="Inter, Arial, sans-serif" fill="#e2e8f0">
Gäste laden Fotos direkt über die PWA hoch du moderierst in Echtzeit.
</text>
</g>
<g transform="translate(460,180)">
<rect width="320" height="360" rx="32" fill="#1e293b"/>
<text x="40" y="80" font-size="36" font-family="Inter, Arial, sans-serif" font-weight="600" fill="#60a5fa">
Aufgaben aktivieren
</text>
<text x="40" y="130" font-size="22" font-family="Inter, Arial, sans-serif" fill="#e2e8f0">
Challenges und Badges halten deine Community bei Laune.
</text>
</g>
<g transform="translate(840,180)">
<rect width="320" height="360" rx="32" fill="#1e293b"/>
<text x="40" y="80" font-size="36" font-family="Inter, Arial, sans-serif" font-weight="600" fill="#34d399">
Gäste begeistern
</text>
<text x="40" y="130" font-size="22" font-family="Inter, Arial, sans-serif" fill="#e2e8f0">
Likes, Slideshow und QR-Einladungen bringen Aufmerksamkeit an jeden Tisch.
</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,57 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720">
<rect width="1280" height="720" fill="#f1f5f9"/>
<text x="80" y="120" font-size="56" font-family="Inter, Arial, sans-serif" font-weight="700" fill="#0f172a">
Wähle dein Eventpaket
</text>
<g transform="translate(80,180)">
<rect width="320" height="360" rx="24" fill="#ffffff" stroke="#e2e8f0" stroke-width="2"/>
<text x="40" y="80" font-size="32" font-family="Inter, Arial, sans-serif" font-weight="700" fill="#0f172a">
Starter
</text>
<text x="40" y="130" font-size="22" font-family="Inter, Arial, sans-serif" fill="#1f2937">
1 Event, 250 Uploads
</text>
<text x="40" y="200" font-size="48" font-family="Inter, Arial, sans-serif" font-weight="700" fill="#f43f5e">
29 €
</text>
<rect x="40" y="260" width="200" height="56" rx="28" fill="#f43f5e"/>
<text x="70" y="298" font-size="24" font-family="Inter, Arial, sans-serif" fill="#ffffff">
Paket wählen
</text>
</g>
<g transform="translate(460,180)">
<rect width="320" height="360" rx="24" fill="#0f172a"/>
<text x="40" y="80" font-size="32" font-family="Inter, Arial, sans-serif" font-weight="700" fill="#f8fafc">
Pro
</text>
<text x="40" y="130" font-size="22" font-family="Inter, Arial, sans-serif" fill="#e2e8f0">
3 Events, 1000 Uploads, Premium-Support
</text>
<text x="40" y="200" font-size="48" font-family="Inter, Arial, sans-serif" font-weight="700" fill="#38bdf8">
79 €
</text>
<rect x="40" y="260" width="200" height="56" rx="28" fill="#38bdf8"/>
<text x="70" y="298" font-size="24" font-family="Inter, Arial, sans-serif" fill="#0f172a">
Paket wählen
</text>
</g>
<g transform="translate(840,180)">
<rect width="320" height="360" rx="24" fill="#ffffff" stroke="#e2e8f0" stroke-width="2"/>
<text x="40" y="80" font-size="32" font-family="Inter, Arial, sans-serif" font-weight="700" fill="#0f172a">
Enterprise
</text>
<text x="40" y="130" font-size="22" font-family="Inter, Arial, sans-serif" fill="#1f2937">
Unbegrenzte Events, SLA, Custom Branding
</text>
<text x="40" y="200" font-size="48" font-family="Inter, Arial, sans-serif" font-weight="700" fill="#0ea5e9">
Auf Anfrage
</text>
<rect x="40" y="260" width="200" height="56" rx="28" fill="#0ea5e9"/>
<text x="60" y="298" font-size="24" font-family="Inter, Arial, sans-serif" fill="#ffffff">
Beratung anfragen
</text>
</g>
<text x="80" y="600" font-size="20" font-family="Inter, Arial, sans-serif" fill="#475569">
Stripe & PayPal Widgets erscheinen unterhalb der Karten, sobald Keys konfiguriert sind.
</text>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,53 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720">
<rect width="1280" height="720" fill="#0b1120"/>
<g transform="translate(80,80)">
<rect width="520" height="560" rx="32" fill="#111c2e"/>
<text x="40" y="80" font-size="48" font-family="Inter, Arial, sans-serif" font-weight="700" fill="#f8fafc">
Bestellübersicht
</text>
<text x="40" y="140" font-size="22" font-family="Inter, Arial, sans-serif" fill="#cbd5f5">
Paket: Pro 3 Events, 1000 Uploads
</text>
<text x="40" y="180" font-size="22" font-family="Inter, Arial, sans-serif" fill="#cbd5f5">
Zahlungsart: Stripe oder PayPal
</text>
<line x1="40" y1="220" x2="480" y2="220" stroke="#1f2a3d" stroke-width="2"/>
<text x="40" y="280" font-size="24" font-family="Inter, Arial, sans-serif" fill="#60a5fa">
Zwischensumme
</text>
<text x="360" y="280" font-size="32" font-family="Inter, Arial, sans-serif" font-weight="700" fill="#60a5fa">
79 €
</text>
<text x="40" y="340" font-size="24" font-family="Inter, Arial, sans-serif" fill="#f472b6">
Gesamt (inkl. MwSt)
</text>
<text x="360" y="340" font-size="36" font-family="Inter, Arial, sans-serif" font-weight="700" fill="#f472b6">
94,01 €
</text>
<rect x="40" y="420" width="240" height="64" rx="32" fill="#f472b6"/>
<text x="70" y="462" font-size="26" font-family="Inter, Arial, sans-serif" fill="#ffffff">
Weiter zum Setup
</text>
<text x="40" y="520" font-size="18" font-family="Inter, Arial, sans-serif" fill="#94a3b8">
Zahlungsdienste offline? Zeige Hinweis und bitte um erneuten Versuch.
</text>
</g>
<g transform="translate(660,120)">
<rect width="480" height="220" rx="24" fill="#f8fafc"/>
<text x="40" y="80" font-size="28" font-family="Inter, Arial, sans-serif" font-weight="600" fill="#111827">
Stripe-Elemente
</text>
<text x="40" y="130" font-size="20" font-family="Inter, Arial, sans-serif" fill="#1f2937">
Kartennummer, Ablaufdatum, CVC, Kartenhalter
</text>
</g>
<g transform="translate(660,380)">
<rect width="480" height="220" rx="24" fill="#ffffff"/>
<text x="40" y="80" font-size="28" font-family="Inter, Arial, sans-serif" font-weight="600" fill="#0f172a">
PayPal Smart Buttons
</text>
<text x="40" y="130" font-size="20" font-family="Inter, Arial, sans-serif" fill="#1f2937">
Automatische Darstellung abhängig vom PayPal Client ID.
</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,43 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720">
<rect width="1280" height="720" fill="#f8fafc"/>
<text x="80" y="120" font-size="56" font-family="Inter, Arial, sans-serif" font-weight="700" fill="#0f172a">
Bereite dein erstes Event vor
</text>
<g transform="translate(80,180)">
<rect width="520" height="420" rx="24" fill="#ffffff" stroke="#e2e8f0" stroke-width="2"/>
<text x="40" y="80" font-size="28" font-family="Inter, Arial, sans-serif" fill="#1f2937">
Eventname
</text>
<rect x="40" y="100" width="440" height="56" rx="12" fill="#f1f5f9"/>
<text x="50" y="135" font-size="20" font-family="Inter, Arial, sans-serif" fill="#64748b">
Sommerfest Kreativagentur
</text>
<text x="40" y="180" font-size="28" font-family="Inter, Arial, sans-serif" fill="#1f2937">
Datum & Uhrzeit
</text>
<rect x="40" y="200" width="440" height="56" rx="12" fill="#f1f5f9"/>
<text x="50" y="235" font-size="20" font-family="Inter, Arial, sans-serif" fill="#64748b">
21.08.2025 18:00 Uhr
</text>
<text x="40" y="280" font-size="28" font-family="Inter, Arial, sans-serif" fill="#1f2937">
Sprache & Features
</text>
<text x="40" y="320" font-size="20" font-family="Inter, Arial, sans-serif" fill="#475569">
[x] Deutsche UI, [ ] Englische UI, [x] Aufgaben aktivieren, [x] Join-Token generieren
</text>
<rect x="40" y="360" width="200" height="56" rx="28" fill="#f43f5e"/>
<text x="60" y="398" font-size="24" font-family="Inter, Arial, sans-serif" fill="#ffffff">
Event erstellen
</text>
</g>
<g transform="translate(640,200)">
<rect width="520" height="320" rx="24" fill="#111827"/>
<text x="40" y="80" font-size="28" font-family="Inter, Arial, sans-serif" fill="#f8fafc">
Success States
</text>
<text x="40" y="130" font-size="22" font-family="Inter, Arial, sans-serif" fill="#cbd5f5">
Zeige „Event erstellt“ Toast und leite ins Dashboard weiter, sobald das Backend
den neuen Join-Token bestätigt hat.
</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,11 @@
# Tenant-Admin-Onboarding Walkthrough Assets
| Datei | Beschreibung |
| --- | --- |
| `01-welcome-hero.svg` | Hero-Screen mit CTA „Pakete entdecken“. |
| `02-how-it-works.svg` | Drei Highlight-Karten (Fotos, Aufgaben, Gäste). |
| `03-package-selection.svg` | Paketübersicht inkl. Stripe/PayPal Modulen. |
| `04-order-summary.svg` | Zusammenfassung mit Zahlungsoptionen. |
| `05-event-setup.svg` | Formular für das erste Event. |
> Die SVGs sind Layout-Platzhalter für Dokumentationszwecke. Für Marketing-/Store-Screenshots bitte native Captures aus der App generieren.