| import * as React from "react" | |
| import { clsx, type ClassValue } from "clsx" | |
| import { twMerge } from "tailwind-merge" | |
| export function cn(...inputs: ClassValue[]) { | |
| return twMerge(clsx(inputs)) | |
| } | |
| export function useIsMobileScreen(breakpoint?: string) { | |
| const [isMobileScreen, setIsMobileScreen] = React.useState(false) | |
| React.useEffect(() => { | |
| const mql = window.matchMedia(`(max-width: ${breakpoint ?? "768px"})`) | |
| setIsMobileScreen(mql.matches) | |
| const listener = () => setIsMobileScreen(mql.matches) | |
| mql.addEventListener("change", listener) | |
| return () => mql.removeEventListener("change", listener) | |
| }, [breakpoint]) | |
| return isMobileScreen | |
| } | |
| export function formatNumber(num: number, decimals: number = 1): string { | |
| if (num === 0) return "0" | |
| const k = 1000 | |
| const sizes = ["", "K", "M", "B", "T"] | |
| const i = Math.floor(Math.log(Math.abs(num)) / Math.log(k)) | |
| if (i === 0) return num.toString() | |
| const scaled = num / Math.pow(k, i) | |
| return `${scaled.toFixed(decimals)}${sizes[i]}` | |
| } | |