5.4 (Teil 4): page-header size=lg-Variante + press-releases/* + companies/index

Component um size-Prop erweitert: md (30px, Standard) | lg (34px, Landing-
Header). lg vergroessert zusaetzlich Beschreibung (13.5px) und Button-Abstand
(gap-3) — exakt die bisherige Sonderoptik der Listen-Landing-Header.

Umgestellt:
- press-releases/create (md), press-releases/edit (md, Status-Badge + ID via
  :meta, 3 Aktionen inkl. Modal-Trigger)
- press-releases/index (lg) und companies/index (lg) — Letzterer war zuvor
  bewusst ausgelassen, ist mit der lg-Variante jetzt originalgetreu abbildbar.

Bewusst NICHT umgestellt: press-releases/show (zusaetzlicher Untertitel +
mehrteilige Firma/Kategorie/Autor-Beschreibung, bleibt bespoke).

md-Ausgabe unveraendert (nur Klassenreihenfolge). 321 Tests gruen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-01 09:16:40 +00:00
parent 2a3b5612cb
commit 1eb2243959
5 changed files with 61 additions and 74 deletions

View file

@ -10,10 +10,25 @@
/** Optionaler Beschreibungstext unter dem Titel */
'description' => '',
/**
* Titel-Größe: md (Standard, 30px) | lg (Landing/Hero-Listen, 34px).
* lg vergrößert zusätzlich die Beschreibung und den Button-Abstand.
*/
'size' => 'md',
])
@php
$size = in_array($size, ['md', 'lg'], true) ? $size : 'md';
$titleClass = $size === 'lg'
? 'text-[34px] tracking-[-0.7px] leading-[1.1]'
: 'text-[30px] tracking-[-0.6px] leading-[1.15]';
$descriptionClass = $size === 'lg' ? 'text-[13.5px]' : 'text-[13px]';
$actionsGap = $size === 'lg' ? 'gap-3' : 'gap-2';
@endphp
{{--
Einheitlicher Seitenkopf des Admin-Backends. Ersetzt den 35-fach kopierten
Einheitlicher Seitenkopf des Admin-Backends. Ersetzt den vielfach kopierten
page-header-Block. Variable Teile über Slots:
<x-slot:meta> – zusätzliche Badges hinter dem Eyebrow (ID, Zähler …)
<x-slot:actions> – Buttons rechts (Zurück, Speichern …)
@ -32,19 +47,19 @@
{{ $meta ?? '' }}
</div>
<h1 class="text-[30px] font-bold tracking-[-0.6px] leading-[1.15] m-0 text-[color:var(--color-ink)] break-words">
<h1 class="{{ $titleClass }} font-bold m-0 text-[color:var(--color-ink)] break-words">
{{ $title }}
</h1>
@if (filled($description))
<p class="text-[13px] leading-[1.55] mt-2 m-0 max-w-[640px] text-[color:var(--color-ink-2)]">
<p class="{{ $descriptionClass }} leading-[1.55] mt-2 m-0 max-w-[640px] text-[color:var(--color-ink-2)]">
{{ $description }}
</p>
@endif
</div>
@isset($actions)
<div class="flex items-center gap-2 flex-shrink-0">
<div class="flex items-center {{ $actionsGap }} flex-shrink-0">
{{ $actions }}
</div>
@endisset

View file

@ -263,26 +263,19 @@ new #[Layout('components.layouts.app'), Title('Firmen')] class extends Component
<div class="space-y-8">
{{-- ============== PAGE HEADER ============== --}}
<header class="page-header">
<div class="min-w-0">
<div class="flex items-center gap-3 mb-3 flex-nowrap whitespace-nowrap">
<span class="badge hub dot">{{ __('Admin Backend') }}</span>
<span class="eyebrow muted">{{ __('Stammdaten · Firmen') }}</span>
</div>
<h1 class="text-[34px] font-bold tracking-[-0.7px] leading-[1.1] m-0 text-[color:var(--color-ink)]">
{{ __('Firmen') }}
</h1>
<p class="text-[13.5px] leading-[1.55] mt-2 m-0 max-w-[640px] text-[color:var(--color-ink-2)]">
{{ __('Übersicht aller Firmen beider Portale, mit Filter, Datenqualität und Schnellaktionen.') }}
</p>
</div>
<div class="flex items-center gap-3 flex-shrink-0">
<x-portal.page-header
size="lg"
:badge="__('Admin Backend')"
:eyebrow="__('Stammdaten · Firmen')"
:title="__('Firmen')"
:description="__('Übersicht aller Firmen beider Portale, mit Filter, Datenqualität und Schnellaktionen.')"
>
<x-slot:actions>
<flux:button icon="plus" variant="primary" href="{{ route('admin.companies.create') }}" wire:navigate>
{{ __('Neue Firma') }}
</flux:button>
</div>
</header>
</x-slot:actions>
</x-portal.page-header>
{{-- ============== KPI-Reihe ============== --}}
<section class="grid grid-cols-1 gap-4 sm:grid-cols-3">

View file

@ -210,27 +210,19 @@ new #[Layout('components.layouts.app'), Title('Neue Pressemitteilung')] class ex
<div class="space-y-8 pr-editor-shell" x-data="{ tagInput: '' }">
{{-- ============== PAGE HEADER ============== --}}
<header class="page-header">
<div class="min-w-0">
<div class="flex items-center gap-3 mb-3 flex-nowrap whitespace-nowrap">
<span class="badge hub dot">{{ __('Admin Backend') }}</span>
<span class="eyebrow muted">{{ __('Content · Neu anlegen') }}</span>
</div>
<h1 class="text-[30px] font-bold tracking-[-0.6px] leading-[1.15] m-0 text-[color:var(--color-ink)]">
{{ __('Neue Pressemitteilung') }}
</h1>
<p class="text-[13px] leading-[1.55] mt-2 m-0 max-w-[640px] text-[color:var(--color-ink-2)]">
{{ __('Schreibfläche links, Steuerung rechts. Pflichtfelder werden rechts in der Checkliste angezeigt.') }}
</p>
</div>
<div class="flex items-center gap-2 flex-shrink-0">
<x-portal.page-header
:badge="__('Admin Backend')"
:eyebrow="__('Content · Neu anlegen')"
:title="__('Neue Pressemitteilung')"
:description="__('Schreibfläche links, Steuerung rechts. Pflichtfelder werden rechts in der Checkliste angezeigt.')"
>
<x-slot:actions>
<flux:button variant="filled" icon="arrow-left" href="{{ route('admin.press-releases.index') }}"
wire:navigate>
{{ __('Zurück') }}
</flux:button>
</div>
</header>
</x-slot:actions>
</x-portal.page-header>
{{-- ============== 2-COLUMN GRID ============== --}}
<div class="grid gap-6 pr-editor-layout">

View file

@ -408,23 +408,17 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl
{{-- Flash-Banner ersetzt durch <flux:toast /> im Layout. --}}
{{-- ============== PAGE HEADER ============== --}}
<header class="page-header">
<div class="min-w-0">
<div class="flex items-center gap-3 mb-3 flex-wrap">
<span class="badge hub dot">{{ __('Admin Backend') }}</span>
<span class="eyebrow muted">{{ __('Content · Bearbeiten') }}</span>
<span @class(['badge', $statusClass])>{{ $statusEnum?->label() ?? $currentStatus }}</span>
<span class="badge hub">ID {{ $id }}</span>
</div>
<h1 class="text-[30px] font-bold tracking-[-0.6px] leading-[1.15] m-0 text-[color:var(--color-ink)]">
{{ __('Pressemitteilung bearbeiten') }}
</h1>
<p class="text-[13px] leading-[1.55] mt-2 m-0 max-w-[640px] text-[color:var(--color-ink-2)]">
{{ __('Schreibfläche links, Steuerung rechts. Status-Aktionen erscheinen oben in der Sidebar.') }}
</p>
</div>
<div class="flex items-center gap-2 flex-shrink-0">
<x-portal.page-header
:badge="__('Admin Backend')"
:eyebrow="__('Content · Bearbeiten')"
:title="__('Pressemitteilung bearbeiten')"
:description="__('Schreibfläche links, Steuerung rechts. Status-Aktionen erscheinen oben in der Sidebar.')"
>
<x-slot:meta>
<span @class(['badge', $statusClass])>{{ $statusEnum?->label() ?? $currentStatus }}</span>
<span class="badge hub">ID {{ $id }}</span>
</x-slot:meta>
<x-slot:actions>
<flux:modal.trigger name="admin-ki-check">
<flux:button variant="filled" icon="sparkles">
{{ __('Prüfung') }}
@ -438,8 +432,8 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl
wire:navigate>
{{ __('Zur Liste') }}
</flux:button>
</div>
</header>
</x-slot:actions>
</x-portal.page-header>
{{-- ============== KI-PRÜFUNG (On-Demand) ============== --}}
<flux:modal name="admin-ki-check" class="w-full max-w-lg">

View file

@ -378,26 +378,19 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten
{{-- Flash-Banner ersetzt durch <flux:toast /> im Layout. --}}
{{-- ============== PAGE HEADER ============== --}}
<header class="page-header">
<div class="min-w-0">
<div class="flex items-center gap-3 mb-3 flex-nowrap whitespace-nowrap">
<span class="badge hub dot">{{ __('Admin Backend') }}</span>
<span class="eyebrow muted">{{ __('Content · Pressemitteilungen') }}</span>
</div>
<h1 class="text-[34px] font-bold tracking-[-0.7px] leading-[1.1] m-0 text-[color:var(--color-ink)]">
{{ __('Pressemitteilungen') }}
</h1>
<p class="text-[13.5px] leading-[1.55] mt-2 m-0 max-w-[640px] text-[color:var(--color-ink-2)]">
{{ __('Übersicht aller PMs beider Portale, mit Filter, Status-Workflow und Schnellaktionen.') }}
</p>
</div>
<div class="flex items-center gap-3 flex-shrink-0">
<x-portal.page-header
size="lg"
:badge="__('Admin Backend')"
:eyebrow="__('Content · Pressemitteilungen')"
:title="__('Pressemitteilungen')"
:description="__('Übersicht aller PMs beider Portale, mit Filter, Status-Workflow und Schnellaktionen.')"
>
<x-slot:actions>
<flux:button icon="plus" variant="primary" href="{{ route('admin.press-releases.create') }}" wire:navigate>
{{ __('Neue PM') }}
</flux:button>
</div>
</header>
</x-slot:actions>
</x-portal.page-header>
{{-- ============== KPI-Reihe ============== --}}
<section class="grid gap-4 grid-cols-2 xl:grid-cols-4">