diff --git a/dev/frontend/hub-flux/PROGRESS.md b/dev/frontend/hub-flux/PROGRESS.md index ee3d93a..694c24c 100644 --- a/dev/frontend/hub-flux/PROGRESS.md +++ b/dev/frontend/hub-flux/PROGRESS.md @@ -5,6 +5,33 @@ --- +## 2026-06-12 · PM-Vorschau-Umbau + Profil-Feinschliff ✅ + +- **Was**: (1) PM-Detailseite (Customer) nach Kevins Review umgebaut: + Status-Workflow direkt unter den Header, farblich abgehoben + (Soft-Hintergrund + 3px-Border je Status: Entwurf hub, Überarbeiten + err, In Prüfung warn, neu: Veröffentlicht ok); danach Pressekontakte + + Status & Verlauf, dann erst Titelbild und Inhalt. Metadaten ergänzt: + Portal, Kategorie, Sprache als Kacheln, Themen (Keywords) als Badges, + Backlink — alles im Verlaufs-Panel. (2) **Inhalts-Typografie**: Die + Detailseiten nutzten `prose`-Klassen, aber das Tailwind-Typography- + Plugin ist gar nicht installiert → Text erschien unformatiert (Diff + Editor vs. Vorschau). Neue Klasse `.pr-content` in hub-components.css + bildet die Editor-Typografie nach (Absätze, Listen, H2-H4, Links, + Blockquote); Customer- UND Admin-Detailseite umgestellt, Lesebreite + max 760px. (3) Profil: Pflicht-Badges an Pflichtfeldern, Fokus-Fix + nach dem Speichern (blur statt Autofokus auf „Anzeigename"), + Submit-Modal-Bestätigungen von rohen Checkboxen auf Flux-Switches + (Alpine-State via change-Event, Button-Freischaltung unverändert). +- **Dateien**: `customer/press-releases/show.blade.php` (Umbau), + `admin/press-releases/show.blade.php` (.pr-content), + `resources/css/shared/hub-components.css` (.pr-content), + `customer/profile.blade.php`, `components/press-release-submit-modal.blade.php`. +- **Build/Test**: Suite 546 passed / 4 skipped, Pint clean, npm run build ok. +- **Offene Fragen**: Web-Detailseiten (`web/release-detail` u. a.) nutzen + ebenfalls wirkungslose `prose`-Klassen — beim Web-Relaunch auf + `.pr-content` (oder Typography-Plugin) umstellen. + ## 2026-06-12 · User-Panel-Restarbeiten (Kevins Liste) ✅ - **Was**: Alle Punkte aus `docs/user-admin/User-Panel-Restarbeiten.md` diff --git a/docs/weiteres/Decision-Update Verlinkung & Backlinks in Pressemitteilungen.md b/docs/weiteres/Decision-Update Verlinkung & Backlinks in Pressemitteilungen.md new file mode 100644 index 0000000..9137bd1 --- /dev/null +++ b/docs/weiteres/Decision-Update Verlinkung & Backlinks in Pressemitteilungen.md @@ -0,0 +1,120 @@ + + +**Version:** Juni 2026 **Datum:** 11.06.2026 **Status:** Abgestimmt – bereit zur Integration ins Konzept-/Decision-Log **Scope:** Behandlung von Links in Presseartikeln, `rel`-Auszeichnung, Linkangabe und Linktyp-Auswahl im Editor, Abgrenzung zum verkauften Dofollow-Backlink. Präzisiert den entsprechenden Punkt im Decision-Update „Preisstruktur & Veröffentlichungs-Flow". + +--- + +## 1. Kontext & Klarstellung + +In der Preis-Abstimmung war der Punkt „verkaufte Dofollow-Backlinks ausgeschlossen" zu pauschal formuliert und konnte als „keine Links" missverstanden werden. Das ist falsch. Links in Presseartikeln gehören selbstverständlich dazu. Die Frage ist nicht _ob_, sondern _wie ausgezeichnet_ und _wie verkauft_. + +Es geht um zwei verschiedene Dinge, die beide „Backlink" heißen: + +1. **Der Link im Presseartikel zur Kundenseite** – normaler, erwarteter Bestandteil jeder PM. Erlaubt, darf hervorgehoben werden. Muss technisch korrekt ausgezeichnet sein. +2. **Den „Dofollow-Backlink für SEO-Wert" als bezahltes Upsell verkaufen** – das ist die Falle und bleibt ausgeschlossen. + +--- + +## 2. Grundregel (Google-konform) + +**Externe Links in Pressemitteilungen werden systemseitig mit `rel="sponsored"` bzw. `rel="nofollow"` ausgezeichnet.** + +Hintergrund: Google behandelt Links in Pressemitteilungen als Kategorie, die nofollow gehört – der Kunde setzt den Link selbst, es ist keine redaktionelle Empfehlung des Portals. Jeder über Bezahlung oder kommerzielle Vereinbarung entstandene Link muss entsprechend qualifiziert sein; eine fehlende Kennzeichnung von Paid-Placements ist selbst der Richtlinienverstoß. Für kombinierte Fälle (bezahlte Platzierung + kein Endorsement) ist `rel="sponsored nofollow"` zulässig. + +**Konsequenz fürs Produkt:** Die `rel`-Auszeichnung ist **nicht kundenseitig wählbar**. Sie wird vom System anhand der Platzierungs-Kategorie automatisch gesetzt. Damit ist die Domain dauerhaft sauber und es gibt keinen Hebel, über den ein Kunde „dofollow" erzwingen könnte. + +--- + +## 3. Wichtig: nofollow ≠ wertlos + +Die alte Logik „nofollow = nutzlos" gilt seit 2019 nicht mehr. Google behandelt `nofollow`/`sponsored`/`ugc` seitdem als **Hinweis**, nicht als absolute Anweisung. Praktischer Wert für den Kunden bleibt: + +- **Referral-Traffic** – direkte Klicks vom Presseartikel auf die Kundenseite +- **Marken-Assoziation & Kontext** – die Nennung selbst zählt +- **AI-/LLM-Sichtbarkeit** – Markennennungen aus Presseartikeln fließen zunehmend in Google AI Overviews und LLM-Antworten ein, wo Sichtbarkeit von Autorität abhängt, nicht nur von klassischen Backlinks + +**Das ist das ehrliche, zukunftsfeste Verkaufsargument:** Sichtbarkeit, Reichweite und Auffindbarkeit – nicht „PageRank kaufen". + +--- + +## 4. Linktypen im Überblick + +|Element|Funktion|`rel` (systemseitig)| +|---|---|---| +|Firmen-Link im PM-Fließtext|Standard, immer möglich|`sponsored` / `nofollow`| +|**Unternehmens-CTA-Box** (Website, Newsroom, Kontakt) am PM-Ende|Hervorhebung, optisch abgesetzt|`sponsored` / `nofollow`| +|Link zur **Landingpage / Produktseite** (extern)|vom Kunden gewählt|`sponsored` / `nofollow`| +|Link zum **Unternehmensprofil auf dem Portal** (intern)|redaktionelle interne Verlinkung|**follow**| + +**Der unterschätzte Punkt – die interne Verlinkung:** Ein follow-Link auf das **portaleigene** Unternehmensprofil ist regelkonform (interner, redaktioneller Link) und stärkt die **eigene** Domain-Architektur. Der Kunde bekommt eine sichtbare „Über das Unternehmen"-Verlinkung; das Portal baut gleichzeitig seine interne Linkstruktur auf, statt fremde Autorität zu verschenken. + +--- + +## 5. Linkangabe & Linktyp-Auswahl im Editor + +**Anforderung:** Beim Erstellen einer PM gibt der Kunde Links an und wählt einen Linktyp. + +**Sauberes Design (Google-konform):** Der Kunde wählt **Ziel und Zweck** des Links – das System leitet daraus die korrekte `rel`-Auszeichnung ab. Die Begriffe „follow/nofollow" tauchen im Kunden-UI **nicht** auf. + +Editor-Flow beim Hinzufügen eines Links: + +1. **Ziel-URL** eingeben +2. **Link-Art** wählen (das ist die kundenseitige „Linktyp"-Auswahl): + +|Link-Art (Auswahl im Editor)|Beispiel|Systemseitige Auszeichnung| +|---|---|---| +|Unternehmens-Website|startseite.de|extern → `sponsored`/`nofollow`| +|Spezifische Landingpage / Produktseite|aktion.startseite.de|extern → `sponsored`/`nofollow`| +|Newsroom / Unternehmensprofil auf dem Portal|(interner Profil-Link)|intern → `follow`| +|Kontakt / Social-Profil|LinkedIn etc.|extern → `sponsored`/`nofollow`| + +3. **Darstellung** (optional, ggf. tarif-/boost-abhängig): Inline-Textlink **oder** hervorgehobene CTA-Box. Das betrifft die _Präsentation_, nicht den Link-Typ. + +**Entscheidung festgehalten:** Die Linktyp-Auswahl steuert **Ziel und Darstellung**, nie das `rel`-Attribut. Das `rel` ist systemgesteuert. Damit hat der Kunde maximale Freiheit bei Ziel und Hervorhebung, ohne dass die Domain-Sicherheit kippt. + +--- + +## 6. Was Produkt ist – und was tabu bleibt + +||Status| +|---|---| +|Links in der PM (extern, korrekt ausgezeichnet)|✅ Standard, kostenlos Teil der Veröffentlichung| +|Hervorgehobene CTA-Box / Linkdarstellung|✅ als Hervorhebungs-/Boost-Feature verkaufbar| +|follow-Link auf portaleigenes Unternehmensprofil|✅ regelkonform, stärkt eigene Domain| +|Sichtbarkeit / Reichweite / Platzierung|✅ das eigentliche Verkaufsargument| +|„Dofollow-Backlink" als bezahltes Upsell|❌ Link-Scheme-Verstoß, Domain-Risiko, gegen Anti-Zombie| +|Kundenseitiger follow/nofollow-Schalter|❌ nicht im UI, `rel` bleibt systemgesteuert| + +--- + +## 7. Anti-Zombie-Check (dieser Stand) + +- ✅ Keine versteckten SEO-Versprechen – verkauft wird Sichtbarkeit, nicht PageRank +- ✅ Domain-Glaubwürdigkeit langfristig geschützt (korrekte `rel`-Auszeichnung systemseitig) +- ✅ Kunde behält volle Freiheit bei Linkziel und Hervorhebung +- ✅ Regelkonform gegenüber Google-Spam-Richtlinien, kein Graubereich +- ✅ Interne Verlinkung baut eigenes Asset statt fremde Autorität zu verschenken + +--- + +## 8. Offene / spätere Punkte + +- **Darstellungs-Stufung:** Soll die hervorgehobene CTA-Box ein eigenes Boost-/Tarif-Feature sein oder Standard? (Hängt am Boost-Konzept.) +- **Anzahl Links pro PM:** Sinnvolle Obergrenze definieren (gegen Link-Spam in der PM selbst, z. B. Profil + Website + 1–2 Kontextlinks). +- **Anchor-Text-Regeln:** Optional späterer Hinweis/Soft-Check gegen übermäßige Exact-Match-Anchors (Spam-Signal), eher Phase 2. + +--- + +## 9. Korrektur am vorherigen Decision-Update + +Im Dokument „Preisstruktur & Veröffentlichungs-Flow", Abschnitt 4, wird der Eintrag + +> „Bewusst ausgeschlossen: Verkaufte Dofollow-Backlinks." + +ersetzt durch: + +> „Verlinkung: Links zur Kundenseite sind Standard-Bestandteil jeder PM, systemseitig als `sponsored`/`nofollow` ausgezeichnet. Hervorhebung der Linkdarstellung ist als Produkt-Feature möglich. **Tabu:** Verkauf von Dofollow-Backlinks und kundenseitige `rel`-Auswahl. Details siehe Decision-Update „Verlinkung & Backlinks"." + +--- + +_SEO-/Richtlinien-Stand: Google-Spam-Policies inkl. Link-Spam-Enforcement 2024–2026; `nofollow`/`sponsored`/`ugc` als Hinweise seit September 2019. Vor produktiver Umsetzung der `rel`-Logik einmal gegen die dann aktuelle Google-Search-Central-Doku gegenprüfen._ \ No newline at end of file diff --git a/resources/css/shared/hub-components.css b/resources/css/shared/hub-components.css index 012b775..675022d 100644 --- a/resources/css/shared/hub-components.css +++ b/resources/css/shared/hub-components.css @@ -81,6 +81,87 @@ flex-wrap: wrap; } + /* ============================================================ + * PM-Inhalt (gerenderter Editor-HTML in Vorschau/Detail) + * + * Die Detailseiten nutzten `prose`-Klassen, aber das + * Tailwind-Typography-Plugin ist nicht installiert — der Text + * erschien deshalb unformatiert. Diese Klasse bildet die + * Editor-Typografie nach (Absätze, Listen, Zwischenüberschriften, + * Links), ohne eine neue Abhängigkeit einzuführen. + * ============================================================ */ + + .pr-content { + font-size: 14.5px; + line-height: 1.7; + color: var(--color-ink); + } + .pr-content p { + margin: 0 0 1em; + } + .pr-content p:last-child { + margin-bottom: 0; + } + .pr-content h2, + .pr-content h3, + .pr-content h4 { + color: var(--color-ink); + font-weight: 700; + letter-spacing: -0.2px; + line-height: 1.3; + margin: 1.6em 0 0.6em; + } + .pr-content h2 { + font-size: 19px; + } + .pr-content h3 { + font-size: 16.5px; + } + .pr-content h4 { + font-size: 15px; + } + .pr-content h2:first-child, + .pr-content h3:first-child, + .pr-content h4:first-child { + margin-top: 0; + } + .pr-content ul, + .pr-content ol { + margin: 0 0 1em; + padding-inline-start: 1.4em; + } + .pr-content ul { + list-style: disc; + } + .pr-content ol { + list-style: decimal; + } + .pr-content li { + margin: 0.3em 0; + } + .pr-content a { + color: var(--color-hub); + text-decoration: underline; + text-underline-offset: 2px; + } + .pr-content strong, + .pr-content b { + font-weight: 700; + color: var(--color-ink); + } + .pr-content blockquote { + margin: 1em 0; + padding: 0.2em 0 0.2em 1em; + border-left: 3px solid var(--color-hub-soft-2); + color: var(--color-ink-2); + font-style: italic; + } + .pr-content hr { + margin: 1.5em 0; + border: 0; + border-top: 1px solid var(--color-bg-rule); + } + /* ============================================================ * Stat-Cards (KPI-Karten mit farbigem Strip links) * ============================================================ */ diff --git a/resources/views/livewire/admin/press-releases/show.blade.php b/resources/views/livewire/admin/press-releases/show.blade.php index 75aff68..b51014f 100644 --- a/resources/views/livewire/admin/press-releases/show.blade.php +++ b/resources/views/livewire/admin/press-releases/show.blade.php @@ -467,7 +467,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends {{ __('Inhalt') }}
+ {{ __('Diese Pressemitteilung ist veröffentlicht (seit :date).', ['date' => $pr->published_at?->format('d.m.Y H:i') ?? '–']) }} +
+- {{ __('Stichwörter') }}: - {{ $pr->keywords }} -
- @endif - @if ($pr->backlink_url) -- {{ __('Backlink') }}: - - {{ $pr->backlink_url }} - -
- @endif -