85 lines
2.1 KiB
TypeScript
85 lines
2.1 KiB
TypeScript
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',
|
||
},
|
||
]
|