# Entwicklungskonzept – BusinessPortal24, Presseecho & presseportale-Hub Frontend > **Stand:** 13. Mai 2026 > **Domains:** `businessportal24.test` / `.com` · `presseecho.test` / `.de` · `presseportale.test` / `.com` (Hub) > **Theme-Slugs:** `businessportal24` (warm-rotes Editorial) · `presseecho` (grünes Editorial) · `presseportale` (Hub-Blau · Publisher-Landing) > **Assets-Dir (geteilt):** `public/build/web/` > **Ziel:** Editoriales DACH-Pressemitteilungs-Ökosystem mit 1:1-Mockup-Umsetzung. Presseecho nutzt die **gleiche Komponenten-Architektur** wie BP24, der Hub `presseportale.com` ist eine **eigenständige Publisher-Landing** mit klar abgegrenztem Charakter (Hub-Blau + Bernstein, kein Editorial-Feed). Dieses Dokument beschreibt den aktuellen Stand und die wichtigsten Architektur­entscheidungen der BusinessPortal24-, Presseecho- und presseportale-Hub-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. Presseecho übernimmt **dieselbe Architektur**, tauscht aber das Surface auf grünlich-getintetes Editorial-Off-White und ersetzt die warm-rote Akzentfarbe durch ein dunkles **Forest-Green** (Brand `#345636`). Die Editorial-Akzentfarbe für Eyebrows auf dunklem Grund bleibt warm-amber (`accent-warm: #e8a95f`) – das hat sich in der Iteration als beste Lesbarkeit auf den dunklen Forest-Panels bewährt. | 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|presseportale` als Query-Parameter > **Hub-Sonderfall (`presseportale.test`):** Diese Domain ist gleichzeitig **Admin-Backend** (Auth/Admin/Customer-Routen, theme = `main`, Build-Dir `build/portal/`) **und** öffentliche **Hub-Landing** (theme = `presseportale`, Build-Dir `build/web/`). In `config/domains.php` existieren beide Einträge (`portal` und `presseportale`) für dieselbe `domain_name`. Der `ThemeServiceProvider` matcht zuerst `portal` (Backend-Standard); für die öffentliche Landing schaltet **`routes/web.php` per `$applyWebDomainConfig('presseportale')` explizit auf das Hub-Theme** um. Auth- und Admin-Routen bleiben unbeeinflusst. ### 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.1.1 Presseecho-Farbpalette (Stand 13.05.2026, finalisiert) Damit das Theme für Presseecho dokumentiert ist, hier der **verbindliche Token-Snapshot** aus `theme-presseecho.css`: ```css @theme { /* Surfaces (grünlich-getintete Editorial-Vorlage) */ --color-bg: #f2f4ed; --color-bg-elev: #fafbf7; --color-bg-rule: #dde2d3; --color-bg-rule-strong: #1b2417; --color-bg-card-warm: #ecefe3; --color-bg-card-warm-border: #c7cfb6; /* Dunkle Editorial-Panels (Topbar, CTA, Newsletter, Footer) */ --color-topbar: #1a3d2e; /* linear-gradient(135deg, #1a3d2e 0%, #122d22 100%) */ --color-topbar2: #122d22; /* Ink (warm-grün, gedämpft) */ --color-ink: #1b2417; --color-ink-2: #324132; --color-ink-3: #6a7766; --color-ink-4: #98a294; --color-ink-on-dark: #f0f4eb; --color-ink-on-dark-2: #b1b9ab; /* Brand: dunkles Forest-Green */ --color-brand: #345636; --color-brand-deep: #243c25; --color-brand-soft: #dbe7d3; /* Editorial-Akzente */ --color-accent-warm: #e8a95f; /* warmer Bernstein für Eyebrows auf Dunkel */ --color-ink-on-dark-muted: #859485; --color-ink-on-dark-rule: #28332b; --color-bg-card-warm-hover: #dde3cc; --color-bg-card-warm-rule: #b7c0a2; --color-card-warm-cat: #5f6a52; --color-card-warm-title: #2e3826; --color-feature-line: #a8c8a8; --color-feature-dot: #c4dcc4; } /* Gradient-Komponenten-Klassen */ .bg-feature-grad { background-image: linear-gradient(135deg, #2c4733, #15281c); } .bg-hero-grad { background-image: linear-gradient(135deg, #2c4733, #1a2a1f); } ``` **Iteration des Topbar-Gradients:** | Versuch | Werte | Bewertung | | --- | --- | --- | | Startwert | `#1b2a1f → #25342a` | zu dunkel/zu neutral | | Erste Variante | `#1f4d3a → #163a2c` | **zu hell** | | **Final** | **`#1a3d2e → #122d22`** | **abgenommen** ✅ | ### 3.1.2 presseportale-Hub-Palette (Stand 13.05.2026) Der **Hub** ist bewusst eigenständig positioniert: er ist **kein Editorial-Feed**, sondern eine reine Publisher-Landing („Ein Konto – zwei Reichweiten"). Er bekommt daher einen ganz eigenen Charakter: * **Surface:** warmes Buchpapier wie bei BP24/Presseecho (`--color-bg: #f6f4ef`) – signalisiert Familien-Zugehörigkeit. * **Primary:** Hub-Blau `#1A2540` mit Gradient nach `#243152` (Topbar, CTAs, alle „Hub"-Akzente). * **Akzent:** gedecktes Bernstein `#B07A3A` – **bewusst gewählt**, weil weder Orange (BP24) noch Grün (Presseecho). Der Hub steht visuell „zwischen" den beiden Brands. * **Schrift:** Inter Tight (Standardtext) + JetBrains Mono (Mono) + Source Serif 4 (**nur für Marken-Mentions** der Tochter-Portale, damit typografische Konsistenz zur jeweiligen Brand-Landing erhalten bleibt; im Hub-Fließtext nicht verwendet). Token-Snapshot aus `resources/css/web/theme-presseportale.css`: ```css @theme { /* Surfaces – gleiche Familie wie BP24/Presseecho */ --color-bg: #f6f4ef; --color-bg-elev: #fbfaf6; --color-bg-rule: #e2ddd0; --color-bg-card: #ffffff; --color-bg-card-warm: #efeadc; /* Hub-Blau – Primary */ --color-hub: #1a2540; --color-hub-2: #243152; --color-hub-3: #2e3d66; --color-hub-soft: #e5e9f1; --color-hub-soft-2: #cfd6e4; --color-hub-line: #7b8fbf; --color-topbar: #1a2540; --color-topbar2: #243152; /* Bernstein-Akzent – bewusst NICHT BP24-Orange, NICHT Presseecho-Grün */ --color-accent: #b07a3a; --color-accent-deep: #8a5e27; --color-accent-soft: #f1e6d3; /* Ink, Brand-Aliase (für Komponenten, die brand-Tokens nutzen) */ --color-brand: #1a2540; --color-brand-deep: #0f1729; --color-brand-soft: #e5e9f1; /* Schrift: Inter Tight + JetBrains Mono für Hub-Inhalte, Source Serif 4 wird mitgeladen, aber nur für Marken-Mentions per aktiviert. */ --font-sans: "Inter Tight", 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; } ``` Hub-spezifische **Komponenten-Klassen** (alle in `@layer components`): * `.bg-hub-grad` → 135° `#1a2540 → #243152` (Topbar, CTA, Architektur-Knoten) * `.bg-hub-grad-2` → 180° `#1a2540 → #0f1729` (Footer) * `.bg-accent-grad` → 135° `#b07a3a → #8a5e27` * `.hero-grid` → subtile 48×48 px Gitterlinien als Hero-Hintergrund * `.section-eyebrow` → Hub-Blau-Eyebrow mit Linien-Schwanz * `.ribbon-recommend` → „Empfohlen für Unternehmen"-Banner auf der Pro-Tarif-Karte * `.faq-chev` + `details > summary` → CSS-only Accordion (kein JS nötig) ### 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). `name` + `accent` ergeben **zusammen** den vollständigen Markennamen – der `accent`-Teil wird im Header/Footer farbig hervorgehoben: ```php 'presseecho' => [ 'theme' => 'presseecho', 'brand' => [ 'name' => 'presse', // schwarz 'accent' => 'echo', // grün (text-brand → #345636) 'tagline_short' => 'Pressemitteilungen · DACH', 'tagline_long' => 'Fachmeldungen aus Wirtschaft und Industrie ...', 'footer_legal' => '© :year presseecho · Alle Rechte vorbehalten', 'about_label' => 'Über presseecho', 'meta_title' => '... – presseecho', 'meta_description' => '...', 'newsletter_topics' => [ ... ], ], ], 'businessportal24' => [ 'theme' => 'businessportal24', 'brand' => [ 'name' => 'businessportal', // schwarz 'accent' => '24', // orange (text-brand → #C84A1E) 'footer_legal' => '© :year businessportal24 · Alle Rechte vorbehalten', ... ], ], 'presseportale' => [ // Hub-Variante (web) 'theme' => 'presseportale', 'brand' => [ 'name' => 'presse', // hub-blau 'accent' => 'portale', // bernstein 'footer_legal' => '© :year presseportale · Alle Rechte vorbehalten', ... ], ], ``` Komponenten (`site-header`, `site-footer`, `newsletter-strip`) lesen ihre Defaults aus `config('domains.domains.'.config('app.theme').'.brand', [...])`. Übergaben via `:brand="..."` überschreiben sie jederzeit. ### 3.3 Brand-Mark-Konvention (verbindlich, Stand 13.05.2026) Die Schreibweise der drei Marken folgt einer einheitlichen Regel: **keine TLD-Endung am Markennamen, Akzentteil farblich hervorgehoben.** Domains (`.de`, `.com`) gehören ausschließlich in technische Felder (URLs, mailto-Adressen, Impressum) – niemals in den Marken-Schriftzug. | Marke | Wortmarke | Akzentfarbe (auto) | Akzentfarbe (on-dark) | | ------------------ | ------------------------------------------ | ---------------------- | --------------------- | | `presseecho` | **presse**·*echo* | `#345636` (Forest) | `#9BD5B2` | | `businessportal24` | **businessportal**·*24* | `#C84A1E` (Orange) | `#F4B098` | | `presseportale` | **presse**·*portale* | `#B07A3A` (Bernstein) | `#B07A3A` | **Single Source of Truth:** Die Komponente `` rendert die Markenschreibung zentral inkl. Span-Splitting, Schriftart und Akzent­farbe. Sie wird überall verwendet, wo eine Marke als Fließtext-Mention erscheint: * Hub-Komponenten (`hub/top-utility-bar`, `hub/site-header`, `hub/site-footer`, `hub/brand-context-banner`) * Hub-View `presseportale.blade.php` (Hero-Headline, Architektur-Diagramm, Tarif-Subline, Plattform-Familie, FAQ) * Cross-Brand-Mentions auf BP24-/Presseecho-Landings, falls ergänzt ```blade {{-- Standard: font-serif (Source Serif 4), Auto-Akzent --}} {{-- In Fließtext / kleinen Schrift­größen: font-sans (Inter Tight) --}} {{-- Auf dunklem Hintergrund (Topbar, Hub-Footer): hellere Akzentfarbe --}} ``` Die BP24-/Presseecho-Header und -Footer rendern ihren eigenen Markennamen weiterhin über das `$brandName`+`$brandAccent`-Pattern aus der `brand`-Config (die Config liefert dasselbe Splitting `presse`+`echo`), erscheinen also typografisch identisch. --- ## 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 │ │ ├── │ │ └──