From cd2e466f0983a9bc0bcbbe2c385649cd82fee769 Mon Sep 17 00:00:00 2001 From: boban Date: Mon, 20 Apr 2026 20:20:29 +0200 Subject: [PATCH] feat: E-Mail Templates neu gestaltet + Mail-Preview unter /admin/mail-preview MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Einheitliches Design für alle Templates: - Neues Layout: weißes Card, 3px Indigo-Gradient-Akzentbalken, aziros-Wordmark - Icon-Badge pro Template (52px, border-radius:14px, thematische Farbe) - Konsistente Typografie, Info-Boxen, Button-Stil - reset-password, smtp-test, aria-composed auf @extends migriert Preview-Route: /admin/mail-preview (Index) + /admin/mail-preview/{template} → Alle 8 Templates mit Fake-Daten in einer skalierten Vorschau-Grid-Ansicht. Co-Authored-By: Claude Sonnet 4.6 --- .../emails/affiliate-qualified.blade.php | 44 ++++---- .../views/emails/agent/message.blade.php | 40 ++++--- .../views/emails/agent/reminder.blade.php | 101 ++++++++++-------- .../views/emails/aria-composed.blade.php | 29 ++++- .../views/emails/auth/verify.blade.php | 45 ++++---- .../views/emails/components/button.blade.php | 14 +-- .../views/emails/components/code.blade.php | 20 +--- .../views/emails/gift-access.blade.php | 50 +++++---- src/resources/views/emails/layout.blade.php | 62 +++++++---- .../views/emails/reset-password.blade.php | 86 +++++---------- .../views/emails/smtp-test.blade.php | 32 +++++- .../views/mail-preview/index.blade.php | 62 +++++++++++ src/routes/web.php | 77 +++++++++++-- 13 files changed, 426 insertions(+), 236 deletions(-) create mode 100644 src/resources/views/mail-preview/index.blade.php diff --git a/src/resources/views/emails/affiliate-qualified.blade.php b/src/resources/views/emails/affiliate-qualified.blade.php index 7e093b2..57e3d0c 100644 --- a/src/resources/views/emails/affiliate-qualified.blade.php +++ b/src/resources/views/emails/affiliate-qualified.blade.php @@ -2,27 +2,33 @@ @section('content') -
- -
+{{-- Icon --}} + + + + +
+ +
-

- Du hast {{ $credits }} Credits verdient! -

+{{-- Title --}} +

+ Dein Referral hat sich qualifiziert! +

+

+ {{ $referredUser->name }} nutzt Aziros jetzt seit 3 Monaten. +

-

- {{ $referredUser->name }} nutzt Aziros jetzt seit 3 Monaten - — dein Referral hat sich qualifiziert! -

+{{-- Credits badge --}} +
+

Gutschrift

+

+{{ $credits }}

+

Credits wurden deinem Konto gutgeschrieben

+
-
-
+{{ $credits }}
-
Credits wurden deinem Konto gutgeschrieben
-
- - - Mein Affiliate-Dashboard - +{{-- CTA --}} + + Mein Affiliate-Dashboard + @endsection diff --git a/src/resources/views/emails/agent/message.blade.php b/src/resources/views/emails/agent/message.blade.php index b2f4079..b9e2967 100644 --- a/src/resources/views/emails/agent/message.blade.php +++ b/src/resources/views/emails/agent/message.blade.php @@ -2,25 +2,31 @@ @section('content') -
- -
+{{-- Icon --}} + + + + +
+ +
-

- Nachricht -

+{{-- Title --}} +

+ Neue Nachricht +

+

+ von {{ $sender_name }} +

-

- von {{ $sender_name }} -

+{{-- Recipient label --}} +

+ Nachricht an {{ $recipient_name }} +

-

- Nachricht an {{ $recipient_name }} -

- -
-

{{ $message }}

-
+{{-- Message box --}} +
+

{{ $message }}

+
@endsection diff --git a/src/resources/views/emails/agent/reminder.blade.php b/src/resources/views/emails/agent/reminder.blade.php index 3b482f0..fc79407 100644 --- a/src/resources/views/emails/agent/reminder.blade.php +++ b/src/resources/views/emails/agent/reminder.blade.php @@ -2,55 +2,70 @@ @section('content') -
- -
+{{-- Icon --}} + + + + +
+ +
-

- Terminerinnerung -

+{{-- Title --}} +

+ Terminerinnerung +

+

+ von {{ $sender_name }} +

-

- von {{ $sender_name }} -

