@frank-auth/react
Version:
Flexible and customizable React UI components for Frank Authentication
1 lines • 2.42 kB
Source Map (JSON)
{"version":3,"file":"utils.cjs","sources":["../../../src/lib/utils.ts"],"sourcesContent":["import {type ClassValue, clsx} from \"clsx\";\nimport {twMerge} from \"tailwind-merge\";\n\n/**\n * Utility function to merge Tailwind CSS classes with clsx and tailwind-merge\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * Generate a unique ID for components\n */\nexport function generateId(prefix = 'hero-ui'): string {\n return `${prefix}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Debounce function for performance optimization\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\n/**\n * Check if a value is a valid React node\n */\nexport function isValidElement(value: any): boolean {\n return value !== null && value !== undefined && value !== '';\n}\n\n/**\n * Create ripple effect coordinates\n */\nexport function createRipple(\n event: React.MouseEvent<HTMLElement>,\n element: HTMLElement\n): { x: number; y: number; size: number } {\n const rect = element.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const size = Math.max(rect.width, rect.height);\n\n return { x, y, size };\n}\n\n/**\n * Convert size prop to numeric value\n */\nexport function getSizeValue(size: 'sm' | 'md' | 'lg' | 'xl'): number {\n const sizeMap = {\n sm: 32,\n md: 40,\n lg: 48,\n xl: 56,\n };\n return sizeMap[size] || sizeMap.md;\n}\n\n/**\n * Get contrast color for backgrounds\n */\nexport function getContrastColor(backgroundColor: string): 'light' | 'dark' {\n // Simple implementation - in a real app, you'd use a proper color contrast calculation\n const darkColors = ['primary', 'destructive', 'success'];\n return darkColors.includes(backgroundColor) ? 'light' : 'dark';\n}\n\n/**\n * Format validation error messages\n */\nexport function formatErrorMessage(error: string | undefined): string | undefined {\n if (!error) return undefined;\n return error.charAt(0).toUpperCase() + error.slice(1);\n}"],"names":["cn","inputs","twMerge","clsx"],"mappings":"oIAMO,SAASA,KAAMC,EAAsB,CACnC,OAAAC,EAAA,QAAQC,OAAKF,CAAM,CAAC,CAC7B"}