export type PortalTheme = 'violet' | 'slate' | 'blue' | 'emerald'; interface ThemeTokens { /** Gradient for the logo mark and login branding panel */ gradient: string; /** Text accent for the brand wordmark */ text: string; /** Active nav item background */ activeBg: string; /** Active nav item text */ activeText: string; /** Active left indicator bar */ bar: string; /** Ring/border tint used in login branding */ soft: string; } export const PORTAL_THEMES: Record = { violet: { gradient: 'bg-gradient-to-br from-violet-500 to-purple-700', text: 'text-violet-600', activeBg: 'bg-violet-50', activeText: 'text-violet-700', bar: 'bg-violet-600', soft: 'text-violet-100', }, slate: { gradient: 'bg-gradient-to-br from-slate-700 to-slate-900', text: 'text-slate-800', activeBg: 'bg-slate-100', activeText: 'text-slate-900', bar: 'bg-slate-800', soft: 'text-slate-200', }, blue: { gradient: 'bg-gradient-to-br from-blue-500 to-indigo-700', text: 'text-blue-600', activeBg: 'bg-blue-50', activeText: 'text-blue-700', bar: 'bg-blue-600', soft: 'text-blue-100', }, emerald: { gradient: 'bg-gradient-to-br from-emerald-500 to-teal-700', text: 'text-emerald-600', activeBg: 'bg-emerald-50', activeText: 'text-emerald-700', bar: 'bg-emerald-600', soft: 'text-emerald-100', }, }; export function initials(name?: string | null, email?: string | null): string { const source = (name ?? email ?? '?').trim(); const parts = source.split(/\s+/).filter(Boolean); if (parts.length >= 2) return (parts[0][0] + parts[1][0]).toUpperCase(); return source.slice(0, 2).toUpperCase(); }