5.4: empty-state auf customer/press-releases + customer/press-kits ausgerollt

Component um optionalen Default-Slot erweitert (rendert unter den Aktionen)
fuer Zusatzinhalt wie die Onboarding-Schritte der Leerzustaende.

Umgestellt:
- customer/press-releases/index: 3 States (Suche ohne Treffer, Filter ohne
  Treffer=warm, gar keine PMs inkl. Onboarding-Grid im Default-Slot)
- customer/press-kits/index: 2 States (Filter=warm, keine Firma inkl.
  Onboarding-Grid), Panel-Wrapper bleibt erhalten

Der Such-Titel behaelt das originale ASCII-Anfuehrungszeichen (via einfach-
gequotetem Attribut mit escaptem PHP-String). Alle Views kompilieren,
162 Customer-/PM-Tests gruen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-01 12:06:21 +00:00
parent 077d313baa
commit 1c75e61179
3 changed files with 50 additions and 50 deletions

View file

@ -577,37 +577,36 @@ new #[Layout('components.layouts.app'), Title('Meine Firmen')] class extends Com
@if ($hasActiveFilters)
{{-- Empty: Filter ohne Treffer --}}
<div class="panel" data-state="empty-filter">
<div class="empty-stage">
<div class="empty-ico warm">
<x-portal.empty-state
variant="warm"
:title="__('Keine Firmen mit diesen Filtern')"
:subtitle="__('Aktive Filter passen auf keine Einträge. Filter zurücksetzen oder weiter fassen.')"
>
<x-slot:icon>
<flux:icon.funnel class="size-6" />
</div>
<h3 class="empty-title">{{ __('Keine Firmen mit diesen Filtern') }}</h3>
<p class="empty-sub">
{{ __('Aktive Filter passen auf keine Einträge. Filter zurücksetzen oder weiter fassen.') }}
</p>
<div class="flex items-center gap-2.5 mt-6">
</x-slot:icon>
<x-slot:actions>
<flux:button variant="primary" wire:click="resetFilters">
{{ __('Alle Filter zurücksetzen') }}
</flux:button>
</div>
</div>
</x-slot:actions>
</x-portal.empty-state>
</div>
@else
{{-- Empty: noch keine Firma --}}
<div class="panel" data-state="empty-none">
<div class="empty-stage">
<div class="empty-ico">
<x-portal.empty-state
:title="__('Noch keine Firma angelegt')"
:subtitle="__('Lege deine erste Firma an. Du kannst direkt im Anschluss eine Pressemitteilung darauf veröffentlichen — eine separate Freigabe der Firma ist nicht erforderlich.')"
>
<x-slot:icon>
<flux:icon.building-office class="size-6" />
</div>
<h3 class="empty-title">{{ __('Noch keine Firma angelegt') }}</h3>
<p class="empty-sub">
{{ __('Lege deine erste Firma an. Du kannst direkt im Anschluss eine Pressemitteilung darauf veröffentlichen — eine separate Freigabe der Firma ist nicht erforderlich.') }}
</p>
<div class="flex items-center gap-2.5 mt-6">
</x-slot:icon>
<x-slot:actions>
<flux:button variant="primary" icon="plus" href="{{ route('me.press-kits.create') }}" wire:navigate>
{{ __('Erste Firma anlegen') }}
</flux:button>
</div>
</x-slot:actions>
<div class="mt-9 grid gap-3 w-full max-w-[560px]" style="grid-template-columns:repeat(3,1fr);">
<div class="text-left px-3 py-2.5 rounded-[3px] border border-[color:var(--color-bg-rule)] bg-[color:var(--color-bg-elev)]">
<div class="font-mono text-[9.5px] tracking-[0.16em] font-bold mb-1 text-[color:var(--color-accent-deep)]">01</div>
@ -628,7 +627,7 @@ new #[Layout('components.layouts.app'), Title('Meine Firmen')] class extends Com
</div>
</div>
</div>
</div>
</x-portal.empty-state>
</div>
@endif

View file

