Update guest v2 branding and theming

This commit is contained in:
Codex Agent
2026-02-03 15:18:44 +01:00
parent a0ef90e13a
commit a820ef2e8b
57 changed files with 1416 additions and 277 deletions

View File

@@ -28,6 +28,10 @@ function resolveThemeVariant(
? 'dark'
: null;
if (appearanceOverride) {
return appearanceOverride;
}
if (mode === 'dark') {
return 'dark';
}
@@ -36,10 +40,6 @@ function resolveThemeVariant(
return 'light';
}
if (appearanceOverride) {
return appearanceOverride;
}
if (backgroundPrefers) {
return backgroundPrefers;
}

View File

@@ -0,0 +1,28 @@
import { DEFAULT_EVENT_BRANDING, useOptionalEventBranding } from '@/guest/context/EventBrandingContext';
import type { EventBranding } from '@/guest/types/event-branding';
import { useAppearance, type Appearance } from '@/hooks/use-appearance';
import { resolveGuestThemeName } from './brandingTheme';
export function resolveGuestThemeVariant(branding: EventBranding, appearance: Appearance): 'light' | 'dark' {
const themeName = resolveGuestThemeName(branding, appearance);
return themeName === 'guestNight' ? 'dark' : 'light';
}
export function useGuestThemeVariant(brandingOverride?: EventBranding | null): {
isDark: boolean;
variant: 'light' | 'dark';
themeName: 'guestLight' | 'guestNight';
branding: EventBranding;
} {
const { appearance, resolved } = useAppearance() as {
appearance?: Appearance;
resolved?: 'light' | 'dark';
};
const brandingContext = useOptionalEventBranding();
const branding = brandingOverride ?? brandingContext?.branding ?? DEFAULT_EVENT_BRANDING;
const appearanceMode = appearance ?? (resolved === 'dark' ? 'dark' : 'light');
const themeName = resolveGuestThemeName(branding, appearanceMode);
const variant = themeName === 'guestNight' ? 'dark' : 'light';
return { isDark: variant === 'dark', variant, themeName, branding };
}

View File

@@ -0,0 +1,18 @@
export type GuestToastPayload = {
text: string;
type?: 'success' | 'error' | 'info';
action?: { label: string; onClick: () => void };
durationMs?: number;
};
export function pushGuestToast(detail: GuestToastPayload) {
if (typeof window === 'undefined') {
return;
}
try {
window.dispatchEvent(new CustomEvent('guest-toast', { detail }));
} catch (error) {
console.warn('Dispatching toast event failed', error);
}
}