// Small pure render helpers shared across swarm-ui pages. Not folded // into `@hive/shared` — swarm-ui's formatting choices aren't a // cross-package contract, and there's nothing here worth sharing. // Relative age, coarsened to one unit ("5m ago"). Built on the native // `Intl.RelativeTimeFormat` (no dependency needed — mara asked whether // a lightweight package was warranted; the runtime already ships this) // with `style: 'narrow'`, which produces the same "5s/5m/5h/5d ago" // shape the dashboard package's hand-rolled equivalent does, verified // against a real `Intl` call rather than assumed from the spec. const RTF = new Intl.RelativeTimeFormat("en", { numeric: "always", style: "narrow", }); // The same coarsening for an instant still ahead ("in 5m"). A separate // function rather than a negative `fmtAgo`: that one clamps to zero so a // clock a little ahead of the server never reads as "-3s ago". export function fmtUntil(secondsAhead: number): string { const ahead = Math.max(0, Math.floor(secondsAhead)); if (ahead < 60) return RTF.format(ahead, "second"); if (ahead < 3600) return RTF.format(Math.floor(ahead / 60), "minute"); if (ahead < 86400) return RTF.format(Math.floor(ahead / 3600), "hour"); return RTF.format(Math.floor(ahead / 86400), "day"); } export function fmtAgo(ageSeconds: number): string { const age = Math.max(0, Math.floor(ageSeconds)); if (age < 60) return RTF.format(-age, "second"); if (age < 3600) return RTF.format(-Math.floor(age / 60), "minute"); if (age < 86400) return RTF.format(-Math.floor(age / 3600), "hour"); return RTF.format(-Math.floor(age / 86400), "day"); }