@ -543,62 +543,60 @@ new #[Layout('components.layouts.app'), Title('Meine Pressemitteilungen')] class
</div>
@elseif ($hasAnyPR && $search !== '')
{{-- Empty: Suche ohne Treffer --}}
<div class="empty-stage">
<div class="empty-ico">
<x-portal.empty-state
:title='__("Keine Treffer für „:term\"", ["term" => $search])'
:subtitle="__('Wir konnten zu Ihrer Suche nichts finden. Prüfen Sie die Schreibweise oder schränken Sie den Suchbegriff ein.')"
>
<x-slot:icon>
<svg width="28" height="28" viewBox="0 0 24 24" fill="none">
<circle cx="10.5" cy="10.5" r="6" stroke="currentColor" stroke-width="1.6" />
<path d="M15.5 15.5L20 20" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" />
</svg>
</div>
<h3 class="empty-title">{{ __('Keine Treffer für „:term"', ['term' => $search]) }}</h3>
<p class="empty-sub">
{{ __('Wir konnten zu Ihrer Suche nichts finden. Prüfen Sie die Schreibweise oder schränken Sie den Suchbegriff ein.') }}
</p>
<div class="flex items-center gap-2.5 mt-6">
</x-slot:icon>
<x-slot:actions>
<flux:button variant="primary" wire:click="$set('search', '')">
{{ __('Suche zurücksetzen') }}
</flux:button>
</div>
</div>
</x-slot:actions>
</x-portal.empty-state>
@elseif ($hasAnyPR && $hasAnyFilter)
{{-- Empty: Filter ohne Treffer --}}
<div class="empty-stage">
<div class="empty-ico warm">
<x-portal.empty-state
variant="warm"
:title="__('Keine Mitteilungen mit diesen Filtern')"
:subtitle="__('Aktive Filter passen auf keine Einträge. Setzen Sie einen Filter zurück oder probieren Sie eine breitere Auswahl.')"
>
<x-slot:icon>
<svg width="28" height="28" viewBox="0 0 24 24" fill="none">
<path d="M4 6h16M7 12h10M10 18h4" stroke="currentColor" stroke-width="1.8"
stroke-linecap="round" />
</svg>
</div>
<h3 class="empty-title">{{ __('Keine Mitteilungen mit diesen Filtern') }}</h3>
<p class="empty-sub">
{{ __('Aktive Filter passen auf keine Einträge. Setzen Sie einen Filter zurück oder probieren Sie eine breitere Auswahl.') }}
</p>
<div class="flex items-center gap-2.5 mt-6">
</x-slot:icon>
<x-slot:actions>
<flux:button variant="primary" wire:click="resetFilters">{{ __('Alle Filter zurücksetzen') }}
</flux:button>
</div>
</div>
</x-slot:actions>
</x-portal.empty-state>
@else
{{-- Empty: gar keine PMs überhaupt --}}
<div class="empty-stage">
<div class="empty-ico">
<x-portal.empty-state
:title="__('Noch keine Pressemitteilungen')"
:subtitle="__('Starten Sie mit Ihrer ersten Mitteilung. Nach redaktioneller Prüfung erscheint sie i. d. R. binnen 4 Stunden werktags auf beiden Portalen.')"
>
<x-slot:icon>
<svg width="28" height="28" viewBox="0 0 24 24" fill="none">
<rect x="3" y="4" width="14" height="16" stroke="currentColor" stroke-width="1.5" />
<path d="M17 7h4v13H6" stroke="currentColor" stroke-width="1.5" />
<path d="M6 8h8M6 11h8M6 14h5" stroke="currentColor" stroke-width="1.3"
stroke-linecap="round" />
</svg>
</div>
<h3 class="empty-title">{{ __('Noch keine Pressemitteilungen') }}</h3>
<p class="empty-sub">
{{ __('Starten Sie mit Ihrer ersten Mitteilung. Nach redaktioneller Prüfung erscheint sie i. d. R. binnen 4 Stunden werktags auf beiden Portalen.') }}
</p>
<div class="flex items-center gap-2.5 mt-6">
</x-slot:icon>
<x-slot:actions>
<flux:button variant="primary" icon="plus" href="{{ route('me.press-releases.create') }}"
wire:navigate>
{{ __('Erste Pressemitteilung erstellen') }}
</flux:button>
</div>
</x-slot:actions>
<div class="mt-9 grid gap-3 w-full max-w-[560px]" style="grid-template-columns:repeat(3,1fr);">
<div
class="text-left px-3 py-2.5 bg-[color:var(--color-bg-elev)] border border-[color:var(--color-bg-rule)] rounded-[3px]">
@ -625,7 +623,7 @@ new #[Layout('components.layouts.app'), Title('Meine Pressemitteilungen')] class
{{ __('Zur Prüfung senden') }}</div>
</div>
</div>
</div>
</x-portal.empty-state>
@endif
</article>