import type { ReactNode } from 'react' import { cn } from '@/lib/cn' export type SelectOptionItem = object export function getOptionValue(item: SelectOptionItem, key: string): unknown { return (item as Record)[key] } export function buildOutsideLabel(label: ReactNode | undefined, labelIcon: ReactNode | null, required?: boolean, iconOffsetPx = 4) { const hasLabelText = label !== undefined && label !== null && label !== '' if (!hasLabelText && !labelIcon) return label const iconOffsetClass = iconOffsetPx === 0 ? '' : iconOffsetPx === 2 ? 'translate-y-[2px]' : 'translate-y-[4px]' return ( {labelIcon ? {labelIcon} : null} {hasLabelText ? label : null} {required ? * : null} ) } export function unknownToDisplayString(value: unknown, fallback = ''): string { if (value === null || value === undefined) return fallback if (typeof value === 'string') return value if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') return String(value) return fallback } export function formatNumberInputDisplayValue(value: unknown, formatOptions?: Intl.NumberFormatOptions): string { if (value === undefined || value === null || value === '') return '' const number = typeof value === 'number' ? value : Number(value) if (!Number.isFinite(number)) return unknownToDisplayString(value) // Same Pinar baseline fix as formatNumber — U+066C sits high like an apostrophe. return new Intl.NumberFormat('fa-IR', formatOptions).format(number).replaceAll('\u066C', ',') }