// Adapted from jalcoui (MIT) — github.com/jal-co/ui /** * Author initials fallback for the avatar slot. Returns up to 2 uppercase * characters drawn from the first letter of each whitespace-separated word. */ export function initials(name: string): string { return name .split(/\s+/) .map((w) => w[0] ?? '') .join('') .toUpperCase() .slice(0, 2); } /** * Relative "x ago" formatter used on each commit row. Falls back to a * locale-formatted date once the gap exceeds a week. */ export function formatRelativeDate(date: string | Date): string { const d = typeof date === 'string' ? new Date(date) : date; const now = new Date(); const diffMs = now.getTime() - d.getTime(); const diffMins = Math.floor(diffMs / 60_000); const diffHours = Math.floor(diffMs / 3_600_000); const diffDays = Math.floor(diffMs / 86_400_000); if (diffMins < 1) return 'just now'; if (diffMins < 60) return `${diffMins}m ago`; if (diffHours < 24) return `${diffHours}h ago`; if (diffDays < 7) return `${diffDays}d ago`; return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: d.getFullYear() !== now.getFullYear() ? 'numeric' : undefined, }); } /** * Fully-qualified date shown inside the commit detail popover. */ export function formatFullDate(date: string | Date): string { const d = typeof date === 'string' ? new Date(date) : date; return d.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric', hour: 'numeric', minute: '2-digit', }); }