use super::rules::RuleSet;
use super::values::format_value;
use crate::Options;
use crate::resolve::{ResolvedValue, VarTable};
use std::collections::BTreeSet;
use std::fmt::Write;
pub fn emit(
out: &mut String,
vars: &VarTable,
rules: &RuleSet,
used: &BTreeSet<String>,
opts: &Options,
tooltip_cards: usize,
) {
out.push_str(" <style>\n");
if !opts.bake_vars {
let mut names: Vec<&String> = vars
.entries
.keys()
.filter(|k| used.contains(k.as_str()))
.collect();
names.sort();
if !names.is_empty() {
let adaptive = names
.iter()
.any(|n| is_light_dark(vars.entries.get(*n).unwrap()));
out.push_str(" @layer lini.defaults {\n :root, .lini {");
if adaptive {
out.push_str(" color-scheme: light dark;");
}
for name in &names {
let value = vars.entries.get(*name).unwrap();
write!(
out,
" --lini-{}: {};",
name,
format_value(value, vars, opts)
)
.unwrap();
}
out.push_str(" }\n");
if adaptive {
out.push_str(
" .lini[data-theme=\"dark\"], [data-theme=\"dark\"] .lini { color-scheme: dark; }\n",
);
out.push_str(
" .lini[data-theme=\"light\"], [data-theme=\"light\"] .lini { color-scheme: light; }\n",
);
}
out.push_str(" }\n");
}
}
rules.emit(out);
if tooltip_cards > 0 {
out.push_str(" .lini .lini-chart-tip { visibility: hidden; pointer-events: none; }\n");
for i in 0..tooltip_cards {
writeln!(
out,
" .lini .lini-hit-{i}:hover ~ .lini-tip-{i} {{ visibility: visible; }}"
)
.unwrap();
}
}
out.push_str(" </style>\n");
}
fn is_light_dark(v: &ResolvedValue) -> bool {
matches!(v, ResolvedValue::Call(c) if c.name == "light-dark")
}