diff --git a/POST-6.md b/POST-6.md new file mode 100644 index 0000000..13860c5 --- /dev/null +++ b/POST-6.md @@ -0,0 +1,156 @@ +# Post 6 · Team-Chat + +Fünfter Beitrag der Produktreihe, Termin **Mi 26.08.** laut Redaktionsplan +(von Mo 24.08. verschoben). Stichwort dort: „Ein Kanal pro Projekt, Foto rein, +Aufgabe raus." + +Hell, Theme `modern`, Punktgrund, Text zentriert — dieselbe Anlage wie Post 4 +und 5. Datei `post6.html`, Stand in `state/post6.json`, erreichbar über das +Projektmenü jeder Seite und über `uebersicht.html`. + +**Vier Slides.** Fünf waren erlaubt; der fünfte Punkt wäre DSGVO und deutsche +Server gewesen, und dafür gibt es keinen Bildschirm. Er steht in der +Bildunterschrift, wo eine Aussage ohne Bild hingehört. + +--- + +## 1. Die vier Slides + +| # | Tag | Überschrift | Was zu sehen ist | +|---|---|---|---| +| 1 | Team-Chat | Büro und Baustelle, **endlich im selben Chat.** | Kanalliste und Verlauf nebeneinander, mit Filterzeile und Eingabefeld | +| 2 | Die Kanäle | Ein Kanal **pro Projekt.** | Die Chatliste groß: Projektkanäle, Direktnachrichten, Gruppe | +| 3 | Die Aufgabe | Foto rein, **Aufgabe raus.** | Baustellenfotos, die Aufgabe daraus, die Bestätigung im Projekt | +| 4 | Das Pluszeichen | Nicht nur **Text.** | Das Menü hinter dem Plus im Eingabefeld | + +**Slide 3 ist der Kern.** Der Redaktionsplan verlangt „Foto rein, Aufgabe +raus", und genau das liegt im Werkzeug als Abfolge vor: Tobias schickt die +Baustellenfotos, darauf folgt eine Nachricht mit angehängter Aufgabe, darauf +eine Systemzeile „Aufgabe „Materialliste prüfen" im Projekt erstellt". Die +letzte Zeile macht den Unterschied: die Aufgabe liegt danach im Projekt und +nicht nur im Verlauf. + +Slide 1 trägt den ganzen Chat, weil sie im Profilraster eine Kachel von rund +150 px ist. Dort ist kein Wort lesbar; was ankommt, sind zwei Spalten mit +Blasen. + +--- + +## 2. Die Bildunterschrift + +``` +Im Handwerk läuft die halbe Baustelle über WhatsApp. Das Foto von letzter Woche findet trotzdem keiner wieder. + +In HiveGrid hat jedes Projekt seinen eigenen Kanal, mit Projektnummer. Daneben stehen Direktnachrichten und Gruppen, aber eben nicht alles in einem Verlauf. + +Ein Foto von der Baustelle geht rein, alle sehen es sofort. Aus „mach das mal“ wird mit einem Klick eine echte Aufgabe: mit Frist, mit Namen, im Projekt. + +Dokument, Sprachnachricht, Kontakt, Termin. Was sonst im Chat-Verlauf verschwindet, hängt hier am Projekt. + +Kundendaten gehören nicht in eine WhatsApp-Gruppe. Bei HiveGrid liegen sie verschlüsselt auf deutschen Servern. + +#handwerk #shk #handwerksbetrieb #digitalisierungimhandwerk #teamchat #baustelle #kommunikation #hivegrid +``` + +| Vorgabe | Ist | +|---|---| +| Haken in den ersten 125 Zeichen | erster Absatz, 110 | +| 300 bis 800 Zeichen | 644 | +| 5 bis 10 Hashtags, unten abgesetzt | 8 | +| Suchwörter zusätzlich im Fließtext | Handwerk, Baustelle, Projekt, Kanal, Aufgabe, Chat, Kontakt, Termin | + +Der letzte Absatz steht **wörtlich** so als Merkmal „DSGVO-konform" in +`lib/produkt-daten.ts` der Website. „Aus „mach das mal" wird mit einem Klick +eine echte Aufgabe" ebenfalls, als Merkmal „Aufgaben-Integration". + +--- + +## 3. Woher die Angaben kommen + +Quelle ist `components/general/GeneralTeamChatPage.tsx` aus dem Pitch-Paket +(*fertig bombo · Kundentermin 30.07.2026*). + +| Was | Woher | +|---|---| +| Alle acht Kanäle: Titel, Vorschau, Zeit, Zuordnung, Nadel, Ungelesen | `CHATS`, wörtlich | +| Der Verlauf: Autoren, Texte, Zeiten, Anhänge | `INITIAL_MESSAGES.waermepumpe`, wörtlich | +| Aufbau einer Listenzeile (drei Zeilen) | die Zeilen 170 bis 172 der Quelle | +| Aufbau einer Nachricht, Anhangkarte, Systemzeile | `MessageBubble` und `AttachmentCard` | +| Sinnbild je Kanalsorte (Koffer, Personen, Kürzel) | `ChatAvatar` | +| Kopfzeile „P-2026-0042 · 8 Mitglieder · aktiv" | `ChatHeader` | +| Filterzeile Alle / Projekte / Direkt / Ungelesen | der Typ `ChatFilter` | +| Das Menü hinter dem Plus, samt Trenner | `Composer` | +| Eingabefeld „Nachricht schreiben …" | derselbe Ort | +| Farben, Ränder, Plättchentöne | `ui/theme.css` | +| Alle Symbole | `@subframe/core`, Pfade aus dem Paket kopiert | +| „Büro und Baustelle, endlich im selben Chat." | Überschrift in `lib/produkt-daten.ts` | + +**Vom Chat gibt es nur eine Fassung.** Anders als bei der Pipeline, die mit +Board, Liste, Detail und Schablone vier eigene SHK-Bildschirme hat, liegt der +Chat allein unter `/allgemein/team-chat`. Die Inhalte darin sind trotzdem aus +dem Gewerk: Wärmepumpe Müller, Montagetermin, Baustellenfotos. + +--- + +## 4. Wo bewusst abgewichen wird + +**Slide 1 zeigt drei von sechs Nachrichten, Slide 2 fünf von acht Kanälen.** +Was nicht ins Bild passt, fällt weg; ein Chat und eine Liste scrollen beide. +Slide 2 behält alle drei Sorten: Projektkanal, Direktnachricht, Gruppe. + +**Die Bildergalerie ist eine Anhangkarte, kein Bild.** Im Werkzeug zeigt +`GalleryPreview` zwei Fotos, geladen von Unsplash. Fremde Fotos in einen +Beitrag zu setzen, der von der eigenen Baustelle spricht, wäre eine Behauptung +über Material, das wir nicht haben. Stattdessen steht dort die Karte +„2 Baustellenfotos · Galerie · heute" — der Text ist der der Quelle. + +--- + +## 5. Stand der Dinge + +| | | +|---|---| +| Slides | 4 | +| Format | 1080 × 1350, Ausgabe zweifach: 2160 × 2700 | +| Luft zwischen Text und Zeichnung | 102 / 61 / 254 / 141 px (Grenze 40) | +| Zeichnung ragt über die Seite | nein, alle innerhalb der 92-px-Schutzzone | +| Breiteste Überschriftzeile | 818 px von 896 | +| Stylesheet vollständig | 214 Regeln, `[data-edit]` vorhanden | +| Konsole | keine Fehler | +| Ausgabeweg | geprüft, `01-chat-hell.png` bis `04-menue-hell.png` | + +Geprüft wird mit den Hilfsskripten aus dem Sitzungsordner: `pruef.mjs` misst +über `getBBox()` die tatsächlich gezeichnete Fläche je Slide und die Breite +jeder Überschriftzeile, zählt die Regeln im Stylesheet und liest die Konsole +mit; `schuss.mjs` rendert einzelne Slides; `export.mjs` fährt den echten +Ausgabeweg und fängt `/save` ab. + +--- + +## 6. Drei Fallen aus diesem Bau + +**Die Listenzeile hat drei Zeilen, nicht zwei.** Der erste Anlauf setzte Titel +und Vorschau untereinander und schob Nadel und Ungelesen-Punkt rechts neben +die Vorschau. Dort stießen sie an den Text — und die Zuordnung fehlte ganz. +Im Original steht sie als dritte Zeile: `P-2026-0042` links, die Nadel rechts. +Das war nicht nur ein Layoutfehler: der Fließtext behauptete „Jeder Kanal hängt +an seiner Projektnummer", und die Nummer war nirgends zu sehen. + +**Eine feste Obergrenze für die Blasenbreite hat ein Zitat gekürzt.** Für die +Titelslide musste sie klein sein, damit die Unterhaltung neben die Liste passt. +Auf Slide 3 stand deshalb „Materialliste prüfen · fälli…" statt +„… · fällig 31.07.2026". Die Grenze hängt jetzt an der Spalte, in der die Blase +steht. + +**Beinahe hätte ich ein Zitat ohne Grund gekürzt.** Die Website-Überschrift +lautet „Büro und Baustelle, endlich im selben Chat." Ich hatte das „endlich" +gestrichen mit der Begründung, die Zeile laufe sonst über die Schutzzone, und +diese Begründung sogar mit einer Zahl versehen, die ich nicht gemessen hatte. +Nachgemessen sind es 818 px von 896 erlaubten: sie passt. Das Wort ist wieder +drin. Dafür gibt es jetzt `breite.mjs`, das eine Formulierung misst, bevor sie +in die Datei kommt. + +**Das Prüfskript nahm eine leere Slide auf.** `schuss.mjs` stellte für eine +einzelne Slide ein Fenster von 1400 px. Im durchgehenden Blatt liegt Seite 3 +aber bei x = 2160, und `captureBeyondViewport` fing das nicht zuverlässig ab. +Die Bühne steht jetzt immer auf 7000 px. diff --git a/README.md b/README.md index 3ad9035..6481cf5 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ Downloads landen direkt in `~/Downloads`, ohne Browser-Dialog. | Post 3 · Verbinden statt ersetzen | `post3.html` | Einzelbild, Theme `modern`, erscheint 17.08. | | | Post 4 · Workflow-Engine | `post4.html` | Carousel, 4 Slides, Theme `modern`, erscheint 19.08. | [`POST-4.md`](./POST-4.md) | | Post 5 · Projektmanagement | `post5.html` | Carousel, 5 Slides, Theme `modern`, erscheint 21.08. | [`POST-5.md`](./POST-5.md) | +| Post 6 · Team-Chat | `post6.html` | Carousel, 4 Slides, Theme `modern`, erscheint 26.08. | [`POST-6.md`](./POST-6.md) | **Alle Streifen nebeneinander** zeigt `uebersicht.html`, erreichbar über *Projekt → Alle Projekte im Streifen*. Die Seite baut die Slides nicht selbst @@ -211,6 +212,34 @@ daneben, die im Bild nicht zu erkennen waren. Der Rest steht in > `app/(screens)/4b/`, nur anders beschriftet. Die Abwesenheit einer > Zeichenkette beweist die Abwesenheit eines Bildschirms nicht. +**Post 6 zeigt den Team-Chat**, nachgebaut aus `GeneralTeamChatPage` des +Pitch-Pakets. Anders als die Pipeline mit ihren vier eigenen Bildschirmen gibt +es vom Chat nur eine Fassung, unter `/allgemein/team-chat`. Die Inhalte darin +sind trotzdem aus dem Gewerk: Wärmepumpe Müller, Montagetermin, +Baustellenfotos. + +| Slide | Was sie leistet | +|---|---| +| 1 | Kanalliste und Verlauf nebeneinander, mit Filterzeile und Eingabefeld | +| 2 | die Chatliste groß: Projektkanäle, Direktnachrichten, Gruppe | +| 3 | Fotos, die Aufgabe daraus, die Bestätigung im Projekt | +| 4 | das Menü hinter dem Plus im Eingabefeld | + +**Slide 3 ist der Kern**, und sie ist keine Konstruktion: im Werkzeug folgen +die drei Nachrichten genau so aufeinander. Tobias schickt die Baustellenfotos, +darauf eine Nachricht mit angehängter Aufgabe, darauf die Systemzeile +„Aufgabe „Materialliste prüfen" im Projekt erstellt". Die letzte Zeile macht +den Unterschied: die Aufgabe liegt danach im Projekt, nicht nur im Verlauf. + +**Vier Slides, nicht fünf.** Der fünfte Punkt wäre DSGVO und deutsche Server +gewesen. Dafür gibt es keinen Bildschirm, und eine Behauptung ohne Bild gehört +in die Bildunterschrift. + +**Die Bildergalerie ist eine Anhangkarte, kein Bild.** Im Werkzeug lädt +`GalleryPreview` zwei Fotos von Unsplash. Fremde Fotos in einen Beitrag zu +setzen, der von der eigenen Baustelle spricht, wäre eine Behauptung über +Material, das wir nicht haben. + 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 diff --git a/post1.html b/post1.html index ae47bad..6d3ed83 100644 --- a/post1.html +++ b/post1.html @@ -802,6 +802,7 @@ if (location.search.indexOf("nur=streifen") >= 0) +

