import type { Field } from 'payload' import { validateFaviconField } from '../../../modules/seo/index.js' /** * General site identity fields. * Consumed by SEO/OG (siteName, defaultShareImage) and frontend (logo). */ export const generalFields: Field[] = [ { name: 'siteName', type: 'text', admin: { description: 'Used in page titles and Open Graph metadata.', }, localized: true, required: true, }, { name: 'siteDescription', type: 'textarea', admin: { description: 'Fallback meta description when a page has none. Also used for llms.txt and Open Graph.', }, localized: true, }, { name: 'titleOrder', type: 'select', admin: { description: 'Which comes first in browser tabs.', }, defaultValue: 'page-first', options: [ { label: 'Page first — About Us | Acme', value: 'page-first' }, { label: 'Site first — Acme | About Us', value: 'site-first' }, ], }, { name: 'titleSeparator', type: 'select', admin: { description: 'Separates the page title from the site name in browser tabs.', }, defaultValue: '|', options: [ { label: 'Pipe — Page | Site', value: '|' }, { label: 'Dash — Page – Site', value: '–' }, { label: 'Hyphen — Page - Site', value: '-' }, { label: 'Bullet — Page · Site', value: '·' }, { label: 'Slash — Page / Site', value: '/' }, ], }, { name: 'logo', type: 'upload', admin: { description: 'Primary site logo.', }, relationTo: 'media', }, { name: 'defaultShareImage', type: 'upload', admin: { description: 'Fallback Open Graph image when a page has none.', }, relationTo: 'media', }, { name: 'favicon', type: 'upload', admin: { description: 'Square icon, PNG or SVG, min. 48×48px (Google requires this to show it in search). Rendered via buildIconsMetadata.', }, hooks: { // Warn the editor if the favicon is too small / not square for Google. beforeValidate: [validateFaviconField], }, relationTo: 'media', }, ]