feat: platzhalter-bilder finalisiert und gemerget

This commit is contained in:
viiivo 2026-04-23 18:24:53 +02:00
parent fdbb70a4e5
commit 4ff703b4ff
7 changed files with 111 additions and 4 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 KiB

View File

@ -445,6 +445,30 @@
grid-row: 1 / 3; grid-row: 1 / 3;
} }
.detail-gallery-large--single {
grid-template-columns: 1fr 1fr;
grid-template-rows: auto;
align-items: start;
}
.detail-gallery-large--single .detail-gallery-item {
grid-column: 1 / -1;
grid-row: auto;
align-self: start;
}
.detail-gallery-large--single .detail-gallery-image {
height: auto;
min-height: 0;
object-fit: contain;
object-position: top center;
background: var(--butter-light);
}
.detail-gallery-large--single img:first-child {
grid-row: auto;
}
.detail-lightbox { .detail-lightbox {
/* Full-screen overlay for enlarged gallery image view. */ /* Full-screen overlay for enlarged gallery image view. */
position: fixed; position: fixed;
@ -847,6 +871,11 @@
grid-row: auto; grid-row: auto;
} }
.detail-gallery-large--single {
grid-template-columns: 1fr;
grid-template-rows: auto;
}
.detail-lightbox { .detail-lightbox {
padding: 12px; padding: 12px;
} }

View File

@ -425,6 +425,42 @@ function mapEventTypeToCategory(value) {
return categoryMap[value] || value.toUpperCase(); return categoryMap[value] || value.toUpperCase();
} }
/**
* Liefert je Eventtyp ein passendes Platzhalterbild.
*/
function getPlaceholderImageByEventType(eventType) {
const normalizedType = String(eventType || "")
.trim()
.toLowerCase()
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "")
.replace(/[+&/_-]/g, " ")
.replace(/\s+/g, " ");
if (normalizedType.includes("brunch")) {
return "assets/platzhalter_brunch.jpeg";
}
if (normalizedType.includes("lunch")) {
return "assets/platzhalter_lunch.jpeg";
}
if (
normalizedType.includes("kaffee")
|| normalizedType.includes("coffee")
|| normalizedType.includes("cafe")
|| normalizedType.includes("kuchen")
) {
return "assets/platzhalter_kaffee.jpeg";
}
if (normalizedType.includes("dinner")) {
return "assets/platzhalter_dinner.jpeg";
}
return "assets/platzhalter_dinner.jpeg";
}
/** /**
* Baut aus den Formulardaten ein lokal speicherbares Event-Objekt. * Baut aus den Formulardaten ein lokal speicherbares Event-Objekt.
*/ */
@ -436,6 +472,8 @@ function buildStoredEvent() {
const eventDate = form.elements.eventDate.value; const eventDate = form.elements.eventDate.value;
const eventTime = form.elements.eventTime.value; const eventTime = form.elements.eventTime.value;
const eventCity = form.elements.eventCity.value.trim(); const eventCity = form.elements.eventCity.value.trim();
const fallbackGallery = [getPlaceholderImageByEventType(eventType)];
const resolvedGallery = galleryImages.length > 0 ? [...galleryImages] : fallbackGallery;
return { return {
id: Date.now(), id: Date.now(),
@ -444,6 +482,7 @@ function buildStoredEvent() {
address: form.elements.eventAddress.value.trim(), address: form.elements.eventAddress.value.trim(),
date: formatDateForStorage(eventDate), date: formatDateForStorage(eventDate),
time: formatTimeForStorage(eventTime), time: formatTimeForStorage(eventTime),
eventType,
category: mapEventTypeToCategory(eventType), category: mapEventTypeToCategory(eventType),
diet: dietType, diet: dietType,
spots: Number(form.elements.maxGuests.value), spots: Number(form.elements.maxGuests.value),
@ -460,7 +499,7 @@ function buildStoredEvent() {
allergiesNote: form.elements.allergiesOther.value.trim(), allergiesNote: form.elements.allergiesOther.value.trim(),
// Host wird separat geführt und nicht als angemeldeter Gast gezählt. // Host wird separat geführt und nicht als angemeldeter Gast gezählt.
participants: [], participants: [],
gallery: [...galleryImages], gallery: resolvedGallery,
createdAt: new Date().toISOString(), createdAt: new Date().toISOString(),
source: "local" source: "local"
}; };

View File

@ -198,6 +198,39 @@
return labels[diet] || diet; return labels[diet] || diet;
} }
function getPlaceholderImageByEventType(event) {
const rawType = String(event?.eventType || event?.category || '')
.trim()
.toLowerCase()
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.replace(/[+&/_-]/g, ' ')
.replace(/\s+/g, ' ');
if (rawType.includes('brunch')) {
return 'assets/platzhalter_brunch.jpeg';
}
if (rawType.includes('lunch')) {
return 'assets/platzhalter_lunch.jpeg';
}
if (
rawType.includes('kaffee')
|| rawType.includes('coffee')
|| rawType.includes('cafe')
|| rawType.includes('kuchen')
) {
return 'assets/platzhalter_kaffee.jpeg';
}
if (rawType.includes('dinner')) {
return 'assets/platzhalter_dinner.jpeg';
}
return 'assets/platzhalter_dinner.jpeg';
}
// Fetch data source and resolve the matching event record. // Fetch data source and resolve the matching event record.
try { try {
const response = await fetch('data/events.json'); const response = await fetch('data/events.json');
@ -234,9 +267,15 @@
.map(name => getParticipantNameForViewer(name, isOwnEvent)) .map(name => getParticipantNameForViewer(name, isOwnEvent))
.filter(Boolean); .filter(Boolean);
const galleryImages = Array.isArray(event.gallery) ? event.gallery.filter(Boolean) : []; const galleryImages = Array.isArray(event.gallery) ? event.gallery.filter(Boolean) : [];
const galleryMarkup = galleryImages.length > 0 const resolvedGalleryImages = galleryImages.length > 0
? `<div class="detail-gallery detail-gallery-large"> ? galleryImages
${galleryImages.slice(0, 9).map((img, index) => ` : [getPlaceholderImageByEventType(event)];
const galleryLayoutClass = resolvedGalleryImages.length === 1
? 'detail-gallery detail-gallery-large detail-gallery-large--single'
: 'detail-gallery detail-gallery-large';
const galleryMarkup = resolvedGalleryImages.length > 0
? `<div class="${galleryLayoutClass}">
${resolvedGalleryImages.slice(0, 9).map((img, index) => `
<button class="detail-gallery-item" type="button" aria-label="Bild ${index + 1} gross anzeigen" data-fullsrc="${img}"> <button class="detail-gallery-item" type="button" aria-label="Bild ${index + 1} gross anzeigen" data-fullsrc="${img}">
<img src="${img}" alt="${event.title} Bild ${index + 1}" class="detail-gallery-image"> <img src="${img}" alt="${event.title} Bild ${index + 1}" class="detail-gallery-image">
</button> </button>