diff --git a/post2-alt.html b/post2-alt.html index 8b4284e..d97502e 100644 --- a/post2-alt.html +++ b/post2-alt.html @@ -1000,6 +1000,7 @@ if (location.search.indexOf("nur=streifen") >= 0) +

diff --git a/post2.html b/post2.html index de9dad2..6ccd8a3 100644 --- a/post2.html +++ b/post2.html @@ -893,6 +893,7 @@ if (location.search.indexOf("nur=streifen") >= 0) +

diff --git a/post3.html b/post3.html index c33175e..ad8d262 100644 --- a/post3.html +++ b/post3.html @@ -913,6 +913,7 @@ if (location.search.indexOf("nur=streifen") >= 0) +

diff --git a/post4.html b/post4.html index 8e9d984..10d8cc3 100644 --- a/post4.html +++ b/post4.html @@ -941,6 +941,7 @@ if (location.search.indexOf("nur=streifen") >= 0) +

diff --git a/post5.html b/post5.html index efed0e0..f2cd252 100644 --- a/post5.html +++ b/post5.html @@ -941,6 +941,7 @@ if (location.search.indexOf("nur=streifen") >= 0) +

diff --git a/post6.html b/post6.html new file mode 100644 index 0000000..804f100 --- /dev/null +++ b/post6.html @@ -0,0 +1,5450 @@ + + + + + + +PostGrid Post 6 · Team-Chat + + + + + + + +
+ + + +
+
+
+
+
+
+
+
+
+

