diff --git a/README.md b/README.md
index 7d96872..59378b8 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,7 @@ Downloads landen direkt in `~/Downloads`, ohne Browser-Dialog.
| Post 1 · Lösung | `post1.html` | Carousel, Anzahl frei | |
| Post 2 · Die Geschichte | `post2.html` | Carousel, 6 Slides, erscheint 12.08. | [`POST-2.md`](./POST-2.md) |
| Post 2 · Alternative | `post2-alt.html` | Derselbe Beitrag im Theme `modern` | |
+| Post 3 · Verbinden statt ersetzen | `post3.html` | Einzelbild, Theme `modern`, erscheint 17.08. | |
**Alle Streifen nebeneinander** zeigt `uebersicht.html`, erreichbar über
*Projekt → Alle Projekte im Streifen*. Die Seite baut die Slides nicht selbst
@@ -42,6 +43,18 @@ Beide zeigen denselben Beitrag mit denselben Texten.
Die Themes stehen in [`rules.md`](./rules.md) §1a mit ihren Unterschieden.
Wer eine Visualisierung ändert, muss an beide Dateien denken.
+**Post 3 ist ein Einzelbild**, keine Slidefolge: eine Haltung, die man
+durchwischen muss, ist keine. Sein Bild ist das **Wabenfeld der Startseite**,
+nachgebaut aus `HoneycombSection.tsx` — dieselbe Achsrechnung, dieselben
+Zellnummern, dieselbe Belegung, damit es wiedererkennbar bleibt und keine
+Anmutung davon ist. Die vier Waben „In Arbeit" fehlen: auf der Startseite sind
+sie ein Versprechen, im Beitrag wären sie ein Eingeständnis.
+
+Die vierzehn Partner-Marken liegen unter `assets/partner/` und sind, wie alles
+andere hier, aus der Website **gespiegelt statt verlinkt**. Sechs davon sind
+PNG und damit dieselbe Wette wie ein Screenshot (§7 in `rules.md`), deshalb
+prüft der Export sie einzeln nach — `wabenZonen()` in `post3.html`.
+
Der Redaktionsplan für alle weiteren Beiträge liegt in
[`redaktionsplan/`](./redaktionsplan/), gebaut mit `python3 redaktionsplan/bauen.py`.
@@ -169,7 +182,9 @@ Maßstab zurück.
```
assets/
├── brand/ Wortmarke hell/dunkel, G-Marke (SVG + PNG), Wabe, Geerkens
-├── partner/ DATEV, KWP, Google Calendar, Google Drive, MS Outlook, MS Teams
+├── partner/ die 14 Marken des Wabenfelds (DATEV, KWP, pds, Bauhow, Aircall,
+│ Onepage, PandaDoc, Hallo Petra, Claude, OpenAI, Google Drive,
+│ Google Calendar, MS Outlook, MS Teams)
├── mockups/ Geräte-Mockups (Displays ausgeknockt, Screenshot liegt dahinter)
├── screens/ Software-Screenshots
├── eigene/ selbst importierte Bilder
diff --git a/assets/partner/aircall.svg b/assets/partner/aircall.svg
new file mode 100644
index 0000000..3c1df88
--- /dev/null
+++ b/assets/partner/aircall.svg
@@ -0,0 +1,31 @@
+
+
+
diff --git a/assets/partner/bauhow.png b/assets/partner/bauhow.png
new file mode 100644
index 0000000..41ec91b
Binary files /dev/null and b/assets/partner/bauhow.png differ
diff --git a/assets/partner/claude.svg b/assets/partner/claude.svg
new file mode 100644
index 0000000..026cace
--- /dev/null
+++ b/assets/partner/claude.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/partner/hallopetra.png b/assets/partner/hallopetra.png
new file mode 100644
index 0000000..9877950
Binary files /dev/null and b/assets/partner/hallopetra.png differ
diff --git a/assets/partner/onepage.png b/assets/partner/onepage.png
new file mode 100644
index 0000000..5b102cc
Binary files /dev/null and b/assets/partner/onepage.png differ
diff --git a/assets/partner/openai.svg b/assets/partner/openai.svg
new file mode 100644
index 0000000..ac1badc
--- /dev/null
+++ b/assets/partner/openai.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/partner/pandadoc.png b/assets/partner/pandadoc.png
new file mode 100644
index 0000000..ebc95b2
Binary files /dev/null and b/assets/partner/pandadoc.png differ
diff --git a/assets/partner/pds.svg b/assets/partner/pds.svg
new file mode 100644
index 0000000..fea6ee7
--- /dev/null
+++ b/assets/partner/pds.svg
@@ -0,0 +1,30 @@
+
diff --git a/post1.html b/post1.html
index c038b57..f4ae1e1 100644
--- a/post1.html
+++ b/post1.html
@@ -793,6 +793,7 @@ if (location.search.indexOf("nur=streifen") >= 0)
+
+
+
+
+
+
+
diff --git a/rules.md b/rules.md
index 965db94..92f052b 100644
--- a/rules.md
+++ b/rules.md
@@ -1,7 +1,7 @@
# Post-Generator — Regeln & Konventionen
Arbeitsgrundlage für alles, was in diesem Repo an Social-Grafiken entsteht.
-**Stand:** 31.07.2026
+**Stand:** 15.08.2026
Der Generator läuft lokal: `./serve.sh` →
(Post 1, Carousel).
@@ -20,6 +20,7 @@ Alle Marken-Werte stammen aus der Website, nicht aus diesem Repo. Bei Zweifel
| Schrift | `HiveGrid-Website/app/layout.tsx` |
| Badge-Styling | `HiveGrid-Website/components/sections/ScreenshotAccordion.tsx` |
| Feature-Texte | `HiveGrid-Website/app/playground/PlaygroundClient.tsx` → `solutionModules` |
+| Wabenfeld: Geometrie, Zellnummern, Belegung | `HiveGrid-Website/components/landing/HoneycombSection.tsx` |
Die Werte sind hier gespiegelt, weil der Export keine Tailwind-/oklch-Farben
verträgt (siehe §7). Ändert sich die Website, müssen sie **hier nachgezogen
@@ -42,7 +43,7 @@ und Kompositionen der Visualisierungen.
| Theme | Erkennungszeichen | Datei |
|---|---|---|
| `notebook` | Rasterhintergrund, Zeichenblock-Optik, Marker in der Überschrift, handgezogene Formen | `post2.html` |
-| `modern` | Ruhiger Grund ohne Textur, sehr große Überschrift mit einem farbigen Wort, schwebende Karten mit Haarlinie, präzise Formen | `post2-alt.html` |
+| `modern` | Ruhiger Grund ohne Textur, sehr große Überschrift mit einem farbigen Wort, schwebende Karten mit Haarlinie, präzise Formen | `post2-alt.html`, `post3.html` |
Jede Datei trägt oben eine Konstante `THEME`. Sie steuert nichts, sie benennt
nur — die Unterschiede stecken in den CSS-Werten und in den Zeichen-Primitiven.
@@ -255,6 +256,38 @@ Spalten um ¾ der Breite, benachbarte Spalten sitzen eine halbe Reihe versetzt.
Eine Kachel = zwei Spalten breit, eine Reihe hoch. **Die über den Kachelrand
hinausragenden Kopien sind Pflicht** — ohne sie sieht man die Nähte.
+### Wabenfeld
+
+Nicht zu verwechseln mit dem Wabenraster: das ist die Textur im Hintergrund,
+das Wabenfeld ist die **Grafik von der Startseite** — die Marke als Nabe, die
+fremden Programme als Waben darum, verbunden über Stränge. Sie steht in
+`post3.html` als `visWabenfeld()` und ist aus `HoneycombSection.tsx`
+übernommen, nicht nachempfunden:
+
+| | Wert | Warum genau der |
+|---|---|---|
+| Umkreisradius | 62 | alles andere leitet sich davon ab |
+| Flächenfaktor | 0,84 | lässt die Fuge zwischen zwei Waben offen |
+| Achsrechnung | `x = 1,5·R·q`, `y = √3·R·(r + q/2)` | flat-top |
+| Zellnummern | 1 Nabe, 2–7 innerer Ring, 8–19 Deko-Ring, dann das Feld | die Belegung hängt daran |
+| Marken-Größe | sichtbar 56,5 px | Claude und OpenAI sind die Eichmarken |
+
+**Die Zellnummern sind die Schnittstelle.** Welche Marke wo sitzt, steht auf
+der Website in `HONEYCOMB_DEFAULT_LOGO_PLACEMENTS` und hier in `WABE_MARKEN`,
+beide über dieselben Nummern. Wer den Ringgang in `wabeRing()` umstellt,
+verschiebt damit stillschweigend jede Marke.
+
+**Eine Marke wird über zwei Zahlen eingepasst**, nicht über eine: die
+Grundfläche ihres Renderpfads (Feld 59,52 px, Deko 50,44 px) mal ihre eigene
+Skalierung. Das Verhältnis 1,18 zwischen beiden Pfaden stammt aus der Website
+und ist der Grund, warum dieselbe sichtbare Größe zwei verschiedene Faktoren
+braucht. Für eine neue Marke gilt: `gr = Grundfläche / Anteil, den die Datei in
+ihrer eigenen Fläche ausfüllt` — eine Datei mit Luft ringsum braucht mehr.
+
+**Die vier Waben „In Arbeit" gehören nicht in einen Beitrag.** Auf der
+Startseite sind sie ein Versprechen, im Feed wären sie ein Eingeständnis. Es
+sind die Zellen 29, 41, 46 und 59, und sie bleiben gewöhnliche leere Waben.
+
---
## 4. Typografie
diff --git a/state/post3.json b/state/post3.json
new file mode 100644
index 0000000..1432018
--- /dev/null
+++ b/state/post3.json
@@ -0,0 +1,39 @@
+{
+ "bandTon": "orange",
+ "bgState": [
+ {
+ "bg": "raster",
+ "int": "dezent"
+ }
+ ],
+ "current": 0,
+ "deck": [
+ {
+ "ref": "verbinden",
+ "werte": {}
+ }
+ ],
+ "edits": [
+ {
+ "body": {
+ "dx": 33
+ },
+ "headline": {
+ "dx": 0,
+ "dy": 0
+ }
+ }
+ ],
+ "frameStyle": "chamfer",
+ "layoutState": [
+ "standard"
+ ],
+ "rasterAn": "aus",
+ "superSample": 2,
+ "tagOut": "an",
+ "textMitte": "an",
+ "tilt": "an",
+ "v": 7,
+ "variant": "hell",
+ "view": "streifen"
+}
diff --git a/uebersicht.html b/uebersicht.html
index f59ab99..917e2b3 100644
--- a/uebersicht.html
+++ b/uebersicht.html
@@ -106,6 +106,7 @@
+
@@ -129,6 +130,7 @@
{ datei: "./post1.html", name: "Post 1 · Lösung" },
{ datei: "./post2.html", name: "Post 2 · Die Geschichte", theme: "notebook" },
{ datei: "./post2-alt.html", name: "Post 2 · Alternative", theme: "modern" },
+ { datei: "./post3.html", name: "Post 3 · Verbinden statt ersetzen", theme: "modern" },
];
const flaeche = document.getElementById("flaeche");
@@ -194,7 +196,11 @@
const offen = reihen.filter(r => r.da).length;
meta.textContent = offen < reihen.length
? "Lade Streifen ... " + offen + " von " + reihen.length
- : reihen.length + " Projekte · " + reihen.map(r => Math.round(r.w / 1080) + " Slides").join(" · ");
+ // Seit Post 3 gibt es Einzelbilder: "1 Slides" stand vorher da.
+ : reihen.length + " Projekte · " + reihen.map(r => {
+ const n = Math.round(r.w / 1080);
+ return n + (n === 1 ? " Slide" : " Slides");
+ }).join(" · ");
}
// Kein Ziehen, kein Rad-Zoom: die Seite scrollt wie eine gewoehnliche Seite.