Files
craftvia/src/lib/marketing/pages.ts
T
msolarczekandClaude Opus 5 4815a957b0 Produktseite ausgebaut: Unterseiten und Bildschirmfotos aus der App
Neue öffentliche Routen unter src/app/(marketing): Übersicht /funktionen, sechs Detailseiten
(planung, baustelle, zeiterfassung, berichte, abrechnung, lotse), /sicherheit und /preise,
gemeinsames Gerüst mit Kopf- und Fußzeile.

scripts/marketing-shots.ts nimmt die Bilder direkt aus der laufenden App auf (Playwright über
den installierten Chrome, Session wie im Smoke-Test, ohne Passworteingabe); 14 Aufnahmen in
public/marketing ersetzen die gezeichneten Vorschauen.

Plantafel: „Vorschläge" hängt jetzt als Fußzeile in der Auftragskarte statt frei zwischen zwei
Karten zu stehen (neue Prop footer an OrderCard, Schlüssel unplanned.suggestionsFor).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 13:35:04 +02:00

32 lines
1.4 KiB
TypeScript

/**
* Aufbau der öffentlichen Funktionsseiten (`/funktionen/<slug>`). Texte liegen in
* `messages/<locale>/marketing.json` unter `pages.<slug>`, Bildschirmfotos in `public/marketing/`
* (erzeugt von `scripts/marketing-shots.ts`).
*/
export const FEATURE_SLUGS = ["planung", "baustelle", "zeiterfassung", "berichte", "abrechnung", "lotse"] as const;
export type FeatureSlug = (typeof FEATURE_SLUGS)[number];
export type Shot = { src: string; kind: "desktop" | "mobile" };
export type FeaturePage = {
/** Reihenfolge der Bildschirmfotos; Beschriftungen kommen aus `pages.<slug>.shot<n>` */
shots: Shot[];
points: number;
cards: number;
};
const desktop = (src: string): Shot => ({ src, kind: "desktop" });
const mobile = (src: string): Shot => ({ src, kind: "mobile" });
export const FEATURE_PAGES: Record<FeatureSlug, FeaturePage> = {
planung: { shots: [desktop("plantafel"), desktop("live-lage")], points: 5, cards: 3 },
baustelle: { shots: [mobile("mobil-heute"), mobile("mobil-auftrag")], points: 5, cards: 3 },
zeiterfassung: { shots: [mobile("mobil-zeiten"), desktop("zeitfreigabe")], points: 5, cards: 3 },
berichte: { shots: [desktop("berichte"), desktop("auftrag")], points: 5, cards: 3 },
abrechnung: { shots: [desktop("abrechnung")], points: 5, cards: 3 },
lotse: { shots: [mobile("mobil-lotse")], points: 5, cards: 3 },
};
export const isFeatureSlug = (v: string): v is FeatureSlug => (FEATURE_SLUGS as readonly string[]).includes(v);