AkurAI Build
Menu

Public repository / 3a1d4dc0df9425a910df82402300a2aeb40318ae

AkurAI-Framework / crates/css/src/generate.rs

Latest change 8fbc17482f2972707fdb2d8c70707551677012fd - feat(css): atomic/utility CSS engine core (scan + generate) by Ólafur Búi Ólafsson

//! Stylesheet generation: used class tokens → compact CSS.
//!
//! Each recognised utility becomes one compact rule `.class{declaration}`;
//! unknown classes are skipped. Rules are emitted in the order the classes are
//! given, with no whitespace between them, for stable, minimal output.

use crate::utilities;

/// Build a compact stylesheet for `classes`, keeping only recognised utilities
/// and preserving input order.
pub fn stylesheet(classes: &[String]) -> String {
    let mut out = String::new();
    for class in classes {
        if let Some(body) = utilities::declaration(class) {
            out.push('.');
            out.push_str(class);
            out.push('{');
            out.push_str(&body);
            out.push('}');
        }
    }
    out
}

#[cfg(test)]
mod tests {
    use super::*;

    fn owned(items: &[&str]) -> Vec<String> {
        items.iter().map(|s| s.to_string()).collect()
    }

    #[test]
    fn emits_only_known_utilities_in_order() {
        let css = stylesheet(&owned(&["flex", "btn", "p-2"]));
        assert_eq!(css, ".flex{display:flex}.p-2{padding:8px}");
    }

    #[test]
    fn empty_input_yields_empty_string() {
        assert_eq!(stylesheet(&[]), "");
    }

    #[test]
    fn all_unknown_yields_empty_string() {
        assert_eq!(stylesheet(&owned(&["card", "btn-primary"])), "");
    }
}