+
+ + +
+
+ + + +
+
+
+ + +
+ + + + + + diff --git a/state/post6.json b/state/post6.json new file mode 100644 index 0000000..3644b35 --- /dev/null +++ b/state/post6.json @@ -0,0 +1,77 @@ +{ + "bandTon": "orange", + "bgState": [ + { + "bg": "raster", + "int": "dezent" + }, + { + "bg": "raster", + "int": "dezent" + }, + { + "bg": "raster", + "int": "dezent" + }, + { + "bg": "raster", + "int": "dezent" + } + ], + "current": 0, + "deck": [ + { + "ref": "chat", + "werte": {} + }, + { + "ref": "kanaele", + "werte": {} + }, + { + "ref": "aufgabe", + "werte": {} + }, + { + "ref": "menue", + "werte": {} + } + ], + "edits": [ + { + "headline": { + "dy": 3 + } + }, + { + "headline": { + "dy": 3 + } + }, + { + "headline": { + "dy": 3 + } + }, + { + "headline": { + "dy": 3 + } + } + ], + "frameStyle": "chamfer", + "layoutState": [ + "standard", + "standard", + "standard", + "standard" + ], + "rasterAn": "punkte", + "superSample": 2, + "tagOut": "an", + "textMitte": "an", + "tilt": "an", + "v": 7, + "variant": "hell", + "view": "streifen" +} diff --git a/uebersicht.html b/uebersicht.html index c6ff35b..dddf0ab 100644 --- a/uebersicht.html +++ b/uebersicht.html @@ -109,6 +109,7 @@ +
@@ -135,6 +136,7 @@ { datei: "./post3.html", name: "Post 3 · Verbinden statt ersetzen", theme: "modern" }, { datei: "./post4.html", name: "Post 4 · Workflow-Engine", theme: "modern" }, { datei: "./post5.html", name: "Post 5 · Projektmanagement", theme: "modern" }, + { datei: "./post6.html", name: "Post 6 · Team-Chat", theme: "modern" }, ]; const flaeche = document.getElementById("flaeche");