From 92a80e8759c89643fa2f020e021681f23f4cb88a Mon Sep 17 00:00:00 2001 From: Johannes Gasser Date: Mon, 18 May 2026 07:01:11 +0200 Subject: [PATCH] added image support --- sanity.config.ts | 3 - src/pages/blog/[slug].astro | 234 -------------------------- src/pages/blog/index.astro | 180 -------------------- src/sanity/portableText.ts | 13 +- src/sanity/queries.ts | 33 ---- src/sanity/schemas/index.ts | 4 +- src/sanity/schemas/page.ts | 33 ---- src/sanity/schemas/post.ts | 47 ------ src/sanity/schemas/theaterHomepage.ts | 24 +-- 9 files changed, 25 insertions(+), 546 deletions(-) delete mode 100644 src/pages/blog/[slug].astro delete mode 100644 src/pages/blog/index.astro delete mode 100644 src/sanity/schemas/page.ts delete mode 100644 src/sanity/schemas/post.ts diff --git a/sanity.config.ts b/sanity.config.ts index f097493..573094f 100644 --- a/sanity.config.ts +++ b/sanity.config.ts @@ -37,9 +37,6 @@ export default defineConfig({ .schemaType('theaterHomepage') .documentId('theaterHomepage') ), - S.divider(), - S.documentTypeListItem('post').title('Blog Posts'), - S.documentTypeListItem('page').title('Pages'), ]), }), visionTool(), diff --git a/src/pages/blog/[slug].astro b/src/pages/blog/[slug].astro deleted file mode 100644 index 28dd1ef..0000000 --- a/src/pages/blog/[slug].astro +++ /dev/null @@ -1,234 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; -import { sanityClient } from '../../sanity/client'; -import { renderPortableText } from '../../sanity/portableText'; -import { urlFor } from '../../sanity/imageUrl'; -import { allPostsQuery } from '../../sanity/queries'; - -export async function getStaticPaths() { - const posts = await sanityClient.fetch(allPostsQuery); - return posts.map((post: any) => ({ - params: { slug: post.slug }, - props: { post }, - })); -} - -const { post } = Astro.props as { post: any }; -const bodyHtml = renderPortableText(post.body); ---- - - -
-
-
-

{post.title}

- -
-
- - {post.coverImage && ( -
- {post.title} -
- )} - -
-
-
-
-
- - -
-
- - diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro deleted file mode 100644 index dbc63de..0000000 --- a/src/pages/blog/index.astro +++ /dev/null @@ -1,180 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; -import { sanityClient } from '../../sanity/client'; -import { urlFor } from '../../sanity/imageUrl'; -import { allPostsQuery } from '../../sanity/queries'; - -const allPosts = await sanityClient.fetch(allPostsQuery); ---- - - -
-
-

Blog

-

Stay updated with the latest news and behind-the-scenes insights

