übergang auf pakete, integration von stripe und paypal, blog hinzugefügt.

This commit is contained in:
Codex Agent
2025-09-29 07:59:39 +02:00
parent 0a643c3e4d
commit e52a4005aa
83 changed files with 4284 additions and 629 deletions

View File

@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Purchase Confirmation</title>
</head>
<body>
<h1>Kauf-Bestätigung</h1>
<p>Vielen Dank für Ihren Kauf, {{ $purchase->user->fullName }}!</p>
<p>Package: {{ $purchase->package->name }}</p>
<p>Preis: {{ $purchase->amount }} </p>
<p>Das Package ist nun in Ihrem Tenant-Account aktiviert.</p>
<p>Mit freundlichen Grüßen,<br>Das Fotospiel-Team</p>
</body>
</html>

View File

@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Fotospiel</title>
</head>
<body>
<h1>Willkommen bei Fotospiel, {{ $user->fullName }}!</h1>
<p>Vielen Dank für Ihre Registrierung. Ihr Account ist nun aktiv.</p>
<p>Username: {{ $user->username }}</p>
<p>E-Mail: {{ $user->email }}</p>
<p>Bitte verifizieren Sie Ihre E-Mail-Adresse, um auf das Admin-Panel zuzugreifen.</p>
<p>Mit freundlichen Grüßen,<br>Das Fotospiel-Team</p>
</body>
</html>

View File

@@ -0,0 +1,73 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>@yield('title', 'Fotospiel - Event-Fotos einfach und sicher mit QR-Codes')</title>
<meta name="description" content="Sammle Gastfotos für Events mit QR-Codes und unserer PWA-Plattform. Für Hochzeiten, Firmenevents und mehr. Kostenloser Einstieg.">
<link rel="icon" href="{{ asset('logo.svg') }}" type="image/svg+xml">
@vite(['resources/css/app.css'])
<style>
@keyframes aurora {
0%, 100% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
}
.bg-aurora {
background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
background-size: 400% 400%;
animation: aurora 15s ease infinite;
}
</style>
</head>
<body class="bg-gray-50 text-gray-900">
<!-- Header -->
<header class="bg-white shadow-md sticky top-0 z-50">
<div class="container mx-auto px-4 py-4 flex items-center justify-between">
<div class="flex items-center space-x-2">
<a href="/" class="text-2xl font-bold text-gray-900">Fotospiel</a>
<svg class="w-6 h-6 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"></path>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 13a3 3 0 11-6 0 3 3 0 016 0z"></path>
</svg>
</div>
<nav class="hidden md:flex space-x-6 items-center">
<a href="#how-it-works" class="text-gray-600 hover:text-gray-900">How it works</a>
<a href="#features" class="text-gray-600 hover:text-gray-900">Features</a>
<div class="relative group">
<button class="text-gray-600 hover:text-gray-900">Occasions</button>
<div class="absolute top-full left-0 mt-2 bg-white border rounded shadow-lg hidden group-hover:block">
<a href="/occasions/weddings" class="block px-4 py-2 text-gray-600 hover:text-gray-900">Weddings</a>
<a href="/occasions/birthdays" class="block px-4 py-2 text-gray-600 hover:text-gray-900">Birthdays</a>
<a href="/occasions/corporate-events" class="block px-4 py-2 text-gray-600 hover:text-gray-900">Corporate Events</a>
<a href="/occasions/family-celebrations" class="block px-4 py-2 text-gray-600 hover:text-gray-900">Family Celebrations</a>
</div>
</div>
<a href="/blog" class="text-gray-600 hover:text-gray-900">Blog</a>
<a href="/packages" class="text-gray-600 hover:text-gray-900">Packages</a>
<a href="#contact" class="text-gray-600 hover:text-gray-900">Contact</a>
<a href="/packages" class="bg-[#FFB6C1] text-white px-6 py-2 rounded-full font-semibold hover:bg-[#FF69B4] transition">Packages entdecken</a>
</nav>
<!-- Mobile Menu Placeholder (Hamburger) -->
<button class="md:hidden text-gray-600"></button>
</div>
</header>
<main>
@yield('content')
</main>
<!-- Footer -->
<footer class="bg-gray-800 text-white py-8 px-4">
<div class="container mx-auto text-center">
<p>&copy; 2025 Fotospiel GmbH. Alle Rechte vorbehalten.</p>
<div class="mt-4 space-x-4">
<a href="/impressum" class="hover:text-[#FFB6C1]">Impressum</a>
<a href="/datenschutz" class="hover:text-[#FFB6C1]">Datenschutz</a>
<a href="#contact" class="hover:text-[#FFB6C1]">Kontakt</a>
</div>
</div>
</footer>
@stack('scripts')
</body>
</html>

View File