- - {{-- Event Details --}} -
- +{{-- Event card --}} +
+
+ + + + + + + + + + + + + + + + @if(!empty($event_notes)) - - - - - - - - - - - @if(!empty($event_notes)) - - - - - @endif -
Termin{{ $event_title }}
+
+
Datum{{ $event_date }}
Uhrzeit + {{ $event_time }}@if(!empty($event_end)) – {{ $event_end }}@endif Uhr +
Termin{{ $event_title }}
Datum{{ $event_date }}
Uhrzeit - {{ $event_time }}@if(!empty($event_end)) - {{ $event_end }}@endif Uhr + +
Info{{ $event_notes }}
+ + Info + {{ $event_notes }} + + @endif + +
+ +{{-- Personal message --}} +@if(!empty($message)) +
+

Nachricht

+

{{ $message }}

+@endif - {{-- Persönliche Nachricht --}} - @if(!empty($message)) -
-

Nachricht

-

{{ $message }}

-
- @endif - -

- Hallo {{ $recipient_name }}, dies ist eine automatische Terminerinnerung. -

+{{-- Recipient note --}} +

+ Hallo {{ $recipient_name }} — dies ist eine automatische Terminerinnerung. +

@endsection diff --git a/src/resources/views/emails/aria-composed.blade.php b/src/resources/views/emails/aria-composed.blade.php index f6cbf2c..59d8ea2 100644 --- a/src/resources/views/emails/aria-composed.blade.php +++ b/src/resources/views/emails/aria-composed.blade.php @@ -1,3 +1,26 @@ -

{!! nl2br(e($body)) !!}

-
-

Gesendet von Aria · aziros.com

+@extends('emails.layout') + +@section('content') + +{{-- Icon --}} + + + + +
+ +
+ +{{-- Message body --}} +
+ {!! nl2br(e($body)) !!} +
+ +{{-- Sent by footer --}} +
+

+ Gesendet von Aria · aziros.com +

+
+ +@endsection diff --git a/src/resources/views/emails/auth/verify.blade.php b/src/resources/views/emails/auth/verify.blade.php index 53f730c..e5aa00c 100644 --- a/src/resources/views/emails/auth/verify.blade.php +++ b/src/resources/views/emails/auth/verify.blade.php @@ -2,28 +2,33 @@ @section('content') -
- -
+{{-- Icon --}} + + + + +
+ +
-

- {{ t('mail.auth.verify.title') }} -

+{{-- Title --}} +

+ {{ t('mail.auth.verify.title') }} +

+

+ {{ t('mail.auth.verify.text') }} +

-

- {{ t('mail.auth.verify.text') }} -

+{{-- Button --}} +@if(!empty($url)) + + {{ t('mail.auth.verify.button') }} + +@endif - {{-- BUTTON --}} - @if(!empty($url)) - - {{ t('mail.auth.verify.button') }} - - @endif - -

- {{ t('mail.auth.verify.expires') }} -

+{{-- Expiry --}} +

+ {{ t('mail.auth.verify.expires') }} +

@endsection diff --git a/src/resources/views/emails/components/button.blade.php b/src/resources/views/emails/components/button.blade.php index 37ea4af..776c362 100644 --- a/src/resources/views/emails/components/button.blade.php +++ b/src/resources/views/emails/components/button.blade.php @@ -1,14 +1,6 @@ -
+

+ style="display:inline-block;background:#4F46E5;color:#ffffff;padding:14px 32px;border-radius:10px;text-decoration:none;font-size:14px;font-weight:600;letter-spacing:0.1px;line-height:1;"> {{ $slot }} -

+

diff --git a/src/resources/views/emails/components/code.blade.php b/src/resources/views/emails/components/code.blade.php index ead7e97..6d4fad8 100644 --- a/src/resources/views/emails/components/code.blade.php +++ b/src/resources/views/emails/components/code.blade.php @@ -1,25 +1,13 @@ - +
- @foreach(str_split($slot) as $index => $digit) - - - - {{-- Abstand --}} @if(!$loop->last) @endif - @endforeach
+ @foreach(str_split($slot) as $digit) + {{ $digit }}
diff --git a/src/resources/views/emails/gift-access.blade.php b/src/resources/views/emails/gift-access.blade.php index 35930be..4ebe0f8 100644 --- a/src/resources/views/emails/gift-access.blade.php +++ b/src/resources/views/emails/gift-access.blade.php @@ -2,34 +2,38 @@ @section('content') -
- -
+{{-- Icon --}} + + + + +
+ +
-

- Hallo {{ $user->name }}! -

