use crate::{OrbitalChartPalette, SeriesDef};
const SERIES_TOKEN_COUNT: usize = 6;
pub fn series_color_token(index: usize) -> String {
let slot = (index % SERIES_TOKEN_COUNT) + 1;
format!("var(--orbital-chart-series-{slot})")
}
pub fn resolve_series_color(
index: usize,
series: &SeriesDef,
palette: &OrbitalChartPalette,
) -> String {
if let Some(color) = &series.color {
return color.clone();
}
if let Some(color) = palette.colors.get(index) {
return color.clone();
}
series_color_token(index)
}
pub fn default_series_color_vars() -> &'static str {
r#"
--orbital-chart-series-1: var(--orb-color-accent-primary, #2563eb);
--orbital-chart-series-2: var(--orb-color-accent-secondary, #7c3aed);
--orbital-chart-series-3: var(--orb-color-accent-tertiary, #059669);
--orbital-chart-series-4: var(--orb-color-accent-quaternary, #d97706);
--orbital-chart-series-5: var(--orb-color-accent-primary, #2563eb);
--orbital-chart-series-6: var(--orb-color-accent-secondary, #7c3aed);
"#
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn prefers_explicit_series_color() {
let series = SeriesDef {
id: "a".into(),
color: Some("#ff0000".into()),
..Default::default()
};
let color = resolve_series_color(0, &series, &OrbitalChartPalette::default());
assert_eq!(color, "#ff0000");
}
#[test]
fn falls_back_to_token() {
let series = SeriesDef {
id: "a".into(),
..Default::default()
};
let color = resolve_series_color(0, &series, &OrbitalChartPalette::default());
assert!(color.contains("--orbital-chart-series-"));
}
}