feat: improve hero image UX and live preview (#163, #158)

- Update hero photo help text to mention category override capability
- Add hint in category manager about default hero photo fallback
- Add placeholder text in gallery preview for hero section
- Ensure live preview updates correctly for header/divider style changes
This commit is contained in:
Paul Nothaft
2026-02-07 00:29:25 +01:00
parent 9c2a0d272a
commit d63f67a2af
4 changed files with 23 additions and 7 deletions
@@ -123,6 +123,11 @@ export const EventCategoryManager: React.FC<EventCategoryManagerProps> = ({ even
)} )}
</div> </div>
{/* Hint about hero photo fallback */}
<p className="text-xs text-neutral-500 dark:text-neutral-400 italic">
{t('categories.categoryHeroHint')}
</p>
{/* Add new category form */} {/* Add new category form */}
{isAdding && ( {isAdding && (
<div className="flex gap-2"> <div className="flex gap-2">
@@ -2,6 +2,7 @@ import React, { useMemo } from 'react';
import { Camera, Calendar } from 'lucide-react'; import { Camera, Calendar } from 'lucide-react';
import { ThemeConfig, GalleryLayoutType, HeroDividerStyle } from '../../types/theme.types'; import { ThemeConfig, GalleryLayoutType, HeroDividerStyle } from '../../types/theme.types';
import { buildResourceUrl } from '../../utils/url'; import { buildResourceUrl } from '../../utils/url';
import { useTranslation } from 'react-i18next';
interface GalleryPreviewBranding { interface GalleryPreviewBranding {
company_name?: string; company_name?: string;
@@ -64,12 +65,13 @@ const PreviewPhoto: React.FC<{
</div> </div>
); );
export const GalleryPreview: React.FC<GalleryPreviewProps> = ({ export const GalleryPreview: React.FC<GalleryPreviewProps> = ({
theme, theme,
branding, branding,
layoutType, layoutType,
className = '' className = ''
}) => { }) => {
const { t } = useTranslation();
const mockPhotos = useMemo(() => generateMockPhotos(12), []); const mockPhotos = useMemo(() => generateMockPhotos(12), []);
// Use the provided layoutType or fallback to theme's gallery layout // Use the provided layoutType or fallback to theme's gallery layout
@@ -252,6 +254,11 @@ export const GalleryPreview: React.FC<GalleryPreviewProps> = ({
<Calendar className="w-4 h-4 mr-1" /> <Calendar className="w-4 h-4 mr-1" />
<span>January 15, 2026</span> <span>January 15, 2026</span>
</div> </div>
{/* Hero photo placeholder hint */}
<div className="mt-3 flex items-center justify-center gap-1.5 text-white/60 text-xs">
<Camera className="w-3 h-3" />
<span>{t('branding.heroPlaceholderText')}</span>
</div>
</div> </div>
</div> </div>
<div className="absolute bottom-0 left-0 right-0"> <div className="absolute bottom-0 left-0 right-0">
+4 -2
View File
@@ -719,7 +719,8 @@
"removeCoverPhoto": "Titelbild entfernen", "removeCoverPhoto": "Titelbild entfernen",
"coverPhotoSet": "Titelbild erfolgreich festgelegt", "coverPhotoSet": "Titelbild erfolgreich festgelegt",
"coverPhotoRemoved": "Titelbild entfernt", "coverPhotoRemoved": "Titelbild entfernt",
"failedToSetCoverPhoto": "Titelbild konnte nicht festgelegt werden" "failedToSetCoverPhoto": "Titelbild konnte nicht festgelegt werden",
"categoryHeroHint": "Wenn kein Titelbild für eine Kategorie festgelegt ist, wird das Standard-Hero-Foto verwendet."
}, },
"events": { "events": {
"noStatisticsAvailableYet": "Noch keine Statistiken verfügbar", "noStatisticsAvailableYet": "Noch keine Statistiken verfügbar",
@@ -882,7 +883,7 @@
"heroLogoPositionLabel": "Position", "heroLogoPositionLabel": "Position",
"heroLogoHidden": "Logo ausgeblendet", "heroLogoHidden": "Logo ausgeblendet",
"heroPhoto": "Hero-Foto", "heroPhoto": "Hero-Foto",
"heroPhotoHelp": "Wählen Sie ein hervorgehobenes Foto für das Hero-Galerie-Layout", "heroPhotoHelp": "Wählen Sie ein Standard-Hero-Foto für die Galerie. Sie können dies pro Kategorie überschreiben.",
"selectHeroPhoto": "Hero-Foto auswählen", "selectHeroPhoto": "Hero-Foto auswählen",
"noHeroPhotoSelected": "Kein Hero-Foto ausgewählt", "noHeroPhotoSelected": "Kein Hero-Foto ausgewählt",
"heroPhotoSelected": "Hero-Foto ausgewählt", "heroPhotoSelected": "Hero-Foto ausgewählt",
@@ -1432,6 +1433,7 @@
"saveTheme": "Design speichern", "saveTheme": "Design speichern",
"previewLayout": "Vorschau-Layout", "previewLayout": "Vorschau-Layout",
"livePreview": "Live-Vorschau", "livePreview": "Live-Vorschau",
"heroPlaceholderText": "Das Hero-Foto Ihrer Veranstaltung wird hier angezeigt",
"whiteLabel": "White Label", "whiteLabel": "White Label",
"hidePoweredBy": "\"Powered by PicPeak\" Branding ausblenden", "hidePoweredBy": "\"Powered by PicPeak\" Branding ausblenden",
"hidePoweredByHelp": "Entfernen Sie die PicPeak-Kennzeichnung aus Galerie-Fußzeilen für ein vollständig personalisiertes Erscheinungsbild", "hidePoweredByHelp": "Entfernen Sie die PicPeak-Kennzeichnung aus Galerie-Fußzeilen für ein vollständig personalisiertes Erscheinungsbild",
+4 -2
View File
@@ -332,7 +332,8 @@
"removeCoverPhoto": "Remove Cover Photo", "removeCoverPhoto": "Remove Cover Photo",
"coverPhotoSet": "Cover photo set successfully", "coverPhotoSet": "Cover photo set successfully",
"coverPhotoRemoved": "Cover photo removed", "coverPhotoRemoved": "Cover photo removed",
"failedToSetCoverPhoto": "Failed to set cover photo" "failedToSetCoverPhoto": "Failed to set cover photo",
"categoryHeroHint": "If no cover photo is set for a category, the default hero photo will be used."
}, },
"events": { "events": {
"title": "Events", "title": "Events",
@@ -508,7 +509,7 @@
"heroLogoPositionLabel": "Position", "heroLogoPositionLabel": "Position",
"heroLogoHidden": "Logo hidden", "heroLogoHidden": "Logo hidden",
"heroPhoto": "Hero Photo", "heroPhoto": "Hero Photo",
"heroPhotoHelp": "Select a featured photo for the hero gallery layout", "heroPhotoHelp": "Select a default hero photo for the gallery. You can override this per category.",
"selectHeroPhoto": "Select Hero Photo", "selectHeroPhoto": "Select Hero Photo",
"noHeroPhotoSelected": "No hero photo selected", "noHeroPhotoSelected": "No hero photo selected",
"heroPhotoSelected": "Hero photo selected", "heroPhotoSelected": "Hero photo selected",
@@ -1147,6 +1148,7 @@
"saveTheme": "Save Theme", "saveTheme": "Save Theme",
"previewLayout": "Preview Layout", "previewLayout": "Preview Layout",
"livePreview": "Live Preview", "livePreview": "Live Preview",
"heroPlaceholderText": "Your event's hero photo will appear here",
"whiteLabel": "White Label", "whiteLabel": "White Label",
"hidePoweredBy": "Hide \"Powered by PicPeak\" branding", "hidePoweredBy": "Hide \"Powered by PicPeak\" branding",
"hidePoweredByHelp": "Remove the PicPeak attribution from gallery footers for a fully white-labeled experience", "hidePoweredByHelp": "Remove the PicPeak attribution from gallery footers for a fully white-labeled experience",