Frontend: Editorial-Relaunch der öffentlichen Strecke + Ausgaben-Routing

Öffentliche Seiten auf gemeinsames Editorial-Design (x-web.site-header/-footer,
Design-Tokens) und Ausgaben-Präfix /{edition}/ (de|en) umgestellt.

- Routing: neue Middleware SetEdition (Locale + URL::defaults), /{edition}-Gruppe
  in routes/web.php, Root-Redirect auf /de, 301 für Legacy-.html-URLs,
  Baseline-Default in AppServiceProvider.
- Neue URL-Schemata: /{edition}/press-release/{slug}, /{edition}/category/{slug}.
- Ausgabe = Sprache: DE/EN-Umschalter (Region/CH/AT entfernt); EditorialClock
  und Livewire-Komponenten sprachdynamisch.
- Detail-, Kategorie- und Veröffentlichen-Seite mit echten Daten neu aufgebaut.
- Suche aktiviert: Volt-Komponente livewire/web/search (Titel/Text/Keywords +
  Firma + Rubrik, Filter, Sortierung, Pagination, URL-Parameter q/category/sort).
- Rubriken-Navigation statt Übersichtsseite: Helper CategoryNavigation;
  web/kategorien.blade.php + Route entfernt (Legacy-301).
- Tests: Edition-Routing, Kategorie-Seite/-Navigation, Detail, Veröffentlichen,
  Suche, EditorialClock. Doku in "Echte öffentliche Unterseiten.md" aktualisiert.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Kevin Adametz 2026-06-16 16:39:28 +00:00
parent a0547208d3
commit 253141c6dc
64 changed files with 4457 additions and 2971 deletions

View file

@ -20,6 +20,24 @@
@source "../../views/livewire/auth";
@source "../../views/components/layouts/auth";
/**
* Editorial-Status-Tokens (Detailseite/Branchenseite).
* Semantisch identisch über alle Web-Themes hinweg: Bernstein-Warnung
* (Korrekturhinweise) und grüne Verifizierung (verifizierte Publisher).
* Liegen hier zentral, damit beide Marken (BP24 + presseecho) dieselben
* Status-Utilities (bg-warn-bg, text-verify-ink ) generieren.
*/
@theme {
--color-warn-bg: #fff8e1;
--color-warn-border: #e8c77a;
--color-warn-ink: #7a5a0f;
--color-warn-ink-deep: #3d2f0f;
--color-verify-bg: #e8f4ec;
--color-verify-border: #1b8e3a;
--color-verify-ink: #0f5e26;
}
/* Tailwind Base Layer für gemeinsame Elemente */
@layer base {
*,
@ -81,6 +99,80 @@
/* Gemeinsame Component Styles */
@layer components {
/**
* Artikel-Fließtext der Detailseite (sanitisiertes PM-HTML).
* Bildet die Editorial-Typografie aus dem tailwind_v3-Mockup nach und
* nutzt ausschließlich Theme-Tokens, damit BP24 und presseecho identisch
* rendern (nur die Brand-Akzente unterscheiden sich).
*/
.pm-body > p {
font-family: var(--font-serif);
font-size: 17px;
line-height: 1.65;
margin: 0 0 18px;
color: var(--color-ink);
text-wrap: pretty;
}
.pm-body > h2 {
font-family: var(--font-serif);
font-size: 22px;
font-weight: 600;
letter-spacing: -0.3px;
line-height: 1.25;
margin: 32px 0 14px;
color: var(--color-ink);
}
.pm-body > h3 {
font-family: var(--font-serif);
font-size: 18px;
font-weight: 600;
line-height: 1.3;
margin: 26px 0 10px;
color: var(--color-ink);
}
.pm-body > ul,
.pm-body > ol {
font-family: var(--font-serif);
font-size: 17px;
line-height: 1.65;
color: var(--color-ink);
margin: 0 0 18px;
padding-left: 1.4em;
}
.pm-body > ul {
list-style: disc;
}
.pm-body > ol {
list-style: decimal;
}
.pm-body li {
margin-bottom: 6px;
}
.pm-body blockquote {
margin: 28px 0;
padding-left: 24px;
border-left: 3px solid var(--color-brand);
}
.pm-body blockquote p {
font-family: var(--font-serif);
font-size: 21px;
font-style: italic;
font-weight: 500;
line-height: 1.4;
letter-spacing: -0.2px;
margin: 0 0 12px;
color: var(--color-ink);
text-wrap: balance;
}
.pm-body a {
color: var(--color-brand);
text-decoration: underline;
text-underline-offset: 2px;
}
.pm-body strong {
font-weight: 600;
}
/* Button Base Styles */
.btn {
@apply inline-flex items-center justify-center px-4 py-2 rounded-lg font-medium transition-all duration-200;
@ -196,6 +288,22 @@
text-wrap: balance;
}
/* Schraffur-Platzhalter für fehlende Pressefotos/Logos (Detailseite) */
.hatch-dark {
background-image: repeating-linear-gradient(
135deg,
rgba(255, 255, 255, 0.04) 0 10px,
transparent 10px 20px
);
}
.hatch-light {
background-image: repeating-linear-gradient(
135deg,
rgba(0, 0, 0, 0.04) 0 6px,
transparent 6px 12px
);
}
/* Animations */
@keyframes fade-in {
from {