- -

- Du hast kostenlosen Zugang zum - {{ $plan->name }} - erhalten — {{ $durationLabel }}. -

+{{-- Title --}} +

+ Hallo {{ $user->name }}! +

+

+ Du hast kostenlosen Zugang zum + {{ $plan->name }}-Plan erhalten — {{ $durationLabel }}. +

+{{-- Validity badge --}} +
@if($endsAt) -

- Dein Zugang ist gültig bis: - {{ $endsAt->format('d.m.Y') }} -

+

Gültig bis

+

{{ $endsAt->format('d.m.Y') }}

@else -

- Dein Zugang ist unbegrenzt gültig. -

+

Gültigkeit

+

Unbegrenzt

@endif +
- - Jetzt Aria nutzen - +{{-- CTA --}} + + Jetzt Aria nutzen + @endsection diff --git a/src/resources/views/emails/layout.blade.php b/src/resources/views/emails/layout.blade.php index f072db2..8efe2af 100644 --- a/src/resources/views/emails/layout.blade.php +++ b/src/resources/views/emails/layout.blade.php @@ -1,30 +1,56 @@ - - + + + + + + Aziros + + - +
+ + + {{-- Footer --}} + + + + +
+ + + {{-- Wordmark --}} - + -
+ + + aziros + +
+ {{-- Card --}} + + - - - - {{-- FOOTER --}} - @include('emails.components.footer') - -
- {{-- HEADER --}} - @include('emails.components.header') + {{-- Accent bar --}} +
- {{-- CONTENT --}} -
- @yield('content') -
+ {{-- Content --}} +
+ @yield('content') +
+

+ Du erhältst diese E-Mail, weil du {{ config('app.name') }} nutzt.
+ Falls du sie nicht erwartet hast, kannst du sie ignorieren. +

+

+ © {{ date('Y') }} Aziros GmbH · Made with ♡ in Austria +

+
+ diff --git a/src/resources/views/emails/reset-password.blade.php b/src/resources/views/emails/reset-password.blade.php index 201341c..f7489c6 100644 --- a/src/resources/views/emails/reset-password.blade.php +++ b/src/resources/views/emails/reset-password.blade.php @@ -1,63 +1,35 @@ - - - - - - Passwort zurücksetzen - - - - - - -
- +@extends('emails.layout') - {{-- Logo --}} - - - +@section('content') - {{-- Card --}} - - - - - {{-- Footer --}} - - - - -
- aziros -
+{{-- Icon --}} + + + + +
+ +
-

- Passwort zurücksetzen -

-

- Hallo {{ $user->name }}, -

-

- Du hast ein Zurücksetzen deines Passworts angefordert. - Klicke auf den Button, um ein neues Passwort zu setzen. -

+{{-- Title --}} +

+ Passwort zurücksetzen +

+

+ Hallo {{ $user->name }}, klicke auf den Button um ein neues Passwort zu setzen. +

- - Passwort zurücksetzen - +{{-- Button --}} + + Passwort zurücksetzen + -

- Dieser Link ist 60 Minuten gültig.
- Falls du kein Passwort-Reset angefordert hast, ignoriere diese E-Mail. -

+{{-- Expiry note --}} +
+

+ Dieser Link ist 60 Minuten gültig.
+ Falls du kein Passwort-Reset angefordert hast, ignoriere diese E-Mail. +

+
-
- © {{ date('Y') }} Aziros · Made in Austria -
-
- - +@endsection diff --git a/src/resources/views/emails/smtp-test.blade.php b/src/resources/views/emails/smtp-test.blade.php index d3a5c1f..2dfc117 100644 --- a/src/resources/views/emails/smtp-test.blade.php +++ b/src/resources/views/emails/smtp-test.blade.php @@ -1,2 +1,30 @@ -

Dein SMTP Server ist korrekt konfiguriert.

-

E-Mails können von Aria in deinem Namen gesendet werden.

+@extends('emails.layout') + +@section('content') + +{{-- Icon --}} + + + + +
+ +
+ +{{-- Title --}} +

+ SMTP erfolgreich konfiguriert +

+

+ Dein SMTP-Server ist korrekt eingerichtet.
+ E-Mails können von Aria in deinem Namen versendet werden. +

+ +{{-- Status box --}} +
+

+ ✓ Verbindung hergestellt +

+
+ +@endsection diff --git a/src/resources/views/mail-preview/index.blade.php b/src/resources/views/mail-preview/index.blade.php new file mode 100644 index 0000000..02ef56a --- /dev/null +++ b/src/resources/views/mail-preview/index.blade.php @@ -0,0 +1,62 @@ + + + + + + Mail Preview · Aziros + + + +
+ +
+ + Mail Preview +
+ +

