@frank-auth/react
Version:
Flexible and customizable React UI components for Frank Authentication
1 lines • 30.8 kB
Source Map (JSON)
{"version":3,"file":"theme.cjs","sources":["../../../src/utils/theme.ts"],"sourcesContent":["import type {\n ColorPalette,\n ColorPalettes,\n ComponentVariant,\n Theme,\n ThemeColors,\n ThemeCustomization,\n ThemeGeneratorOptions,\n ThemeMode,\n ThemeValidation\n} from '../types';\n\n// Color utilities\nexport const hexToHsl = (hex: string): [number, number, number] => {\n const r = Number.parseInt(hex.slice(1, 3), 16) / 255;\n const g = Number.parseInt(hex.slice(3, 5), 16) / 255;\n const b = Number.parseInt(hex.slice(5, 7), 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max === min) {\n h = s = 0; // achromatic\n } else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100)];\n};\n\nexport const hslToHex = (h: number, s: number, l: number): string => {\n h /= 360;\n s /= 100;\n l /= 100;\n\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1/6) return p + (q - p) * 6 * t;\n if (t < 1/2) return q;\n if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n };\n\n let r, g, b;\n\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n\n const toHex = (c: number) => {\n const hex = Math.round(c * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\nexport const adjustBrightness = (hex: string, amount: number): string => {\n const [h, s, l] = hexToHsl(hex);\n const newL = Math.max(0, Math.min(100, l + amount));\n return hslToHex(h, s, newL);\n};\n\nexport const adjustSaturation = (hex: string, amount: number): string => {\n const [h, s, l] = hexToHsl(hex);\n const newS = Math.max(0, Math.min(100, s + amount));\n return hslToHex(h, newS, l);\n};\n\nexport const adjustHue = (hex: string, amount: number): string => {\n const [h, s, l] = hexToHsl(hex);\n const newH = (h + amount + 360) % 360;\n return hslToHex(newH, s, l);\n};\n\nexport const getContrastRatio = (color1: string, color2: string): number => {\n const getLuminance = (hex: string): number => {\n const r = Number.parseInt(hex.slice(1, 3), 16) / 255;\n const g = Number.parseInt(hex.slice(3, 5), 16) / 255;\n const b = Number.parseInt(hex.slice(5, 7), 16) / 255;\n\n const gamma = (c: number) => c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n\n return 0.2126 * gamma(r) + 0.7152 * gamma(g) + 0.0722 * gamma(b);\n };\n\n const lum1 = getLuminance(color1);\n const lum2 = getLuminance(color2);\n const brightest = Math.max(lum1, lum2);\n const darkest = Math.min(lum1, lum2);\n\n return (brightest + 0.05) / (darkest + 0.05);\n};\n\nexport const isValidContrast = (color1: string, color2: string, level: 'AA' | 'AAA' = 'AA'): boolean => {\n const ratio = getContrastRatio(color1, color2);\n return level === 'AA' ? ratio >= 4.5 : ratio >= 7;\n};\n\nexport const findAccessibleColor = (\n baseColor: string,\n backgroundColor: string,\n level: 'AA' | 'AAA' = 'AA'\n): string => {\n const color = baseColor;\n const [h, s, l] = hexToHsl(color);\n\n // Try adjusting lightness first\n for (let adjustment = 0; adjustment <= 50; adjustment += 5) {\n // Try lighter\n const lighterL = Math.min(100, l + adjustment);\n const lighterColor = hslToHex(h, s, lighterL);\n if (isValidContrast(lighterColor, backgroundColor, level)) {\n return lighterColor;\n }\n\n // Try darker\n const darkerL = Math.max(0, l - adjustment);\n const darkerColor = hslToHex(h, s, darkerL);\n if (isValidContrast(darkerColor, backgroundColor, level)) {\n return darkerColor;\n }\n }\n\n // If lightness adjustment doesn't work, try pure black or white\n const white = '#ffffff';\n const black = '#000000';\n\n if (isValidContrast(white, backgroundColor, level)) {\n return white;\n }\n\n if (isValidContrast(black, backgroundColor, level)) {\n return black;\n }\n\n // Fallback to the original color\n return baseColor;\n};\n\n// Color palette generation\nexport const generateColorPalette = (baseColor: string): ColorPalette => {\n const [h, s, l] = hexToHsl(baseColor);\n\n return {\n 50: hslToHex(h, Math.max(10, s - 40), Math.min(95, l + 40)),\n 100: hslToHex(h, Math.max(20, s - 30), Math.min(90, l + 35)),\n 200: hslToHex(h, Math.max(30, s - 20), Math.min(85, l + 25)),\n 300: hslToHex(h, Math.max(40, s - 10), Math.min(75, l + 15)),\n 400: hslToHex(h, s, Math.min(65, l + 5)),\n 500: baseColor,\n 600: hslToHex(h, Math.min(100, s + 10), Math.max(35, l - 5)),\n 700: hslToHex(h, Math.min(100, s + 15), Math.max(25, l - 15)),\n 800: hslToHex(h, Math.min(100, s + 20), Math.max(15, l - 25)),\n 900: hslToHex(h, Math.min(100, s + 25), Math.max(10, l - 35)),\n 950: hslToHex(h, Math.min(100, s + 30), Math.max(5, l - 45)),\n DEFAULT: baseColor,\n foreground: findAccessibleColor(baseColor, '#ffffff'),\n };\n};\n\nexport const generateSemanticColors = (\n primary: string,\n mode: ThemeMode = 'light'\n): Pick<ThemeColors, 'success' | 'warning' | 'danger' | 'info'> => {\n const colors = {\n success: mode === 'light' ? '#22c55e' : '#16a34a',\n warning: mode === 'light' ? '#f59e0b' : '#d97706',\n danger: mode === 'light' ? '#ef4444' : '#dc2626',\n info: mode === 'light' ? '#3b82f6' : '#2563eb',\n };\n\n return colors;\n};\n\n// Theme mode utilities\nexport const getSystemTheme = (): 'light' | 'dark' => {\n if (typeof window === 'undefined') return 'light';\n\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n};\n\nexport const watchSystemTheme = (callback: (theme: 'light' | 'dark') => void): (() => void) => {\n if (typeof window === 'undefined') return () => {};\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const handler = (e: MediaQueryListEvent) => {\n callback(e.matches ? 'dark' : 'light');\n };\n\n mediaQuery.addEventListener('change', handler);\n\n return () => {\n mediaQuery.removeEventListener('change', handler);\n };\n};\n\nexport const resolveThemeMode = (mode: ThemeMode): 'light' | 'dark' => {\n if (mode === 'system') {\n return getSystemTheme();\n }\n return mode;\n};\n\n// CSS variable utilities\nexport const generateCSSVariables = (theme: Theme): Record<string, string> => {\n const variables: Record<string, string> = {};\n\n // Colors\n Object.entries(theme.colors).forEach(([key, value]) => {\n variables[`--frank-${key.replace(/([A-Z])/g, '-$1').toLowerCase()}`] = value;\n });\n\n // Spacing\n Object.entries(theme.spacing).forEach(([key, value]) => {\n variables[`--frank-spacing-${key}`] = value;\n });\n\n // Border radius\n Object.entries(theme.borderRadius).forEach(([key, value]) => {\n variables[`--frank-radius-${key}`] = value;\n });\n\n // Shadows\n Object.entries(theme.shadows).forEach(([key, value]) => {\n variables[`--frank-shadow-${key}`] = value;\n });\n\n // Typography\n Object.entries(theme.typography.fontSize).forEach(([key, [size, config]]) => {\n variables[`--frank-text-${key}`] = size;\n variables[`--frank-text-${key}-line-height`] = config.lineHeight;\n if (config.letterSpacing) {\n variables[`--frank-text-${key}-letter-spacing`] = config.letterSpacing;\n }\n });\n\n // Font weights\n Object.entries(theme.typography.fontWeight).forEach(([key, value]) => {\n variables[`--frank-font-${key}`] = value;\n });\n\n // Custom variables\n if (theme.cssVariables) {\n Object.entries(theme.cssVariables).forEach(([key, value]) => {\n variables[key.startsWith('--') ? key : `--${key}`] = value;\n });\n }\n\n return variables;\n};\n\nexport const applyCSSVariables = (variables: Record<string, string>, element?: HTMLElement): void => {\n const target = element || document.documentElement;\n\n Object.entries(variables).forEach(([key, value]) => {\n target.style.setProperty(key, value);\n });\n};\n\nexport const removeCSSVariables = (keys: string[], element?: HTMLElement): void => {\n const target = element || document.documentElement;\n\n keys.forEach(key => {\n target.style.removeProperty(key);\n });\n};\n\n// Theme generation\nexport const generateTheme = (options: ThemeGeneratorOptions): Partial<Theme> => {\n const { primaryColor, secondaryColor, mode, colorHarmony } = options;\n\n const primaryPalette = generateColorPalette(primaryColor);\n const secondaryPalette = secondaryColor\n ? generateColorPalette(secondaryColor)\n : generateColorPalette(adjustHue(primaryColor, 30));\n\n // Generate neutral palette\n const neutralBase = mode === 'light' ? '#6b7280' : '#9ca3af';\n const neutralPalette = generateColorPalette(neutralBase);\n\n // Generate semantic colors\n const semanticColors = generateSemanticColors(primaryColor, mode);\n\n const colors: ThemeColors = {\n background: mode === 'light' ? '#ffffff' : '#0f172a',\n foreground: mode === 'light' ? '#0f172a' : '#f8fafc',\n\n content1: mode === 'light' ? '#ffffff' : '#18181b',\n content2: mode === 'light' ? '#f4f4f5' : '#27272a',\n content3: mode === 'light' ? '#e4e4e7' : '#3f3f46',\n content4: mode === 'light' ? '#d4d4d8' : '#52525b',\n\n primary: primaryPalette,\n primaryForeground: findAccessibleColor('#ffffff', primaryPalette[500]),\n\n secondary: secondaryPalette,\n secondaryForeground: findAccessibleColor('#ffffff', secondaryPalette[500]),\n\n accent: primaryPalette[600],\n accentForeground: findAccessibleColor('#ffffff', primaryPalette[600]),\n\n muted: neutralPalette[100],\n mutedForeground: neutralPalette[600],\n\n border: mode === 'light' ? neutralPalette[200] : neutralPalette[800],\n divider: mode === 'light' ? neutralPalette[100] : neutralPalette[800],\n\n input: mode === 'light' ? '#ffffff' : '#27272a',\n inputForeground: mode === 'light' ? '#0f172a' : '#f8fafc',\n\n focus: primaryPalette[500],\n focusVisible: primaryPalette[500],\n\n overlay: mode === 'light' ? 'rgba(0, 0, 0, 0.5)' : 'rgba(0, 0, 0, 0.8)',\n\n success: semanticColors.success,\n successForeground: findAccessibleColor('#ffffff', semanticColors.success),\n warning: semanticColors.warning,\n warningForeground: findAccessibleColor('#ffffff', semanticColors.warning),\n danger: semanticColors.danger,\n dangerForeground: findAccessibleColor('#ffffff', semanticColors.danger),\n info: semanticColors.info,\n infoForeground: findAccessibleColor('#ffffff', semanticColors.info),\n\n selection: primaryPalette[100],\n selectionForeground: primaryPalette[900],\n\n disabled: neutralPalette[300],\n disabledForeground: neutralPalette[500],\n card: '',\n cardForeground: '',\n popover: '',\n popoverForeground: '',\n ring: '',\n destructive: '',\n destructiveForeground: ''\n };\n\n const palette: ColorPalettes = {\n primary: primaryPalette,\n secondary: secondaryPalette,\n neutral: neutralPalette,\n success: generateColorPalette(semanticColors.success),\n warning: generateColorPalette(semanticColors.warning),\n danger: generateColorPalette(semanticColors.danger),\n info: generateColorPalette(semanticColors.info),\n };\n\n return {\n name: `Generated ${mode} theme`,\n mode,\n colors,\n palette,\n };\n};\n\n// Theme validation\nexport const validateTheme = (theme: Partial<Theme>): ThemeValidation => {\n const errors: string[] = [];\n const warnings: string[] = [];\n const contrastRatios: Record<string, number> = {};\n\n if (!theme.colors) {\n errors.push('Theme must have colors defined');\n return {\n valid: false,\n errors,\n warnings,\n accessibility: {\n contrastRatios,\n wcagLevel: 'fail',\n },\n };\n }\n\n // Check required colors\n const requiredColors = ['background', 'foreground', 'primary', 'primaryForeground'];\n for (const color of requiredColors) {\n if (!(color in theme.colors)) {\n errors.push(`Missing required color: ${color}`);\n }\n }\n\n // Check contrast ratios\n const checkContrast = (colorKey: string, backgroundKey: string) => {\n const color = theme.colors![colorKey as keyof ThemeColors];\n const background = theme.colors![backgroundKey as keyof ThemeColors];\n\n if (color && background) {\n const ratio = getContrastRatio(typeof color === 'string' ? color : color.DEFAULT, typeof background === 'string' ? background : background.DEFAULT);\n contrastRatios[`${colorKey}/${backgroundKey}`] = ratio;\n\n if (ratio < 4.5) {\n warnings.push(`Low contrast ratio for ${colorKey} on ${backgroundKey}: ${ratio.toFixed(2)}`);\n }\n }\n };\n\n checkContrast('foreground', 'background');\n checkContrast('primaryForeground', 'primary');\n checkContrast('secondaryForeground', 'secondary');\n checkContrast('successForeground', 'success');\n checkContrast('warningForeground', 'warning');\n checkContrast('dangerForeground', 'danger');\n checkContrast('infoForeground', 'info');\n\n // Determine WCAG level\n const minRatio = Math.min(...Object.values(contrastRatios));\n let wcagLevel: 'A' | 'AA' | 'AAA' | 'fail';\n\n if (minRatio >= 7) {\n wcagLevel = 'AAA';\n } else if (minRatio >= 4.5) {\n wcagLevel = 'AA';\n } else if (minRatio >= 3) {\n wcagLevel = 'A';\n } else {\n wcagLevel = 'fail';\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n accessibility: {\n contrastRatios,\n wcagLevel,\n },\n };\n};\n\n// Theme merging utilities\nexport const mergeThemes = (baseTheme: Theme, customization: ThemeCustomization): Theme => {\n const merged: Theme = { ...baseTheme };\n\n if (customization.colors) {\n merged.colors = { ...merged.colors, ...customization.colors };\n }\n\n if (customization.typography) {\n merged.typography = {\n ...merged.typography,\n ...customization.typography,\n };\n }\n\n if (customization.spacing) {\n merged.spacing = { ...merged.spacing, ...customization.spacing };\n }\n\n if (customization.components) {\n merged.components = {\n ...merged.components,\n ...customization.components,\n };\n }\n\n if (customization.cssVariables) {\n merged.cssVariables = {\n ...merged.cssVariables,\n ...customization.cssVariables,\n };\n }\n\n if (customization.custom) {\n merged.custom = {\n ...merged.custom,\n ...customization.custom,\n };\n }\n\n return merged;\n};\n\n// Component variant utilities\nexport const getComponentVariant = (\n theme: Theme,\n component: string,\n variant: string,\n color = 'default'\n): ComponentVariant | undefined => {\n const componentVariants = theme.components[component as keyof typeof theme.components];\n if (!componentVariants) return undefined;\n\n const variantConfig = componentVariants[variant as keyof typeof componentVariants];\n if (!variantConfig || typeof variantConfig !== 'object') return undefined;\n\n return variantConfig as ComponentVariant;\n};\n\nexport const getComponentStyles = (\n theme: Theme,\n component: string,\n variant: string,\n color = 'default',\n size = 'md'\n): string => {\n const variantConfig = getComponentVariant(theme, component, variant, color);\n if (!variantConfig) return '';\n\n let styles = variantConfig.base || '';\n\n // Add color styles\n const colorStyles = variantConfig.colors?.[color as keyof typeof variantConfig.colors];\n if (colorStyles) {\n styles += ` ${colorStyles.background || ''} ${colorStyles.foreground || ''} ${colorStyles.border || ''}`;\n }\n\n // Add size styles\n const sizeStyles = variantConfig.sizes?.[size as keyof typeof variantConfig.sizes];\n if (sizeStyles) {\n styles += ` ${sizeStyles}`;\n }\n\n return styles.trim();\n};\n\n// Storage utilities for theme persistence\nexport const saveThemeToStorage = (theme: string, mode: ThemeMode): void => {\n if (typeof window === 'undefined') return;\n\n try {\n localStorage.setItem('frank-auth-theme', theme);\n localStorage.setItem('frank-auth-theme-mode', mode);\n } catch {\n // Ignore storage errors\n }\n};\n\nexport const loadThemeFromStorage = (): { theme?: string; mode?: ThemeMode } => {\n if (typeof window === 'undefined') return {};\n\n try {\n const theme = localStorage.getItem('frank-auth-theme');\n const mode = localStorage.getItem('frank-auth-theme-mode') as ThemeMode;\n\n return {\n theme: theme || undefined,\n mode: mode || undefined,\n };\n } catch {\n return {};\n }\n};\n\n// Export utilities object\nexport const ThemeUtils = {\n // Color utilities\n hexToHsl,\n hslToHex,\n adjustBrightness,\n adjustSaturation,\n adjustHue,\n getContrastRatio,\n isValidContrast,\n findAccessibleColor,\n\n // Palette generation\n generateColorPalette,\n generateSemanticColors,\n\n // Theme mode\n getSystemTheme,\n watchSystemTheme,\n resolveThemeMode,\n\n // CSS variables\n generateCSSVariables,\n applyCSSVariables,\n removeCSSVariables,\n\n // Theme generation\n generateTheme,\n validateTheme,\n mergeThemes,\n\n // Component utilities\n getComponentVariant,\n getComponentStyles,\n\n // Storage\n saveThemeToStorage,\n loadThemeFromStorage,\n};"],"names":["hexToHsl","hex","r","g","b","max","min","h","s","l","d","hslToHex","hue2rgb","p","q","t","toHex","c","adjustBrightness","amount","newL","adjustSaturation","newS","adjustHue","newH","getContrastRatio","color1","color2","getLuminance","gamma","lum1","lum2","brightest","darkest","isValidContrast","level","ratio","findAccessibleColor","baseColor","backgroundColor","color","adjustment","lighterL","lighterColor","darkerL","darkerColor","white","black","generateColorPalette","generateSemanticColors","primary","mode","getSystemTheme","watchSystemTheme","callback","mediaQuery","handler","e","resolveThemeMode","generateCSSVariables","theme","variables","key","value","size","config","applyCSSVariables","element","target","removeCSSVariables","keys","generateTheme","options","primaryColor","secondaryColor","colorHarmony","primaryPalette","secondaryPalette","neutralPalette","semanticColors","colors","palette","validateTheme","errors","warnings","contrastRatios","requiredColors","checkContrast","colorKey","backgroundKey","background","minRatio","wcagLevel","mergeThemes","baseTheme","customization","merged","getComponentVariant","component","variant","componentVariants","variantConfig","getComponentStyles","styles","colorStyles","sizeStyles","saveThemeToStorage","loadThemeFromStorage","ThemeUtils"],"mappings":"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"}