{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "format",
  "title": "Format",
  "description": "Number and byte formatting shared by every ikada component: compact, grouped and locale-aware.",
  "registryDependencies": [],
  "files": [
    {
      "path": "registry/ikada/lib/ikada/format.ts",
      "content": "/**\n * Number formatting shared by every component. Defaults to `en` so a machine whose\n * locale groups with dots never shows \"860.000 of 1.000.000\" next to \"1.28M\". Pass a\n * `locale` (or set it once with `LocaleProvider`) to change it.\n */\nexport const DEFAULT_LOCALE = \"en\";\n\nconst cache = new Map<string, Intl.NumberFormat>();\n\nfunction formatter(locale: string, options: Intl.NumberFormatOptions): Intl.NumberFormat {\n  const key = `${locale}|${JSON.stringify(options)}`;\n  let f = cache.get(key);\n  if (!f) {\n    f = new Intl.NumberFormat(locale, options);\n    cache.set(key, f);\n  }\n  return f;\n}\n\nexport interface FormatOptions {\n  locale?: string;\n  /** Most fraction digits shown. Defaults: 3 for `formatNumber`, 2 for `formatCompact`. */\n  maximumFractionDigits?: number;\n}\n\n/** Full number with grouping: 860000 becomes \"860,000\". */\nexport function formatNumber(\n  n: number,\n  { locale = DEFAULT_LOCALE, maximumFractionDigits = 3 }: FormatOptions = {},\n): string {\n  return formatter(locale, { maximumFractionDigits }).format(n);\n}\n\n/** Compact units for large values: 860000 becomes \"860K\", 1280000 becomes \"1.28M\". Under 1,000 it is the plain number. */\nexport function formatCompact(\n  n: number,\n  { locale = DEFAULT_LOCALE, maximumFractionDigits = 2 }: FormatOptions = {},\n): string {\n  return formatter(locale, { notation: \"compact\", maximumFractionDigits }).format(n);\n}\n\nconst byteUnits = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"] as const;\n\n/** Decimal (1000-based) byte sizes: 1536 becomes \"1.5 KB\", 12 becomes \"12 B\". */\nexport function formatBytes(\n  bytes: number,\n  { locale = DEFAULT_LOCALE, maximumFractionDigits = 1 }: FormatOptions = {},\n): string {\n  if (!Number.isFinite(bytes)) return String(bytes);\n  const abs = Math.abs(bytes);\n  const exp = abs < 1000 ? 0 : Math.min(byteUnits.length - 1, Math.floor(Math.log10(abs) / 3));\n  const value = bytes / 1000 ** exp;\n  return `${formatter(locale, { maximumFractionDigits: exp === 0 ? 0 : maximumFractionDigits }).format(value)} ${byteUnits[exp]}`;\n}\n",
      "type": "registry:lib",
      "target": "@components/ikada/lib/format.ts"
    }
  ],
  "categories": [
    "utilities"
  ],
  "type": "registry:lib"
}