@@ -15,5 +15,14 @@
<p>Package-Daten (Limits, Features) sind anonymisiert und werden nur für die Funktionalität benötigt. Consent für Zahlungen und E-Mails wird bei Kauf eingeholt. Daten werden nach 10 Jahren gelöscht.</p>
<p>Ihre Rechte: Auskunft, Löschung, Widerspruch. Kontaktieren Sie uns unter <a href="/kontakt">Kontakt</a>.</p>
<p>Cookies: Nur funktionale Cookies für die PWA.</p>
<h2>Persönliche Datenverarbeitung</h2>
<p>Bei der Registrierung und Nutzung des Systems werden folgende persönliche Daten verarbeitet: Vor- und Nachname, Adresse, Telefonnummer, E-Mail-Adresse, Username. Diese Daten werden zur Erfüllung des Vertrags (Package-Kauf, Tenant-Management) und für die Authentifizierung verwendet. Die Verarbeitung erfolgt gemäß Art. 6 Abs. 1 lit. b DSGVO.</p>
<h2>Account-Löschung</h2>
<p>Sie haben das Recht, Ihre persönlichen Daten jederzeit löschen zu lassen (Recht auf Löschung, Art. 17 DSGVO). Kontaktieren Sie uns unter [E-Mail] zur Löschung Ihres Accounts. Alle zugehörigen Daten (Events, Photos, Purchases) werden gelöscht, soweit keine gesetzlichen Aufbewahrungspflichten bestehen.</p>
<h2>Datensicherheit</h2>
<p>Wir verwenden HTTPS, verschlüsselte Speicherung (Passwörter hashed) und regelmäßige Backups. Zugriff auf Daten ist rollebasierend beschränkt (Tenant vs SuperAdmin).</p>
</body>
</html>

View File