E-Mail Templates

+

{{ count($templates) }} Templates — Klicke auf eine Karte für die Vollansicht.

+ + + +
+ + diff --git a/src/routes/web.php b/src/routes/web.php index d319bd3..514a353 100644 --- a/src/routes/web.php +++ b/src/routes/web.php @@ -22,13 +22,7 @@ use Illuminate\Support\Facades\Route; -Route::get('/mail-preview', function () { - return view('emails.auth.verify', [ - 'user' => 'Max Mustermann', - 'code' => '123456', - 'url' => 'https://example.com/verify' // 🔥 hinzufügen - ]); -}); +// ── Mail Preview (nur Admin) ────────────────────────────────────────────────── Route::middleware(['auth.custom'])->group(function () { // intentionally empty — kept for middleware reference @@ -63,6 +57,75 @@ Route::middleware(['user', 'role:admin'])->prefix('admin')->name('admin.')->grou Route::get('/affiliates', \App\Livewire\Admin\Affiliates\Index::class)->name('affiliates.index'); Route::get('/translations', TranslationIndex::class)->name('translations.index'); Route::get('/versions', \App\Livewire\Admin\Versions::class)->name('versions.index'); + + // ── Mail Preview ────────────────────────────────────────────────────────── + $fakeData = [ + 'auth.verify' => [ + 'name' => 'E-Mail verifizieren', + 'data' => ['url' => 'https://app.aziros.com/verify?token=preview', 'user' => 'Max Mustermann'], + ], + 'reset-password' => [ + 'name' => 'Passwort zurücksetzen', + 'data' => ['url' => 'https://app.aziros.com/password/reset/preview', 'user' => (object)['name' => 'Max Mustermann']], + ], + 'agent.reminder' => [ + 'name' => 'Terminerinnerung', + 'data' => [ + 'sender_name' => 'Maria Muster', + 'event_title' => 'Strategie-Meeting Q2', + 'event_date' => 'Montag, 22. April 2026', + 'event_time' => '14:00', + 'event_end' => '15:30', + 'event_notes' => 'Bitte die Präsentation vorbereiten.', + 'recipient_name' => 'Max Mustermann', + 'message' => 'Vergiss bitte nicht, die Unterlagen mitzubringen!', + ], + ], + 'agent.message' => [ + 'name' => 'Neue Nachricht (Agent)', + 'data' => [ + 'sender_name' => 'Maria Muster', + 'recipient_name' => 'Max Mustermann', + 'message' => 'Hallo Max, kannst du mir bitte die Unterlagen für das Meeting zukommen lassen? Ich brauche sie bis morgen früh.', + ], + ], + 'gift-access' => [ + 'name' => 'Geschenk-Zugang', + 'data' => [ + 'user' => (object)['name' => 'Max Mustermann'], + 'plan' => (object)['name' => 'Pro'], + 'durationLabel' => '3 Monate kostenlos', + 'endsAt' => \Carbon\Carbon::now()->addMonths(3), + ], + ], + 'affiliate-qualified' => [ + 'name' => 'Affiliate qualifiziert', + 'data' => [ + 'credits' => 50, + 'referredUser' => (object)['name' => 'Lisa Müller'], + ], + ], + 'smtp-test' => [ + 'name' => 'SMTP Test', + 'data' => [], + ], + 'aria-composed' => [ + 'name' => 'Aria – Verfasste E-Mail', + 'data' => ['body' => "Hallo!\n\nIch habe deine Aufgabe erledigt und hier ist die Zusammenfassung der Ergebnisse für dein Meeting morgen.\n\nBitte prüfe die Agenda und gib mir Bescheid, ob noch Änderungen nötig sind."], + ], + ]; + + Route::get('/mail-preview', function () use ($fakeData) { + $templates = collect($fakeData)->map(fn($v, $k) => ['key' => $k, 'name' => $v['name']])->values(); + return view('mail-preview.index', compact('templates')); + })->name('mail-preview.index'); + + Route::get('/mail-preview/{template}', function (string $template) use ($fakeData) { + abort_unless(isset($fakeData[$template]), 404); + $entry = $fakeData[$template]; + $view = 'emails.' . str_replace('.', '/', str_replace('-', '-', $template)); + return response(view($view, $entry['data'])); + })->name('mail-preview.show'); }); Route::middleware('user')->group(function () {