Initial website — Astro + Tailwind + Sanity schema, 9 pages

This commit is contained in:
2026-06-04 15:53:52 +00:00
commit 1d1492e611
33 changed files with 7472 additions and 0 deletions

30
sanity/sanity.config.ts Normal file
View File

@@ -0,0 +1,30 @@
import { defineConfig } from "sanity";
import { structureTool } from "sanity/structure";
import { visionTool } from "@sanity/vision";
import { schemaTypes } from "./schemas";
export default defineConfig({
name: "kitafreunde-regenbogen",
title: "Kitafreunde Regenbogen",
projectId: process.env.SANITY_STUDIO_PROJECT_ID!,
dataset: process.env.SANITY_STUDIO_DATASET ?? "production",
plugins: [
structureTool({
structure: (S) =>
S.list()
.title("Inhalt")
.items([
S.documentTypeListItem("post").title("Aktuelles / Blog"),
S.documentTypeListItem("project").title("Projekte"),
S.documentTypeListItem("teamMember").title("Vorstand"),
S.divider(),
S.documentTypeListItem("siteSettings").title("Website-Einstellungen"),
]),
}),
visionTool(),
],
schema: { types: schemaTypes },
});

6
sanity/schemas/index.ts Normal file
View File

@@ -0,0 +1,6 @@
import post from "./post";
import project from "./project";
import teamMember from "./teamMember";
import siteSettings from "./siteSettings";
export const schemaTypes = [post, project, teamMember, siteSettings];

39
sanity/schemas/post.ts Normal file
View File

@@ -0,0 +1,39 @@
import { defineType, defineField } from "sanity";
export default defineType({
name: "post",
title: "Aktuelles / Blog",
type: "document",
fields: [
defineField({ name: "title", title: "Titel", type: "string", validation: (r) => r.required() }),
defineField({ name: "slug", title: "URL-Slug", type: "slug", options: { source: "title" }, validation: (r) => r.required() }),
defineField({ name: "publishedAt", title: "Veröffentlicht am", type: "datetime", validation: (r) => r.required() }),
defineField({ name: "excerpt", title: "Kurzbeschreibung", type: "text", rows: 3 }),
defineField({ name: "coverImage", title: "Titelbild", type: "image", options: { hotspot: true } }),
defineField({
name: "body",
title: "Inhalt",
type: "array",
of: [
{ type: "block" },
{ type: "image", options: { hotspot: true } },
],
}),
defineField({
name: "category",
title: "Kategorie",
type: "string",
options: {
list: [
{ title: "Vereinsnews", value: "news" },
{ title: "Projekte", value: "projects" },
{ title: "Veranstaltungen", value: "events" },
{ title: "Presse", value: "press" },
],
},
}),
],
preview: {
select: { title: "title", subtitle: "publishedAt", media: "coverImage" },
},
});

38
sanity/schemas/project.ts Normal file
View File

@@ -0,0 +1,38 @@
import { defineType, defineField } from "sanity";
export default defineType({
name: "project",
title: "Projekte",
type: "document",
fields: [
defineField({ name: "title", title: "Projektname", type: "string", validation: (r) => r.required() }),
defineField({ name: "slug", title: "URL-Slug", type: "slug", options: { source: "title" }, validation: (r) => r.required() }),
defineField({ name: "date", title: "Zeitraum", type: "string", description: 'z.B. "Sommer 2024" oder "MärzMai 2024"' }),
defineField({ name: "summary", title: "Kurzbeschreibung", type: "text", rows: 3, validation: (r) => r.required() }),
defineField({
name: "body",
title: "Ausführliche Beschreibung",
type: "array",
of: [{ type: "block" }, { type: "image", options: { hotspot: true } }],
}),
defineField({ name: "image", title: "Hauptbild", type: "image", options: { hotspot: true } }),
defineField({ name: "targetGroup", title: "Für wen", type: "string", description: 'z.B. "Alle Kinder" oder "Gruppe Schmetterlinge"' }),
defineField({ name: "featured", title: "Auf Startseite hervorheben?", type: "boolean", initialValue: false }),
defineField({
name: "status",
title: "Status",
type: "string",
options: {
list: [
{ title: "Geplant", value: "planned" },
{ title: "Laufend", value: "active" },
{ title: "Abgeschlossen", value: "done" },
],
},
initialValue: "done",
}),
],
preview: {
select: { title: "title", subtitle: "date", media: "image" },
},
});

View File

@@ -0,0 +1,62 @@
import { defineType, defineField } from "sanity";
export default defineType({
name: "siteSettings",
title: "Website-Einstellungen",
type: "document",
// Singleton — nur ein Dokument
__experimental_actions: ["update", "publish"],
fields: [
defineField({
name: "contact",
title: "Kontakt",
type: "object",
fields: [
{ name: "email", title: "E-Mail", type: "string" },
{ name: "phone", title: "Telefon (optional)", type: "string" },
{ name: "address", title: "Adresse", type: "string", initialValue: "Keilerstraße 23, 13503 Berlin" },
],
}),
defineField({
name: "bank",
title: "Bankverbindung",
type: "object",
fields: [
{ name: "iban", title: "IBAN", type: "string" },
{ name: "bic", title: "BIC", type: "string" },
{ name: "bank", title: "Bankname", type: "string" },
{ name: "accountHolder", title: "Kontoinhaber", type: "string", initialValue: "Kitafreunde Regenbogen e.V." },
],
}),
defineField({
name: "social",
title: "Social Media",
type: "object",
fields: [
{ name: "instagram", title: "Instagram-URL", type: "url" },
{ name: "facebook", title: "Facebook-URL", type: "url" },
],
}),
defineField({
name: "memberFees",
title: "Mitgliedsbeiträge",
type: "object",
fields: [
{ name: "active", title: "Aktives Mitglied (Mindestbeitrag €/Jahr)", type: "number", initialValue: 12 },
{ name: "supporting", title: "Fördermitglied (Mindestbeitrag €/Jahr)", type: "number", initialValue: 6 },
{ name: "admissionFee", title: "Aufnahmegebühr €", type: "number", initialValue: 5 },
],
}),
defineField({
name: "stats",
title: "Zahlen für die Startseite",
type: "object",
fields: [
{ name: "members", title: "Mitgliederzahl", type: "number" },
{ name: "fundsPerYear", title: "Fördersumme €/Jahr", type: "number" },
{ name: "projectsTotal", title: "Projekte gesamt", type: "number" },
],
}),
],
preview: { select: { title: "contact.email" } },
});

View File

@@ -0,0 +1,31 @@
import { defineType, defineField } from "sanity";
export default defineType({
name: "teamMember",
title: "Vorstandsmitglieder",
type: "document",
fields: [
defineField({ name: "name", title: "Name", type: "string", validation: (r) => r.required() }),
defineField({
name: "role",
title: "Funktion",
type: "string",
options: {
list: [
{ title: "Vorsitzende/r", value: "chair" },
{ title: "Stellvertretung", value: "deputy" },
{ title: "Kassenwart/in", value: "treasurer" },
{ title: "Beisitz", value: "board" },
],
},
validation: (r) => r.required(),
}),
defineField({ name: "bio", title: "Kurz-Bio", type: "text", rows: 2 }),
defineField({ name: "photo", title: "Foto", type: "image", options: { hotspot: true } }),
defineField({ name: "order", title: "Reihenfolge", type: "number", initialValue: 99 }),
],
orderings: [{ title: "Reihenfolge", name: "orderAsc", by: [{ field: "order", direction: "asc" }] }],
preview: {
select: { title: "name", subtitle: "role", media: "photo" },
},
});