Initial website — Astro + Tailwind + Sanity schema, 9 pages
This commit is contained in:
6
sanity/schemas/index.ts
Normal file
6
sanity/schemas/index.ts
Normal 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
39
sanity/schemas/post.ts
Normal 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
38
sanity/schemas/project.ts
Normal 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ärz–Mai 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" },
|
||||
},
|
||||
});
|
||||
62
sanity/schemas/siteSettings.ts
Normal file
62
sanity/schemas/siteSettings.ts
Normal 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" } },
|
||||
});
|
||||
31
sanity/schemas/teamMember.ts
Normal file
31
sanity/schemas/teamMember.ts
Normal 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" },
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user