use dotmax::color::scheme_builder::ColorSchemeBuilder;
use dotmax::color::schemes::ColorScheme;
use dotmax::Color;
fn render_gradient_bar(scheme: &ColorScheme, width: usize) {
print!(" ");
for i in 0..width {
let intensity = i as f32 / (width - 1) as f32;
let color = scheme.sample(intensity);
print!("\x1b[48;2;{};{};{}m \x1b[0m", color.r, color.g, color.b);
}
println!();
}
fn print_header(title: &str) {
println!("\n\x1b[1;36m{}\x1b[0m", title);
println!("{}", "─".repeat(60));
}
fn main() -> Result<(), dotmax::DotmaxError> {
println!("\x1b[1;33m╔══════════════════════════════════════════════════════════════╗\x1b[0m");
println!("\x1b[1;33m║ Custom Color Scheme Builder Demo (Story 5.4) ║\x1b[0m");
println!("\x1b[1;33m╚══════════════════════════════════════════════════════════════╝\x1b[0m");
print_header("🔥 Fire Gradient (Custom Color Stops)");
println!(" A heat-based gradient from black through red, orange, yellow to white");
println!(" Colors placed at specific intensity positions for realistic fire effect");
println!();
let fire_scheme = ColorSchemeBuilder::new("fire")
.add_color(0.0, Color::rgb(0, 0, 0))
.add_color(0.2, Color::rgb(128, 0, 0))
.add_color(0.4, Color::rgb(255, 0, 0))
.add_color(0.6, Color::rgb(255, 128, 0))
.add_color(0.8, Color::rgb(255, 255, 0))
.add_color(1.0, Color::rgb(255, 255, 255))
.build()?;
println!(
" Scheme: {} ({} color stops)",
fire_scheme.name(),
fire_scheme.colors().len()
);
render_gradient_bar(&fire_scheme, 60);
print_header("🌊 Ocean Gradient (Deep to Surface)");
println!(" Simulates ocean depth: dark blue depths → turquoise surface → white foam");
println!();
let ocean_scheme = ColorSchemeBuilder::new("ocean")
.add_color(0.0, Color::rgb(0, 0, 50))
.add_color(0.3, Color::rgb(0, 50, 150))
.add_color(0.6, Color::rgb(0, 150, 200))
.add_color(0.8, Color::rgb(64, 224, 208))
.add_color(1.0, Color::rgb(240, 255, 255))
.build()?;
println!(
" Scheme: {} ({} color stops)",
ocean_scheme.name(),
ocean_scheme.colors().len()
);
render_gradient_bar(&ocean_scheme, 60);
print_header("🏢 Brand Colors (Corporate Gradient)");
println!(" Example corporate palette: dark navy → brand blue → accent teal → white");
println!(" Perfect for data visualizations matching company branding");
println!();
let brand_scheme = ColorSchemeBuilder::new("acme_corp")
.add_color(0.0, Color::rgb(0, 32, 64))
.add_color(0.4, Color::rgb(0, 102, 204))
.add_color(0.7, Color::rgb(0, 180, 180))
.add_color(1.0, Color::rgb(200, 240, 255))
.build()?;
println!(
" Scheme: {} ({} color stops)",
brand_scheme.name(),
brand_scheme.colors().len()
);
render_gradient_bar(&brand_scheme, 60);
print_header("🎨 Using from_colors() Convenience Constructor");
println!(" Evenly-spaced colors: just provide the colors, positions auto-calculated");
println!(" 4 colors → positions at 0.0, 0.33, 0.67, 1.0");
println!();
let sunset_scheme = ColorScheme::from_colors(
"sunset",
vec![
Color::rgb(25, 25, 112), Color::rgb(255, 69, 0), Color::rgb(255, 215, 0), Color::rgb(255, 250, 205), ],
)?;
println!(
" Scheme: {} ({} color stops)",
sunset_scheme.name(),
sunset_scheme.colors().len()
);
render_gradient_bar(&sunset_scheme, 60);
print_header("💜 Neon Cyberpunk Gradient");
println!(" Vibrant neon colors with sharp transitions for that retro-future aesthetic");
println!();
let neon_scheme = ColorSchemeBuilder::new("cyberpunk")
.add_color(0.0, Color::rgb(20, 0, 40))
.add_color(0.25, Color::rgb(138, 43, 226))
.add_color(0.5, Color::rgb(255, 20, 147))
.add_color(0.75, Color::rgb(0, 255, 255))
.add_color(1.0, Color::rgb(0, 191, 255))
.build()?;
println!(
" Scheme: {} ({} color stops)",
neon_scheme.name(),
neon_scheme.colors().len()
);
render_gradient_bar(&neon_scheme, 60);
print_header("🌍 Earth Tones (Natural Gradient)");
println!(" Warm, natural colors: deep brown → terracotta → sand → cream");
println!();
let earth_scheme = ColorScheme::from_colors(
"earth_tones",
vec![
Color::rgb(59, 36, 27), Color::rgb(139, 69, 19), Color::rgb(205, 133, 63), Color::rgb(222, 184, 135), Color::rgb(255, 248, 220), ],
)?;
println!(
" Scheme: {} ({} color stops)",
earth_scheme.name(),
earth_scheme.colors().len()
);
render_gradient_bar(&earth_scheme, 60);
print_header("📊 Sampling the Fire Scheme at Different Intensities");
println!();
let intensities = [0.0, 0.25, 0.5, 0.75, 1.0];
for &intensity in &intensities {
let color = fire_scheme.sample(intensity);
println!(
" intensity={:.2} → \x1b[48;2;{};{};{}m \x1b[0m RGB({:3}, {:3}, {:3})",
intensity, color.r, color.g, color.b, color.r, color.g, color.b
);
}
print_header("✅ Summary");
println!(" • ColorSchemeBuilder allows precise color stop placement");
println!(" • from_colors() provides a simple API for evenly-spaced gradients");
println!(" • Both methods produce ColorScheme instances compatible with sample()");
println!(" • Custom schemes enable brand-specific and artistic visualizations");
println!();
Ok(())
}