import type { Field } from "payload"; /** * Reusable, always-optional SEO field group — added to every public-facing * collection/global. Never required: every consumer falls back to a * sensible, automatically derived value when a field is left empty (see * lib/seo/resolve.ts), per the "SEO fields are optional with fallbacks" * requirement. */ export function seoFields(): Field { return { type: "collapsible", label: "SEO", admin: { description: "Optional — wird automatisch aus dem Inhalt abgeleitet, wenn hier nichts eingetragen ist.", }, fields: [ { name: "seo", type: "group", label: "", fields: [ { name: "title", type: "text", label: "SEO Title", maxLength: 70, admin: { description: "Falls leer: automatisch aus dem Seitentitel erzeugt." }, }, { name: "description", type: "textarea", label: "Meta Description", maxLength: 300, admin: { description: "Falls leer: automatisch aus dem Inhalt erzeugt (erste ~160 Zeichen)." }, }, { name: "keywords", type: "text", label: "SEO Keywords (optional, kommagetrennt)", }, { name: "ogImage", type: "upload", relationTo: "media", label: "Open Graph Bild", admin: { description: "Falls leer: Hauptbild dieser Seite bzw. das Standard-Social-Bild aus den SEO-Einstellungen." }, }, ], }, ], }; }