Files
2026-03-12 07:10:17 -04:00

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,
}
},
},
})