Coloriginz Design Systemshadcn custom registry

@col/format

Versie: 1.0.0 Toegevoegd: 2026-08-06

Herkomst

Vier apps schreven elk hun eigen Nederlandse formattering. growerportal2/src/lib/format.ts is de meest complete: formatCurrency, formatCurrencyDetailed, formatNumber, formatPrice, formatDate, formatTime, formatFileSize — 283 aanroepen over 37 bestanden. floriday api/src/features/supply-search/format.ts is kleiner maar het meest doordacht: gepind op nl-NL en UTC, met een bewust behandeld negatief getal en een bewust behandelde onherkende valutacode. supplier-onboarding-vercel/src/lib/i18n.ts formatteert datum/tijd per taal via een Language → locale-mapping (nl, en, es, it). voorraadbeheer heeft geen gedeeld bestand: formatCurrency- en toLocaleDateString-aanroepen staan letterlijk gekopieerd op zes of meer pagina's, met een eigen localeMap per aanroepplek.

Dit item combineert de vier: de functieset van growerportal2, de edge-case-discipline van floriday, en de eis van supplier-onboarding/voorraadbeheer dat de locale een parameter is, geen aanname.

Waarvoor

Vijf pure functies voor het formatteren van een datum, tijd, getal, bedrag of bestandsgrootte naar een leesbare string — geen state, geen React, geen Intl-kennis nodig bij de aanroeper. Pak dit voor elke plek waar een Date, number of bytes-aantal aan een gebruiker getoond wordt. Gebruik het niet voor parsen (invoervelden, formuliervalidatie) — dit item gaat één kant op, waarde naar weergavestring.

Wat je app moet leveren

Niets — geen props, geen backend-contract. Vijf functies, direct importeren en aanroepen:

import { formatDate, formatTime, formatNumber, formatCurrency, formatFileSize } from '@/lib/format'

formatDate(new Date())                              // "06-08-2026"
formatDate(request.createdAt, { locale: 'en-GB' })   // "06/08/2026"
formatDate(auctionDate, { timeZone: 'UTC' })         // pin op UTC voor een tijdzone-loze datum

formatTime(new Date())                               // "14:05"

formatNumber(1234567.891)                            // "1.234.567,891"
formatNumber(count, { maximumFractionDigits: 0 })     // "1.235"

formatCurrency(1234.5)                                // "€ 1.234,50" (NBSP na €)
formatCurrency(total, { decimals: false })            // "€ 1.235"
formatCurrency(stukprijs, { decimals: 3 })            // "€ 1,500" — exact aantal decimalen
formatCurrency(amount, { locale: 'en-US', currency: 'USD' })

formatFileSize(file.size)                             // "2.4 MB"
function formatDate(value: Date | string, options?: Intl.DateTimeFormatOptions & { locale?: string }): string
function formatTime(value: Date | string, options?: Intl.DateTimeFormatOptions & { locale?: string }): string
function formatNumber(value: number, options?: Intl.NumberFormatOptions & { locale?: string }): string
function formatCurrency(value: number, options?: { locale?: string; currency?: string; decimals?: boolean | number }): string
function formatFileSize(bytes: number): string
Functie Standaard Opmerking
formatDate nl-NL, dd-mm-jjjj, geen tijdzone options (Intl.DateTimeFormatOptions) overschrijft per veld; timeZone gaat ongewijzigd door
formatTime nl-NL, uu:mm, geen tijdzone zelfde tijdzone-gedrag als formatDate
formatNumber nl-NL, geen eigen fractie-standaard options gaat ongewijzigd naar Intl.NumberFormat
formatCurrency nl-NL, EUR, 2 decimalen decimals is boolean | number: false → 0 decimalen, true/weglaten → 2, een getal (bv. 3) zet het exacte aantal; onherkende currency valt terug op "<bedrag> <code>" in plaats van te gooien
formatFileSize — binair (1024), niet decimaal (1000); geen locale-parameter, dit zijn geen Intl-eenheden

formatDate/formatTime accepteren zowel een Date als een ISO-string, zodat een waarde rechtstreeks uit een API-response (JSON kent geen Date-type) zonder tussenstap geformatteerd kan worden.

Bestanden

Bestand Landt in Soort
format.ts lib/format.ts beheerd

Geen registryDependencies, geen cssVars. Eén bestand, geen dependencies.

Gebruikt door

App Sinds versie Opmerkingen
— Nog niet vanuit dit item geïnstalleerd.

growerportal2 (283 aanroepen, 37 bestanden), floriday-middleware, supplier-onboarding-vercel en voorraadbeheer hebben elk hun eigen versie — dat is precies waar dit item uit samengesteld is (zie Herkomst). Wie een migratie oppakt: doe dat als eigen taak, niet als bijvangst (zie docs/specs/2026-08-06-v10-basisitems.md, Risico's) — growerportal2 alleen al is een grote zoek-en-vervang. Voeg hier een regel toe zodra een app is overgezet.

Bewuste keuzes

Bekende beperkingen