-
-
- -
-
- {allPosts.length === 0 ? ( -

No blog posts yet. Check back soon!

- ) : ( -
- {allPosts.map((post: any) => ( -
- {post.coverImage && ( -
- {post.title} -
- )} -
-

- - {post.title} - -

- -

{post.excerpt}

- - Read full post → - -
-
- ))} -
- )} -
-
-
- - diff --git a/src/sanity/portableText.ts b/src/sanity/portableText.ts index b6d09fa..7954a6d 100644 --- a/src/sanity/portableText.ts +++ b/src/sanity/portableText.ts @@ -1,6 +1,17 @@ import { toHTML } from '@portabletext/to-html' +import { urlFor } from './imageUrl' export function renderPortableText(blocks: any[]): string { if (!blocks?.length) return '' - return toHTML(blocks) + return toHTML(blocks, { + components: { + types: { + image: ({ value }) => { + const url = urlFor(value) + if (!url) return '' + return `${value.alt ?? ''}` + }, + }, + }, + }) } diff --git a/src/sanity/queries.ts b/src/sanity/queries.ts index 15586ca..d88fef6 100644 --- a/src/sanity/queries.ts +++ b/src/sanity/queries.ts @@ -1,34 +1 @@ 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 - } -` diff --git a/src/sanity/schemas/index.ts b/src/sanity/schemas/index.ts index 9d6ca6f..a1c72dd 100644 --- a/src/sanity/schemas/index.ts +++ b/src/sanity/schemas/index.ts @@ -1,5 +1,3 @@ -import { postSchema } from './post' -import { pageSchema } from './page' import { theaterHomepageSchema } from './theaterHomepage' -export const schemaTypes = [postSchema, pageSchema, theaterHomepageSchema] +export const schemaTypes = [theaterHomepageSchema] diff --git a/src/sanity/schemas/page.ts b/src/sanity/schemas/page.ts deleted file mode 100644 index f5c3188..0000000 --- a/src/sanity/schemas/page.ts +++ /dev/null @@ -1,33 +0,0 @@ -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(), - }), - ], -}) diff --git a/src/sanity/schemas/post.ts b/src/sanity/schemas/post.ts deleted file mode 100644 index b0da0c0..0000000 --- a/src/sanity/schemas/post.ts +++ /dev/null @@ -1,47 +0,0 @@ -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(), - }), - ], -}) diff --git a/src/sanity/schemas/theaterHomepage.ts b/src/sanity/schemas/theaterHomepage.ts index 66374ec..c54018a 100644 --- a/src/sanity/schemas/theaterHomepage.ts +++ b/src/sanity/schemas/theaterHomepage.ts @@ -33,8 +33,8 @@ export const theaterHomepageSchema = defineType({ 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: 'content_de', title: 'Content (German)', type: 'array', of: [{ type: 'block' }, defineArrayMember({ type: 'image', options: { hotspot: true } })] }), + defineField({ name: 'content_en', title: 'Content (English)', type: 'array', of: [{ type: 'block' }, defineArrayMember({ type: 'image', options: { hotspot: true } })] }), ], }), @@ -46,8 +46,8 @@ export const theaterHomepageSchema = defineType({ 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: 'content_de', title: 'Content (German)', type: 'array', of: [{ type: 'block' }, defineArrayMember({ type: 'image', options: { hotspot: true } })] }), + defineField({ name: 'content_en', title: 'Content (English)', type: 'array', of: [{ type: 'block' }, defineArrayMember({ type: 'image', options: { hotspot: true } })] }), defineField({ name: 'organizations', title: 'Organizations', @@ -76,8 +76,8 @@ export const theaterHomepageSchema = defineType({ 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: 'content_de', title: 'Content (German)', type: 'array', of: [{ type: 'block' }, defineArrayMember({ type: 'image', options: { hotspot: true } })] }), + defineField({ name: 'content_en', title: 'Content (English)', type: 'array', of: [{ type: 'block' }, defineArrayMember({ type: 'image', options: { hotspot: true } })] }), ], }), @@ -89,8 +89,8 @@ export const theaterHomepageSchema = defineType({ 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: 'content_de', title: 'Content (German)', type: 'array', of: [{ type: 'block' }, defineArrayMember({ type: 'image', options: { hotspot: true } })] }), + defineField({ name: 'content_en', title: 'Content (English)', type: 'array', of: [{ type: 'block' }, defineArrayMember({ type: 'image', options: { hotspot: true } })] }), 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' }), @@ -133,8 +133,8 @@ export const theaterHomepageSchema = defineType({ 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: 'content_de', title: 'Content (German)', type: 'array', of: [{ type: 'block' }, defineArrayMember({ type: 'image', options: { hotspot: true } })] }), + defineField({ name: 'content_en', title: 'Content (English)', type: 'array', of: [{ type: 'block' }, defineArrayMember({ type: 'image', options: { hotspot: true } })] }), ], }), @@ -163,8 +163,8 @@ export const theaterHomepageSchema = defineType({ 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: 'content_de', title: 'Content (German)', type: 'array', of: [{ type: 'block' }, defineArrayMember({ type: 'image', options: { hotspot: true } })] }), + defineField({ name: 'content_en', title: 'Content (English)', type: 'array', of: [{ type: 'block' }, defineArrayMember({ type: 'image', options: { hotspot: true } })] }), defineField({ name: 'ticket_url', title: 'Ticket Purchase URL', type: 'url' }), ], }),