This commit is contained in:
Vendored
+2
@@ -0,0 +1,2 @@
|
||||
/// <reference types="astro/client" />
|
||||
/// <reference types="@sanity/astro/module" />
|
||||
@@ -0,0 +1 @@
|
||||
export { sanityClient } from 'sanity:client'
|
||||
@@ -0,0 +1,11 @@
|
||||
import { createImageUrlBuilder } from '@sanity/image-url'
|
||||
|
||||
const builder = createImageUrlBuilder({
|
||||
projectId: import.meta.env.PUBLIC_SANITY_PROJECT_ID,
|
||||
dataset: import.meta.env.PUBLIC_SANITY_DATASET ?? 'production',
|
||||
})
|
||||
|
||||
export function urlFor(source: any): string {
|
||||
if (!source) return ''
|
||||
return builder.image(source).url()
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
import { toHTML } from '@portabletext/to-html'
|
||||
|
||||
export function renderPortableText(blocks: any[]): string {
|
||||
if (!blocks?.length) return ''
|
||||
return toHTML(blocks)
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
export const theaterHomepageQuery = `*[_type == "theaterHomepage" && _id == "theaterHomepage"][0]`
|
||||
|
||||
export const allPostsQuery = `
|
||||
*[_type == "post"] | order(date desc) {
|
||||
_id,
|
||||
title,
|
||||
"slug": slug.current,
|
||||
date,
|
||||
excerpt,
|
||||
coverImage,
|
||||
body
|
||||
}
|
||||
`
|
||||
|
||||
export const postBySlugQuery = `
|
||||
*[_type == "post" && slug.current == $slug][0] {
|
||||
_id,
|
||||
title,
|
||||
"slug": slug.current,
|
||||
date,
|
||||
excerpt,
|
||||
coverImage,
|
||||
body
|
||||
}
|
||||
`
|
||||
|
||||
export const pageBySlugQuery = `
|
||||
*[_type == "page" && slug.current == $slug][0] {
|
||||
_id,
|
||||
title,
|
||||
description,
|
||||
body
|
||||
}
|
||||
`
|
||||
@@ -0,0 +1,5 @@
|
||||
import { postSchema } from './post'
|
||||
import { pageSchema } from './page'
|
||||
import { theaterHomepageSchema } from './theaterHomepage'
|
||||
|
||||
export const schemaTypes = [postSchema, pageSchema, theaterHomepageSchema]
|
||||
@@ -0,0 +1,33 @@
|
||||
import { defineType, defineField } from 'sanity'
|
||||
|
||||
export const pageSchema = defineType({
|
||||
name: 'page',
|
||||
title: 'Pages',
|
||||
type: 'document',
|
||||
fields: [
|
||||
defineField({
|
||||
name: 'title',
|
||||
title: 'Title',
|
||||
type: 'string',
|
||||
validation: (r) => r.required(),
|
||||
}),
|
||||
defineField({
|
||||
name: 'slug',
|
||||
title: 'Slug',
|
||||
type: 'slug',
|
||||
options: { source: 'title' },
|
||||
}),
|
||||
defineField({
|
||||
name: 'description',
|
||||
title: 'Description',
|
||||
type: 'string',
|
||||
}),
|
||||
defineField({
|
||||
name: 'body',
|
||||
title: 'Content',
|
||||
type: 'array',
|
||||
of: [{ type: 'block' }],
|
||||
validation: (r) => r.required(),
|
||||
}),
|
||||
],
|
||||
})
|
||||
@@ -0,0 +1,47 @@
|
||||
import { defineType, defineField } from 'sanity'
|
||||
|
||||
export const postSchema = defineType({
|
||||
name: 'post',
|
||||
title: 'Blog Posts',
|
||||
type: 'document',
|
||||
fields: [
|
||||
defineField({
|
||||
name: 'title',
|
||||
title: 'Title',
|
||||
type: 'string',
|
||||
validation: (r) => r.required(),
|
||||
}),
|
||||
defineField({
|
||||
name: 'slug',
|
||||
title: 'Slug',
|
||||
type: 'slug',
|
||||
options: { source: 'title' },
|
||||
validation: (r) => r.required(),
|
||||
}),
|
||||
defineField({
|
||||
name: 'date',
|
||||
title: 'Publication Date',
|
||||
type: 'datetime',
|
||||
validation: (r) => r.required(),
|
||||
}),
|
||||
defineField({
|
||||
name: 'excerpt',
|
||||
title: 'Excerpt',
|
||||
type: 'string',
|
||||
validation: (r) => r.required(),
|
||||
}),
|
||||
defineField({
|
||||
name: 'coverImage',
|
||||
title: 'Cover Image',
|
||||
type: 'image',
|
||||
options: { hotspot: true },
|
||||
}),
|
||||
defineField({
|
||||
name: 'body',
|
||||
title: 'Body',
|
||||
type: 'array',
|
||||
of: [{ type: 'block' }, { type: 'image' }],
|
||||
validation: (r) => r.required(),
|
||||
}),
|
||||
],
|
||||
})
|
||||
@@ -0,0 +1,173 @@
|
||||
import { defineType, defineField, defineArrayMember } from 'sanity'
|
||||
|
||||
export const theaterHomepageSchema = defineType({
|
||||
name: 'theaterHomepage',
|
||||
title: 'Theater Homepage',
|
||||
type: 'document',
|
||||
// Singleton: disable create/delete — only update and publish
|
||||
__experimental_actions: ['update', 'publish'],
|
||||
fields: [
|
||||
defineField({
|
||||
name: 'title',
|
||||
title: 'Page Title',
|
||||
type: 'string',
|
||||
}),
|
||||
|
||||
// Hero Section
|
||||
defineField({
|
||||
name: 'hero',
|
||||
title: 'Hero Section',
|
||||
type: 'object',
|
||||
fields: [
|
||||
defineField({ name: 'title_de', title: 'Title (German)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'title_en', title: 'Title (English)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'subtitle_de', title: 'Subtitle (German)', type: 'text' }),
|
||||
defineField({ name: 'subtitle_en', title: 'Subtitle (English)', type: 'text' }),
|
||||
],
|
||||
}),
|
||||
|
||||
// Section 1: Das Projekt / The Project
|
||||
defineField({
|
||||
name: 'projekt',
|
||||
title: 'Section 1: Das Projekt / The Project',
|
||||
type: 'object',
|
||||
fields: [
|
||||
defineField({ name: 'title_de', title: 'Title (German)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'title_en', title: 'Title (English)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'content_de', title: 'Content (German)', type: 'array', of: [{ type: 'block' }] }),
|
||||
defineField({ name: 'content_en', title: 'Content (English)', type: 'array', of: [{ type: 'block' }] }),
|
||||
],
|
||||
}),
|
||||
|
||||
// Section 2: Wer steckt dahinter / Who's Behind It
|
||||
defineField({
|
||||
name: 'team',
|
||||
title: "Section 2: Wer steckt dahinter / Who's Behind It",
|
||||
type: 'object',
|
||||
fields: [
|
||||
defineField({ name: 'title_de', title: 'Title (German)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'title_en', title: 'Title (English)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'content_de', title: 'Content (German)', type: 'array', of: [{ type: 'block' }] }),
|
||||
defineField({ name: 'content_en', title: 'Content (English)', type: 'array', of: [{ type: 'block' }] }),
|
||||
defineField({
|
||||
name: 'organizations',
|
||||
title: 'Organizations',
|
||||
type: 'array',
|
||||
of: [
|
||||
defineArrayMember({
|
||||
type: 'object',
|
||||
fields: [
|
||||
defineField({ name: 'name', title: 'Name', type: 'string' }),
|
||||
defineField({ name: 'role_de', title: 'Role (German)', type: 'string' }),
|
||||
defineField({ name: 'role_en', title: 'Role (English)', type: 'string' }),
|
||||
defineField({ name: 'logo', title: 'Logo', type: 'image', options: { hotspot: false } }),
|
||||
defineField({ name: 'url', title: 'Website URL', type: 'url' }),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
|
||||
// Section 3: Das Stück / The Play
|
||||
defineField({
|
||||
name: 'stueck',
|
||||
title: 'Section 3: Das Stück / The Play',
|
||||
type: 'object',
|
||||
fields: [
|
||||
defineField({ name: 'title_de', title: 'Title (German)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'title_en', title: 'Title (English)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'content_de', title: 'Content (German)', type: 'array', of: [{ type: 'block' }] }),
|
||||
defineField({ name: 'content_en', title: 'Content (English)', type: 'array', of: [{ type: 'block' }] }),
|
||||
],
|
||||
}),
|
||||
|
||||
// Section 4: Mitwirkung / Participation
|
||||
defineField({
|
||||
name: 'mitwirkung',
|
||||
title: 'Section 4: Mitwirkung / Participation',
|
||||
type: 'object',
|
||||
fields: [
|
||||
defineField({ name: 'title_de', title: 'Title (German)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'title_en', title: 'Title (English)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'content_de', title: 'Content (German)', type: 'array', of: [{ type: 'block' }] }),
|
||||
defineField({ name: 'content_en', title: 'Content (English)', type: 'array', of: [{ type: 'block' }] }),
|
||||
defineField({ name: 'director_name', title: 'Director Name', type: 'string' }),
|
||||
defineField({ name: 'director_email', title: 'Director Email', type: 'string' }),
|
||||
defineField({ name: 'director_phone', title: 'Director Phone', type: 'string' }),
|
||||
],
|
||||
}),
|
||||
|
||||
// Section 5: Termine / Schedule
|
||||
defineField({
|
||||
name: 'termine',
|
||||
title: 'Section 5: Termine / Schedule',
|
||||
type: 'object',
|
||||
fields: [
|
||||
defineField({ name: 'title_de', title: 'Title (German)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'title_en', title: 'Title (English)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({
|
||||
name: 'events',
|
||||
title: 'Events',
|
||||
type: 'array',
|
||||
of: [
|
||||
defineArrayMember({
|
||||
type: 'object',
|
||||
fields: [
|
||||
defineField({ name: 'title_de', title: 'Event Title (German)', type: 'string' }),
|
||||
defineField({ name: 'title_en', title: 'Event Title (English)', type: 'string' }),
|
||||
defineField({ name: 'date', title: 'Date / Period', type: 'string' }),
|
||||
defineField({ name: 'description_de', title: 'Description (German)', type: 'text' }),
|
||||
defineField({ name: 'description_en', title: 'Description (English)', type: 'text' }),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
|
||||
// Section 6: Presse / Press
|
||||
defineField({
|
||||
name: 'presse',
|
||||
title: 'Section 6: Presse / Press',
|
||||
type: 'object',
|
||||
fields: [
|
||||
defineField({ name: 'title_de', title: 'Title (German)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'title_en', title: 'Title (English)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'content_de', title: 'Content (German)', type: 'array', of: [{ type: 'block' }] }),
|
||||
defineField({ name: 'content_en', title: 'Content (English)', type: 'array', of: [{ type: 'block' }] }),
|
||||
],
|
||||
}),
|
||||
|
||||
// Section 7: Foto Galerie / Photo Gallery
|
||||
defineField({
|
||||
name: 'gallery',
|
||||
title: 'Section 7: Foto Galerie / Photo Gallery',
|
||||
type: 'object',
|
||||
fields: [
|
||||
defineField({ name: 'title_de', title: 'Title (German)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'title_en', title: 'Title (English)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({
|
||||
name: 'images',
|
||||
title: 'Gallery Images',
|
||||
type: 'array',
|
||||
of: [{ type: 'image' }],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
|
||||
// Section 8: Tickets
|
||||
defineField({
|
||||
name: 'tickets',
|
||||
title: 'Section 8: Tickets',
|
||||
type: 'object',
|
||||
fields: [
|
||||
defineField({ name: 'title_de', title: 'Title (German)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'title_en', title: 'Title (English)', type: 'string', validation: (r) => r.required() }),
|
||||
defineField({ name: 'content_de', title: 'Content (German)', type: 'array', of: [{ type: 'block' }] }),
|
||||
defineField({ name: 'content_en', title: 'Content (English)', type: 'array', of: [{ type: 'block' }] }),
|
||||
defineField({ name: 'ticket_url', title: 'Ticket Purchase URL', type: 'url' }),
|
||||
],
|
||||
}),
|
||||
],
|
||||
})
|
||||
Reference in New Issue
Block a user