@productshiv/baapui
Version:
A truly cross-platform multi-design UI framework that works with React, Next.js, React Native, and any React-based framework.
460 lines (435 loc) • 12.1 kB
text/typescript
import { Theme } from '../types';
import { validateTheme, ThemeValidationError } from '../validation';
import { checkColorContrast } from '../../utils/accessibility';
// Retro Light Theme - 80s Neon Inspired
export const retroLightTheme: Theme = {
mode: 'light',
design: 'retro',
colors: {
primary: '#FF6B9D', // Hot pink
secondary: '#00F5FF', // Electric cyan
background: '#1A1A2E', // Dark navy
surface: '#16213E', // Darker blue
text: '#EEEEFF', // Off-white
textSecondary: '#B8B8FF', // Light purple
border: '#FF6B9D', // Hot pink border
error: '#FF073A', // Neon red
success: '#39FF14', // Electric green
warning: '#FFFF00', // Electric yellow
info: '#00F5FF', // Electric cyan
lightShadow: '#FF6B9D40', // Pink glow
darkShadow: '#00000080', // Dark shadow
},
shadows: {
small: {
shadowColor: '#FF6B9D',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.6,
shadowRadius: 4.0,
elevation: 3,
},
medium: {
shadowColor: '#00F5FF',
shadowOffset: { width: 0, height: 4 },
shadowOpacity: 0.7,
shadowRadius: 8.0,
elevation: 6,
},
large: {
shadowColor: '#FF6B9D',
shadowOffset: { width: 0, height: 8 },
shadowOpacity: 0.8,
shadowRadius: 12.0,
elevation: 10,
},
},
spacing: {
xs: 6,
sm: 12,
md: 20,
lg: 28,
xl: 36,
},
typography: {
h1: {
fontSize: 36,
fontWeight: 'bold',
letterSpacing: 2.0,
textTransform: 'uppercase',
},
h2: {
fontSize: 30,
fontWeight: 'bold',
letterSpacing: 1.5,
textTransform: 'uppercase',
},
h3: {
fontSize: 24,
fontWeight: '700',
letterSpacing: 1.2,
textTransform: 'uppercase',
},
body: {
fontSize: 16,
fontWeight: 'normal',
letterSpacing: 0.5,
},
button: {
fontSize: 18,
fontWeight: 'bold',
letterSpacing: 1.0,
textTransform: 'uppercase',
},
caption: {
fontSize: 12,
fontWeight: 'normal',
letterSpacing: 0.8,
textTransform: 'uppercase',
},
},
shape: {
borderRadius: {
sm: 2,
md: 4,
lg: 8,
full: 0, // Sharp corners for retro feel
},
},
};
// Validate retro themes for accessibility and consistency
function validateRetroTheme(theme: Theme, themeName: string): Theme {
try {
validateTheme(theme);
console.log(`✅ ${themeName} passed validation`);
return theme;
} catch (error) {
if (error instanceof ThemeValidationError) {
console.warn(`⚠️ ${themeName} validation issues:`, error.message);
// Return theme with warnings but don't throw
return theme;
}
throw error;
}
}
// Export validated themes
export const validatedRetroLightTheme = validateRetroTheme(retroLightTheme, 'Retro Light Theme');
// Accessibility-improved color palettes
export const ACCESSIBLE_RETRO_PALETTES = {
neon80s: {
primary: '#FF1493', // Deep pink - better contrast
secondary: '#00CED1', // Dark turquoise - better contrast
accent: '#32CD32', // Lime green - good contrast
background: '#0A0A0A', // Darker for better contrast
surface: '#1A1A1A', // Darker surface
text: '#FFFFFF', // Pure white for maximum contrast
textSecondary: '#CCCCCC', // Light gray with good contrast
},
pastel90s: {
primary: '#8B4B8B', // Darker plum for better contrast
secondary: '#4B8B4B', // Darker green for better contrast
accent: '#8B4B8B', // Consistent with primary
background: '#F8F8F8', // Slightly darker cream
surface: '#F0F0F0', // Light gray
text: '#2F2F2F', // Dark gray for good contrast
textSecondary: '#5F5F5F', // Medium gray
},
grunge90s: {
primary: '#9932CC', // Darker orchid for better contrast
secondary: '#FF6347', // Tomato - better contrast than orange red
accent: '#228B22', // Forest green - better contrast
background: '#000000', // Pure black
surface: '#1C1C1C', // Dark gray
text: '#FFFFFF', // Pure white
textSecondary: '#CCCCCC', // Light gray
},
vintage70s: {
primary: '#8B4513', // Saddle brown - good contrast
secondary: '#A0522D', // Sienna - complementary
accent: '#B8860B', // Dark goldenrod - better contrast
background: '#FFF8DC', // Cornsilk - light background
surface: '#F5DEB3', // Wheat - slightly darker
text: '#2F2F2F', // Dark gray
textSecondary: '#5F5F5F', // Medium gray
},
terminal: {
primary: '#00FF00', // Bright green - classic terminal
secondary: '#FFFF00', // Bright yellow
accent: '#00FFFF', // Bright cyan
background: '#000000', // Pure black
surface: '#0A0A0A', // Very dark gray
text: '#00FF00', // Green text
textSecondary: '#00CC00', // Darker green
},
};
// Helper function to create accessible retro theme
export function createAccessibleRetroTheme(
baseTheme: Theme,
palette: keyof typeof ACCESSIBLE_RETRO_PALETTES
): Theme {
const colors = ACCESSIBLE_RETRO_PALETTES[palette];
// Validate color combinations
const textContrast = checkColorContrast(colors.text, colors.background);
const primaryContrast = checkColorContrast(colors.primary, colors.background);
if (textContrast.ratio < 4.5) {
console.warn(`⚠️ Text contrast ratio ${textContrast.ratio}:1 may not meet WCAG AA standards`);
}
if (primaryContrast.ratio < 3) {
console.warn(`⚠️ Primary color contrast ratio ${primaryContrast.ratio}:1 may not meet WCAG AA standards for large text`);
}
return {
...baseTheme,
colors: {
...baseTheme.colors,
...colors,
error: '#DC143C', // Crimson - good contrast
success: colors.accent,
warning: '#FF8C00', // Dark orange - better contrast
info: colors.secondary,
},
};
}
// Retro theme utilities
export const retroThemeUtils = {
/**
* Get the appropriate text color for a background
*/
getContrastingTextColor: (backgroundColor: string): string => {
const contrast = checkColorContrast('#FFFFFF', backgroundColor);
return contrast.ratio >= 4.5 ? '#FFFFFF' : '#000000';
},
/**
* Validate if a color combination meets accessibility standards
*/
validateColorCombination: (foreground: string, background: string) => {
return checkColorContrast(foreground, background);
},
/**
* Get theme-appropriate shadow for retro design
*/
getRetroShadow: (era: keyof typeof RETRO_COLOR_PALETTES, intensity: 'small' | 'medium' | 'large') => {
const palette = RETRO_COLOR_PALETTES[era];
const baseColor = palette.primary;
const intensityMap = {
small: { opacity: 0.4, radius: 4, offset: 2 },
medium: { opacity: 0.6, radius: 8, offset: 4 },
large: { opacity: 0.8, radius: 12, offset: 6 },
};
const config = intensityMap[intensity];
return {
shadowColor: baseColor,
shadowOffset: { width: 0, height: config.offset },
shadowOpacity: config.opacity,
shadowRadius: config.radius,
elevation: config.offset,
};
},
};
// Retro Dark Theme - 90s Grunge Inspired
export const retroDarkTheme: Theme = {
mode: 'dark',
design: 'retro',
colors: {
primary: '#8A2BE2', // Blue violet
secondary: '#FF4500', // Orange red
background: '#0D0D0D', // Almost black
surface: '#1C1C1C', // Dark gray
text: '#F0F0F0', // Light gray
textSecondary: '#A0A0A0', // Medium gray
border: '#8A2BE2', // Blue violet border
error: '#DC143C', // Crimson
success: '#32CD32', // Lime green
warning: '#FFD700', // Gold
info: '#1E90FF', // Dodger blue
lightShadow: '#8A2BE240', // Purple glow
darkShadow: '#00000090', // Deep shadow
},
shadows: {
small: {
shadowColor: '#8A2BE2',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.5,
shadowRadius: 3.0,
elevation: 2,
},
medium: {
shadowColor: '#FF4500',
shadowOffset: { width: 0, height: 4 },
shadowOpacity: 0.6,
shadowRadius: 6.0,
elevation: 4,
},
large: {
shadowColor: '#8A2BE2',
shadowOffset: { width: 0, height: 6 },
shadowOpacity: 0.7,
shadowRadius: 10.0,
elevation: 8,
},
},
spacing: {
xs: 4,
sm: 8,
md: 16,
lg: 24,
xl: 32,
},
typography: {
h1: {
fontSize: 32,
fontWeight: 'bold',
letterSpacing: 1.5,
},
h2: {
fontSize: 26,
fontWeight: '700',
letterSpacing: 1.2,
},
h3: {
fontSize: 20,
fontWeight: '600',
letterSpacing: 1.0,
},
body: {
fontSize: 15,
fontWeight: 'normal',
letterSpacing: 0.3,
},
button: {
fontSize: 16,
fontWeight: '600',
letterSpacing: 0.8,
},
caption: {
fontSize: 11,
fontWeight: 'normal',
letterSpacing: 0.5,
},
},
shape: {
borderRadius: {
sm: 3,
md: 6,
lg: 10,
full: 0, // Sharp corners for retro feel
},
},
};
// Export validated dark theme
export const validatedRetroDarkTheme = validateRetroTheme(retroDarkTheme, 'Retro Dark Theme');
// Retro Color Palettes for different eras
export const RETRO_COLOR_PALETTES = {
neon80s: {
primary: '#FF6B9D',
secondary: '#00F5FF',
accent: '#39FF14',
background: '#1A1A2E',
surface: '#16213E',
},
pastel90s: {
primary: '#FFB6C1',
secondary: '#98FB98',
accent: '#DDA0DD',
background: '#F5F5DC',
surface: '#FFF8DC',
},
grunge90s: {
primary: '#8A2BE2',
secondary: '#FF4500',
accent: '#32CD32',
background: '#0D0D0D',
surface: '#1C1C1C',
},
vintage70s: {
primary: '#D2691E',
secondary: '#8B4513',
accent: '#DAA520',
background: '#F4A460',
surface: '#DEB887',
},
terminal: {
primary: '#00FF00',
secondary: '#FFFF00',
accent: '#00FFFF',
background: '#000000',
surface: '#001100',
},
};
// Retro Typography Styles
export const RETRO_TYPOGRAPHY = {
pixelArt: {
fontFamily: 'monospace',
letterSpacing: 2,
textTransform: 'uppercase' as const,
},
neon: {
fontWeight: 'bold' as const,
letterSpacing: 1.5,
textTransform: 'uppercase' as const,
textShadowColor: '#FF6B9D',
textShadowOffset: { width: 0, height: 0 },
textShadowRadius: 10,
},
vintage: {
fontWeight: '600' as const,
letterSpacing: 0.8,
fontStyle: 'italic' as const,
},
terminal: {
fontFamily: 'monospace',
letterSpacing: 1,
fontWeight: 'normal' as const,
},
};
// Retro Border Styles
export const RETRO_BORDERS = {
thick: {
borderWidth: 4,
borderStyle: 'solid' as const,
},
neon: {
borderWidth: 2,
borderStyle: 'solid' as const,
shadowColor: '#FF6B9D',
shadowOffset: { width: 0, height: 0 },
shadowOpacity: 0.8,
shadowRadius: 8,
},
pixelated: {
borderWidth: 3,
borderStyle: 'solid' as const,
},
vintage: {
borderWidth: 1,
borderStyle: 'solid' as const,
},
};
// Retro Shadow Effects
export const RETRO_SHADOWS = {
neonGlow: {
shadowColor: '#FF6B9D',
shadowOffset: { width: 0, height: 0 },
shadowOpacity: 0.8,
shadowRadius: 12,
elevation: 8,
},
deepShadow: {
shadowColor: '#000000',
shadowOffset: { width: 4, height: 4 },
shadowOpacity: 0.9,
shadowRadius: 0,
elevation: 0,
},
retroBox: {
shadowColor: '#8A2BE2',
shadowOffset: { width: 3, height: 3 },
shadowOpacity: 0.7,
shadowRadius: 0,
elevation: 3,
},
};
// Export accessible theme variants
export const accessibleRetroNeon80s = createAccessibleRetroTheme(retroLightTheme, 'neon80s');
export const accessibleRetroPastel90s = createAccessibleRetroTheme(retroLightTheme, 'pastel90s');
export const accessibleRetroGrunge90s = createAccessibleRetroTheme(retroDarkTheme, 'grunge90s');
export const accessibleRetroVintage70s = createAccessibleRetroTheme(retroLightTheme, 'vintage70s');
export const accessibleRetroTerminal = createAccessibleRetroTheme(retroDarkTheme, 'terminal');