feat: Team, Villa-Bilder und bestaetigte Camp-Eckdaten
Docker-Images bauen und veroeffentlichen / build-and-push (push) Successful in 2m49s

- Team-Abschnitt mit neun Personen, Eric Heitz als Head of Modelcamp,
  Portraets im Rundbogen mit Initialen-Platzhaltern bis Fotos vorliegen
- Unterkunftsbilder der Villa La Chiesina lokal in public/images/unterkunft
  (vom Auftraggeber freigegeben), Hero-Leitbild, Ausstattung, Booking-Link
- Migration: Termin 08.05.-15.05.2027, Ort Arcidosso (Toskana), eigenes
  Bett im geteilten Zimmer, 13 Plaetze; Admin-Werte bleiben erhalten
- Reveal: kein Hydration-Fehler mehr bei reduzierter Bewegung
- Doku zu offenen Punkten aktualisiert

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
Nick SzaunigandClaude Opus 5.5 committed 2026-10-01 07:39:27 +02:00
1 parent 28663cda7a
commit 804bb832ea
28 files changed
+220 -89

No files matched your search

+57 -18
View File
@@ -11,9 +11,11 @@
* - Termin, Ort, Zimmer-/Bettbeschreibung, Veranstalter, Steuerhinweis und
* Bedingungen pflegt der Adminbereich (Datenbank), weil sie den
* Live-Verkauf freischalten. Hier steht alles Uebrige.
* - Bilder: nur mit bestaetigter Nutzungsberechtigung, als lokale Datei im
* Medienverzeichnis (MEDIA_DIR, ausgeliefert unter /media/…). Kein
* Hotlinking fremder Bilder (z. B. von Booking.com).
* - Bilder: nur mit bestaetigter Nutzungsberechtigung und immer als lokale
* Datei, nie per Hotlinking. Feste Bilder liegen in public/images/,
* austauschbare Medien im Medienverzeichnis (MEDIA_DIR, /media/…).
* Die Unterkunftsbilder stammen aus dem Booking.com-Eintrag der Villa
* und wurden vom Auftraggeber am 01.10.2026 zur Nutzung freigegeben.
*
* Offene Punkte: docs/OFFENE-PUNKTE.md
*/
@@ -21,12 +23,14 @@
export type PlaceholderTone = "cover" | "villa" | "garden" | "room" | "terrace" | "portrait" | "studio";
export type Media =
| { kind: "placeholder"; label: string; tone: PlaceholderTone }
| { kind: "placeholder"; label: string; tone: PlaceholderTone; glyph?: string }
| { kind: "image"; src: string; alt: string; width: number; height: number };
export type Confirmable<T> = T & { confirmed: boolean };
const placeholder = (label: string, tone: PlaceholderTone): Media => ({ kind: "placeholder", label, tone });
const portrait = (name: string, initials: string): Media => ({ kind: "placeholder", label: `Porträt ${name}`, tone: "portrait", glyph: initials });
/** Lokales Bild aus public/images/unterkunft (1280 x 853 px). */
const villa = (file: string, alt: string): Media => ({ kind: "image", src: `/images/unterkunft/${file}.jpg`, alt, width: 1280, height: 853 });
export const site = {
hero: {
@@ -35,7 +39,7 @@ export const site = {
headline: "Gemeinsam wachsen. In Italien.",
subline:
"Das ARTISTA Modelcamp 2027 bringt Models an einem Ort in Italien zusammen – zum Lernen, Arbeiten und Wohnen unter einem Dach.",
media: placeholder("Leitmotiv: Bild oder Video folgt", "cover"),
media: villa("villa-luftbild", "Luftaufnahme der Villa La Chiesina zwischen Zypressen und Wiesen in der Toskana"),
},
camp: {
@@ -89,22 +93,57 @@ export const site = {
accommodation: {
title: "Die Unterkunft",
lead: "Wohnen, arbeiten und abends zusammensitzen – alles an einem Ort.",
// Link zur Unterkunft (z. B. Booking.com), nachzureichen.
bookingUrl: null as string | null,
lead: "Eine Villa zwischen Zypressen, mit Blick über die Hügel am Monte Amiata. Wohnen, arbeiten und abends zusammensitzen – alles an einem Ort.",
name: "Villa La Chiesina",
place: "Arcidosso, Toskana",
// Ohne Tracking-Parameter; Termin und Personenzahl waehlt man dort selbst.
bookingUrl: "https://www.booking.com/hotel/it/villa-la-chiesina-arcidosso.de.html" as string | null,
// Ausstattung laut Unterkunftsbeschreibung (Booking.com, Stand 01.10.2026).
features: [
"Eigener Außenpool (saisonal)",
"Großer Garten mit Terrasse",
"Blick auf die Berge",
"Gemeinsames Wohnzimmer und gut ausgestattete Küche",
"Bettwäsche und Handtücher",
"WLAN",
],
images: [
placeholder("Unterkunft: Außenansicht", "villa"),
placeholder("Unterkunft: Garten oder Terrasse", "terrace"),
placeholder("Unterkunft: Zimmer", "room"),
placeholder("Unterkunft: Gemeinschaftsbereich", "garden"),
villa("villa-eingang", "Die Villa La Chiesina mit Steintreppe und Rasen im Frühling"),
villa("pool", "Pool mit Liegen im Garten der Villa"),
villa("wohnzimmer-kamin", "Wohnzimmer mit Holzbalkendecke, Natursteinwand und Kamin"),
villa("anwesen-luftbild", "Luftaufnahme des Anwesens mit Zypressenallee, Pool und Tennisplatz"),
villa("schlafzimmer-einzelbetten", "Schlafzimmer mit zwei Einzelbetten und Holzbalkendecke"),
villa("esszimmer", "Esszimmer mit großem Holztisch und Kamin"),
villa("terrasse", "Sitzplatz auf der Gartenterrasse"),
villa("pool-zypressen", "Pool zwischen hohen Zypressen, im Hintergrund die Hügel der Toskana"),
villa("steintreppe", "Alte Steintreppe im Garten unter Bäumen"),
villa("arcidosso", "Blick auf den mittelalterlichen Ort Arcidosso mit Burg"),
] as Media[],
},
teachers: {
title: "Die Dozentinnen",
team: {
title: "Das Team",
lead: "Fotografie, Modelcoaching, Content und eine Küche, die alle zusammenbringt: Diese Menschen sind beim Modelcamp 2027 dabei.",
// Namen und Rollen vom Auftraggeber (01.10.2026). Porträts folgen:
// Datei in public/images/team/ legen und "portrait" ersetzen, z. B.
// { kind: "image", src: "/images/team/eric-heitz.jpg", alt: "Porträt Eric Heitz", width: 1200, height: 1500 }.
// Kurzbeschreibungen nur aus freigegebenen Angaben, keine erfundenen Referenzen.
head: {
name: "Eric Heitz",
title: "Head of Modelcamp",
role: "Fotograf · Content Creator · Modelcoach",
bio: null as string | null,
portrait: portrait("Eric Heitz", "EH"),
},
people: [
{ name: null as string | null, role: null as string | null, bio: null as string | null, portrait: placeholder("Porträt Dozentin", "portrait") as Media },
{ name: null as string | null, role: null as string | null, bio: null as string | null, portrait: placeholder("Porträt Dozentin", "studio") as Media },
{ name: "Michele Ietro", role: "Editorial- und Casual-Fotograf", bio: null as string | null, portrait: portrait("Michele Ietro", "MI") },
{ name: "Lola Stoll", role: "Editorial Model · UGC · GNTM 2026", bio: null as string | null, portrait: portrait("Lola Stoll", "LS") },
{ name: "Eileen Kaupp", role: "Editorial Model · Fashion · GNTM 2026", bio: null as string | null, portrait: portrait("Eileen Kaupp", "EK") },
{ name: "Gabriela Pronkin", role: "Commercial · Casual Model · UGC", bio: null as string | null, portrait: portrait("Gabriela Pronkin", "GP") },
{ name: "Stefan Höchtl", role: "Social Media Content Creator", bio: null as string | null, portrait: portrait("Stefan Höchtl", "SH") },
{ name: "Saskia Sirowatka", role: "Social Media Managerin", bio: null as string | null, portrait: portrait("Saskia Sirowatka", "SS") },
{ name: "André Hartshauser", role: "Workshop-Organisation · Assistenz Küche", bio: null as string | null, portrait: portrait("André Hartshauser", "AH") },
{ name: "Ante Rejo", role: "Chefkoch", bio: null as string | null, portrait: portrait("Ante Rejo", "AR") },
],
},
@@ -135,7 +174,7 @@ export const NAV_ITEMS = [
{ id: "camp", label: "Das Camp" },
{ id: "leistungen", label: "Leistungen" },
{ id: "unterkunft", label: "Unterkunft" },
{ id: "dozentinnen", label: "Dozentinnen" },
{ id: "team", label: "Team" },
{ id: "artista", label: "Über ARTISTA" },
{ id: "preis", label: "Preis" },
{ id: "fragen", label: "Fragen" },