# Entwicklungskonzept – BusinessPortal24 & Presseecho Frontend > **Stand:** 12. Mai 2026 > **Domains:** `businessportal24.test` / `businessportal24.com` · `presseecho.test` / `presseecho.com` > **Theme-Slugs:** `businessportal24` (warm-rotes Editorial) · `presseecho` (grünes Editorial) > **Assets-Dir (geteilt):** `public/build/web/` > **Ziel:** Editoriales DACH-Pressemitteilungs-Portal mit 1:1-Mockup-Umsetzung. Presseecho nutzt die **gleiche Komponenten-Architektur** wie BP24 und unterscheidet sich nur via Theme-Tokens + Brand-Konfiguration. Dieses Dokument beschreibt den aktuellen Stand und die wichtigsten Architektur­entscheidungen der BusinessPortal24- und Presseecho-Frontend-Entwicklung. Es ist die zentrale Anlaufstelle für alle, die im Frontend weiterarbeiten oder neue Seiten ergänzen. --- ## 1. Zielbild & Designreferenzen Das Portal folgt einer **editorial-zeitungs-orientierten Ästhetik** mit ruhiger Beige-Surface, klarer Hierarchie über Typografie statt Cards und einer einzigen warm-roten Akzentfarbe. | Datei | Zweck | | --- | --- | | `dev/frontend/Pass B _ _ Deutschland _aktiv.png` | Visuelle Referenz Desktop | | `dev/frontend/Pass B _ _ Deutschland _aktiv.html` | Roh-HTML-Export aus Figma (für strukturelle Analyse) | | `dev/frontend/Mobile _ Startseite.png` | Visuelle Referenz Mobile | | `dev/frontend/tailwind_v3/Startseite Tailwind.html` | **Master-Vorlage** der Implementierung (Tailwind v3 Export – sauberer, ohne Embedded-Bilder) | | `dev/frontend/tailwind_v3/Branchenseite Tailwind.html` | Vorlage Branchenseite (offen) | | `dev/frontend/tailwind_v3/Detailseite Tailwind.html` | Vorlage Detailseite Pressemitteilung (offen) | | `dev/frontend/tailwind_v3/Veröffentlichen Tailwind.html` | Vorlage Veröffentlichen-Landing (offen) | | `dev/frontend/Branchenseite _ Energie _ Klima _aktiv.png` / `.html` | Hochauflösende Branchen-Vorlage | | `dev/frontend/Detailseite _ Pressemitteilung _aktiv.png` / `.html` | Hochauflösende Detailseite-Vorlage | | `dev/frontend/Ver_ffentlichen _ Variante A _aktiv_.png` / `.html` | Veröffentlichen-Vorlage | | `dev/frontend/Umsetzungskonzept - Frontend BusinessPortal24 Startseite.md` | Historisches Detailkonzept zur Startseite | **Verbindlich:** Die `tailwind_v3`-Exports sind die normative Referenz – sie enthalten alle Spacings, Schriftgrößen, Tracking-Werte und Farbtöne in Klartext. Das `.png` dient als visuelle Bestätigung. --- ## 2. Tech-Stack - **Framework:** Laravel 12 (PHP 8.4) - **UI:** Livewire 4 + Volt 1 (single-file components) - **CSS:** Tailwind CSS v4 mit `@theme`-Tokens und scoped Layer-Komponenten - **Build:** Vite 6 (dualer Setup: `vite.web.config.js` Port 5178 / `vite.portal.config.js` Port 5177) - **Interaktivität:** Alpine.js v3 (initialisiert in `resources/js/app.js`) - **Icons:** Inline-SVG (Bunny-Fonts-Icons werden bewusst NICHT genutzt, um Render-konsistent zu bleiben) - **Fonts (Bunny.net):** `Inter Tight` (Sans), `Source Serif 4` (Serif), `JetBrains Mono` (Mono) - **Tests:** Pest 3 + PHPUnit 11 - **Lint/Format:** Laravel Pint (`vendor/bin/pint --dirty --format agent`) --- ## 3. Domain-Routing Das Portal nutzt das bestehende `ThemeServiceProvider`-System aus `CLAUDE.md`. Beide Domains teilen sich `build/web/`-Assets und unterscheiden sich nur in der geladenen Theme-CSS-Datei: ``` Request (Host: businessportal24.test) → ThemeServiceProvider erkennt Domain → /config/domains.php liefert assets_dir = "build/web", theme = "businessportal24" → routes/web.php · "/" gibt businessportal24.blade.php zurück, vor­geladen mit Daten aus $webHomeData(Portal::Businessportal24) → resources/views/web/layouts/web-master.blade.php lädt theme-businessportal24.css + app.js Request (Host: presseecho.test) → /config/domains.php liefert theme = "presseecho" → routes/web.php · "/" gibt presseecho.blade.php zurück, vor­geladen mit Daten aus $webHomeData(Portal::Presseecho) → web-master.blade.php lädt theme-presseecho.css + app.js ``` Lokale Domain-Simulation: - `.env`: `DEV_SIMULATE_DOMAIN=true`, `DEV_SIMULATED_DOMAIN=businessportal24.test|presseecho.test` - Alternativ: `?theme=businessportal24|presseecho` als Query-Parameter ### 3.1 Generischer Daten-Provider Der Daten-Provider `$webHomeData(Portal $primaryPortal)` in `routes/web.php` ist **portal-agnostisch** und liefert für beide Domains die gleichen Variablen (`leadRelease`, `sideReleases`, `mostReadReleases`, `activeNewsrooms`, `industryIndex`, `homeStats`). Aufruf: ```php view('web.presseecho', $webHomeData(Portal::Presseecho)); view('web.businessportal24', $webHomeData(Portal::Businessportal24)); ``` Die Trennung der Portale geschieht über `whereIn('portal', [$primaryPortal->value, Portal::Both->value])`. ### 3.2 Brand-Konfiguration In `config/domains.php` liegt pro Domain ein **`brand`-Block**, der Komponenten dynamisch befüllt (Logo-Text, Tagline, Newsletter-Topics, Footer-Legal, Meta-Texte): ```php 'presseecho' => [ 'theme' => 'presseecho', 'brand' => [ 'name' => 'presseecho', 'accent' => null, // kein Brand-Akzent (z.B. "24") 'tagline_short' => 'Pressemitteilungen · DACH', 'tagline_long' => 'Fachmeldungen aus Wirtschaft und Industrie ...', 'footer_legal' => '© :year presseecho.com · Alle Rechte vorbehalten', 'about_label' => 'Über presseecho', 'meta_title' => '... – presseecho', 'meta_description' => '...', 'newsletter_topics' => [ ... ], ], ], 'businessportal24' => [ 'theme' => 'businessportal24', 'brand' => [ 'name' => 'businessportal', 'accent' => '24', // markenrechtlicher Brand-Akzent ... ], ], ``` Komponenten (`site-header`, `site-footer`, `newsletter-strip`) lesen ihre Defaults aus `config('domains.domains.'.config('app.theme').'.brand', [...])`. Übergaben via `:brand="..."` überschreiben sie jederzeit. --- ## 4. Theme-System (Tailwind v4) ### Datei: `resources/css/web/theme-businessportal24.css` Alle Designtokens liegen in einem `@theme`-Block: ```css @theme { /* Surfaces */ --color-bg: #f6f4ef; --color-bg-elev: #fbfaf6; --color-bg-rule: #e5e0d5; --color-bg-rule-strong: #1c1a17; --color-bg-card-warm: #f1ece2; /* Warm-beige Anzeigen-Karten */ --color-bg-card-warm-border: #d9cdb6; --color-topbar: #1a1f26; --color-topbar2: #232a33; /* Ink (Text-Hierarchie) */ --color-ink: #1c1a17; --color-ink-2: #3d3935; --color-ink-3: #6e6862; --color-ink-4: #9a958d; --color-ink-on-dark: #f6f4ef; --color-ink-on-dark-2: #b8b3aa; /* Brand */ --color-brand: #c84a1e; --color-brand-deep: #a23814; --color-brand-soft: #f4e5dd; --color-live: #e03a1a; --color-gain: #2e8540; --color-loss: #c8341e; --color-ok: #2e8540; /* Editorial-Akzente (auf dunklem Grund / in Card-Warm) */ --color-accent-warm: #ff8b6f; /* Eyebrows auf TopBar/Hero/Newsletter */ --color-ink-on-dark-muted: #8a847b; /* gedämpfter Text auf Dunkel */ --color-ink-on-dark-rule: #2a2723; /* feiner Trenner auf Dunkel */ --color-bg-card-warm-hover: #ece5d5; --color-bg-card-warm-rule: #c8bda8; /* Hairline „Anzeige" innerhalb Card-Warm */ --color-card-warm-cat: #6e6862; --color-card-warm-title: #3a332b; --color-feature-line: #a8c8a8; /* Decor-Linien im Feature-Bild-Fallback */ --color-feature-dot: #c4dcc4; /* Typo & Layout */ --font-sans: "Inter Tight", "Söhne", Inter, system-ui, sans-serif; --font-serif: "Source Serif 4", "Source Serif Pro", Charter, Georgia, serif; --font-mono: "JetBrains Mono", "SF Mono", ui-monospace, monospace; --container-layout: 1280px; } ``` Daraus stehen Klassen wie `bg-bg`, `text-ink-3`, `border-bg-rule`, `text-brand`, `text-accent-warm`, `bg-card-warm-hover`, `max-w-layout`, `font-serif` automatisch zur Verfügung. > **Wichtig:** Komponenten dürfen **keine Hex-Werte** mehr enthalten. Stattdessen die Tokens nutzen (`text-accent-warm`, `border-ink-on-dark-rule`, `text-card-warm-cat`, …). So bleibt der Theme-Wechsel zwischen BP24 und Presseecho ein reiner CSS-Switch. ### Wiederkehrende Komponenten-Klassen (in `@layer components`) | Klasse | Verwendung | | --- | --- | | `.eyebrow` / `.eyebrow.muted` / `.eyebrow.on-dark` | 11px-Vor-Label uppercase (Brand-Farbe / Grau / `accent-warm` für Dunkel-Sektionen) | | `.bp-cat` | Kategoriekürzel 11px uppercase brand | | `.bp-tag` | Solid-Brand-Tag (z. B. „TOP-MELDUNG", „Top-Meldung") | | `.rule-strong` | 1 px-Hairline auf `--color-bg-rule-strong` | | `.rule` | 1 px-Hairline auf `--color-bg-rule` | | `.bg-topbar-grad` | 135°-Gradient TopBar → Topbar2 (TopBar, CTA, Footer, Newsletter) | | `.bg-feature-grad` | 135°-Gradient (Featured-Top-Bild-Fallback) | | `.bg-hero-grad` | 135°-Gradient (Hero-Bild-Fallback) | | `.ticker-marquee-track` | Endlos-Laufband (CSS-Keyframe `bp-ticker-marquee`, Dauer per `--bp-ticker-duration`, default 42 s; respektiert `prefers-reduced-motion`) | ### Utility-Klassen (in `@layer utilities`) - `.pulse-dot` – 1.6 s ease-in-out Animation (Live-Ticker, „heute aktiv"-Badge) - `.tabular-nums` – `font-variant-numeric: tabular-nums` Plus eine globale Regel: ```css [x-cloak] { display: none !important; } /* Alpine.js Init-Schutz */ ``` --- ## 5. Komponenten-Architektur ### 5.1 Layout ``` resources/views/web/layouts/web-master.blade.php └── @yield('content') ``` Das Layout lädt das theme-spezifische CSS via `@vite`. Domain-spezifische Fonts werden nur für `businessportal24` von bunny.net gezogen. ### 5.2 Startseite ``` resources/views/web/businessportal24.blade.php ├── ← TopBar + Header + Nav + Live-Ticker ├──
│ ├── ← „Im Fokus" Hero + Sidebar „Was sonst zählt" │ ├──
1.7fr/1fr Grid │ │ ├── │ │ └──