AI Color Palette Generator
Generate sophisticated color palettes using machine learning and color theory principles
Project Tags
AI-Powered Color Palette Generation
An intelligent color palette generator that combines machine learning with traditional color theory to create harmonious, accessible, and contextually appropriate color schemes. The tool analyzes thousands of successful design palettes to suggest combinations that work well together across different use cases.
The Problem
Designers and developers often struggle with color selection, especially when creating:
- Accessible color combinations that meet WCAG guidelines
- Brand-appropriate palettes that convey the right emotional tone
- Harmonious schemes that work across different media and contexts
- Systematic color systems for design systems and UI libraries
Solution
Built an AI-powered tool that:
- Learns from successful designs - Trained on 50K+ curated color palettes from award-winning designs
- Applies color theory - Incorporates traditional color harmony rules and psychological associations
- Ensures accessibility - Automatically checks and adjusts for WCAG AA/AAA compliance
- Provides context awareness - Suggests palettes based on industry, mood, and use case
Technical Implementation
Machine Learning Pipeline
// Color Harmony Prediction Model
class ColorHarmonyModel {
private model: tf.LayersModel
private colorEncoder: ColorEncoder
constructor() {
this.colorEncoder = new ColorEncoder()
this.loadPretrainedModel()
}
async generateHarmoniousPalette(baseColor: Color, options: PaletteOptions): Promise<ColorPalette> {
// Convert color to feature vector
const baseFeatures = this.colorEncoder.encode(baseColor)
// Add context features (industry, mood, accessibility requirements)
const contextFeatures = this.encodeContext(options)
// Combine features
const inputFeatures = tf.concat([baseFeatures, contextFeatures])
// Generate palette candidates
const prediction = await this.model.predict(inputFeatures) as tf.Tensor
const paletteColors = await this.decodePrediction(prediction)
// Post-process for accessibility and harmony
return this.optimizePalette(paletteColors, options)
}
private async optimizePalette(colors: Color[], options: PaletteOptions): Promise<ColorPalette> {
// Apply accessibility constraints
const accessibleColors = this.ensureAccessibility(colors, options.contrastRequirement)
// Fine-tune harmony using traditional color theory
const harmonizedColors = this.applyHarmonyRules(accessibleColors, options.harmonyType)
return new ColorPalette(harmonizedColors, this.calculateHarmonyScore(harmonizedColors))
}
}
Color Theory Engine
// Traditional color theory implementation
class ColorTheoryEngine {
generateComplementary(baseColor: HSLColor): HSLColor {
return {
h: (baseColor.h + 180) % 360,
s: baseColor.s,
l: baseColor.l
}
}
generateTriadic(baseColor: HSLColor): HSLColor[] {
return [
baseColor,
{ h: (baseColor.h + 120) % 360, s: baseColor.s, l: baseColor.l },
{ h: (baseColor.h + 240) % 360, s: baseColor.s, l: baseColor.l }
]
}
generateAnalogous(baseColor: HSLColor, count: number = 5): HSLColor[] {
const step = 30 // degrees
const colors: HSLColor[] = []
for (let i = 0; i < count; i++) {
colors.push({
h: (baseColor.h + (i * step)) % 360,
s: baseColor.s * (0.8 + Math.random() * 0.4), // Add slight variation
l: baseColor.l * (0.7 + Math.random() * 0.6)
})
}
return colors
}
}
Accessibility Checker
class AccessibilityChecker {
checkContrast(foreground: Color, background: Color): ContrastResult {
const fgLuminance = this.getRelativeLuminance(foreground)
const bgLuminance = this.getRelativeLuminance(background)
const contrast = (Math.max(fgLuminance, bgLuminance) + 0.05) /
(Math.min(fgLuminance, bgLuminance) + 0.05)
return {
ratio: contrast,
aa: contrast >= 4.5,
aaa: contrast >= 7,
aaLarge: contrast >= 3,
aaaLarge: contrast >= 4.5
}
}
optimizeForAccessibility(palette: ColorPalette, requirement: 'AA' | 'AAA'): ColorPalette {
const requiredRatio = requirement === 'AAA' ? 7 : 4.5
const optimizedColors = palette.colors.map(color => {
if (!this.meetsContrastRequirement(color, palette.background, requiredRatio)) {
return this.adjustColorForContrast(color, palette.background, requiredRatio)
}
return color
})
return new ColorPalette(optimizedColors, palette.background)
}
}
Key Features
1. Context-Aware Generation
The AI considers the intended use case and industry context:
interface PaletteContext {
industry: 'tech' | 'finance' | 'healthcare' | 'creative' | 'retail'
mood: 'professional' | 'friendly' | 'energetic' | 'calm' | 'luxurious'
platform: 'web' | 'mobile' | 'print' | 'brand'
accessibility: 'AA' | 'AAA'
}
2. Real-Time Preview
Live preview showing how colors work together in various contexts:
- UI components (buttons, cards, forms)
- Data visualizations (charts, graphs)
- Typography combinations
- Brand applications (logos, marketing materials)
3. Export Options
Multiple export formats for different workflows:
- CSS custom properties
- Sass/SCSS variables
- Adobe Swatch Exchange (.ase)
- Figma/Sketch palettes
- JSON data structures
4. Palette History & Favorites
Automatic saving of generated palettes with search and filtering:
class PaletteManager {
async savePalette(palette: ColorPalette, metadata: PaletteMetadata): Promise<string> {
const paletteId = generateUUID()
await this.storage.save({
id: paletteId,
palette,
metadata,
createdAt: new Date(),
tags: this.extractTags(metadata),
dominantColors: this.analyzeDominantColors(palette)
})
return paletteId
}
async searchPalettes(query: SearchQuery): Promise<SavedPalette[]> {
return this.storage.search({
text: query.text,
colors: query.colorFilters,
tags: query.tags,
dateRange: query.dateRange
})
}
}
Results & Usage
The AI Color Palette Generator has gained significant traction in the design community:
User Feedback Highlights
- "Finally, colors that actually work together" - UX Designer at Atlassian
- "The accessibility checking saved me hours of manual testing" - Frontend Developer
- "My go-to tool for client branding projects" - Freelance Designer
Technical Challenges
1. Color Space Accuracy
Working with different color spaces (RGB, HSL, LAB, OKLCH) while maintaining perceptual accuracy:
class ColorSpaceConverter {
// Convert to perceptually uniform color space for ML processing
rgbToOklch(rgb: RGBColor): OKLCHColor {
// Multi-step conversion: RGB → Linear RGB → XYZ → OKLab → OKLCH
const linearRgb = this.rgbToLinear(rgb)
const xyz = this.linearRgbToXyz(linearRgb)
const oklab = this.xyzToOklab(xyz)
return this.oklabToOklch(oklab)
}
// Ensure colors remain valid after ML transformations
clampToValidRange(color: any, colorSpace: ColorSpace): any {
switch (colorSpace) {
case 'rgb':
return {
r: Math.max(0, Math.min(255, color.r)),
g: Math.max(0, Math.min(255, color.g)),
b: Math.max(0, Math.min(255, color.b))
}
case 'hsl':
return {
h: color.h % 360,
s: Math.max(0, Math.min(100, color.s)),
l: Math.max(0, Math.min(100, color.l))
}
}
}
}
2. Model Performance in Browser
Optimizing TensorFlow.js models for real-time inference:
class ModelOptimizer {
async loadOptimizedModel(): Promise<tf.LayersModel> {
// Load quantized model for smaller file size
const model = await tf.loadLayersModel('/models/color-harmony-quantized.json')
// Compile with WebGL backend for GPU acceleration
await tf.ready()
tf.backend().setFlags({ WEBGL_FORCE_F16_TEXTURES: true })
// Warm up the model
const dummyInput = tf.randomNormal([1, 10])
await model.predict(dummyInput)
dummyInput.dispose()
return model
}
}
Innovation Highlights
1. Perceptual Color Distances
Using CIEDE2000 color difference formula for more accurate color harmony:
calculatePerceptualDistance(color1: LABColor, color2: LABColor): number {
// Implement CIEDE2000 formula for perceptually accurate color differences
return this.ciede2000(color1, color2)
}
2. Cultural Color Associations
Database of color meanings across different cultures for global design sensitivity:
interface ColorCulturalData {
color: string
culture: string
associations: string[]
appropriateness: 'high' | 'medium' | 'low'
contextualNotes: string
}
3. Dynamic Accessibility Scoring
Real-time accessibility scoring that goes beyond basic contrast ratios:
class AdvancedAccessibilityScorer {
calculateAccessibilityScore(palette: ColorPalette): AccessibilityScore {
return {
contrastScore: this.calculateContrastScore(palette),
colorBlindnessScore: this.simulateColorBlindness(palette),
cognitiveLoadScore: this.assessCognitiveLoad(palette),
overallScore: this.calculateWeightedScore(scores)
}
}
}
Open Source Impact
The project is open source and has been adopted by:
- Design systems teams at 12+ companies
- Educational institutions for color theory courses
- Accessibility advocates for WCAG compliance tools
- Other developers as a library for color generation
Community Contributions
- 45+ GitHub stars
- 12 community-contributed color harmony algorithms
- Translations in 8 languages
- Integration packages for popular design tools
Future Roadmap
Planned Features:
- Brand Analysis: Upload brand assets to generate consistent palettes
- Image-Based Generation: Extract palettes from uploaded images
- API Service: RESTful API for integration with other tools
- Collaborative Palettes: Team sharing and commenting features
- Advanced Theming: Generate complete design system color tokens
"This tool has fundamentally changed how I approach color in my design process. The AI suggestions often surprise me with combinations I wouldn't have considered, but they work beautifully." - Sarah Chen, Senior Product Designer
Explore More Projects
Discover more open source tools, frameworks, and experiments that solve real-world problems with modern technologies.