156 lines
4.6 KiB
TypeScript
156 lines
4.6 KiB
TypeScript
import { config, fields, collection, singleton } from '@keystatic/core';
|
|
|
|
export default config({
|
|
storage: {
|
|
kind: 'local',
|
|
},
|
|
|
|
singletons: {
|
|
homepage: singleton({
|
|
label: 'Homepage',
|
|
path: 'src/content/homepage',
|
|
schema: {
|
|
heroSubtitle: fields.text({
|
|
label: 'Hero Subtitle',
|
|
description: 'Text before the rotating research areas',
|
|
}),
|
|
bannerText: fields.text({
|
|
label: 'Banner Text',
|
|
description: 'Top banner announcement text',
|
|
}),
|
|
bannerLink: fields.text({
|
|
label: 'Banner Link',
|
|
description: 'URL for the banner CTA',
|
|
}),
|
|
},
|
|
}),
|
|
},
|
|
|
|
collections: {
|
|
announcements: collection({
|
|
label: 'Announcements',
|
|
slugField: 'title',
|
|
path: 'src/content/announcements/*',
|
|
format: { contentField: 'content' },
|
|
schema: {
|
|
title: fields.slug({ name: { label: 'Title' } }),
|
|
type: fields.select({
|
|
label: 'Type',
|
|
options: [
|
|
{ label: 'Deadline', value: 'deadline' },
|
|
{ label: 'Seminar', value: 'seminar' },
|
|
{ label: 'News', value: 'news' },
|
|
],
|
|
defaultValue: 'news',
|
|
}),
|
|
date: fields.date({ label: 'Date' }),
|
|
description: fields.text({
|
|
label: 'Short Description',
|
|
multiline: true,
|
|
}),
|
|
link: fields.text({ label: 'Link URL' }),
|
|
content: fields.markdoc({ label: 'Content' }),
|
|
},
|
|
}),
|
|
|
|
seminars: collection({
|
|
label: 'Seminars',
|
|
slugField: 'title',
|
|
path: 'src/content/seminars/*',
|
|
format: { contentField: 'content' },
|
|
schema: {
|
|
title: fields.slug({ name: { label: 'Title' } }),
|
|
speaker: fields.text({ label: 'Speaker' }),
|
|
date: fields.date({ label: 'Date' }),
|
|
time: fields.text({ label: 'Time' }),
|
|
venue: fields.text({ label: 'Venue' }),
|
|
status: fields.select({
|
|
label: 'Status',
|
|
options: [
|
|
{ label: 'Upcoming', value: 'upcoming' },
|
|
{ label: 'Past', value: 'past' },
|
|
],
|
|
defaultValue: 'upcoming',
|
|
}),
|
|
content: fields.markdoc({ label: 'Abstract / Details' }),
|
|
},
|
|
}),
|
|
|
|
news: collection({
|
|
label: 'News',
|
|
slugField: 'title',
|
|
path: 'src/content/news/*',
|
|
format: { contentField: 'content' },
|
|
schema: {
|
|
title: fields.slug({ name: { label: 'Title' } }),
|
|
date: fields.date({ label: 'Date' }),
|
|
category: fields.select({
|
|
label: 'Category',
|
|
options: [
|
|
{ label: 'Award', value: 'award' },
|
|
{ label: 'Recognition', value: 'recognition' },
|
|
{ label: 'Student Achievement', value: 'student' },
|
|
{ label: 'Grant', value: 'grant' },
|
|
{ label: 'General', value: 'general' },
|
|
],
|
|
defaultValue: 'general',
|
|
}),
|
|
description: fields.text({
|
|
label: 'Short Description',
|
|
multiline: true,
|
|
}),
|
|
content: fields.markdoc({ label: 'Content' }),
|
|
},
|
|
}),
|
|
|
|
blog: collection({
|
|
label: 'Blog Posts',
|
|
slugField: 'title',
|
|
path: 'src/content/blog-posts/*',
|
|
format: { contentField: 'content' },
|
|
schema: {
|
|
title: fields.slug({ name: { label: 'Title' } }),
|
|
date: fields.date({ label: 'Date' }),
|
|
author: fields.text({ label: 'Author' }),
|
|
description: fields.text({
|
|
label: 'Description',
|
|
multiline: true,
|
|
}),
|
|
coverImage: fields.image({
|
|
label: 'Cover Image',
|
|
directory: 'public/images/blog',
|
|
publicPath: '/images/blog',
|
|
}),
|
|
content: fields.markdoc({ label: 'Content' }),
|
|
},
|
|
}),
|
|
|
|
events: collection({
|
|
label: 'Events',
|
|
slugField: 'title',
|
|
path: 'src/content/events/*',
|
|
format: { contentField: 'content' },
|
|
schema: {
|
|
title: fields.slug({ name: { label: 'Title' } }),
|
|
date: fields.date({ label: 'Date' }),
|
|
endDate: fields.date({ label: 'End Date (optional)' }),
|
|
type: fields.select({
|
|
label: 'Type',
|
|
options: [
|
|
{ label: 'Workshop', value: 'workshop' },
|
|
{ label: 'Conference', value: 'conference' },
|
|
{ label: 'School', value: 'school' },
|
|
{ label: 'Outreach', value: 'outreach' },
|
|
{ label: 'Other', value: 'other' },
|
|
],
|
|
defaultValue: 'other',
|
|
}),
|
|
description: fields.text({
|
|
label: 'Description',
|
|
multiline: true,
|
|
}),
|
|
content: fields.markdoc({ label: 'Content' }),
|
|
},
|
|
}),
|
|
},
|
|
});
|