feat: Implement a new terminal dashboard featuring an analytics panel, sparklines, and foundational UI components and utilities.
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
import { type ClassValue, clsx } from "clsx";
|
||||
import { twMerge } from "tailwind-merge";
|
||||
|
||||
/**
|
||||
* Utility for merging tailwind classes safely.
|
||||
*/
|
||||
export function cn(...inputs: ClassValue[]) {
|
||||
return twMerge(clsx(inputs));
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a number as a currency string.
|
||||
*/
|
||||
export function formatCurrency(value: number, decimals: number = 2) {
|
||||
return new Intl.NumberFormat("en-US", {
|
||||
style: "currency",
|
||||
currency: "USD",
|
||||
minimumFractionDigits: decimals,
|
||||
maximumFractionDigits: decimals,
|
||||
}).format(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a percentage from midpoint.
|
||||
*/
|
||||
export function formatPercent(value: number) {
|
||||
return (value * 100).toFixed(1) + "%";
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts Fahrenheit to Celsius.
|
||||
*/
|
||||
export function fToC(f: number) {
|
||||
return ((f - 32) * 5) / 9;
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a date/time string to HH:MM:SS.
|
||||
*/
|
||||
export function formatTime(date: Date | string) {
|
||||
const d = typeof date === "string" ? new Date(date) : date;
|
||||
if (isNaN(d.getTime())) return String(date);
|
||||
return d.toLocaleTimeString("zh-CN", {
|
||||
hour12: false,
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user