UNPKG

@fimbul-works/vec-color

Version:

A comprehensive, type-safe color manipulation library for TypeScript that provides a wide range of color space conversions, blending operations, and accessibility utilities.

1,133 lines (887 loc) 36.6 kB
# API Documentation for @fimbul-works/vec-color ## Table of Contents 1. [Color Fundamentals](#color-fundamentals) - [Color Vector Representation](#color-vector-representation) - [Types and Interfaces](#types-and-interfaces) - [String Parsing & Formatting](#string-parsing--formatting) - [Color Space Conversions](#color-space-conversions) 2. [Color Manipulation](#color-manipulation) - [Basic Transformations](#basic-transformations) - [Advanced Adjustments](#advanced-adjustments) - [Effects & Filters](#effects--filters) - [Alpha Channel Operations](#alpha-channel-operations) - [Blend Modes](#blend-modes) 3. [Color Analysis](#color-analysis) - [Color Distance & Similarity](#color-distance--similarity) - [Color Classification](#color-classification) - [Dominant Color Detection](#dominant-color-detection) - [Debug & Validation Tools](#debug--validation-tools) - [Accessibility Analysis](#accessibility-analysis) 4. [Palette Generation](#palette-generation) - [Basic Color Schemes](#basic-color-schemes) - [Accessible Palettes](#accessible-palettes) - [Color Variations](#color-variations) - [Color Harmonization](#color-harmonization) 5. [Color Spaces](#color-spaces) - [RGB/HSL (Display)](#rgbhsl-display) - [LAB/XYZ (Perceptual)](#labxyz-perceptual) - [CMYK (Print)](#cmyk-print) - [Color Temperature](#color-temperature) 6. [Special Features](#special-features) - [Color Blindness Simulation & Testing](#color-blindness-simulation--testing) - [Cosine Gradient Generation](#cosine-gradient-generation) 7. [Usage Examples](#usage-examples) - [Color String Examples](#color-string-examples) - [Color Manipulation Examples](#color-manipulation-examples) - [Color Adjustment Examples](#color-adjustment-examples) - [Alpha Channel Examples](#alpha-channel-examples) - [Blend Mode Examples](#blend-mode-examples) - [Color Space Conversion Examples](#color-space-conversion-examples) - [Temperature Manipulation Examples](#temperature-manipulation-examples) - [Color Analysis Examples](#color-analysis-examples) - [Color Comparison Examples](#color-analysis-examples) - [Color Classification Examples](#color-classification-examples) - [Accessibility Examples](#accessibility-examples) - [Gamut Examples](#gamut-examples) - [Dominant Color Detection Examples](#dominant-color-detection-examples) - [Debug Tools Examples](#debug-tools-examples) - [Palette Generation Examples](#palette-generation-examples) - [Color Scheme Examples](#color-scheme-examples) - [Color Harmonization Examples](#color-harmonization-examples) - [Gradient Examples](#gradient-examples) - [Color Blindness Examples](#color-blindness-examples) 8. [Optimization & Best Practices](#optimization--best-practices) - [Performance Tips](#performance-tips) - [Error Handling](#error-handling) - [Edge Cases](#edge-cases) ## Color Fundamentals ### Color Vector Representation Colors are represented using vector types from the [@fimbul-works/vec](https://github.com/fimbul-works/vec) library: [Vec3](https://github.com/fimbul-works/vec/blob/main/VEC3.md) for RGB colors and [Vec4](https://github.com/fimbul-works/vec/blob/main/VEC4.md) for RGBA/CMYK, with all values normalized between 0 and 1. This vector-based approach enables powerful mathematical operations and transformations. ```typescript // RGB color representations const red = new Vec3(1, 0, 0); // Pure red const green = new Vec3(0, 1, 0); // Pure green const blue = new Vec3(0, 0, 1); // Pure blue const white = new Vec3(1, 1, 1); // White const black = new Vec3(0, 0, 0); // Black const gray = new Vec3(0.5, 0.5, 0.5); // 50% gray // RGBA color representation (Vec4) const translucentRed = new Vec4(1, 0, 0, 0.5); // 50% transparent red ``` See the [Vec3](https://github.com/fimbul-works/vec/blob/main/VEC3.md) and [Vec4](https://github.com/fimbul-works/vec/blob/main/VEC4.md) API documentation for a full list of available methods and functionality. ### Types and Interfaces ```typescript type ColorBlindnessType = 'protanopia' | 'deuteranopia' | 'tritanopia' | 'achromatopsia'; interface ColorStringOptions { format: 'hex' | 'rgb' | 'hsl'; alpha?: number; includeHash?: boolean; } interface ColorClassification { temperature: 'warm' | 'cool' | 'neutral'; intensity: 'vivid' | 'pastel' | 'dark' | 'light' | 'medium'; category: string; } ``` ### String Parsing & Formatting Functions for converting between color strings and Vec3/Vec4 representations. #### Parsing Functions - `parseColor(color: string): Vec3`: Main entry point for parsing any supported color format - `parseHex(hex: string): Vec3`: Parses hex color strings (#RGB or #RRGGBB) - `parseRGB(rgb: string): Vec3`: Parses RGB/RGBA strings (rgb(r,g,b) format) - `parseHSL(hsl: string): Vec3`: Parses HSL/HSLA strings (hsl(h,s%,l%) format) #### Formatting Functions - `colorToString(color: Vec3, options: ColorStringOptions): string`: Main formatting function with configurable output - `toHex(color: Vec3, includeHash?: boolean): string`: Converts to hex format - `toRGB(color: Vec3, alpha?: number): string`: Converts to RGB/RGBA format - `toHSL(color: Vec3, alpha?: number): string`: Converts to HSL/HSLA format See [Color String Examples](#color-string-examples) for usage patterns. ### Color Space Conversions ```typescript // Main conversion functions rgbToHSL(rgb: Vec3): Vec3 // For intuitive color manipulation hslToRGB(hsl: Vec3): Vec3 rgbToLAB(rgb: Vec3): Vec3 // For precise color comparisons labToRGB(lab: Vec3): Vec3 rgbToXYZ(rgb: Vec3): Vec3 // For device-independent color xyzToRGB(xyz: Vec3): Vec3 rgbToCMYK(rgb: Vec3): Vec4 // For print applications cmykToRGB(cmyk: Vec4): Vec3 ``` ⚠️ **Considerations:** - HSL hue undefined at saturation = 0 - LAB conversions may produce out-of-gamut colors - CMYK conversion is device-dependent - Temperature estimation may return null for non-blackbody colors See [Color Spaces](#color-spaces) for detailed information about each color space. ## Color Manipulation ### Basic Transformations Core color manipulation functions for adjusting basic properties. #### Functions - `adjustBrightness(color: Vec3, amount: number): Vec3`: Adjusts overall color brightness - `adjustSaturation(color: Vec3, amount: number): Vec3`: Modifies color intensity - `adjustGamma(color: Vec3, gamma: number): Vec3`: Applies gamma correction - `adjustContrast(color: Vec3, amount: number): Vec3`: Enhances/reduces contrast - `adjustVibrance(color: Vec3, amount: number): Vec3`: Smart saturation preserving skin tones - `colorBalance(color: Vec3, adjustments: Vec3): Vec3`: Fine-tune individual RGB channels - `adjustNeutrality(color: Vec3, amount: number): Vec3`: Shift colors toward/away from gray #### Usage Notes - All adjustment amounts are normalized between -1 and 1 unless specified - Negative values reduce the effect, positive values enhance - See [Color Adjustment Examples](#color-adjustment-examples) ### Advanced Adjustments Functions for sophisticated color modifications. #### Core Functions - `adjustTemperature(color: Vec3, adjustment: number): Vec3`: Adjusts color temperature - `adjustTimeOfDay(color: Vec3, timeOfDay: number): Vec3`: Adjusts color based on natural lighting at different times - `adjustTonalRange(color: Vec3, shadows: number, highlights: number): Vec3`: Selectively adjusts shadows and highlights - `adjustComplementary(color: Vec3, amount: number): Vec3`: Adjusts color based on its complementary color - `rotateHue(color: Vec3, degrees: number): Vec3`: Rotates the hue by degrees #### Usage Notes - All adjustment amounts are normalized between -1 and 1 unless specified - Temperature adjustments in Kelvin (-10000K to +10000K) - Time of day uses 24-hour format (0-23) ### Effects & Filters Functions for applying common color effects and transformations. #### Core Functions - `tint(color: Vec3, amount: number): Vec3`: Adds white (0 to 1) - `shade(color: Vec3, amount: number): Vec3`: Adds black (0 to 1) - `tone(color: Vec3, amount: number): Vec3`: Adds gray (0 to 1) - `sepia(color: Vec3, amount: number): Vec3`: Applies sepia effect (0 to 1) - `grayscale(color: Vec3): Vec3`: Converts to grayscale - `invert(color: Vec3): Vec3`: Inverts colors See [Effects Examples](#effects-examples) for usage patterns. ### Alpha Channel Operations Functions for handling transparency and alpha channel calculations. #### Core Functions - `withAlpha(color: Vec3, alpha?: number): Vec4`: Creates RGBA color from RGB - `toPremultipliedAlpha(color: Vec3, alpha?: number): Vec4`: Converts to premultiplied format - `fromPremultipliedAlpha(premultiplied: Vec4): [Vec3, number]`: Extracts color and alpha #### Usage Notes - Alpha values range from 0 (transparent) to 1 (opaque) - Premultiplied alpha is useful for certain blend operations - Alpha conversion preserves color information See [Alpha Channel Examples](#alpha-channel-examples) for usage patterns. ### Blend Modes Functions for combining colors using standard digital imaging blend modes. #### Basic Blending - `mix<T extends Vec3 | Vec4>(color1: T, color2: T, ratio: number): T`: Linear interpolation - `blendMultiply<T extends Vec3 | Vec4>(base: T, blend: T): T`: Multiplication blend - `blendScreen<T extends Vec3 | Vec4>(base: T, blend: T): T`: Screen blend - `blendOverlay<T extends Vec3 | Vec4>(base: T, blend: T): T`: Overlay blend #### Advanced Blending - `blendSoftLight<T extends Vec3 | Vec4>(base: T, blend: T): T`: Soft light effect - `blendHardLight<T extends Vec3 | Vec4>(base: T, blend: T): T`: Hard light effect - `blendColorDodge<T extends Vec3 | Vec4>(base: T, blend: T): T`: Color dodge effect - `blendColorBurn<T extends Vec3 | Vec4>(base: T, blend: T): T`: Color burn effect #### Special Blends - `blendDifference<T extends Vec3 | Vec4>(base: T, blend: T): T`: Absolute color difference - `blendExclusion<T extends Vec3 | Vec4>(base: T, blend: T): T`: Similar to difference but lower contrast #### Features - All blend functions support both RGB (Vec3) and RGBA (Vec4) - Alpha channel information is preserved when present - Output format matches input format See [Blend Mode Examples](#blend-mode-examples) for visual examples and common use cases. ## Color Analysis ### Color Distance & Similarity Functions for measuring and comparing color differences using different algorithms. #### Core Functions - `calculateColorSimilarityFast(colorA: Vec3, colorB: Vec3): number`: Fast RGB-weighted comparison for real-time operations - `calculateColorSimilarityLab(colorA: Vec3, colorB: Vec3): number`: Precise perceptual comparison using CIEDE2000 - `colorDistanceMatrix(colors: Vec3[]): number[][]`: Generates pairwise comparison matrix for color sets - `deltaE2000(lab1: Vec3, lab2: Vec3): number`: Low-level CIEDE2000 calculation in LAB space #### Output Scale All similarity functions return values between 0 (maximum difference) and 1 (identical). #### Usage Notes - Use `calculateColorSimilarityFast` for real-time operations and large datasets - Use `calculateColorSimilarityLab` for color-critical applications - LAB-based functions require color conversion ([see Color Spaces](#color-spaces)) See [Color Comparison Examples](#color-comparison-examples) for detailed usage patterns. ### Color Classification Functions for analyzing and categorizing colors based on their properties. #### Analysis Functions - `classifyColor(color: Vec3): ColorClassification`: Categorizes color by temperature, intensity, and basic color name - `sortColors(colors: Vec3[], by?: "hue" | "saturation" | "lightness" | "temperature"): Vec3[]`: Orders colors by specified attribute - `perceivedBrightness(color: Vec3): number`: Calculates brightness using human perception weights See [Color Analysis Examples](#color-analysis-examples) for usage patterns, and [Types and Interfaces](#types-and-interfaces) for `ColorClassification` definition.. ### Dominant Color Detection - `findDominantColors(colors: Vec3[], count?: number): Vec3[]`: Finds dominant colors using k-means clustering See [Dominant Color Detection Examples](#dominant-color-detection-examples) for detailed usage. ### Accessibility Analysis Functions for ensuring color combinations meet WCAG accessibility standards. #### Core Functions - `contrastRatio(color1: Vec3, color2: Vec3): number`: Calculates WCAG contrast ratio (1-21) - `meetsWCAGRequirements(foreground: Vec3, background: Vec3, level: "AA" | "AAA", isLargeText?: boolean): boolean`: Checks WCAG compliance - `relativeLuminance(color: Vec3): number`: Calculates relative luminance (0-1) - `getTextColor(backgroundColor: Vec3): Vec3`: Determines optimal text color for background #### Usage Notes - WCAG AA requires contrast ratio ≥ 4.5 (3.0 for large text) - WCAG AAA requires contrast ratio ≥ 7.0 (4.5 for large text) See [Accessibility Examples](#accessibility-examples) for implementation patterns. ### Debug & Validation Tools Tools for inspecting color properties and validating color values. #### Debug Functions - `debugColor(color: Vec3): ColorDebugInfo`: Provides comprehensive color information - `validateColorSpace(color: Vec3, space: "RGB" | "HSL" | "LAB"): ColorValidationResult`: Validates color values #### Debug Information - Original color representations (Vec3, RGB, Hex, HSL) - Color space values (RGB, HSL, LAB) - Color characteristics (luminance, temperature, classification) - Accessibility metrics - Color blindness simulations See [Debug Tools Examples](#debug-tools-examples) for implementation details. ## Palette Generation ### Color Schemes Functions for generating harmonious color combinations. #### Basic Schemes - `complement(color: Vec3): Vec3`: Returns complementary color - `analogous(color: Vec3): Vec3[]`: Generates analogous color scheme - `triadic(color: Vec3): Vec3[]`: Creates triadic color scheme - `splitComplementary(color: Vec3): Vec3[]`: Generates split-complementary scheme - `tetradic(color: Vec3): Vec3[]`: Creates double-complementary scheme - `compound(color: Vec3): Vec3[]`: Generates compound color scheme #### Color Variations - `monochromatic(color: Vec3): Vec3[]`: Creates variations of the same hue - `shades(color: Vec3, steps?: number): Vec3[]`: Generates darker variations - `tints(color: Vec3, steps?: number): Vec3[]`: Generates lighter variations - `tones(color: Vec3, steps?: number): Vec3[]`: Generates reduced saturation variations See [Color Scheme Examples](#color-scheme-examples) for visual results. ### Accessible Palettes - `getTextColor(backgroundColor: Vec3): Vec3`: Determines optimal text color for background - `generateAccessiblePalette(baseColor: Vec3, count?: number, minContrast?: number): Vec3[]`: Generates accessible color palette ### Color Harmonization - `harmonizeColor(color: Vec3, referenceColor: Vec3): Vec3`: Harmonizes a color with a reference color - Adjusts to nearest harmonic relationship - Preserves color character while improving harmony - Uses common harmonic intervals (30°, 60°, 90°, etc.) - `harmonizePalette(colors: Vec3[], wcagLevel?: "AA" | "AAA"): Vec3[]`: Harmonizes a set of colors - Maintains WCAG contrast requirements - Preserves color relationships - Optimizes for visual harmony See [Color Harmonization Examples](#color-harmonization-examples) ## Color Spaces The library supports multiple color spaces for different use cases. ### RGB (Display) Standard color space for digital displays. ```typescript rgbToHSL(rgb: Vec3): Vec3 // Convert to HSL parseRGB(str: string): Vec3 // Parse RGB string toRGB(color: Vec3): string // Format as RGB string ``` ### HSL (Human-Readable) Intuitive color space for manipulation. ```typescript hslToRGB(hsl: Vec3): Vec3 // Convert to RGB parseHSL(str: string): Vec3 // Parse HSL string toHSL(color: Vec3): string // Format as HSL string ``` ### LAB/XYZ (Color Matching) Device-independent spaces for precise color calculations. ```typescript rgbToLAB(rgb: Vec3): Vec3 // Convert RGB to LAB labToRGB(lab: Vec3): Vec3 // Convert LAB to RGB rgbToXYZ(rgb: Vec3): Vec3 // Convert RGB to XYZ xyzToRGB(xyz: Vec3): Vec3 // Convert XYZ to RGB ``` ### CMYK (Print) Color space for print applications. ```typescript rgbToCMYK(rgb: Vec3): Vec4 // Convert RGB to CMYK cmykToRGB(cmyk: Vec4): Vec3 // Convert CMYK to RGB ``` See [Color Space Conversion Examples](#color-space-conversion-examples) for detailed usage. ### Color Temperature Color temperature calculations in Kelvin. ```typescript kelvinToRGB(kelvin: number): Vec3 // Convert temperature to RGB estimateColorTemperature(rgb: Vec3): number | null // Estimate temperature ``` See [Temperature Manipulation Examples](#temperature-manipulation-examples) for detailed usage. ### Gamut Mapping Functions for handling colors that cannot be displayed in the RGB color space. #### Core Functions - `isInGamut(color: Vec3): boolean`: Tests if color is within displayable range - `clipToGamut(color: Vec3): Vec3`: Fast clipping to nearest valid color - `compressToGamut(color: Vec3, preserveHue?: boolean): Vec3`: Smart compression maintaining relationships - `projectToGamut(color: Vec3): Vec3`: Lightness-preserving projection #### Usage Notes - Choose based on requirements: - `clipToGamut` for performance-critical operations - `compressToGamut` for maintaining color relationships - `projectToGamut` for preserving perceived brightness - Always test with `isInGamut` before expensive operations See [Gamut Examples](#gamut-examples) for implementation patterns. ## Special Features ### Color Blindness Simulation Tools for testing and optimizing colors for color vision deficiencies. #### Simulation Functions - `simulateColorBlindness(color: Vec3, type: ColorBlindnessType): Vec3`: Simulates how a color appears - `isDistinguishableForColorBlindness(color1: Vec3, color2: Vec3, type: ColorBlindnessType): boolean`: Tests color distinction - `optimizeForColorBlindness(colors: Vec3[]): Vec3[]`: Adjusts colors for better distinction - `validateColorBlindnessSafety(colors: Vec3[]): ValidationResult`: Comprehensive palette validation #### Supported Types - Protanopia (red-blind) - Deuteranopia (green-blind) - Tritanopia (blue-blind) - Achromatopsia (complete color blindness) See [Color Blindness Examples](#color-blindness-examples) for optimization strategies. ### Cosine Gradient Generation Functions for creating smooth, mathematically-generated color gradients using [cosine interpolation](https://iquilezles.org/articles/palettes/). #### Core Functions - `cosineGradient(t: number, a: Vec3, b: Vec3, c: Vec3, d: Vec3): Vec3`: Generates color using cosine interpolation - `generateCosinePalette(steps: number, preset: CosineGradientPreset): Vec3[]`: Creates full gradient palette #### Built-in Presets - `COSINE_PRESET_RAINBOW`: Full spectrum gradient - `COSINE_PRESET_FIRE`: Warm color gradient - `COSINE_PRESET_ICE`: Cool color gradient #### Parameters Explained The cosine gradient function uses four Vec3 parameters to control the gradient: ```typescript cosineGradient( t: number, // Position in gradient (0 to 1) a: Vec3, // Center of oscillation b: Vec3, // Amplitude c: Vec3, // Frequency d: Vec3 // Phase ): Vec3 ``` - `a`: Centers the oscillation (like an offset) - `b`: Controls how far the colors swing from the center - `c`: Controls how many times the pattern repeats - `d`: Shifts the pattern along the gradient See [Gradient Examples](#gradient-examples) for preset results and custom gradient creation. ## Usage Examples ### Color String Examples #### Parsing Colors ```typescript import { parseColor, parseHex, parseRGB, parseHSL } from '@fimbul-works/vec-color'; // Auto-detect format const color1 = parseColor('#ff0000'); const color2 = parseColor('rgb(255, 0, 0)'); const color3 = parseColor('hsl(0, 100%, 50%)'); // Format-specific parsing try { const hex = parseHex('#ff0000'); // From CSS const rgb = parseRGB('rgb(255,0,0)'); // From Canvas const hsl = parseHSL('hsl(0,100%,50%)'); // From color picker } catch (error) { console.error('Invalid color format'); } ``` #### Formatting Colors ```typescript import { Vec3 } from '@fimbul-works/vec'; import { colorToString } from '@fimbul-works/vec-color'; const color = new Vec3(1, 0, 0); // Red // Different format outputs const hex = colorToString(color, { format: 'hex' }); // "#ff0000" const rgb = colorToString(color, { format: 'rgb' }); // "rgb(255, 0, 0)" const hsl = colorToString(color, { format: 'hsl' }); // "hsl(0, 100%, 50%)" // With alpha const rgba = colorToString(color, { format: 'rgb', alpha: 0.5 }); // "rgba(255, 0, 0, 0.5)" ``` ### Color Manipulation Examples #### Color Adjustment Examples ##### Basic Adjustments ```typescript import { Vec3 } from '@fimbul-works/vec'; import { adjustBrightness, adjustSaturation, adjustContrast } from '@fimbul-works/vec-color'; const color = new Vec3(0.8, 0.2, 0.2); // Bright red // Single adjustments const brighter = adjustBrightness(color, 0.2); // 20% brighter const moreVivid = adjustSaturation(color, 0.3); // 30% more saturated const highContrast = adjustContrast(color, 0.5); // 50% more contrast // Chained adjustments const adjusted = adjustContrast( adjustSaturation( adjustBrightness(color, 0.1), 0.2 ), 0.15 ); ``` #### Effects Examples ```typescript import { Vec3 } from '@fimbul-works/vec'; import { tint, shade, tone, sepia, grayscale, invert } from '@fimbul-works/vec-color'; // Base color const blue = new Vec3(0.2, 0.4, 0.8); // Basic effects const tinted = tint(blue, 0.3); // 30% lighter const shaded = shade(blue, 0.3); // 30% darker const toned = tone(blue, 0.3); // 30% more muted // Photo effects const sepiaTone = sepia(blue, 0.8); // Strong sepia effect const bw = grayscale(blue); // Black and white const negative = invert(blue); // Color negative // Creating a vintage effect function vintageEffect(color: Vec3): Vec3 { // Apply multiple effects in sequence return sepia( tone( tint(color, 0.1), // Slightly lighter 0.2 // Slightly muted ), 0.5 // Medium sepia ); } // Creating an effect palette function generateEffectPalette(color: Vec3) { return { original: color, light: tint(color, 0.3), dark: shade(color, 0.3), muted: tone(color, 0.5), vintage: vintageEffect(color), bw: grayscale(color) }; } ``` #### Alpha Channel Examples ```typescript import { Vec3, Vec4 } from '@fimbul-works/vec'; import { withAlpha, toPremultipliedAlpha, fromPremultipliedAlpha, blendWithAlpha } from '@fimbul-works/vec-color'; // Basic alpha handling const red = new Vec3(1, 0, 0); const transparentRed = withAlpha(red, 0.5); // 50% transparent const opaqueRed = withAlpha(red); // Fully opaque // Premultiplied alpha operations const premultiplied = toPremultipliedAlpha(red, 0.5); const [color, alpha] = fromPremultipliedAlpha(premultiplied); // Complex alpha blending const background = withAlpha(new Vec3(1, 1, 1), 1); // White const foreground = withAlpha(new Vec3(0, 0, 1), 0.5); // Semi-transparent blue const result = blendWithAlpha(background, foreground); ``` #### Blend Mode Examples ##### Basic Blending ```typescript import { Vec3, Vec4 } from '@fimbul-works/vec'; import { mix, blendMultiply, blendScreen, blendOverlay } from '@fimbul-works/vec-color'; // RGB blending const base = new Vec3(0.8, 0.2, 0.2); // Red const blend = new Vec3(0.2, 0.2, 0.8); // Blue const mixed = mix(base, blend, 0.5); // 50% mix const multiplied = blendMultiply(base, blend); const screened = blendScreen(base, blend); // With alpha support const baseA = new Vec4(0.8, 0.2, 0.2, 0.5); // Semi-transparent red const blendA = new Vec4(0.2, 0.2, 0.8, 0.8); // More opaque blue const result = blendOverlay(baseA, blendA); // Preserves alpha ``` #### Color Space Examples #### Color Space Conversion Examples ```typescript import { Vec3 } from '@fimbul-works/vec'; import { rgbToHSL, hslToRGB, rgbToLAB, rgbToXYZ, rgbToCMYK, kelvinToRGB } from '@fimbul-works/vec-color'; // RGB to HSL conversion const rgb = new Vec3(1, 0, 0); // Red const hsl = rgbToHSL(rgb); // { h: 0, s: 1, l: 0.5 } const backToRGB = hslToRGB(hsl); // Color matching with LAB const lab = rgbToLAB(rgb); const xyz = rgbToXYZ(rgb); // Print preparation const cmyk = rgbToCMYK(rgb); // { c: 0, m: 1, y: 1, k: 0 } // Color temperature const warmLight = kelvinToRGB(2700); // Warm incandescent const daylight = kelvinToRGB(6500); // Natural daylight ``` #### Temperature Manipulation Examples ```typescript import { Vec3 } from '@fimbul-works/vec'; import { kelvinToRGB, estimateColorTemperature, adjustTemperature } from '@fimbul-works/vec-color'; // Create colors from temperature const candlelight = kelvinToRGB(1900); // Warm/orange (~1900K) const sunlight = kelvinToRGB(5500); // Neutral daylight (~5500K) const bluesky = kelvinToRGB(9000); // Cool/blue (~9000K) // Estimate color temperature const color = new Vec3(1, 0.8, 0.6); // Warm color const temp = estimateColorTemperature(color); if (temp !== null) { console.log(`Color temperature: ${Math.round(temp)}K`); } // Adjust color temperature const original = new Vec3(0.8, 0.8, 0.8); // Neutral gray // Make warmer or cooler const warmer = adjustTemperature(original, -2000); // Shift towards warm const cooler = adjustTemperature(original, 2000); // Shift towards cool // Create a time-of-day sequence const timeSequence = [ adjustTemperature(original, -3000), // Dawn (warm) adjustTemperature(original, 2000), // Midday (cool) adjustTemperature(original, -2500) // Sunset (warm) ]; ``` ### Color Analysis Examples #### Color Comparison Examples ##### Basic Color Similarity ```typescript import { Vec3 } from '@fimbul-works/vec'; import { calculateColorSimilarityFast, calculateColorSimilarityLab, colorDistanceMatrix } from '@fimbul-works/vec-color'; // Fast comparison for real-time applications function findSimilarColors(target: Vec3, colors: Vec3[]): Vec3[] { return colors .sort((a, b) => calculateColorSimilarityFast(b, target) - calculateColorSimilarityFast(a, target) ) .slice(0, 5); // Get top 5 similar colors } // Precise comparison for color matching function isColorMatch(color1: Vec3, color2: Vec3, threshold = 0.95): boolean { return calculateColorSimilarityLab(color1, color2) > threshold; } ``` ##### Color Distance Matrix ```typescript import { parseColor, colorDistanceMatrix } from '@fimbul-works/vec-color'; // Analyze a color palette const palette = [ parseColor('#ff0000'), // Red parseColor('#00ff00'), // Green parseColor('#0000ff'), // Blue parseColor('#ff0088'), // Pink parseColor('#ff8800') // Orange ]; const distances = colorDistanceMatrix(palette); // Find most similar pairs const similarPairs = []; for (let i = 0; i < distances.length; i++) { for (let j = i + 1; j < distances[i].length; j++) { if (distances[i][j] > 0.85) { // Similar colors similarPairs.push([i, j]); } } } ``` #### Color Classification Examples ```typescript import { classifyColor, sortColors, perceivedBrightness } from '@fimbul-works/vec-color'; // Classify a color const color = new Vec3(1, 0.5, 0); const classification = classifyColor(color); // Returns: { temperature: 'warm', intensity: 'vivid', category: 'orange' } // Sort a palette by different attributes const palette = [/* array of colors */]; const byHue = sortColors(palette, 'hue'); const byBrightness = sortColors(palette, 'lightness'); ``` #### Accessibility Examples ##### WCAG Compliance Testing ```typescript import { contrastRatio, meetsWCAGRequirements, getTextColor } from '@fimbul-works/vec-color'; // Check color combination const background = new Vec3(0.9, 0.9, 0.9); const text = new Vec3(0.1, 0.1, 0.1); const ratio = contrastRatio(text, background); const isAACompliant = meetsWCAGRequirements(text, background, "AA"); const isAAACompliant = meetsWCAGRequirements(text, background, "AAA"); // Get accessible text color const autoText = getTextColor(background); ``` #### Gamut Examples ```typescript import { Vec3 } from '@fimbul-works/vec'; import { isInGamut, clipToGamut, compressToGamut, projectToGamut, rgbToLAB, labToRGB } from '@fimbul-works/vec-color'; // Check if color is displayable const labColor = rgbToLAB(new Vec3(1, 0, 0)); const outOfGamut = labToRGB(labColor); if (!isInGamut(outOfGamut)) { // Choose appropriate mapping strategy const clipped = clipToGamut(outOfGamut); // Fast const compressed = compressToGamut(outOfGamut); // Preserves relationships const projected = projectToGamut(outOfGamut); // Preserves brightness } // Batch processing with gamut mapping function processColors(colors: Vec3[]): Vec3[] { return colors.map(color => isInGamut(color) ? color : clipToGamut(color) ); } ``` #### Dominant Color Detection Examples ```typescript import { Vec3 } from '@fimbul-works/vec'; import { findDominantColors, colorToString, getTextColor } from '@fimbul-works/vec-color'; // Sample image colors const imageColors = [ new Vec3(0.8, 0.2, 0.2), // Red new Vec3(0.8, 0.3, 0.2), // Similar red new Vec3(0.2, 0.7, 0.3), // Green new Vec3(0.2, 0.2, 0.8), // Blue new Vec3(0.9, 0.9, 0.9), // White new Vec3(0.1, 0.1, 0.1), // Black // ... more colors from image ]; // Find dominant colors const dominantColors = findDominantColors(imageColors, 5); // Create color palette information const palette = dominantColors.map(color => ({ color: color, hex: colorToString(color, { format: 'hex' }), textColor: getTextColor(color), frequency: imageColors.filter(c => // Simple similarity check for frequency Math.abs(c.x - color.x) < 0.1 && Math.abs(c.y - color.y) < 0.1 && Math.abs(c.z - color.z) < 0.1 ).length / imageColors.length })); // Sort by frequency palette.sort((a, b) => b.frequency - a.frequency); // Generate theme colors const theme = { primary: palette[0].color, secondary: palette[1].color, accent: palette[2].color, background: palette.find(p => p.frequency > 0.1 && relativeLuminance(p.color) > 0.8)?.color ?? new Vec3(1, 1, 1), text: palette.find(p => p.frequency > 0.1 && relativeLuminance(p.color) < 0.2)?.color ?? new Vec3(0, 0, 0) }; ``` #### Debug Tools Examples ##### Color Inspection ```typescript import { debugColor, validateColorSpace } from '@fimbul-works/vec-color'; // Get comprehensive color information const debug = debugColor(new Vec3(1, 0, 0)); console.log(debug.original.hex); // "#ff0000" console.log(debug.characteristics); // Temperature, classification, etc. console.log(debug.accessibility); // Contrast ratios, WCAG compliance // Validate color values const validation = validateColorSpace(color, "RGB"); if (!validation.valid) { console.warn(validation.issues); } ``` ### Palette Generation Examples #### Color Scheme Examples ```typescript import { complement, analogous, triadic, splitComplementary } from '@fimbul-works/vec-color'; const baseColor = new Vec3(0.2, 0.5, 0.8); // Generate different schemes const complementary = complement(baseColor); const analogousColors = analogous(baseColor); // [base, +30°, -30°] const triadicColors = triadic(baseColor); // [base, +120°, +240°] const splitColors = splitComplementary(baseColor); // [base, +150°, -150°] ``` #### Color Harmonization Examples ```typescript import { Vec3 } from '@fimbul-works/vec'; import { harmonizeColor, harmonizePalette, parseColor } from '@fimbul-works/vec-color'; // Harmonize single color with reference const reference = parseColor('#0066cc'); // Base blue const color = parseColor('#ff9900'); // Orange const harmonized = harmonizeColor(color, reference); // Harmonize entire palette const palette = [ parseColor('#0066cc'), // Base blue parseColor('#ff9900'), // Orange parseColor('#66cc33'), // Green parseColor('#cc3366') // Pink ]; // Create accessible, harmonious palette const harmonizedPalette = harmonizePalette(palette, 'AA'); // Check results meet accessibility requirements const results = harmonizedPalette.map(color => ({ original: colorToString(color, { format: 'hex' }), wcagAA: meetsWCAGRequirements(color, reference, 'AA'), harmonic: true // All colors are now harmonized })); ``` #### Gradient Examples ```typescript import { cosineGradient, generateCosinePalette, COSINE_PRESET_RAINBOW } from '@fimbul-works/vec-color'; // Generate single color const t = 0.5; // Position in gradient (0-1) const color = cosineGradient(t, COSINE_PRESET_RAINBOW.a, COSINE_PRESET_RAINBOW.b, COSINE_PRESET_RAINBOW.c, COSINE_PRESET_RAINBOW.d ); // Generate full palette const palette = generateCosinePalette(10, COSINE_PRESET_RAINBOW); ``` ## Optimization & Best Practices ### Performance Tips 1. Batch conversions when possible: ```typescript // Good const hsl = rgbToHSL(color); const adjusted1 = adjustHue(hsl, 30); const adjusted2 = adjustSaturation(hsl, 0.2); // Bad const adjusted1 = adjustHue(rgbToHSL(color), 30); const adjusted2 = adjustSaturation(rgbToHSL(color), 0.2); ``` 2. Use FastSimilarity for arrays/realtime: ```typescript // For large arrays or realtime colors.sort((a, b) => calculateColorSimilarityFast(a, reference) - calculateColorSimilarityFast(b, reference) ); ``` ### Color Blindness Examples ```typescript import { simulateColorBlindness, optimizeForColorBlindness } from '@fimbul-works/vec-color'; // Simulate appearance const protanopiaView = simulateColorBlindness(color, 'protanopia'); const deuteranopiaView = simulateColorBlindness(color, 'deuteranopia'); // Optimize a palette const palette = [/* array of colors */]; const optimizedPalette = optimizeForColorBlindness(palette); // Validate optimization const validation = validateColorBlindnessSafety(optimizedPalette); if (!validation.safe) { console.log('Problem areas:', validation.issues); } ``` ### Error Handling Common error scenarios and how to handle them: ```typescript try { // Invalid hex color const color = parseHex('#XYZ'); } catch (error) { console.error('Invalid color format'); } // Handling out-of-gamut colors function ensureValidRGB(color: Vec3): Vec3 { return new Vec3( Math.min(1, Math.max(0, color.x)), Math.min(1, Math.max(0, color.y)), Math.min(1, Math.max(0, color.z)) ); } // Handling undefined color transformations function safeHueRotation(color: Vec3, degrees: number): Vec3 { const hsl = rgbToHSL(color); // Only rotate hue if the color has saturation if (hsl.y === 0) return color; return rotateHue(color, degrees); } ``` ### Edge Cases Important edge cases to consider: 1. Grayscale Colors ```typescript // Special handling for grayscale colors where hue is undefined function adjustGrayscale(color: Vec3): void { const hsl = rgbToHSL(color); if (hsl.y === 0) { // Handle grayscale case return adjustBrightness(color, amount); } } ``` 2. Extreme Values ```typescript // Handle extreme color values function safeColorAdjustment(color: Vec3, amount: number): Vec3 { // Prevent division by zero in color math const epsilon = 0.000001; const safeColor = new Vec3( Math.max(epsilon, color.x), Math.max(epsilon, color.y), Math.max(epsilon, color.z) ); return adjustColor(safeColor, amount); } ``` 3. Alpha Channel Edge Cases ```typescript // Handle alpha channel edge cases function safeAlphaBlend(color: Vec4, background: Vec4): Vec4 { if (color.w === 0) return background; if (color.w === 1) return color; if (background.w === 0) return color; return blendWithAlpha(color, background); } ``` 4. Color Temperature Edge Cases ```typescript // Handle color temperature edge cases function safeTemperatureAdjustment(color: Vec3, tempChange: number): Vec3 { const currentTemp = estimateColorTemperature(color); if (currentTemp === null) { // Handle colors that don't map to a temperature return color; } return adjustTemperature(color, tempChange); } ```