UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

1 lines 30.1 kB
{"version":3,"file":"appearance.cjs","sources":["../../../src/config/appearance.ts"],"sourcesContent":["/**\n * @frank-auth/react - Appearance Configuration\n *\n * Advanced appearance management system with component-level customization,\n * branding integration, and responsive design support.\n */\n\nimport type {\n AppearanceConfig,\n BrandingConfig,\n ColorVariant,\n ComponentAppearance,\n ComponentSize,\n OrganizationConfig,\n} from './types';\n\nimport {\n DEFAULT_APPEARANCE_CONFIG,\n DEFAULT_BRANDING_CONFIG,\n DEFAULT_COMPONENT_APPEARANCE,\n DEFAULT_LAYOUT_CONFIG,\n} from './defaults';\n\n// ============================================================================\n// Component Variant Configurations\n// ============================================================================\n\n/**\n * Input component appearance variants\n */\nexport const INPUT_VARIANTS = {\n flat: {\n className: 'bg-default-100 hover:bg-default-200 focus:bg-default-100',\n style: {\n backgroundColor: 'hsl(var(--color-default-100))',\n border: 'none',\n borderRadius: 'var(--border-radius-md)',\n },\n },\n bordered: {\n className: 'border-2 border-default-200 hover:border-default-300 focus:border-primary',\n style: {\n backgroundColor: 'transparent',\n border: '2px solid hsl(var(--color-default-200))',\n borderRadius: 'var(--border-radius-md)',\n },\n },\n underlined: {\n className: 'border-b-2 border-default-300 hover:border-default-400 focus:border-primary',\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n borderBottom: '2px solid hsl(var(--color-default-300))',\n borderRadius: '0',\n },\n },\n faded: {\n className: 'bg-default-50 hover:bg-default-100 focus:bg-default-100 border border-default-200',\n style: {\n backgroundColor: 'hsl(var(--color-default-50))',\n border: '1px solid hsl(var(--color-default-200))',\n borderRadius: 'var(--border-radius-md)',\n },\n },\n} as const;\n\n/**\n * Button component appearance variants\n */\nexport const BUTTON_VARIANTS = {\n solid: {\n className: 'bg-primary text-primary-foreground hover:bg-primary-600 focus:bg-primary-700',\n style: {\n backgroundColor: 'hsl(var(--color-primary))',\n color: 'hsl(var(--color-primary-foreground))',\n border: 'none',\n },\n },\n bordered: {\n className: 'border-2 border-primary text-primary hover:bg-primary hover:text-primary-foreground',\n style: {\n backgroundColor: 'transparent',\n color: 'hsl(var(--color-primary))',\n border: '2px solid hsl(var(--color-primary))',\n },\n },\n light: {\n className: 'bg-primary-100 text-primary-700 hover:bg-primary-200',\n style: {\n backgroundColor: 'hsl(var(--color-primary-100))',\n color: 'hsl(var(--color-primary-700))',\n border: 'none',\n },\n },\n flat: {\n className: 'bg-default-100 text-default-700 hover:bg-default-200',\n style: {\n backgroundColor: 'hsl(var(--color-default-100))',\n color: 'hsl(var(--color-default-700))',\n border: 'none',\n },\n },\n faded: {\n className: 'bg-default-50 text-default-700 hover:bg-default-100 border border-default-200',\n style: {\n backgroundColor: 'hsl(var(--color-default-50))',\n color: 'hsl(var(--color-default-700))',\n border: '1px solid hsl(var(--color-default-200))',\n },\n },\n shadow: {\n className: 'bg-primary text-primary-foreground hover:bg-primary-600 shadow-lg hover:shadow-xl',\n style: {\n backgroundColor: 'hsl(var(--color-primary))',\n color: 'hsl(var(--color-primary-foreground))',\n border: 'none',\n boxShadow: 'var(--shadow-lg)',\n },\n },\n ghost: {\n className: 'text-primary hover:bg-primary-100 hover:text-primary-700',\n style: {\n backgroundColor: 'transparent',\n color: 'hsl(var(--color-primary))',\n border: 'none',\n },\n },\n} as const;\n\n/**\n * Card component appearance variants\n */\nexport const CARD_VARIANTS = {\n shadow: {\n className: 'bg-card text-card-foreground shadow-md',\n style: {\n backgroundColor: 'hsl(var(--color-card))',\n color: 'hsl(var(--color-card-foreground))',\n boxShadow: 'var(--shadow-md)',\n },\n },\n bordered: {\n className: 'bg-card text-card-foreground border border-border',\n style: {\n backgroundColor: 'hsl(var(--color-card))',\n color: 'hsl(var(--color-card-foreground))',\n border: '1px solid hsl(var(--color-border))',\n },\n },\n flat: {\n className: 'bg-default-50 text-default-900',\n style: {\n backgroundColor: 'hsl(var(--color-default-50))',\n color: 'hsl(var(--color-default-900))',\n },\n },\n} as const;\n\n// ============================================================================\n// Size Configurations\n// ============================================================================\n\n/**\n * Component size configurations\n */\nexport const SIZE_CONFIGS = {\n sm: {\n padding: 'var(--spacing-sm)',\n fontSize: 'var(--font-size-sm)',\n height: '32px',\n minHeight: '32px',\n },\n md: {\n padding: 'var(--spacing-md)',\n fontSize: 'var(--font-size-base)',\n height: '40px',\n minHeight: '40px',\n },\n lg: {\n padding: 'var(--spacing-lg)',\n fontSize: 'var(--font-size-lg)',\n height: '48px',\n minHeight: '48px',\n },\n} as const;\n\n/**\n * Modal size configurations\n */\nexport const MODAL_SIZES = {\n xs: { width: '320px', maxWidth: '90vw' },\n sm: { width: '400px', maxWidth: '90vw' },\n md: { width: '512px', maxWidth: '90vw' },\n lg: { width: '640px', maxWidth: '90vw' },\n xl: { width: '768px', maxWidth: '90vw' },\n '2xl': { width: '896px', maxWidth: '95vw' },\n '3xl': { width: '1024px', maxWidth: '95vw' },\n '4xl': { width: '1280px', maxWidth: '95vw' },\n '5xl': { width: '1536px', maxWidth: '95vw' },\n full: { width: '100vw', height: '100vh', maxWidth: '100vw', maxHeight: '100vh' },\n} as const;\n\n// ============================================================================\n// Responsive Breakpoints\n// ============================================================================\n\n/**\n * Responsive breakpoints\n */\nexport const BREAKPOINTS = {\n sm: '640px',\n md: '768px',\n lg: '1024px',\n xl: '1280px',\n '2xl': '1536px',\n} as const;\n\n/**\n * Responsive utilities\n */\nexport const RESPONSIVE_UTILITIES = {\n /**\n * Check if screen size matches breakpoint\n */\n isBreakpoint: (breakpoint: keyof typeof BREAKPOINTS): boolean => {\n if (typeof window === 'undefined') return false;\n return window.matchMedia(`(min-width: ${BREAKPOINTS[breakpoint]})`).matches;\n },\n\n /**\n * Get current breakpoint\n */\n getCurrentBreakpoint: (): keyof typeof BREAKPOINTS => {\n if (typeof window === 'undefined') return 'md';\n\n const breakpoints = Object.entries(BREAKPOINTS).reverse();\n for (const [name, size] of breakpoints) {\n if (window.matchMedia(`(min-width: ${size})`).matches) {\n return name as keyof typeof BREAKPOINTS;\n }\n }\n return 'sm';\n },\n\n /**\n * Create responsive value getter\n */\n getResponsiveValue: <T>(values: Partial<Record<keyof typeof BREAKPOINTS, T>>, fallback: T): T => {\n const currentBreakpoint = RESPONSIVE_UTILITIES.getCurrentBreakpoint();\n const orderedBreakpoints: (keyof typeof BREAKPOINTS)[] = ['2xl', 'xl', 'lg', 'md', 'sm'];\n\n // Find the first matching value from current breakpoint down\n const currentIndex = orderedBreakpoints.indexOf(currentBreakpoint);\n for (let i = currentIndex; i < orderedBreakpoints.length; i++) {\n const breakpoint = orderedBreakpoints[i];\n if (values[breakpoint] !== undefined) {\n return values[breakpoint]!;\n }\n }\n\n return fallback;\n },\n};\n\n// ============================================================================\n// Appearance Manager Class\n// ============================================================================\n\nexport class AppearanceManager {\n private config: AppearanceConfig;\n private listeners: Set<(config: AppearanceConfig) => void> = new Set();\n\n constructor(initialConfig?: Partial<AppearanceConfig>) {\n this.config = this.mergeAppearanceConfig(DEFAULT_APPEARANCE_CONFIG, initialConfig);\n }\n\n /**\n * Get current appearance configuration\n */\n getConfig(): AppearanceConfig {\n return { ...this.config };\n }\n\n /**\n * Update appearance configuration\n */\n updateConfig(updates: Partial<AppearanceConfig>): void {\n this.config = this.mergeAppearanceConfig(this.config, updates);\n this.notifyListeners();\n }\n\n /**\n * Apply organization branding\n */\n applyOrganizationBranding(organization: OrganizationConfig): void {\n const branding: BrandingConfig = {\n logo: {\n url: organization.settings.branding?.logo,\n alt: organization.name,\n },\n colors: {\n primary: organization.settings.branding?.primaryColor || this.config.branding.colors.primary,\n secondary: organization.settings.branding?.secondaryColor || this.config.branding.colors.secondary,\n },\n fonts: this.config.branding.fonts,\n customCSS: organization.settings.branding?.customCSS,\n };\n\n this.updateConfig({ branding });\n }\n\n /**\n * Get component styles for a specific component\n */\n getComponentStyles(\n componentType: keyof ComponentAppearance,\n variant?: string,\n size?: ComponentSize,\n color?: ColorVariant\n ): {\n className: string;\n style: React.CSSProperties;\n } {\n const componentConfig = this.config.components[componentType];\n\n // Get base styles\n let styles = this.getBaseComponentStyles(componentType, componentConfig);\n\n // Apply variant styles\n if (variant) {\n const variantStyles = this.getVariantStyles(componentType, variant);\n styles = this.mergeStyles(styles, variantStyles);\n }\n\n // Apply size styles\n const actualSize = size || (componentConfig as any)?.size || 'md';\n const sizeStyles = this.getSizeStyles(actualSize);\n styles = this.mergeStyles(styles, sizeStyles);\n\n // Apply color styles\n if (color) {\n const colorStyles = this.getColorStyles(color);\n styles = this.mergeStyles(styles, colorStyles);\n }\n\n return styles;\n }\n\n /**\n * Get layout styles\n */\n getLayoutStyles(): React.CSSProperties {\n return {\n '--container-max-width': this.config.layout.containerMaxWidth,\n '--sidebar-width': this.config.layout.sidebarWidth,\n '--header-height': this.config.layout.headerHeight,\n '--footer-height': this.config.layout.footerHeight,\n '--content-padding': this.config.layout.contentPadding,\n } as React.CSSProperties;\n }\n\n /**\n * Get branding CSS variables\n */\n getBrandingVariables(): Record<string, string> {\n const { branding } = this.config;\n return {\n '--brand-primary': branding.colors.primary,\n '--brand-secondary': branding.colors.secondary,\n '--brand-accent': branding.colors.accent || branding.colors.primary,\n '--brand-font-primary': branding.fonts.primary,\n '--brand-font-secondary': branding.fonts.secondary || branding.fonts.primary,\n };\n }\n\n /**\n * Generate complete CSS for appearance\n */\n generateCSS(): string {\n const brandingVars = this.getBrandingVariables();\n const layoutStyles = this.getLayoutStyles();\n\n let css = ':root {\\n';\n\n // Add branding variables\n Object.entries(brandingVars).forEach(([property, value]) => {\n css += ` ${property}: ${value};\\n`;\n });\n\n // Add layout variables\n Object.entries(layoutStyles).forEach(([property, value]) => {\n css += ` ${property}: ${value};\\n`;\n });\n\n css += '}\\n\\n';\n\n // Add custom CSS if provided\n if (this.config.customCSS) {\n css += this.config.customCSS + '\\n';\n }\n\n if (this.config.branding.customCSS) {\n css += this.config.branding.customCSS + '\\n';\n }\n\n return css;\n }\n\n /**\n * Apply appearance to DOM\n */\n applyToDOM(): void {\n if (typeof document === 'undefined') return;\n\n // Apply CSS variables\n const brandingVars = this.getBrandingVariables();\n const layoutStyles = this.getLayoutStyles();\n const root = document.documentElement;\n\n Object.entries({ ...brandingVars, ...layoutStyles }).forEach(([property, value]) => {\n root.style.setProperty(property, value);\n });\n\n // Apply custom CSS if not already applied\n const customCSSId = 'frank-auth-custom-css';\n let styleEl = document.getElementById(customCSSId) as HTMLStyleElement;\n\n if (!styleEl) {\n styleEl = document.createElement('style');\n styleEl.id = customCSSId;\n document.head.appendChild(styleEl);\n }\n\n const customCSS = [this.config.customCSS, this.config.branding.customCSS]\n .filter(Boolean)\n .join('\\n');\n\n styleEl.textContent = customCSS;\n }\n\n /**\n * Subscribe to appearance changes\n */\n subscribe(callback: (config: AppearanceConfig) => void): () => void {\n this.listeners.add(callback);\n return () => {\n this.listeners.delete(callback);\n };\n }\n\n // Private methods\n\n private mergeAppearanceConfig(\n base: AppearanceConfig,\n override?: Partial<AppearanceConfig>\n ): AppearanceConfig {\n if (!override) return { ...base };\n\n return {\n ...base,\n ...override,\n layout: { ...base.layout, ...override.layout },\n components: { ...base.components, ...override.components },\n branding: {\n ...base.branding,\n ...override.branding,\n logo: { ...base.branding.logo, ...override.branding?.logo },\n colors: { ...base.branding.colors, ...override.branding?.colors },\n fonts: { ...base.branding.fonts, ...override.branding?.fonts },\n },\n };\n }\n\n private getBaseComponentStyles(\n componentType: keyof ComponentAppearance,\n config: any\n ): { className: string; style: React.CSSProperties } {\n return {\n className: `frank-${componentType}`,\n style: {\n borderRadius: `var(--border-radius-${config?.radius || 'md'})`,\n transition: 'all var(--duration-normal) var(--easing-ease-out)',\n },\n };\n }\n\n private getVariantStyles(\n componentType: keyof ComponentAppearance,\n variant: string\n ): { className: string; style: React.CSSProperties } {\n switch (componentType) {\n case 'input':\n return INPUT_VARIANTS[variant as keyof typeof INPUT_VARIANTS] || INPUT_VARIANTS.bordered;\n case 'button':\n return BUTTON_VARIANTS[variant as keyof typeof BUTTON_VARIANTS] || BUTTON_VARIANTS.solid;\n case 'card':\n return CARD_VARIANTS[variant as keyof typeof CARD_VARIANTS] || CARD_VARIANTS.shadow;\n default:\n return { className: '', style: {} };\n }\n }\n\n private getSizeStyles(size: ComponentSize): { className: string; style: React.CSSProperties } {\n const sizeConfig = SIZE_CONFIGS[size];\n return {\n className: `frank-size-${size}`,\n style: {\n padding: sizeConfig.padding,\n fontSize: sizeConfig.fontSize,\n minHeight: sizeConfig.minHeight,\n },\n };\n }\n\n private getColorStyles(color: ColorVariant): { className: string; style: React.CSSProperties } {\n return {\n className: `frank-color-${color}`,\n style: {\n '--component-color': `var(--color-${color})`,\n '--component-color-foreground': `var(--color-${color}-foreground)`,\n } as React.CSSProperties,\n };\n }\n\n private mergeStyles(\n base: { className: string; style: React.CSSProperties },\n override: { className: string; style: React.CSSProperties }\n ): { className: string; style: React.CSSProperties } {\n return {\n className: [base.className, override.className].filter(Boolean).join(' '),\n style: { ...base.style, ...override.style },\n };\n }\n\n private notifyListeners(): void {\n this.listeners.forEach(callback => callback(this.config));\n }\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Create an appearance manager instance\n */\nexport function createAppearanceManager(config?: Partial<AppearanceConfig>): AppearanceManager {\n return new AppearanceManager(config);\n}\n\n/**\n * Get component class names based on configuration\n */\nexport function getComponentClassNames(\n componentType: keyof ComponentAppearance,\n config: ComponentAppearance,\n variant?: string,\n size?: ComponentSize,\n color?: ColorVariant,\n additionalClasses?: string[]\n): string {\n const classes: string[] = [`frank-${componentType}`];\n\n // Add variant class\n if (variant) {\n classes.push(`frank-${componentType}-${variant}`);\n }\n\n // Add size class\n const actualSize = size || (config[componentType] as any)?.size || 'md';\n classes.push(`frank-size-${actualSize}`);\n\n // Add color class\n if (color) {\n classes.push(`frank-color-${color}`);\n }\n\n // Add additional classes\n if (additionalClasses) {\n classes.push(...additionalClasses);\n }\n\n return classes.join(' ');\n}\n\n/**\n * Convert appearance config to Tailwind classes\n */\nexport function appearanceConfigToTailwind(config: ComponentAppearance): Record<string, string> {\n const tailwindClasses: Record<string, string> = {};\n\n // Convert input config\n if (config.input) {\n const { variant, size, color, radius } = config.input;\n const classes = ['transition-all', 'duration-200'];\n\n // Variant classes\n switch (variant) {\n case 'flat':\n classes.push('bg-default-100', 'hover:bg-default-200', 'focus:bg-default-100');\n break;\n case 'bordered':\n classes.push('border-2', 'border-default-200', 'hover:border-default-300', 'focus:border-primary');\n break;\n case 'underlined':\n classes.push('border-b-2', 'border-default-300', 'hover:border-default-400', 'focus:border-primary');\n break;\n case 'faded':\n classes.push('bg-default-50', 'border', 'border-default-200', 'hover:bg-default-100');\n break;\n }\n\n // Size classes\n switch (size) {\n case 'sm':\n classes.push('px-2', 'py-1', 'text-sm', 'h-8');\n break;\n case 'md':\n classes.push('px-3', 'py-2', 'text-base', 'h-10');\n break;\n case 'lg':\n classes.push('px-4', 'py-3', 'text-lg', 'h-12');\n break;\n }\n\n // Radius classes\n if (radius === 'none') classes.push('rounded-none');\n else if (radius === 'sm') classes.push('rounded-sm');\n else if (radius === 'md') classes.push('rounded-md');\n else if (radius === 'lg') classes.push('rounded-lg');\n else if (radius === 'xl') classes.push('rounded-xl');\n else if (radius === 'full') classes.push('rounded-full');\n\n tailwindClasses.input = classes.join(' ');\n }\n\n return tailwindClasses;\n}\n\n/**\n * Create responsive component props\n */\nexport function createResponsiveProps<T>(\n values: Partial<Record<keyof typeof BREAKPOINTS, T>>,\n fallback: T\n): T {\n return RESPONSIVE_UTILITIES.getResponsiveValue(values, fallback);\n}\n\n// ============================================================================\n// Export appearance utilities\n// ============================================================================\n\nexport {\n DEFAULT_APPEARANCE_CONFIG,\n DEFAULT_COMPONENT_APPEARANCE,\n DEFAULT_LAYOUT_CONFIG,\n DEFAULT_BRANDING_CONFIG,\n};"],"names":["INPUT_VARIANTS","BUTTON_VARIANTS","CARD_VARIANTS","SIZE_CONFIGS","MODAL_SIZES","BREAKPOINTS","RESPONSIVE_UTILITIES","breakpoint","breakpoints","name","size","values","fallback","currentBreakpoint","orderedBreakpoints","currentIndex","i","AppearanceManager","initialConfig","__publicField","DEFAULT_APPEARANCE_CONFIG","updates","organization","branding","componentType","variant","color","componentConfig","styles","variantStyles","actualSize","sizeStyles","colorStyles","brandingVars","layoutStyles","css","property","value","root","customCSSId","styleEl","customCSS","callback","base","override","config","sizeConfig","createAppearanceManager","getComponentClassNames","additionalClasses","classes","appearanceConfigToTailwind","tailwindClasses","radius","createResponsiveProps"],"mappings":"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"}