From 5a93fbb0470813129813fcd2e1793342d64a82c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Sat, 21 Feb 2026 19:58:50 +0800 Subject: [PATCH] feat: add utility functions for formatting and animation --- src/lib/utils.ts | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/lib/utils.ts b/src/lib/utils.ts index bd0c391..b1c6dec 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -4,3 +4,51 @@ import { twMerge } from "tailwind-merge" export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) } + +export function formatNumber(num: number): string { + return new Intl.NumberFormat("zh-CN").format(num) +} + +export function formatCurrency(amount: number): string { + return new Intl.NumberFormat("zh-CN", { + style: "currency", + currency: "CNY", + }).format(amount) +} + +export function debounce unknown>( + func: T, + wait: number +): (...args: Parameters) => void { + let timeout: NodeJS.Timeout | null = null + return (...args: Parameters) => { + if (timeout) clearTimeout(timeout) + timeout = setTimeout(() => func(...args), wait) + } +} + +export function throttle unknown>( + func: T, + limit: number +): (...args: Parameters) => void { + let inThrottle: boolean + return (...args: Parameters) => { + if (!inThrottle) { + func(...args) + inThrottle = true + setTimeout(() => (inThrottle = false), limit) + } + } +} + +export function randomBetween(min: number, max: number): number { + return Math.random() * (max - min) + min +} + +export function lerp(start: number, end: number, t: number): number { + return start + (end - start) * t +} + +export function clamp(value: number, min: number, max: number): number { + return Math.min(Math.max(value, min), max) +}