119 lines
2.8 KiB
TypeScript
119 lines
2.8 KiB
TypeScript
import {defineField, defineType} from 'sanity'
|
|
|
|
export default defineType({
|
|
name: 'post',
|
|
title: 'Post',
|
|
type: 'document',
|
|
fields: [
|
|
defineField({
|
|
name: 'title',
|
|
title: 'Title',
|
|
type: 'string',
|
|
validation: (Rule) => Rule.required().max(100),
|
|
}),
|
|
defineField({
|
|
name: 'slug',
|
|
title: 'Slug',
|
|
type: 'slug',
|
|
options: {source: 'title', maxLength: 96},
|
|
validation: (Rule) => Rule.required(),
|
|
}),
|
|
defineField({
|
|
name: 'author',
|
|
title: 'Author',
|
|
type: 'reference',
|
|
to: [{type: 'author'}],
|
|
}),
|
|
defineField({
|
|
name: 'mainImage',
|
|
title: 'Main Image',
|
|
type: 'image',
|
|
options: {hotspot: true},
|
|
fields: [
|
|
defineField({
|
|
name: 'alt',
|
|
title: 'Alt Text',
|
|
type: 'string',
|
|
description: 'Describe the image for screen readers and SEO.',
|
|
}),
|
|
],
|
|
}),
|
|
defineField({
|
|
name: 'publishedAt',
|
|
title: 'Published At',
|
|
type: 'datetime',
|
|
initialValue: () => new Date().toISOString(),
|
|
}),
|
|
defineField({
|
|
name: 'excerpt',
|
|
title: 'Excerpt',
|
|
type: 'text',
|
|
rows: 3,
|
|
description: 'Short summary shown in listings and used as meta description (~160 chars).',
|
|
validation: (Rule) => Rule.max(200),
|
|
}),
|
|
defineField({
|
|
name: 'body',
|
|
title: 'Body',
|
|
type: 'array',
|
|
of: [
|
|
{type: 'block'},
|
|
{
|
|
type: 'image',
|
|
options: {hotspot: true},
|
|
fields: [
|
|
defineField({
|
|
name: 'alt',
|
|
title: 'Alt Text',
|
|
type: 'string',
|
|
}),
|
|
defineField({
|
|
name: 'caption',
|
|
title: 'Caption',
|
|
type: 'string',
|
|
}),
|
|
],
|
|
},
|
|
],
|
|
}),
|
|
defineField({
|
|
name: 'seoTitle',
|
|
title: 'SEO Title',
|
|
type: 'string',
|
|
description: 'Overrides page title in <head>. Leave blank to use post title.',
|
|
validation: (Rule) => Rule.max(70),
|
|
}),
|
|
defineField({
|
|
name: 'seoDescription',
|
|
title: 'SEO Description',
|
|
type: 'text',
|
|
rows: 2,
|
|
description: 'Overrides excerpt in <meta description>. Leave blank to use excerpt.',
|
|
validation: (Rule) => Rule.max(160),
|
|
}),
|
|
],
|
|
orderings: [
|
|
{
|
|
title: 'Published Date, Newest',
|
|
name: 'publishedAtDesc',
|
|
by: [{field: 'publishedAt', direction: 'desc'}],
|
|
},
|
|
],
|
|
preview: {
|
|
select: {
|
|
title: 'title',
|
|
author: 'author.name',
|
|
media: 'mainImage',
|
|
publishedAt: 'publishedAt',
|
|
},
|
|
prepare({title, author, media, publishedAt}) {
|
|
const date = publishedAt ? new Date(publishedAt).toLocaleDateString() : 'Draft'
|
|
return {
|
|
title,
|
|
subtitle: `${author ?? 'No author'} · ${date}`,
|
|
media,
|
|
}
|
|
},
|
|
},
|
|
})
|