Kundenportal-Bühne: Terminplaner, Heatmap und Pinnwand als Live-Demos statt „Funktionen“
Die Station „Funktionen“ ist durch drei Stationen ersetzt (Gruppe „Funktionen zum Dazubuchen“). Auf dem MacBook läuft je eine erfundene Kunden-Website als Live-Komponente, auf dem iPhone die Portal-Ansicht der Funktion (echter Portal-Code, Fake-Daten): - Terminplaner (Salon Schnittstelle): Buchung im Widget, Bestätigung per Link, Eintrag im Kalender-Abo, Mitteilung „Neue Buchung …“ auf dem Handy - Website-Analyse (Boulderhalle Überhang): simulierte Klicks bauen die Heatmap auf (Algorithmus wie analytics/client/h.js); Maus über der Seite zeigt Zone + Klickzahl, darunter die Diagnose mit Rangliste und Satz (Beispieldaten) - News-Pinnwand (Ortsgemeinde Musterbach): „Aufhängen“ im Portal, Zettel fällt auf die Pinnwand Demos laden als eigene Chunks, laufen nur bei aktiver, sichtbarer Station und ohne reduzierte Bewegung. Unter 900 px zeigen die Karten die Website in der Handy-Fassung. Spezifikation: docs/superpowers/specs/2026-10-04-funktionen-demos.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c9ad9ba2b7
commit
72275db9fa
39 files changed
+6567
-75
No files matched your search
@@ -5,7 +5,10 @@ Relaunch: verkleinert die Rohexporte der Kundenportal-Screenshots für die Websi
|
||||
docs/relaunch/assets/portal/*.webp (Rohdateien, doppelte Auflösung)
|
||||
-> public/relaunch/portal/<name>-<breite>.webp
|
||||
|
||||
Aufruf (aus dem Projektverzeichnis): python3 scripts/relaunch-bilder.py
|
||||
Aufruf (aus dem Projektverzeichnis): python3 scripts/relaunch-bilder.py [NAME ...]
|
||||
Ohne Argument werden alle Bilder neu geschrieben (alte Ausgaben vorher entfernt). Mit einem oder mehreren NAME-Filtern
|
||||
(Dateiname ohne .webp, auch als Anfang, z. B. "phone-9" oder "phone-10-analyse") entstehen nur die passenden Bilder;
|
||||
alle anderen Dateien in public/relaunch/portal bleiben unangetastet.
|
||||
|
||||
Nur die Bilder, die der Abschnitt "Kundenportal" (Spezifikation 7.2) wirklich zeigt, landen in public/.
|
||||
Format und Budgets laut Spezifikation 9.5:
|
||||
@@ -45,13 +48,15 @@ BILDER = {
|
||||
"desktop-2-fortschritt": ("desktop", (800, 1200, 1600)),
|
||||
"desktop-3b-chat-foto": ("desktop", (800, 1200, 1600)),
|
||||
"desktop-4-rechnungen": ("desktop", (800, 1200, 1600)),
|
||||
"desktop-7-news-pinnwand": ("desktop", (800, 1200, 1600)),
|
||||
# Handy (Roh 804 x 1748 = iPhone 16 Pro @2x, Safe Area 59/34; das lange Bild 804 x 5340, beschnitten auf 5131)
|
||||
"phone-1-projekte": ("handy", (390, 780)),
|
||||
"phone-3-projektdetails": ("handy", (390, 780)),
|
||||
"phone-4b-chat-foto": ("handy", (390, 780)),
|
||||
"phone-5-rechnungen": ("handy", (390, 780)),
|
||||
"phone-8-news-vorschau": ("handy", (390, 780)),
|
||||
# Funktions-Stationen (Spezifikation 2026-10-04-funktionen-demos.md): Handy-Ansicht der Funktion im Kundenportal
|
||||
"phone-9-termine": ("handy", (390, 780)),
|
||||
"phone-10-analyse": ("handy", (390, 780)),
|
||||
"phone-11-news-musterbach": ("handy", (390, 780)),
|
||||
# langer Screenshot: behält sein hohes Seitenverhältnis (eigenes Budget, siehe BUDGET_LANG)
|
||||
"phone-2-projekte-lang": ("handy", (390, 780)),
|
||||
}
|
||||
@@ -68,16 +73,33 @@ def speichern(bild: Image.Image, ziel: Path, budget: int) -> tuple[int, int]:
|
||||
qualitaet -= SCHRITT
|
||||
|
||||
|
||||
def main() -> int:
|
||||
def waehle(filter_: list[str]) -> dict:
|
||||
"""Alle Bilder ohne Filter, sonst die, deren Name genau so heißt oder mit einem Filter beginnt (z. B. "phone-9")."""
|
||||
if not filter_:
|
||||
return BILDER
|
||||
# "phone-1" soll nicht auch "phone-10-analyse" treffen: Anfang nur bis zum nächsten Bindestrich-Segment
|
||||
treffer = {
|
||||
name: wert for name, wert in BILDER.items()
|
||||
if any(name == f or name.startswith(f + "-") for f in filter_)
|
||||
}
|
||||
unbekannt = [f for f in filter_ if not any(n == f or n.startswith(f + "-") for n in BILDER)]
|
||||
if unbekannt:
|
||||
raise SystemExit(f"Unbekannter Bildname: {', '.join(unbekannt)}")
|
||||
return treffer
|
||||
|
||||
|
||||
def main(argv: list[str]) -> int:
|
||||
ZIEL.mkdir(parents=True, exist_ok=True)
|
||||
# alte Ausgaben entfernen, damit nichts Verwaistes liegen bleibt
|
||||
for alt in ZIEL.glob("*.webp"):
|
||||
alt.unlink()
|
||||
bilder = waehle(argv)
|
||||
if not argv:
|
||||
# alte Ausgaben entfernen, damit nichts Verwaistes liegen bleibt (nur bei einem Lauf über alle Bilder)
|
||||
for alt in ZIEL.glob("*.webp"):
|
||||
alt.unlink()
|
||||
|
||||
fehler = 0
|
||||
summe = 0
|
||||
print(f"{'Datei':44} {'Pixel':>11} {'KB':>7} {'Q':>3} Budget")
|
||||
for name, (art, breiten) in BILDER.items():
|
||||
for name, (art, breiten) in bilder.items():
|
||||
quelle = QUELLE / f"{name}.webp"
|
||||
if not quelle.exists():
|
||||
print(f"FEHLT: {quelle}", file=sys.stderr)
|
||||
@@ -106,4 +128,4 @@ def main() -> int:
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
sys.exit(main(sys.argv[1:]))
|
||||
Reference in new issue
Block a user