use crate::{Emit, STATUS_TONES, class, depth_rule};
use makeover_layout::{Depth, Intent as _};
use std::fmt::Write as _;
pub const METER_CLASSES: &[&str] = &["meter", "progress", "progress-fill", "meter-count"];
pub(crate) fn progress_rules(opts: &Emit) -> String {
let progress = class("progress", opts);
let fill = class("progress-fill", opts);
let meter = class("meter", opts);
let count = class("meter-count", opts);
let mut css = depth_rule(&progress, Depth::Well);
let _ = writeln!(
css,
".{meter} {{\n display: grid;\n grid-template-columns: minmax(0, var(--meter-inline, 12rem)) max-content;\n \
align-items: center;\n gap: var(--gap-peer);\n}}"
);
let _ = writeln!(
css,
".{count} {{\n font-variant-numeric: tabular-nums;\n}}"
);
let _ = writeln!(
css,
".{progress} {{\n block-size: var(--meter-block, 0.625rem);\n overflow: hidden;\n}}"
);
let _ = writeln!(
css,
".{fill} {{\n width: calc(\n min(var(--meter-done, 0), var(--meter-total, 0))\n \
* 100% / max(var(--meter-total, 1), 1)\n );\n block-size: 100%;\n}}"
);
let _ = writeln!(
css,
".{progress} > .{fill} {{\n background: var(--action);\n}}"
);
for tone in STATUS_TONES {
let _ = writeln!(
css,
".{progress} > .{fill}[data-tone=\"{0}\"] {{\n background: var(--{0});\n}}",
tone.token()
);
}
css
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_class_this_module_names_has_a_rule() {
crate::test_support::assert_every_class_has_rule(
&progress_rules(&Emit::default()),
METER_CLASSES,
);
}
}