// Date + label helpers shared across pages. const MONTHS = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', ] function parse(value) { if (!value) return null const d = new Date(value) return isNaN(d.getTime()) ? null : d } // "June 24, 2026" export function longDate(value) { const d = parse(value) if (!d) return '' return `${MONTHS[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}` } // "Jun 24" export function shortDate(value) { const d = parse(value) if (!d) return '' return `${MONTHS[d.getMonth()].slice(0, 3)} ${d.getDate()}` } // "Jun 26 18:55" export function dateTime(value) { const d = parse(value) if (!d) return '' const hh = String(d.getHours()).padStart(2, '0') const mm = String(d.getMinutes()).padStart(2, '0') return `${MONTHS[d.getMonth()].slice(0, 3)} ${d.getDate()} ${hh}:${mm}` } // { mon: 'JUN', num: "'26" } for the newsletter month tile export function monthTile(value) { const d = parse(value) if (!d) return { mon: '—', num: '' } return { mon: MONTHS[d.getMonth()].slice(0, 3).toUpperCase(), num: `'${String(d.getFullYear()).slice(2)}` } } // Compact relative time: "5m ago", "2h ago", "1d ago" export function ago(value) { const d = parse(value) if (!d) return '' const secs = Math.max(1, Math.floor((Date.now() - d.getTime()) / 1000)) if (secs < 60) return `${secs}s ago` const mins = Math.floor(secs / 60) if (mins < 60) return `${mins}m ago` const hrs = Math.floor(mins / 60) if (hrs < 24) return `${hrs}h ago` const days = Math.floor(hrs / 24) return `${days}d ago` } const CATEGORY_LABELS = { news: 'News', five_on_friday: 'Five on Friday', newsletter: 'Newsletter', screenshot: 'Screenshot', } export function categoryLabel(dbCategory) { return CATEGORY_LABELS[dbCategory] || dbCategory }