@@ -0,0 +1,40 @@
@extends('layouts.marketing')
@section('title', 'Kontakt - Fotospiel')
@section('content')
<div class="min-h-screen bg-gray-50 py-12 px-4 sm:px-6 lg:px-8">
<div class="max-w-2xl mx-auto">
<h1 class="text-3xl font-bold text-center mb-8">Kontakt</h1>
<p class="text-center text-gray-600 mb-8">Haben Sie Fragen? Schreiben Sie uns!</p>
<form method="POST" action="{{ route('kontakt.submit') }}" class="space-y-4">
@csrf
<div>
<label for="name" class="block text-sm font-medium text-gray-700 mb-2">Name</label>
<input type="text" id="name" name="name" required class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-[#FFB6C1]">
</div>
<div>
<label for="email" class="block text-sm font-medium text-gray-700 mb-2">E-Mail</label>
<input type="email" id="email" name="email" required class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-[#FFB6C1]">
</div>
<div>
<label for="message" class="block text-sm font-medium text-gray-700 mb-2">Nachricht</label>
<textarea id="message" name="message" rows="4" required class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-[#FFB6C1]"></textarea>
</div>
<button type="submit" class="w-full bg-[#FFB6C1] text-white py-3 rounded-md font-semibold hover:bg-[#FF69B4] transition">Senden</button>
</form>
@if (session('success'))
<p class="mt-4 text-green-600 text-center">{{ session('success') }}</p>
@endif
@if ($errors->any())
<div class="mt-4 p-4 bg-red-100 border border-red-400 rounded-md">
<ul class="list-disc list-inside">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
</div>
</div>
@endsection

View File

@@ -1,57 +1,8 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Fotospiel - Event-Fotos einfach und sicher mit QR-Codes</title>
<meta name="description" content="Sammle Gastfotos für Events mit QR-Codes und unserer PWA-Plattform. Für Hochzeiten, Firmenevents und mehr. Kostenloser Einstieg.">
<link rel="icon" href="{{ asset('logo.svg') }}" type="image/svg+xml">
@vite(['resources/css/app.css'])
<style>
@keyframes aurora {
0%, 100% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
}
.bg-aurora {
background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
background-size: 400% 400%;
animation: aurora 15s ease infinite;
}
</style>
</head>
<body class="bg-gray-50 text-gray-900">
<!-- Header -->
<header class="bg-white shadow-md sticky top-0 z-50">
<div class="container mx-auto px-4 py-4 flex items-center justify-between">
<div class="flex items-center space-x-2">
<a href="/" class="text-2xl font-bold text-gray-900">Fotospiel</a>
<svg class="w-6 h-6 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"></path>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 13a3 3 0 11-6 0 3 3 0 016 0z"></path>
</svg>
</div>
<nav class="hidden md:flex space-x-6 items-center">
<a href="#how-it-works" class="text-gray-600 hover:text-gray-900">How it works</a>
<a href="#features" class="text-gray-600 hover:text-gray-900">Features</a>
<div class="relative group">
<button class="text-gray-600 hover:text-gray-900">Occasions</button>
<div class="absolute top-full left-0 mt-2 bg-white border rounded shadow-lg hidden group-hover:block">
<a href="/occasions/weddings" class="block px-4 py-2 text-gray-600 hover:text-gray-900">Weddings</a>
<a href="/occasions/birthdays" class="block px-4 py-2 text-gray-600 hover:text-gray-900">Birthdays</a>
<a href="/occasions/corporate-events" class="block px-4 py-2 text-gray-600 hover:text-gray-900">Corporate Events</a>
<a href="/occasions/family-celebrations" class="block px-4 py-2 text-gray-600 hover:text-gray-900">Family Celebrations</a>
</div>
</div>
<a href="/blog" class="text-gray-600 hover:text-gray-900">Blog</a>
<a href="/packages" class="text-gray-600 hover:text-gray-900">Packages</a>
<a href="#contact" class="text-gray-600 hover:text-gray-900">Contact</a>
<a href="/packages" class="bg-[#FFB6C1] text-white px-6 py-2 rounded-full font-semibold hover:bg-[#FF69B4] transition">Packages entdecken</a>
</nav>
<!-- Mobile Menu Placeholder (Hamburger) -->
<button class="md:hidden text-gray-600"></button>
</div>
</header>
@extends('layouts.marketing')
@section('title', 'Fotospiel - Event-Fotos einfach und sicher mit QR-Codes')
@section('content')
<!-- Hero Section id="hero" -->
<section id="hero" class="bg-aurora text-white py-20 px-4">
<div class="container mx-auto flex flex-col md:flex-row items-center gap-8 max-w-6xl">
@@ -142,7 +93,7 @@
<section id="contact" class="py-20 px-4 bg-white">
<div class="container mx-auto max-w-2xl">
<h2 class="text-3xl font-bold text-center mb-12">Kontakt</h2>
<form method="POST" action="/kontakt" class="space-y-4">
<form method="POST" action="{{ route('kontakt.submit') }}" class="space-y-4">
@csrf
<div>
<label for="name" class="block text-sm font-medium mb-2">Name</label>
@@ -210,17 +161,4 @@
</div>
</div>
</section>
<!-- Footer -->
<footer class="bg-gray-800 text-white py-8 px-4">
<div class="container mx-auto text-center">
<p>&copy; 2025 Fotospiel GmbH. Alle Rechte vorbehalten.</p>
<div class="mt-4 space-x-4">
<a href="/impressum" class="hover:text-[#FFB6C1]">Impressum</a>
<a href="/datenschutz" class="hover:text-[#FFB6C1]">Datenschutz</a>
<a href="#contact" class="hover:text-[#FFB6C1]">Kontakt</a>
</div>
</div>
</footer>
</body>
</html>
@endsection

View File

@@ -3,12 +3,8 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ $post->meta_title ?? $post->title }} - Fotospiel</title>
<meta name="description" content="{{ $post->meta_description ?? $post->excerpt }}">
<meta property="og:title" content="{{ $post->meta_title ?? $post->title }}">
<meta property="og:description" content="{{ $post->meta_description ?? $post->excerpt }}">
<meta property="og:image" content="{{ $post->featured_image }}">
<meta property="og:url" content="{{ route('blog.show', $post) }}">
<title>{{ $post->title }} - Fotospiel Blog</title>
<meta name="description" content="{{ Str::limit(strip_tags($post->content), 160) }}">
<link rel="icon" href="{{ asset('logo.svg') }}" type="image/svg+xml">
@vite(['resources/css/app.css'])
</head>
@@ -33,44 +29,35 @@
</div>
</div>
<a href="/blog" class="text-gray-900 font-semibold">Blog</a>
<a href="/marketing#pricing" class="text-gray-600 hover:text-gray-900">Pricing</a>
<a href="/packages" class="text-gray-600 hover:text-gray-900">Pricing</a>
<a href="/marketing#contact" class="text-gray-600 hover:text-gray-900">Contact</a>
</nav>
<a href="/buy-credits/basic" class="bg-[#FFB6C1] text-white px-6 py-2 rounded-full font-semibold">Jetzt starten</a>
<a href="/packages" class="bg-[#FFB6C1] text-white px-6 py-2 rounded-full font-semibold">Jetzt starten</a>
</div>
</header>
<!-- Blog Post Hero -->
<section class="py-20 px-4 bg-gradient-to-r from-[#FFB6C1] via-[#FFD700] to-[#87CEEB] text-white">
<div class="container mx-auto max-w-4xl">
@if ($post->featured_image)
<img src="{{ $post->featured_image }}" alt="{{ $post->title }}" class="w-full h-64 object-cover rounded mb-8">
@endif
<!-- Hero for Single Post -->
<section class="bg-gradient-to-r from-[#FFB6C1] via-[#FFD700] to-[#87CEEB] text-white py-20 px-4">
<div class="container mx-auto text-center">
<h1 class="text-4xl md:text-5xl font-bold mb-4">{{ $post->title }}</h1>
<p class="text-xl mb-8">{{ $post->excerpt }}</p>
<p class="text-sm text-gray-200">Veröffentlicht am {{ $post->published_at->format('d.m.Y') }}</p>
<p class="text-lg mb-8">Von {{ $post->author->name ?? 'Fotospiel Team' }} | {{ $post->published_at->format('d.m.Y') }}</p>
@if ($post->featured_image)
<img src="{{ $post->featured_image }}" alt="{{ $post->title }}" class="mx-auto rounded-lg shadow-lg max-w-2xl">
@endif
</div>
</section>
<!-- Blog Post Content -->
<section class="py-20 px-4">
<div class="container mx-auto max-w-4xl">
<div class="prose max-w-none">
{!! $post->content !!}
</div>
<div class="mt-8 p-4 bg-gray-100 rounded">
<h3 class="font-semibold mb-2">Kategorien:</h3>
@foreach ($post->categories as $category)
<span class="inline-block bg-[#FFB6C1] text-white px-2 py-1 rounded text-sm mr-2 mb-2">{{ $category->name }}</span>
@endforeach
<h3 class="font-semibold mt-4 mb-2">Tags:</h3>
@foreach ($post->tags as $tag)
<span class="inline-block bg-gray-200 text-gray-800 px-2 py-1 rounded text-sm mr-2 mb-2">#{{ $tag->name }}</span>
@endforeach
</div>
<div class="mt-8 text-center">
<a href="/blog" class="bg-[#FFB6C1] text-white px-6 py-2 rounded-full font-semibold">Zurück zum Blog</a>
</div>
<!-- Post Content -->
<section class="py-20 px-4 bg-white">
<div class="container mx-auto max-w-4xl prose prose-lg max-w-none">
{!! $post->content !!}
</div>
</section>
<!-- Back to Blog -->
<section class="py-10 px-4 bg-gray-50">
<div class="container mx-auto text-center">
<a href="/blog" class="bg-[#FFB6C1] text-white px-8 py-3 rounded-full font-semibold hover:bg-[#FF69B4] transition">Zurück zum Blog</a>
</div>
</section>

View File

@@ -1,41 +1,8 @@
<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Fotospiel - Blog</title>
<meta name="description" content="Tipps, News und Anleitungen zu Event-Fotos mit QR-Codes und PWA.">
<link rel="icon" href="{{ asset('logo.svg') }}" type="image/svg+xml">
@vite(['resources/css/app.css'])
</head>
<body class="bg-gray-50 text-gray-900">
<!-- Shared Header (wie in occasions.blade.php) -->
<header class="bg-white shadow-md sticky top-0 z-50">
<div class="container mx-auto px-4 py-4 flex items-center justify-between">
<div class="flex items-center space-x-2">
<a href="/marketing" class="text-2xl font-bold text-gray-900">Fotospiel</a>
<svg class="w-6 h-6 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"></path><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 13a3 3 0 11-6 0 3 3 0 016 0z"></path></svg>
</div>
<nav class="hidden md:flex space-x-6">
<a href="/marketing#how-it-works" class="text-gray-600 hover:text-gray-900">How it works</a>
<a href="/marketing#features" class="text-gray-600 hover:text-gray-900">Features</a>
<div class="relative">
<button class="text-gray-600 hover:text-gray-900">Occasions</button>
<div class="absolute top-full left-0 mt-2 bg-white border rounded shadow-lg">
<a href="/occasions/weddings" class="block px-4 py-2 text-gray-600 hover:text-gray-900">Weddings</a>
<a href="/occasions/birthdays" class="block px-4 py-2 text-gray-600 hover:text-gray-900">Birthdays</a>
<a href="/occasions/corporate-events" class="block px-4 py-2 text-gray-600 hover:text-gray-900">Corporate Events</a>
<a href="/occasions/family-celebrations" class="block px-4 py-2 text-gray-600 hover:text-gray-900">Family Celebrations</a>
</div>
</div>
<a href="/blog" class="text-gray-900 font-semibold">Blog</a>
<a href="/marketing#pricing" class="text-gray-600 hover:text-gray-900">Pricing</a>
<a href="/marketing#contact" class="text-gray-600 hover:text-gray-900">Contact</a>
</nav>
<a href="/buy-credits/basic" class="bg-[#FFB6C1] text-white px-6 py-2 rounded-full font-semibold">Jetzt starten</a>
</div>
</header>
@extends('layouts.marketing')
@section('title', 'Fotospiel - Blog')
@section('content')
<!-- Hero for Blog -->
<section class="bg-gradient-to-r from-[#FFB6C1] via-[#FFD700] to-[#87CEEB] text-white py-20 px-4">
<div class="container mx-auto text-center">
@@ -73,17 +40,4 @@
@endif
</div>
</section>
<!-- Footer (wie in occasions.blade.php) -->
<footer class="bg-gray-800 text-white py-8 px-4 mt-20">
<div class="container mx-auto text-center">
<p>&copy; 2025 Fotospiel GmbH. Alle Rechte vorbehalten.</p>
<div class="mt-4 space-x-4">
<a href="/impressum" class="hover:text-[#FFB6C1]">Impressum</a>
<a href="/datenschutz" class="hover:text-[#FFB6C1]">Datenschutz</a>
<a href="/marketing#contact" class="hover:text-[#FFB6C1]">Kontakt</a>
</div>
</div>
</footer>
</body>
</html>
@endsection

View File

@@ -29,7 +29,7 @@
</div>
</div>
<a href="/blog" class="text-gray-600 hover:text-gray-900">Blog</a>
<a href="/marketing#pricing" class="text-gray-600 hover:text-gray-900">Pricing</a>
<a href="/packages" class="text-gray-600 hover:text-gray-900">Pricing</a>
<a href="/marketing#contact" class="text-gray-600 hover:text-gray-900">Contact</a>
</nav>
<a href="/packages" class="bg-[#FFB6C1] text-white px-6 py-2 rounded-full font-semibold">Packages wählen</a>

View File

@@ -73,7 +73,11 @@
</li>
@endif
@if($package->features)
@foreach(json_decode($package->features, true) as $feature => $enabled)
@php
$features = is_array($package->features) ? $package->features : (is_string($package->features) ? json_decode($package->features, true) : []);
$features = is_array($features) ? $features : [];
@endphp
@foreach($features as $feature => $enabled)
@if($enabled)
<li class="flex items-center text-sm text-gray-700">
<svg class="w-4 h-4 text-green-500 mr-2" fill="currentColor" viewBox="0 0 20 20">
@@ -85,8 +89,8 @@
@endforeach
@endif
</ul>
<a href="/packages?type=endcustomer&package_id={{ $package->id }}" class="w-full bg-blue-600 hover:bg-blue-700 text-white py-2 px-4 rounded-md text-center font-semibold transition duration-300">
{{ __('marketing.packages.buy_now') }}
<a href="{{ route('register', ['package_id' => $package->id]) }}" class="w-full bg-blue-600 hover:bg-blue-700 text-white py-2 px-4 rounded-md text-center font-semibold transition duration-300">
{{ __('marketing.packages.register_buy') }}
</a>
</div>
@endforeach
@@ -118,7 +122,11 @@
</li>
@endif
@if($package->features)
@foreach(json_decode($package->features, true) as $feature => $enabled)
@php
$features = is_array($package->features) ? $package->features : (is_string($package->features) ? json_decode($package->features, true) : []);
$features = is_array($features) ? $features : [];
@endphp
@foreach($features as $feature => $enabled)
@if($enabled)
<li class="flex items-center text-sm text-gray-700">
<svg class="w-4 h-4 text-green-500 mr-2" fill="currentColor" viewBox="0 0 20 20">
@@ -130,8 +138,8 @@
@endforeach
@endif
</ul>
<a href="/packages?type=reseller&package_id={{ $package->id }}" class="w-full bg-green-600 hover:bg-green-700 text-white py-2 px-4 rounded-md text-center font-semibold transition duration-300">
{{ __('marketing.packages.subscribe_now') }}
<a href="{{ route('register', ['package_id' => $package->id]) }}" class="w-full bg-green-600 hover:bg-green-700 text-white py-2 px-4 rounded-md text-center font-semibold transition duration-300">
{{ __('marketing.packages.register_subscribe') }}
</a>
</div>
@endforeach

View File

@@ -0,0 +1,99 @@
@extends('layouts.marketing')
@section('title', __('profile.title'))
@section('content')
<div class="min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8">
<div class="max-w-md w-full space-y-8">
<div>
<h2 class="mt-6 text-center text-3xl font-extrabold text-gray-900">
{{ __('profile.title') }}
</h2>
</div>
<form class="mt-8 space-y-6" action="{{ route('profile.update') }}" method="POST">
@csrf
@method('PATCH')
<!-- First Name -->
<div>
<label for="first_name" class="block text-sm font-medium text-gray-700">
{{ __('profile.first_name') }}
</label>
<input id="first_name" name="first_name" type="text" required
value="{{ old('first_name', $user->first_name) }}"
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm @error('first_name') border-red-500 @enderror"
placeholder="{{ __('profile.first_name_placeholder') }}">
@error('first_name')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Last Name -->
<div>
<label for="last_name" class="block text-sm font-medium text-gray-700">
{{ __('profile.last_name') }}
</label>
<input id="last_name" name="last_name" type="text" required
value="{{ old('last_name', $user->last_name) }}"
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm @error('last_name') border-red-500 @enderror"
placeholder="{{ __('profile.last_name_placeholder') }}">
@error('last_name')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Address -->
<div>
<label for="address" class="block text-sm font-medium text-gray-700">
{{ __('profile.address') }}
</label>
<textarea id="address" name="address" required rows="3"
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm @error('address') border-red-500 @enderror">{{ old('address', $user->address) }}</textarea>
@error('address')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Phone -->
<div>
<label for="phone" class="block text-sm font-medium text-gray-700">
{{ __('profile.phone') }}
</label>
<input id="phone" name="phone" type="tel" required
value="{{ old('phone', $user->phone) }}"
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm @error('phone') border-red-500 @enderror"
placeholder="{{ __('profile.phone_placeholder') }}">
@error('phone')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Password -->
<div>
<label for="password" class="block text-sm font-medium text-gray-700">
{{ __('profile.password') }}
</label>
<input id="password" name="password" type="password"
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm @error('password') border-red-500 @enderror"
placeholder="{{ __('profile.password_placeholder') }}">
@error('password')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<div>
<button type="submit"
class="group relative w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition duration-300">
{{ __('profile.save') }}
</button>
</div>
<div class="text-center">
<p class="text-sm text-gray-600">
{{ __('profile.delete_account') }} <a href="#" class="text-red-600 hover:text-red-500">{{ __('profile.delete') }}</a>
</p>
</div>
</form>
</div>
</div>
@endsection

View File

@@ -0,0 +1,182 @@
@extends('layouts.marketing')
@section('title', __('auth.register'))
@section('content')
<div class="min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8">
<div class="max-w-md w-full space-y-8">
<div>
<h2 class="mt-6 text-center text-3xl font-extrabold text-gray-900">
{{ __('auth.register') }}
</h2>
@if($package ?? false)
<div class="mt-4 p-4 bg-blue-50 border border-blue-200 rounded-md">
<h3 class="text-lg font-semibold text-blue-900 mb-2">{{ $package->name }}</h3>
<p class="text-blue-800 mb-2">{{ $package->description }}</p>
<p class="text-sm text-blue-700">
{{ $package->price == 0 ? __('marketing.free') : $package->price . ' €' }}
</p>
</div>
@endif
</div>
<form class="mt-8 space-y-6" action="{{ route('register.store') }}" method="POST">
@csrf
@if($package ?? false)
<input type="hidden" name="package_id" value="{{ $package->id }}">
@endif
<!-- Name Field -->
<div>
<label for="name" class="block text-sm font-medium text-gray-700">
{{ __('auth.name') }}
</label>
<input id="name" name="name" type="text" required
value="{{ old('name') }}"
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-t-md focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm @error('name') border-red-500 @enderror"
placeholder="{{ __('auth.name_placeholder') }}">
@error('name')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Username Field -->
<div>
<label for="username" class="block text-sm font-medium text-gray-700">
{{ __('auth.username') }}
</label>
<input id="username" name="username" type="text" required
value="{{ old('username') }}"
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-t-md focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm @error('username') border-red-500 @enderror"
placeholder="{{ __('auth.username_placeholder') }}">
@error('username')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Email Field -->
<div>
<label for="email" class="block text-sm font-medium text-gray-700">
{{ __('auth.email') }}
</label>
<input id="email" name="email" type="email" required
value="{{ old('email') }}"
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-t-md focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm @error('email') border-red-500 @enderror"
placeholder="{{ __('auth.email_placeholder') }}">
@error('email')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Password Field -->
<div>
<label for="password" class="block text-sm font-medium text-gray-700">
{{ __('auth.password') }}
</label>
<input id="password" name="password" type="password" required
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-b-md focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm @error('password') border-red-500 @enderror"
placeholder="{{ __('auth.password_placeholder') }}">
@error('password')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Confirm Password Field -->
<div>
<label for="password_confirmation" class="block text-sm font-medium text-gray-700">
{{ __('auth.confirm_password') }}
</label>
<input id="password_confirmation" name="password_confirmation" type="password" required
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-b-md focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm"
placeholder="{{ __('auth.confirm_password_placeholder') }}">
</div>
<!-- First Name Field -->
<div>
<label for="first_name" class="block text-sm font-medium text-gray-700">
{{ __('profile.first_name') }}
</label>
<input id="first_name" name="first_name" type="text" required
value="{{ old('first_name') }}"
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm @error('first_name') border-red-500 @enderror"
placeholder="{{ __('profile.first_name_placeholder') }}">
@error('first_name')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Last Name Field -->
<div>
<label for="last_name" class="block text-sm font-medium text-gray-700">
{{ __('profile.last_name') }}
</label>
<input id="last_name" name="last_name" type="text" required
value="{{ old('last_name') }}"
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm @error('last_name') border-red-500 @enderror"
placeholder="{{ __('profile.last_name_placeholder') }}">
@error('last_name')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Address Field -->
<div>
<label for="address" class="block text-sm font-medium text-gray-700">
{{ __('profile.address') }}
</label>
<textarea id="address" name="address" required rows="3"
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm @error('address') border-red-500 @enderror">{{ old('address') }}</textarea>
@error('address')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Phone Field -->
<div>
<label for="phone" class="block text-sm font-medium text-gray-700">
{{ __('profile.phone') }}
</label>
<input id="phone" name="phone" type="tel" required
value="{{ old('phone') }}"
class="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-blue-500 focus:border-blue-500 focus:z-10 sm:text-sm @error('phone') border-red-500 @enderror"
placeholder="{{ __('profile.phone_placeholder') }}">
@error('phone')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Privacy Consent -->
<div class="flex items-start">
<div class="flex items-center h-5">
<input id="privacy_consent" name="privacy_consent" type="checkbox" required
class="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded @error('privacy_consent') border-red-500 @enderror">
</div>
<div class="ml-3 text-sm">
<label for="privacy_consent" class="font-medium text-gray-700">
{{ __('auth.privacy_consent') }}
<a href="{{ route('datenschutz') }}" class="text-blue-600 hover:text-blue-500">{{ __('auth.privacy_policy') }}</a>.
</label>
@error('privacy_consent')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
</div>
<div>
<button type="submit"
class="group relative w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition duration-300">
{{ __('auth.register') }}
</button>
</div>
<div class="text-center">
<p class="text-sm text-gray-600">
{{ __('auth.have_account') }}
<a href="{{ route('login') }}" class="font-medium text-blue-600 hover:text-blue-500">
{{ __('auth.login') }}
</a>
</p>
</div>
</form>
</div>
</div>
@endsection

View File

@@ -1,13 +1,58 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Zahlung erfolgreich - Fotospiel</title>
</head>
<body class="container mx-auto px-4 py-8 text-center">
<h1>Zahlung erfolgreich!</h1>
<p>Vielen Dank für Ihren Kauf. Ihr Konto wurde aktualisiert.</p>
<a href="/admin" class="bg-green-600 text-white px-4 py-2 rounded">Zum Admin-Dashboard</a>
</body>
</html>
@extends('marketing.layout')
@section('title', __('marketing.success.title'))
@section('content')
<div class="min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8">
@auth
@if(auth()->user()->email_verified_at)
<script>
window.location.href = '/admin';
</script>
<div class="text-center">
<div class="spinner-border animate-spin inline-block w-8 h-8 border border-2 border-blue-600 border-t-transparent rounded-full" role="status">
<span class="sr-only">Loading...</span>
</div>
<p class="mt-2 text-gray-600">{{ __('marketing.success.redirecting') }}</p>
</div>
@else
<div class="max-w-md w-full bg-white rounded-lg shadow-md p-8">
<div class="text-center">
<h2 class="text-2xl font-bold text-gray-900 mb-4">
{{ __('marketing.success.verify_email') }}
</h2>
<p class="text-gray-600 mb-6">
{{ __('marketing.success.check_email') }}
</p>
<form method="POST" action="{{ route('verification.send') }}">
@csrf
<button type="submit" class="bg-blue-600 hover:bg-blue-700 text-white px-6 py-2 rounded-md font-medium transition duration-300">
{{ __('auth.resend_verification') }}
</button>
</form>
<p class="mt-4 text-sm text-gray-600">
{{ __('auth.have_account') }} <a href="{{ route('login') }}" class="text-blue-600 hover:text-blue-500">{{ __('auth.login') }}</a>
</p>
</div>
</div>
@endif
@else
<div class="max-w-md w-full bg-white rounded-lg shadow-md p-8">
<div class="text-center">
<h2 class="text-2xl font-bold text-gray-900 mb-4">
{{ __('marketing.success.complete_purchase') }}
</h2>
<p class="text-gray-600 mb-6">
{{ __('marketing.success.login_to_continue') }}
</p>
<a href="{{ route('login') }}" class="bg-blue-600 hover:bg-blue-700 text-white px-6 py-2 rounded-md font-medium transition duration-300 block mb-2">
{{ __('auth.login') }}
</a>
<p class="text-sm text-gray-600">
{{ __('auth.no_account') }} <a href="{{ route('register') }}" class="text-blue-600 hover:text-blue-500">{{ __('auth.register') }}</a>
</p>
</div>
</div>
@endauth
</div>
@endsection

View File

@@ -0,0 +1,192 @@
@extends('layouts.marketing')
@section('title', __('profile.edit_title'))
@section('content')
<div class="min-h-screen bg-gray-50 py-12 px-4 sm:px-6 lg:px-8">
<div class="max-w-4xl mx-auto">
<div class="bg-white shadow overflow-hidden sm:rounded-lg">
<div class="px-4 py-5 sm:px-6">
<h3 class="text-lg leading-6 font-medium text-gray-900">
{{ __('profile.personal_information') }}
</h3>
<p class="mt-1 max-w-2xl text-sm text-gray-500">
{{ __('profile.update_info') }}
</p>
</div>
<div class="border-t border-gray-200">
<form method="POST" action="{{ route('profile.update') }}" class="px-4 py-5 sm:p-6">
@csrf
@method('PATCH')
<!-- Name Field -->
<div class="grid grid-cols-6 gap-6">
<div class="col-span-6 sm:col-span-3">
<label for="name" class="block text-sm font-medium text-gray-700">
{{ __('auth.name') }}
</label>
<input type="text" name="name" id="name" value="{{ old('name', $user->name) }}"
class="mt-1 focus:ring-blue-500 focus:border-blue-500 block w-full shadow-sm sm:text-sm border-gray-300 rounded-md @error('name') border-red-500 @enderror"
required>
@error('name')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Username Field -->
<div class="col-span-6 sm:col-span-3">
<label for="username" class="block text-sm font-medium text-gray-700">
{{ __('auth.username') }}
</label>
<input type="text" name="username" id="username" value="{{ old('username', $user->username) }}"
class="mt-1 focus:ring-blue-500 focus:border-blue-500 block w-full shadow-sm sm:text-sm border-gray-300 rounded-md @error('username') border-red-500 @enderror"
required>
@error('username')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
</div>
<div class="grid grid-cols-6 gap-6 mt-6">
<!-- Email Field -->
<div class="col-span-6 sm:col-span-3">
<label for="email" class="block text-sm font-medium text-gray-700">
{{ __('auth.email') }}
</label>
<input type="email" name="email" id="email" value="{{ old('email', $user->email) }}"
class="mt-1 focus:ring-blue-500 focus:border-blue-500 block w-full shadow-sm sm:text-sm border-gray-300 rounded-md @error('email') border-red-500 @enderror"
required>
@error('email')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- First Name Field -->
<div class="col-span-6 sm:col-span-3">
<label for="first_name" class="block text-sm font-medium text-gray-700">
{{ __('profile.first_name') }}
</label>
<input type="text" name="first_name" id="first_name" value="{{ old('first_name', $user->first_name) }}"
class="mt-1 focus:ring-blue-500 focus:border-blue-500 block w-full shadow-sm sm:text-sm border-gray-300 rounded-md @error('first_name') border-red-500 @enderror"
required>
@error('first_name')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
</div>
<div class="grid grid-cols-6 gap-6 mt-6">
<!-- Last Name Field -->
<div class="col-span-6 sm:col-span-3">
<label for="last_name" class="block text-sm font-medium text-gray-700">
{{ __('profile.last_name') }}
</label>
<input type="text" name="last_name" id="last_name" value="{{ old('last_name', $user->last_name) }}"
class="mt-1 focus:ring-blue-500 focus:border-blue-500 block w-full shadow-sm sm:text-sm border-gray-300 rounded-md @error('last_name') border-red-500 @enderror"
required>
@error('last_name')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Phone Field -->
<div class="col-span-6 sm:col-span-3">
<label for="phone" class="block text-sm font-medium text-gray-700">
{{ __('profile.phone') }}
</label>
<input type="tel" name="phone" id="phone" value="{{ old('phone', $user->phone) }}"
class="mt-1 focus:ring-blue-500 focus:border-blue-500 block w-full shadow-sm sm:text-sm border-gray-300 rounded-md @error('phone') border-red-500 @enderror"
required>
@error('phone')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
</div>
<!-- Address Field -->
<div class="col-span-6 mt-6">
<label for="address" class="block text-sm font-medium text-gray-700">
{{ __('profile.address') }}
</label>
<textarea name="address" id="address" rows="3" class="mt-1 focus:ring-blue-500 focus:border-blue-500 block w-full shadow-sm sm:text-sm border-gray-300 rounded-md @error('address') border-red-500 @enderror">{{ old('address', $user->address) }}</textarea>
@error('address')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
@if (session('status') == 'profile-updated')
<div class="col-span-6 mt-4 bg-green-50 border border-green-200 rounded-md p-4">
<p class="text-sm text-green-800">{{ __('profile.updated_success') }}</p>
</div>
@endif
<div class="flex justify-end mt-6">
<button type="submit"
class="bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 px-4 rounded-md transition duration-300">
{{ __('profile.save') }}
</button>
</div>
</form>
</div>
</div>
<!-- Password Update Section -->
<div class="mt-8 bg-white shadow overflow-hidden sm:rounded-lg">
<div class="px-4 py-5 sm:px-6">
<h3 class="text-lg leading-6 font-medium text-gray-900">
{{ __('profile.password') }}
</h3>
<p class="mt-1 max-w-2xl text-sm text-gray-500">
{{ __('profile.update_password') }}
</p>
</div>
<div class="border-t border-gray-200 px-4 py-5 sm:p-6">
<form method="POST" action="{{ route('profile.update-password') }}">
@csrf
@method('PATCH')
<!-- Current Password -->
<div class="mb-4">
<label for="current_password" class="block text-sm font-medium text-gray-700">
{{ __('profile.current_password') }}
</label>
<input type="password" name="current_password" id="current_password" required
class="mt-1 focus:ring-blue-500 focus:border-blue-500 block w-full shadow-sm sm:text-sm border-gray-300 rounded-md @error('current_password') border-red-500 @enderror">
@error('current_password')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- New Password -->
<div class="mb-4">
<label for="password" class="block text-sm font-medium text-gray-700">
{{ __('auth.password') }}
</label>
<input type="password" name="password" id="password" required
class="mt-1 focus:ring-blue-500 focus:border-blue-500 block w-full shadow-sm sm:text-sm border-gray-300 rounded-md @error('password') border-red-500 @enderror">
@error('password')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Confirm New Password -->
<div class="mb-6">
<label for="password_confirmation" class="block text-sm font-medium text-gray-700">
{{ __('auth.confirm_password') }}
</label>
<input type="password" name="password_confirmation" id="password_confirmation" required
class="mt-1 focus:ring-blue-500 focus:border-blue-500 block w-full shadow-sm sm:text-sm border-gray-300 rounded-md">
</div>
<div class="flex justify-end">
<button type="submit"
class="bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 px-4 rounded-md transition duration-300">
{{ __('profile.update_password') }}
</button>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection