cn utility
cinatra-ai/utilsFreeUtility
Tailwind class-merge helper (clsx + tailwind-merge).
Live preview
live · rendered by the registry
Rendered by @cinatra-ai on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://raw.githubusercontent.com/cinatra-ai/cinatra/main/public/r/utils.jsonSource
1import { clsx, type ClassValue } from "clsx";2import { twMerge } from "tailwind-merge";34export function cn(...inputs: ClassValue[]) {5 return twMerge(clsx(inputs));6}78export function slugify(value: string) {9 return value10 .toLowerCase()11 .normalize("NFKD")12 .replace(/[^\w\s-]/g, "")13 .trim()14 .replace(/[\s_-]+/g, "-")15 .replace(/^-+|-+$/g, "");16}1718export function formatCurrencyMillions(value?: number | null) {19 if (value === undefined || value === null || Number.isNaN(value)) {20 return "Undisclosed";21 }2223 return `$${value.toFixed(2)}M`;24}2526export function firstName(fullName?: string) {27 if (!fullName) {28 return undefined;29 }3031 return fullName.split(/\s+/)[0];32}3334export function quarterLabel(quarterId: string) {35 return quarterId.replace("-", " ");36}3738export function asArray(value: string | string[] | undefined) {39 if (value === undefined) {40 return [];41 }4243 return Array.isArray(value) ? value : [value];44}4546export function compareValues(a: string | number | null | undefined, b: string | number | null | undefined) {47 if (typeof a === "number" && typeof b === "number") {48 return a - b;49 }5051 return String(a ?? "").localeCompare(String(b ?? ""), undefined, { sensitivity: "base" });52}5354export function getPageNumbers(55 currentPage: number,56 totalPages: number57): (number | '...')[] {58 if (totalPages <= 7) {59 return Array.from({ length: totalPages }, (_, i) => i + 1);60 }61 if (currentPage <= 4) {62 return [1, 2, 3, 4, 5, '...', totalPages];63 }64 if (currentPage >= totalPages - 3) {65 return [1, '...', totalPages - 4, totalPages - 3, totalPages - 2, totalPages - 1, totalPages];66 }67 return [1, '...', currentPage - 1, currentPage, currentPage + 1, '...', totalPages];68}
What it pulls in
npm packages
