- Add CSS custom properties for surfaces, text, borders, accent, radius, font stacks - Add JetBrains Mono via next/font/google alongside Inter (both as CSS variables) - Upgrade cn() from naive filter/join to twMerge(clsx()) for proper Tailwind class merging - Standardize marketing section containers from max-w-7xl to max-w-6xl - Install tailwind-merge and clsx dependencies
28 lines
976 B
TypeScript
28 lines
976 B
TypeScript
export function formatDuration(ms: number | null | undefined): string {
|
|
if (ms === null || ms === undefined) return "—";
|
|
if (ms < 1000) return `${ms}ms`;
|
|
if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;
|
|
return `${(ms / 60000).toFixed(1)}m`;
|
|
}
|
|
|
|
export function formatRelativeTime(date: string | Date): string {
|
|
const now = new Date();
|
|
const then = typeof date === "string" ? new Date(date) : date;
|
|
const diffMs = now.getTime() - then.getTime();
|
|
const diffSec = Math.floor(diffMs / 1000);
|
|
if (diffSec < 60) return "just now";
|
|
const diffMin = Math.floor(diffSec / 60);
|
|
if (diffMin < 60) return `${diffMin}m ago`;
|
|
const diffHour = Math.floor(diffMin / 60);
|
|
if (diffHour < 24) return `${diffHour}h ago`;
|
|
const diffDay = Math.floor(diffHour / 24);
|
|
return `${diffDay}d ago`;
|
|
}
|
|
|
|
import { type ClassValue, clsx } from "clsx";
|
|
import { twMerge } from "tailwind-merge";
|
|
|
|
export function cn(...inputs: ClassValue[]) {
|
|
return twMerge(clsx(inputs));
|
|
}
|