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>
32 lines
1.4 KiB
TypeScript
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);
|